Importacion de librerías

library(sf)
library(sp)
library(dplyr)
library(ggplot2)
library(readxl)
library(xfun)
library(tidyr)

Carga y visualizacion de archivos xlsx y shapefile

# Verifica nombres de columnas si da error
colnames(EncuestaOrigenDestino)
##  [1] "FECHA"                                                                                   
##  [2] "ID ESTACIÓN"                                                                             
##  [3] "ESTACIÓN"                                                                                
##  [4] "ACCESO"                                                                                  
##  [5] "MOVIMIENTO"                                                                              
##  [6] "Hora de Encuesta"                                                                        
##  [7] "MUNICIPIO...7"                                                                           
##  [8] "DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...8" 
##  [9] "Codigo Origen_SDG"                                                                       
## [10] "¿QUE ESTABA HACIENDO EN ESE LUGAR?"                                                      
## [11] "MUNICIPIO...11"                                                                          
## [12] "DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...12"
## [13] "Codigo Destino_SDG"                                                                      
## [14] "¿QUE VA HACER A ESE LUGAR?"                                                              
## [15] "ESTRATO EN SU VIVIENDA"                                                                  
## [16] "¿DISPONIA DE UN VEHÍCULO PARA REALIZAR ESTE DESPLAZAMIENTO?"                             
## [17] "OTRO ¿CUÁL?...17"                                                                        
## [18] "ANTES"                                                                                   
## [19] "DESPUES"                                                                                 
## [20] "EDAD"                                                                                    
## [21] "SEXO"                                                                                    
## [22] "PERSONAS EN EL VEHÍCULO"                                                                 
## [23] "TIPO DE VEHÍCULO"                                                                        
## [24] "OTRO ¿CUÁL?...24"                                                                        
## [25] "TIPO DE VIAJERO"                                                                         
## [26] "comuna origen"                                                                           
## [27] "comuna destino"                                                                          
## [28] "Intracomuna"
# Selección de columnas de interés (asegúrate que los nombres estén bien escritos y sin errores)
datos <- EncuestaOrigenDestino[, c("TIPO DE VEHÍCULO", "comuna origen", "comuna destino")]

# Verificar los primeros registros seleccionados
head(datos)
## # A tibble: 6 × 3
##   `TIPO DE VEHÍCULO` `comuna origen` `comuna destino`
##                <dbl> <chr>           <chr>           
## 1                  2 02              22              
## 2                  3 Fuera de Cali   19              
## 3                  2 Fuera de Cali   03              
## 4                  2 Fuera de Cali   09              
## 5                  2 Fuera de Cali   02              
## 6                  3 Fuera de Cali   02
comunas <- st_read("C:/Users/Fabio/OneDrive/Desktop/Analisis de informacion geografica y espacial/Casos/cali/Comunas.shp")
## Reading layer `Comunas' from data source 
##   `C:\Users\Fabio\OneDrive\Desktop\Analisis de informacion geografica y espacial\Casos\cali\Comunas.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 22 features and 4 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: 1053868 ymin: 860190.2 xmax: 1068492 ymax: 879441.5
## Projected CRS: MAGNA_Colombia_Cali
ggplot(comunas) +
  geom_sf(fill = "seashell", color = "black") +
  theme_minimal() +
  labs(title = "Mapa de Comunas")

# Filtrar filas que NO contienen "Fuera de cali" en comuna origen ni comuna destino
datos_filtrados <- datos %>%
  dplyr::select(`TIPO DE VEHÍCULO`, `comuna origen`, `comuna destino`) %>%
  filter(`comuna origen` != "Fuera de Cali" & `comuna destino` != "Fuera de Cali")

head(datos_filtrados)
## # A tibble: 6 × 3
##   `TIPO DE VEHÍCULO` `comuna origen` `comuna destino`
##                <dbl> <chr>           <chr>           
## 1                  2 02              22              
## 2                  2 06              02              
## 3                  3 06              04              
## 4                  3 03              02              
## 5                  3 04              02              
## 6                  3 06              02

Viajes por comuna de origen

# Calcular viajes por comuna de orige
viajes_origen <- 
  datos_filtrados %>%
  count(`comuna origen`) %>%
  mutate(`comuna origen` = as.double(`comuna origen`)) %>%
  filter(`comuna origen` != 0 & !is.na(`comuna origen`)) %>%
  rename(comuna_origen = `comuna origen`,
         viajes_origen = n)

# Asegurar que la columna de emparejamiento es numérica
comunas_sf <- comunas %>%
  mutate(comuna = as.double(comuna)) %>%
  left_join(viajes_origen, by = c("comuna" = "comuna_origen"))

# Graficar con ggplot2
ggplot(comunas_sf) +
  geom_sf(aes(fill = viajes_origen)) +
  scale_fill_viridis_c(option = "plasma", na.value = "white") +
  labs(title = "Viajes de origen por Comuna", fill = "N° de Viajes") +
  theme_minimal()

Viajes por comuna de destino

# Calcular viajes por comuna de destino
viajes_destino <- 
  datos_filtrados %>%
  count(`comuna destino`) %>%
  mutate(`comuna destino` = as.double(`comuna destino`)) %>%
  filter(`comuna destino` != 0 & !is.na(`comuna destino`)) %>%
  rename(comuna_destino = `comuna destino`,
         viajes_destino = n)

# Asegurar que la columna de emparejamiento es numérica
comunas_sf <- comunas %>%
  mutate(comuna = as.double(comuna)) %>%
  left_join(viajes_destino, by = c("comuna" = "comuna_destino"))

# Graficar con ggplot2
ggplot(comunas_sf) +
  geom_sf(aes(fill = viajes_destino)) +
  scale_fill_viridis_c(option = "turbo", na.value = "white") +
  labs(title = "Viajes de destino por Comuna", fill = "N° de Viajes") +
  theme_minimal()

Viajes en Bicicleta

# Filtrar solo registros para bicicletas (tipo 1)
datos_tipo1 <- datos_filtrados %>%
  filter(`TIPO DE VEHÍCULO` == 1)

Por comuna de origen

# Viajes por comuna de origen en Bicicleta
viajes_origen <- 
  datos_tipo1 %>%
  count(`comuna origen`) %>%
  mutate(`comuna origen` = as.double(`comuna origen`)) %>%
  filter(`comuna origen` != 0 & !is.na(`comuna origen`)) %>%
  rename(comuna_origen = `comuna origen`,
         viajes_origen = n)

# Asegurar que la columna de emparejamiento es numérica
comunas_sf <- comunas %>%
  mutate(comuna = as.double(comuna)) %>%
  left_join(viajes_origen, by = c("comuna" = "comuna_origen"))

# Graficar con ggplot2
ggplot(comunas_sf) +
  geom_sf(aes(fill = viajes_origen)) +
  scale_fill_viridis_c(option = "plasma", na.value = "white") +
  labs(title = "Viajes de origen por comuna en bicicleta", fill = "N° de Viajes") +
  theme_minimal()

Por comuna de destino

# Viajes por comuna de destino en Bicicleta
viajes_destino <- 
  datos_tipo1 %>%
  count(`comuna destino`) %>%
  mutate(`comuna destino` = as.double(`comuna destino`)) %>%
  filter(`comuna destino` != 0 & !is.na(`comuna destino`)) %>%
  rename(comuna_destino = `comuna destino`,
         viajes_destino = n)

# Asegurar que la columna de emparejamiento es numérica
comunas_sf <- comunas %>%
  mutate(comuna = as.double(comuna)) %>%
  left_join(viajes_destino, by = c("comuna" = "comuna_destino"))

# Graficar con ggplot2
ggplot(comunas_sf) +
  geom_sf(aes(fill = viajes_destino)) +
  scale_fill_viridis_c(option = "turbo", na.value = "white") +
  labs(title = "Viajes de destino por comuna en bicicleta", fill = "N° de Viajes") +
  theme_minimal()

Viajes en moto

# Filtrar solo registros para moto (tipo 2)
datos_tipo2 <- datos_filtrados %>%
  filter(`TIPO DE VEHÍCULO` == 2)

Por comuna origen

# Viajes por comuna de origen en Moto
viajes_origen <- 
  datos_tipo2 %>%
  count(`comuna origen`) %>%
  mutate(`comuna origen` = as.double(`comuna origen`)) %>%
  filter(`comuna origen` != 0 & !is.na(`comuna origen`)) %>%
  rename(comuna_origen = `comuna origen`,
         viajes_origen = n)

# Asegurar que la columna de emparejamiento es numérica
comunas_sf <- comunas %>%
  mutate(comuna = as.double(comuna)) %>%
  left_join(viajes_origen, by = c("comuna" = "comuna_origen"))

# Graficar con ggplot2
ggplot(comunas_sf) +
  geom_sf(aes(fill = viajes_origen)) +
  scale_fill_viridis_c(option = "plasma", na.value = "white") +
  labs(title = "Viajes de origen por comuna en Moto", fill = "N° de Viajes") +
  theme_minimal()

Por comuna destino

# Viajes por comuna de destino en moto
viajes_destino <- 
  datos_tipo2 %>%
  count(`comuna destino`) %>%
  mutate(`comuna destino` = as.double(`comuna destino`)) %>%
  filter(`comuna destino` != 0 & !is.na(`comuna destino`)) %>%
  rename(comuna_destino = `comuna destino`,
         viajes_destino = n)

# Asegurar que la columna de emparejamiento es numérica
comunas_sf <- comunas %>%
  mutate(comuna = as.double(comuna)) %>%
  left_join(viajes_destino, by = c("comuna" = "comuna_destino"))

# Graficar con ggplot2
ggplot(comunas_sf) +
  geom_sf(aes(fill = viajes_destino)) +
  scale_fill_viridis_c(option = "turbo", na.value = "white") +
  labs(title = "Viajes de destino por comuna en moto", fill = "N° de Viajes") +
  theme_minimal()

Viajes en Automovil

# Filtrar solo registros para automovil (tipo 3)
datos_tipo3 <- datos_filtrados %>%
  filter(`TIPO DE VEHÍCULO` == 3)

Por comuna origen

# Viajes por comuna de origen en Automovil
viajes_origen <- 
  datos_tipo3 %>%
  count(`comuna origen`) %>%
  mutate(`comuna origen` = as.double(`comuna origen`)) %>%
  filter(`comuna origen` != 0 & !is.na(`comuna origen`)) %>%
  rename(comuna_origen = `comuna origen`,
         viajes_origen = n)

# Asegurar que la columna de emparejamiento es numérica
comunas_sf <- comunas %>%
  mutate(comuna = as.double(comuna)) %>%
  left_join(viajes_origen, by = c("comuna" = "comuna_origen"))

# Graficar con ggplot2
ggplot(comunas_sf) +
  geom_sf(aes(fill = viajes_origen)) +
  scale_fill_viridis_c(option = "plasma", na.value = "white") +
  labs(title = "Viajes de origen por comuna en Automovil", fill = "N° de Viajes") +
  theme_minimal()

Por comuna destino

# Viajes por comuna de origen en Automovil
viajes_origen <- 
  datos_tipo3 %>%
  count(`comuna origen`) %>%
  mutate(`comuna origen` = as.double(`comuna origen`)) %>%
  filter(`comuna origen` != 0 & !is.na(`comuna origen`)) %>%
  rename(comuna_origen = `comuna origen`,
         viajes_origen = n)

# Asegurar que la columna de emparejamiento es numérica
comunas_sf <- comunas %>%
  mutate(comuna = as.double(comuna)) %>%
  left_join(viajes_origen, by = c("comuna" = "comuna_origen"))

# Graficar con ggplot2
ggplot(comunas_sf) +
  geom_sf(aes(fill = viajes_origen)) +
  scale_fill_viridis_c(option = "turbo", na.value = "white") +
  labs(title = "Viajes de destino en Automovil", fill = "N° de Viajes") +
  theme_minimal()

Interpretación de resultados

El análisis espacial realizado sobre los viajes en la ciudad de Cali, según los datos de la Encuesta Origen-Destino, permitió identificar la distribución geográfica del origen y destino de los desplazamientos según el tipo de vehículo (bicicleta, moto, automóvil). Los mapas generados muestran con claridad que las comunas con mayor cantidad de viajes de origen y destino se concentran principalmente en zonas como la comuna 2, 17, 19 y 22, que corresponden a sectores con una mayor actividad económica y mejores infraestructuras viales.

Para los viajes en bicicleta, se observa una mayor intensidad en comunas centrales, posiblemente relacionadas con el uso recreativo o la cercanía a zonas universitarias o laborales.

En cuanto a los viajes en moto y automóvil, se evidencia una distribución más amplia, incluyendo comunas periféricas, lo cual refleja una dependencia motorizada para cubrir distancias mayores o falta de alternativas de transporte público eficientes.

Conclusión

La representación espacial de los viajes permite inferir patrones de movilidad urbana y desigualdad territorial. Las comunas con mayor número de viajes suelen coincidir con áreas de mayor desarrollo socioeconómico y oferta de servicios, mientras que las periferias muestran una menor participación, posiblemente por limitaciones de acceso o condiciones socioeconómicas. Este tipo de análisis es fundamental para planificar políticas públicas enfocadas en la movilidad sostenible, la mejora de infraestructura vial y la equidad territorial en el acceso a oportunidades en la ciudad​