Este documento presenta un ejercicio de análisis de datos geográficos y espaciales que combina información alfanumérica de viajes con cartografía vectorial de las comunas de Cali. El objetivo es identificar patrones espaciales de movilidad urbana a través de mapas temáticos, siguiendo la lógica de un Sistema de Información Geográfica (SIG).
El análisis integra tres componentes fundamentales:
La integración de ambas fuentes se realiza asociando los conteos de viajes a la tabla de atributos de la cartografía, lo que permite responder preguntas espaciales sobre la movilidad en Cali utilizando las comunas como unidades de análisis.
La movilidad urbana es uno de los fenómenos más complejos de las ciudades contemporáneas. Entender desde dónde salen los viajes y hacia dónde se dirigen permite formular políticas de transporte más eficientes y equitativas. En el caso de Cali, ciudad con 22 comunas de características socioeconómicas diversas, este análisis cobra especial relevancia.
A partir de los datos de la Encuesta Origen-Destino, este ejercicio busca responder las siguientes preguntas:
Se utilizan las librerías del enfoque visto en clase. La única
diferencia respecto al código es el uso de terra para leer
el shapefile, dado que rgdal fue retirado oficialmente de
CRAN en 2023. terra es el sucesor directo desarrollado por
el mismo autor (Robert Hijmans) y permite convertir el objeto a formato
sp con una sola función, manteniendo todo el flujo de
trabajo con sp, over(), spplot()
y leaflet exactamente como se sugirio en el material de
clase.
require(terra)
require(raster)
require(sp)
require(leaflet)
require(readxl)
require(dplyr)
require(janitor)
require(stringr)
require(knitr)
require(kableExtra)
Se carga el shapefile de comunas de Cali usando
terra::vect() y luego se convierte a objeto sp
con as(x, "Spatial"). Este es el mismo tipo de objeto
SpatialPolygonsDataFrame que genera
shapefile() en el código guia, por lo que
spTransform(), over() y spplot()
funcionan exactamente igual.
# Leer el shapefile con terra (sucesor de rgdal)
comunas_terra <- vect("Casos/cali/Comunas.shp")
# Convertir a SpatialPolygonsDataFrame (objeto sp,)
comunas <- as(comunas_terra, "Spatial")
# Revisar el objeto: clase, features, extensión, CRS y variables
comunas
## class : SpatialPolygonsDataFrame
## features : 22
## extent : 1053868, 1068492, 860190.2, 879441.5 (xmin, xmax, ymin, ymax)
## crs : +proj=tmerc +lat_0=3.441883333 +lon_0=-76.5205625 +k=1 +x_0=1061900.18 +y_0=872364.63 +a=6379137 +rf=298.257222101 +units=m +no_defs
## variables : 4
## names : OBJECTID, gid, comuna, nombre
## min values : 1, 89, 1, Comuna 1
## max values : 22, 110, 22, Comuna 9
# Ver nombres de columnas de la tabla de atributos
names(comunas)
## [1] "OBJECTID" "gid" "comuna" "nombre"
# Ver primeras filas de la tabla de atributos
head(comunas@data)
# Verificar número de polígonos (debe ser 22)
cat("Número de comunas:", length(comunas), "\n")
## Número de comunas: 22
# Verificar CRS
cat("\nCRS del shapefile:\n")
##
## CRS del shapefile:
print(proj4string(comunas))
## [1] "+proj=tmerc +lat_0=3.441883333 +lon_0=-76.5205625 +k=1 +x_0=1061900.18 +y_0=872364.63 +a=6379137 +rf=298.257222101 +units=m +no_defs"
plot(comunas, main = "Comunas de Cali - Cartografia base")
# Consulta espacial por índice
comuna22 <- comunas[22, ]
plot(comuna22, main = "Comuna 22")
# Consulta por atributo de campo de la tabla de atributos
campo_comuna_shp <- "comuna"
comunas_sur <- comunas[comunas@data[[campo_comuna_shp]] >= 20, ]
plot(comunas, main = "Comunas 20, 21 y 22 destacadas en rojo")
plot(comunas_sur, col = "red", add = TRUE)
Se lee el archivo de la Encuesta Origen-Destino. Primero se revisan las hojas disponibles y la hoja de convenciones para identificar correctamente las variables clave.
hojas <- excel_sheets("Casos/EncuestaOrigenDestino.xlsx")
cat("Hojas disponibles:\n")
## Hojas disponibles:
print(hojas)
## [1] "Hoja1" "Convenciones"
convenciones <- read_excel("Casos/EncuestaOrigenDestino.xlsx",
sheet = "Convenciones")
kable(
convenciones,
caption = "Tabla 1. Convenciones de variables - Encuesta Origen-Destino",
align = "l"
) %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
font_size = 11
) %>%
scroll_box(
width = "100%",
height = "350px"
)
| Metro Cali S.A. | …2 | …3 | …4 | …5 | …6 |
|---|---|---|---|---|---|
| EODH Cali | NA | NA | NA | NA | NA |
| Convenciones | NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA | NA |
| Convenciones | NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA | NA |
| General | NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA | NA |
| NA | Movimiento | Sentido | NA | NA | NA |
| NA | 1 | Norte-Sur | NA | NA | NA |
| NA | 2 | Sur-Norte | NA | NA | NA |
| NA | 3 | Occidente-Oriente | NA | NA | NA |
| NA | 4 | Oriente-Occidente | NA | NA | NA |
| NA | NA | NA | NA | NA | NA |
| Encuesta de interceptación privado | NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA | NA |
| NA | ¿Que estaba haciendo en ese Lugar? | NA | NA | Sexo | NA |
| NA | 1 | Trabajando | NA | 1 | Femenino |
| NA | 2 | Asuntos de Trabajo | NA | 2 | Masculino |
| NA | 3 | Estudiando | NA | NA | NA |
| NA | 4 | Recibiendo Atención de Salud | NA | Tipo de Vehículo | NA |
| NA | 5 | Viendo a Alguien | NA | 1 | Bicicleta |
| NA | 6 | Estaba en mi Csa | NA | 2 | Moto |
| NA | 7 | Buscando /Dejando a Alguien | NA | 3 | Automovil |
| NA | 8 | Buscando /Dejando a Algo | NA | 4 | Campero (Guala) |
| NA | 9 | Comiendo /Tomando a Algo | NA | 5 | Taxi |
| NA | 10 | Compras | NA | 6 | Intermunicipal - Bus |
| NA | 11 | Tramites | NA | 7 | Intermunicipal - Buseta |
| NA | 12 | Recreación | NA | 8 | Intermunicipal - Van |
| NA | 13 | Buscando Trabajo | NA | 9 | Taxi blanco |
| NA | 77 | Otra cosa | NA | 77 | Otro ¿Cuál? |
| NA | NA | NA | NA | NA | NA |
| NA | ¿Que va a hacer en ese Lugar? | NA | NA | ¿Utilizó o utilizará otro modo de transporte para éste desplazamiento. | NA |
| NA | 1 | A trabajar | NA | 1 | Bicicleta |
| NA | 2 | Asuntos de Trabajo | NA | 2 | Moto |
| NA | 3 | Estudiar | NA | 3 | Automovil |
| NA | 4 | Recibir Atención de Salud | NA | 4 | Taxi |
| NA | 5 | Ver a Alguien | NA | 5 | Mio-Troncal |
| NA | 6 | Volver a casa | NA | 6 | Mio-Pretroncal |
| NA | 7 | Buscar /Dejar a Alguien | NA | 7 | Mio-Alimentador |
| NA | 8 | Buscar /Dejar a Algo | NA | 8 | Bus/Buseta- Urbano |
| NA | 9 | Comer /Tomar Algo | NA | 9 | Microbus |
| NA | 10 | Compras | NA | 10 | Bus/Buseta Intermunicipal |
| NA | 11 | Tramites | NA | 11 | Chiva |
| NA | 12 | Recreación | NA | 12 | Vehículo Escolar |
| NA | 13 | Buscando Trabajo | NA | 13 | Bus privado /De compañía |
| NA | 77 | Otra cosa | NA | 14 | Vehiculo de Tracción Animal |
| NA | NA | NA | NA | 15 | Mototaxi |
| NA | Estrato en su Vivienda | NA | NA | 16 | Bicitaxi |
| NA | 1 | Bajo bajo | NA | 17 | Taxi Colectivo |
| NA | 2 | Bajo | NA | 18 | Auto Informal |
| NA | 3 | Medio Bajo | NA | 19 | Bus / Colectivo Informal |
| NA | 4 | Medio | NA | 20 | Campero /Jeep / Guala |
| NA | 5 | Medio Alto | NA | 21 | Taxi Especial |
| NA | 6 | Alto | NA | 22 | Uber |
| NA | NA | NA | NA | 23 | Triciclo |
| NA | ¿Disponia de un vehículo para realizar este desplazamiento? | NA | NA | 24 | Motocarro |
| NA | 0 | No dispone de vehiculo motorizado | NA | 25 | Otro |
| NA | 1 | Moto | NA | NA | NA |
| NA | 2 | Vehiculo Privado | NA | NA | NA |
| NA | 3 | Campero (Guala) | NA | Tipo de Viajero | NA |
| NA | 4 | Taxi | NA | 1 | Conductor |
| NA | 5 | Otro (cuál) | NA | 2 | Pasajero |
| NA | NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA | NA |
| Encuesta de interceptación carga | NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA | NA |
| NA | Motivo del viaje | NA | NA | NA | NA |
| NA | 1 | Cargue | NA | NA | NA |
| NA | 2 | Descargue | NA | NA | NA |
| NA | 3 | Carga-Descarga | NA | NA | NA |
| NA | 77 | Otro | NA | NA | NA |
| NA | NA | NA | NA | NA | NA |
| NA | Lugar de destino | NA | NA | NA | NA |
| NA | 1 | Centro de Distribución | NA | NA | NA |
| NA | 2 | Bodega | NA | NA | NA |
| NA | 3 | Almacén de ventas | NA | NA | NA |
| NA | 4 | Empresa o fábrica | NA | NA | NA |
| NA | 77 | Otro | NA | NA | NA |
| NA | NA | NA | NA | NA | NA |
| NA | Tipo | NA | NA | NA | NA |
| NA | 1 | 2 ejes | NA | NA | NA |
| NA | 2 | 3 ejes | NA | NA | NA |
| NA | 3 | 4 o más ejes | NA | NA | NA |
| NA | NA | NA | NA | NA | NA |
| Encuesta de interceptación estaciones | NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA | NA |
| NA | ¿Cómo llegó a esta estación? | NA | NA | Sexo | NA |
| NA | P | Plataforma | NA | 1 | Femenino |
| NA | T | Torniquete | NA | 2 | Masculino |
| NA | NA | NA | NA | NA | NA |
| NA | ¿En qué servicio venía? | NA | NA | NA | NA |
| NA | T | Troncal | NA | ¿Utilizó o utilizará otro modo de transporte para éste desplazamiento. | NA |
| NA | P | Pretroncal | NA | 1 | Bicicleta |
| NA | A | Alimentador | NA | 2 | Moto |
| NA | NA | NA | NA | 3 | Automovil |
| NA | ¿Que estaba haciendo en ese Lugar? | NA | NA | 4 | Taxi |
| NA | 1 | Trabajando | NA | 5 | Mio-Troncal |
| NA | 2 | Asuntos de Trabajo | NA | 6 | Mio-Pretroncal |
| NA | 3 | Estudiando | NA | 7 | Mio-Alimentador |
| NA | 4 | Recibiendo Atención de Salud | NA | 8 | Bus/Buseta- Urbano |
| NA | 5 | Viendo a Alguien | NA | 9 | Microbus |
| NA | 6 | Estaba en mi Csa | NA | 10 | Bus/Buseta Intermunicipal |
| NA | 7 | Buscando /Dejando a Alguien | NA | 11 | Chiva |
| NA | 8 | Buscando /Dejando a Algo | NA | 12 | Vehículo Escolar |
| NA | 9 | Comiendo /Tomando a Algo | NA | 13 | Bus privado /De compañía |
| NA | 10 | Compras | NA | 14 | Vehiculo de Tracción Animal |
| NA | 11 | Tramites | NA | 15 | Mototaxi |
| NA | 12 | Recreación | NA | 16 | Bicitaxi |
| NA | 13 | Buscando Trabajo | NA | 17 | Taxi Colectivo |
| NA | 77 | Otra cosa | NA | 18 | Auto Informal |
| NA | NA | NA | NA | 19 | Bus / Colectivo Informal |
| NA | ¿Que va a hacer en ese Lugar? | NA | NA | 20 | Campero /Jeep / Guala |
| NA | 1 | A trabajar | NA | 21 | Taxi Especial |
| NA | 2 | Asuntos de Trabajo | NA | 22 | Uber |
| NA | 3 | Estudiar | NA | 23 | Triciclo |
| NA | 4 | Recibir Atención de Salud | NA | 24 | Motocarro |
| NA | 5 | Ver a Alguien | NA | 25 | Otro |
| NA | 6 | Volver a casa | NA | NA | NA |
| NA | 7 | Buscar /Dejar a Alguien | NA | NA | NA |
| NA | 8 | Buscar /Dejar a Algo | NA | NA | NA |
| NA | 9 | Comer /Tomar Algo | NA | NA | NA |
| NA | 10 | Compras | NA | NA | NA |
| NA | 11 | Tramites | NA | NA | NA |
| NA | 12 | Recreación | NA | NA | NA |
| NA | 13 | Buscando Trabajo | NA | NA | NA |
| NA | 77 | Otra cosa | NA | NA | NA |
| NA | NA | NA | NA | NA | NA |
| NA | Estrato en su Vivienda | NA | NA | NA | NA |
| NA | 1 | Bajo bajo | NA | NA | NA |
| NA | 2 | Bajo | NA | NA | NA |
| NA | 3 | Medio Bajo | NA | NA | NA |
| NA | 4 | Medio | NA | NA | NA |
| NA | 5 | Medio Alto | NA | NA | NA |
| NA | 6 | Alto | NA | NA | NA |
| NA | NA | NA | NA | NA | NA |
| NA | ¿Disponia de un vehículo para realizar este desplazamiento? | NA | NA | NA | NA |
| NA | 0 | No dispone de vehiculo motorizado | NA | NA | NA |
| NA | 1 | Moto | NA | NA | NA |
| NA | 2 | Vehiculo Privado | NA | NA | NA |
| NA | 3 | Campero (Guala) | NA | NA | NA |
| NA | 4 | Taxi | NA | NA | NA |
| NA | 5 | Otro (cuál) | NA | NA | NA |
| NA | NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA | NA |
| Encuestas de interceptación en tramos | NA | NA | NA | NA | NA |
| NA | ¿Que estaba haciendo en ese Lugar? | NA | NA | Tipo de vehículo | NA |
| NA | 1 | Trabajando | NA | B | Buseta |
| NA | 2 | Asuntos de Trabajo | NA | C | Complementario |
| NA | 3 | Estudiando | NA | P | Padrón |
| NA | 4 | Recibiendo Atención de Salud | NA | M | Microbús |
| NA | 5 | Viendo a Alguien | NA | NA | NA |
| NA | 6 | Estaba en mi Csa | NA | NA | NA |
| NA | 7 | Buscando /Dejando a Alguien | NA | NA | NA |
| NA | 8 | Buscando /Dejando a Algo | NA | NA | NA |
| NA | 9 | Comiendo /Tomando a Algo | NA | NA | NA |
| NA | 10 | Compras | NA | NA | NA |
| NA | 11 | Tramites | NA | NA | NA |
| NA | 12 | Recreación | NA | NA | NA |
| NA | 13 | Buscando Trabajo | NA | NA | NA |
| NA | 77 | Otra cosa | NA | NA | NA |
| NA | NA | NA | NA | NA | NA |
| NA | ¿Que va a hacer en ese Lugar? | NA | NA | NA | NA |
| NA | 1 | A trabajar | NA | NA | NA |
| NA | 2 | Asuntos de Trabajo | NA | NA | NA |
| NA | 3 | Estudiar | NA | NA | NA |
| NA | 4 | Recibir Atención de Salud | NA | NA | NA |
| NA | 5 | Ver a Alguien | NA | NA | NA |
| NA | 6 | Volver a casa | NA | NA | NA |
| NA | 7 | Buscar /Dejar a Alguien | NA | NA | NA |
| NA | 8 | Buscar /Dejar a Algo | NA | NA | NA |
| NA | 9 | Comer /Tomar Algo | NA | NA | NA |
| NA | 10 | Compras | NA | NA | NA |
| NA | 11 | Tramites | NA | NA | NA |
| NA | 12 | Recreación | NA | NA | NA |
| NA | 13 | Buscando Trabajo | NA | NA | NA |
| NA | 77 | Otra cosa | NA | NA | NA |
| NA | NA | NA | NA | NA | NA |
| NA | Estrato en su Vivienda | NA | NA | NA | NA |
| NA | 1 | Bajo bajo | NA | NA | NA |
| NA | 2 | Bajo | NA | NA | NA |
| NA | 3 | Medio Bajo | NA | NA | NA |
| NA | 4 | Medio | NA | NA | NA |
| NA | 5 | Medio Alto | NA | NA | NA |
| NA | 6 | Alto | NA | NA | NA |
| NA | NA | NA | NA | NA | NA |
| NA | ¿Disponia de un vehículo para realizar este desplazamiento? | NA | NA | NA | NA |
| NA | 0 | No dispone de vehiculo motorizado | NA | NA | NA |
| NA | 1 | Moto | NA | NA | NA |
| NA | 2 | Vehiculo Privado | NA | NA | NA |
| NA | 3 | Campero (Guala) | NA | NA | NA |
| NA | 4 | Taxi | NA | NA | NA |
| NA | 5 | Otro (cuál) | NA | NA | NA |
# Leer hoja principal
datos_raw <- read_excel("Casos/EncuestaOrigenDestino.xlsx", sheet = 1)
# Limpiar nombres de columnas
datos_raw <- clean_names(datos_raw)
cat("Registros totales:", nrow(datos_raw), "\n")
## Registros totales: 35054
cat("Variables:", ncol(datos_raw), "\n\n")
## Variables: 28
cat("Nombres de columnas:\n")
## Nombres de columnas:
print(names(datos_raw))
## [1] "fecha"
## [2] "id_estacion"
## [3] "estacion"
## [4] "acceso"
## [5] "movimiento"
## [6] "hora_de_encuesta"
## [7] "municipio_7"
## [8] "departamento_localidad_comuna_distrito_barrio_vereda_hito_direccion_8"
## [9] "codigo_origen_sdg"
## [10] "que_estaba_haciendo_en_ese_lugar"
## [11] "municipio_11"
## [12] "departamento_localidad_comuna_distrito_barrio_vereda_hito_direccion_12"
## [13] "codigo_destino_sdg"
## [14] "que_va_hacer_a_ese_lugar"
## [15] "estrato_en_su_vivienda"
## [16] "disponia_de_un_vehiculo_para_realizar_este_desplazamiento"
## [17] "otro_cual_17"
## [18] "antes"
## [19] "despues"
## [20] "edad"
## [21] "sexo"
## [22] "personas_en_el_vehiculo"
## [23] "tipo_de_vehiculo"
## [24] "otro_cual_24"
## [25] "tipo_de_viajero"
## [26] "comuna_origen"
## [27] "comuna_destino"
## [28] "intracomuna"
glimpse(datos_raw)
## Rows: 35,054
## Columns: 28
## $ fecha <dttm> …
## $ id_estacion <dbl> …
## $ estacion <chr> …
## $ acceso <chr> …
## $ movimiento <chr> …
## $ hora_de_encuesta <dttm> …
## $ municipio_7 <chr> …
## $ departamento_localidad_comuna_distrito_barrio_vereda_hito_direccion_8 <chr> …
## $ codigo_origen_sdg <chr> …
## $ que_estaba_haciendo_en_ese_lugar <dbl> …
## $ municipio_11 <chr> …
## $ departamento_localidad_comuna_distrito_barrio_vereda_hito_direccion_12 <chr> …
## $ codigo_destino_sdg <chr> …
## $ que_va_hacer_a_ese_lugar <dbl> …
## $ estrato_en_su_vivienda <dbl> …
## $ disponia_de_un_vehiculo_para_realizar_este_desplazamiento <dbl> …
## $ otro_cual_17 <lgl> …
## $ antes <dbl> …
## $ despues <lgl> …
## $ edad <dbl> …
## $ sexo <dbl> …
## $ personas_en_el_vehiculo <dbl> …
## $ tipo_de_vehiculo <dbl> …
## $ otro_cual_24 <lgl> …
## $ tipo_de_viajero <chr> …
## $ comuna_origen <chr> …
## $ comuna_destino <chr> …
## $ intracomuna <chr> …
kable(head(datos_raw, 10),
caption = "Tabla 2. Primeras 10 filas de la Encuesta Origen-Destino") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = TRUE, font_size = 11) %>%
scroll_box(width = "100%", height = "300px")
| fecha | id_estacion | estacion | acceso | movimiento | hora_de_encuesta | municipio_7 | departamento_localidad_comuna_distrito_barrio_vereda_hito_direccion_8 | codigo_origen_sdg | que_estaba_haciendo_en_ese_lugar | municipio_11 | departamento_localidad_comuna_distrito_barrio_vereda_hito_direccion_12 | codigo_destino_sdg | que_va_hacer_a_ese_lugar | estrato_en_su_vivienda | disponia_de_un_vehiculo_para_realizar_este_desplazamiento | otro_cual_17 | antes | despues | edad | sexo | personas_en_el_vehiculo | tipo_de_vehiculo | otro_cual_24 | tipo_de_viajero | comuna_origen | comuna_destino | intracomuna |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2015-06-01 | 1 | Avenida 6N X Calle 70N | NORTE | MOV 1 | 1899-12-31 06:10:00 | CALI | B CHIPICHAPE | 218 | 5 | CALI | B PANCE | 2216 | 1 | 3 | 0 | NA | NA | NA | 35 | 2 | 1 | 2 | NA | 1 | 02 | 22 | 0 |
| 2015-06-01 | 1 | Avenida 6N X Calle 70N | NORTE | MOV 1 | 1899-12-31 06:11:00 | CALIMA | DARIEN | 4102 | 6 | CALI | TEQUENDAMA | 1904 | 4 | 2 | NA | NA | NA | NA | 40 | 2 | 4 | 3 | NA | 1 | Fuera de Cali | 19 | 0 |
| 2015-06-01 | 1 | Avenida 6N X Calle 70N | NORTE | MOV 1 | 1899-12-31 06:12:00 | YUMBO | VALLE DEL CAUCA | 3102 | 6 | CALI | B EL PEÑON | 302 | 1 | 3 | NA | NA | NA | NA | 33 | 2 | 1 | 2 | NA | 1 | Fuera de Cali | 03 | 0 |
| 2015-06-01 | 1 | Avenida 6N X Calle 70N | NORTE | MOV 1 | 1899-12-31 06:13:00 | YUMBO | VALLE DEL CAUCA | 3102 | 6 | CALI | B OBRERO | 910 | 1 | 2 | NA | NA | NA | NA | 28 | 2 | 1 | 2 | NA | 1 | Fuera de Cali | 09 | 0 |
| 2015-06-01 | 1 | Avenida 6N X Calle 70N | NORTE | MOV 1 | 1899-12-31 06:14:00 | PALMIRA | VALLE DEL CAUCA | 3202 | 8 | CALI | B CENTENARIO | 223 | 1 | 3 | NA | NA | NA | NA | 25 | 2 | 2 | 2 | NA | 1 | Fuera de Cali | 02 | 0 |
| 2015-06-01 | 1 | Avenida 6N X Calle 70N | NORTE | MOV 1 | 1899-12-31 06:15:00 | PALMIRA | VALLE DEL CAUCA | 3202 | 6 | CALI | B CENTENARIO | 223 | 1 | 2 | NA | NA | NA | NA | 31 | 2 | 3 | 3 | NA | 1 | Fuera de Cali | 02 | 0 |
| 2015-06-01 | 1 | Avenida 6N X Calle 70N | NORTE | MOV 1 | 1899-12-31 06:16:00 | YUMBO | DAPA | 3115 | 6 | CALI | B EL CANEY | 1615 | 2 | 3 | NA | NA | NA | NA | 50 | 2 | 2 | 3 | NA | 1 | Fuera de Cali | 17 | 0 |
| 2015-06-01 | 1 | Avenida 6N X Calle 70N | NORTE | MOV 1 | 1899-12-31 06:17:00 | YUMBO | VALLE DEL CAUCA | 3102 | 6 | JAMUNDI | VALLE DEL CAUCA | 3401 | 1 | 3 | NA | NA | NA | NA | 37 | 2 | 1 | 2 | NA | 1 | Fuera de Cali | Fuera de Cali | NA |
| 2015-06-01 | 1 | Avenida 6N X Calle 70N | NORTE | MOV 1 | 1899-12-31 06:18:00 | YUMBO | VALLE DEL CAUCA | 3102 | 6 | CALI | B CHIPICHAPE | 218 | 1 | 3 | NA | NA | NA | NA | 36 | 2 | 1 | 2 | NA | 1 | Fuera de Cali | 02 | 0 |
| 2015-06-01 | 1 | Avenida 6N X Calle 70N | NORTE | MOV 1 | 1899-12-31 06:20:00 | YUMBO | VALLE DEL CAUCA | 3102 | 6 | CALI | B CHIPICHAPE | 218 | 2 | 3 | NA | NA | NA | NA | 35 | 2 | 2 | 3 | NA | 1 | Fuera de Cali | 02 | 0 |
var_comuna_origen <- "comuna_origen"
var_comuna_destino <- "comuna_destino"
var_vehiculo <- "tipo_de_vehiculo"
var_municipio <- "municipio_7"
# ============================================================
# Exploración de valores únicos
# ============================================================
cat("=== Valores únicos: TIPO DE VEHÍCULO ===\n")
## === Valores únicos: TIPO DE VEHÍCULO ===
if (var_vehiculo != "REEMPLAZAR_CON_NOMBRE_REAL") {
print(unique(datos_raw[[var_vehiculo]]))
} else {
cat(">>> Pendiente: reemplazar var_vehiculo\n")
}
## [1] 2 3 6 4 1 5 7 8 NA 9 77
cat("\n=== Valores únicos: COMUNA DE ORIGEN ===\n")
##
## === Valores únicos: COMUNA DE ORIGEN ===
if (var_comuna_origen != "REEMPLAZAR_CON_NOMBRE_REAL") {
print(sort(unique(datos_raw[[var_comuna_origen]])))
} else {
cat(">>> Pendiente: reemplazar var_comuna_origen\n")
}
## [1] "0" "01" "02" "03"
## [5] "04" "05" "06" "07"
## [9] "08" "09" "10" "11"
## [13] "12" "13" "14" "15"
## [17] "16" "17" "18" "19"
## [21] "20" "21" "22" "Fuera de Cali"
cat("\n=== Valores únicos: COMUNA DE DESTINO ===\n")
##
## === Valores únicos: COMUNA DE DESTINO ===
if (var_comuna_destino != "REEMPLAZAR_CON_NOMBRE_REAL") {
print(sort(unique(datos_raw[[var_comuna_destino]])))
} else {
cat(">>> Pendiente: reemplazar var_comuna_destino\n")
}
## [1] "0" "01" "02" "03"
## [5] "04" "05" "06" "07"
## [9] "08" "09" "10" "11"
## [13] "12" "13" "14" "15"
## [17] "16" "17" "18" "19"
## [21] "20" "21" "22" "Fuera de Cali"
# PASO 1: Renombrar columnas clave
rename_map <- c(
comuna_origen = var_comuna_origen,
comuna_destino = var_comuna_destino,
tipo_vehiculo = var_vehiculo
)
if (var_municipio != "REEMPLAZAR_CON_NOMBRE_REAL" &
var_municipio != "NO_EXISTE" &
var_municipio %in% names(datos_raw)) {
rename_map <- c(rename_map, municipio = var_municipio)
}
datos <- datos_raw %>% rename(any_of(rename_map))
# PASO 2: Filtrar Cali
if ("municipio" %in% names(datos)) {
datos <- datos %>%
filter(str_to_lower(str_trim(municipio)) == "cali")
# Guardamos este valor antes de filtrar comunas
n_reg_cali <- nrow(datos)
cat("Registros después de filtrar Cali:", n_reg_cali, "\n")
} else {
# Si no existe variable de municipio, se conserva la base completa
n_reg_cali <- nrow(datos)
cat("Sin variable de municipio. Se continúa con todos los registros.\n")
}
## Registros después de filtrar Cali: 29383
# PASO 3: Convertir comunas a numérico y filtrar rango 1-22
datos <- datos %>%
mutate(
comuna_origen = as.integer(comuna_origen),
comuna_destino = as.integer(comuna_destino)
) %>%
filter(
!is.na(comuna_origen), !is.na(comuna_destino),
between(comuna_origen, 1, 22),
between(comuna_destino, 1, 22)
)
# Guardamos el número de registros finales válidos para el análisis
n_reg_final <- nrow(datos)
cat("Registros finales con comunas válidas 1-22:", n_reg_final, "\n")
## Registros finales con comunas válidas 1-22: 22143
cat("Registros con comunas válidas (1-22):", nrow(datos), "\n")
## Registros con comunas válidas (1-22): 22143
# PASO 4: Recodificar tipo de vehículo (valores numéricos según convenciones)
datos <- datos %>%
mutate(
tipo_vehiculo_num = as.integer(tipo_vehiculo),
modo = case_when(
tipo_vehiculo_num == 1 ~ "bicicleta",
tipo_vehiculo_num == 2 ~ "moto",
tipo_vehiculo_num == 3 ~ "automovil",
TRUE ~ "otro"
)
)
cat("\nConteo por modo de transporte:\n")
##
## Conteo por modo de transporte:
print(table(datos$modo))
##
## automovil bicicleta moto otro
## 8600 1223 10304 2016
datos_modos <- datos %>% filter(modo %in% c("bicicleta", "automovil", "moto"))
cat("\nRegistros en los 3 modos de interés:", nrow(datos_modos), "\n")
##
## Registros en los 3 modos de interés: 20127
Después de aplicar los filtros, la base queda concentrada en los viajes asociados a Cali y con comunas válidas entre la 1 y la 22. Este paso es importante porque permite que los registros de la encuesta puedan integrarse correctamente con la cartografía de comunas. En otras palabras, solo se conservan los viajes que tienen una correspondencia clara con las unidades espaciales representadas en el shapefile.
# Conteo general por comuna de origen
conteo_origen <- datos %>%
count(comuna_origen, name = "n_viajes") %>%
arrange(desc(n_viajes)) %>%
mutate(porcentaje = round(n_viajes / sum(n_viajes) * 100, 2)) %>%
rename(comuna = comuna_origen)
# Conteo general por comuna de destino
conteo_destino <- datos %>%
count(comuna_destino, name = "n_viajes") %>%
arrange(desc(n_viajes)) %>%
mutate(porcentaje = round(n_viajes / sum(n_viajes) * 100, 2)) %>%
rename(comuna = comuna_destino)
# Conteo por origen y modo
conteo_origen_modo <- datos_modos %>%
count(comuna_origen, modo, name = "n_viajes") %>%
rename(comuna = comuna_origen)
# Conteo por destino y modo
conteo_destino_modo <- datos_modos %>%
count(comuna_destino, modo, name = "n_viajes") %>%
rename(comuna = comuna_destino)
kable(conteo_origen,
caption = "Tabla 3. Viajes por comuna de origen (total)",
col.names = c("Comuna", "N° Viajes", "Porcentaje (%)")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE)
| Comuna | N° Viajes | Porcentaje (%) |
|---|---|---|
| 2 | 2250 | 10.16 |
| 19 | 2240 | 10.12 |
| 17 | 1762 | 7.96 |
| 3 | 1609 | 7.27 |
| 18 | 1208 | 5.46 |
| 4 | 1193 | 5.39 |
| 10 | 1094 | 4.94 |
| 13 | 1031 | 4.66 |
| 22 | 979 | 4.42 |
| 15 | 974 | 4.40 |
| 8 | 862 | 3.89 |
| 16 | 836 | 3.78 |
| 6 | 797 | 3.60 |
| 9 | 737 | 3.33 |
| 11 | 717 | 3.24 |
| 21 | 693 | 3.13 |
| 1 | 626 | 2.83 |
| 20 | 599 | 2.71 |
| 7 | 583 | 2.63 |
| 14 | 575 | 2.60 |
| 5 | 521 | 2.35 |
| 12 | 257 | 1.16 |
kable(conteo_destino,
caption = "Tabla 4. Viajes por comuna de destino (total)",
col.names = c("Comuna", "N° Viajes", "Porcentaje (%)")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE)
| Comuna | N° Viajes | Porcentaje (%) |
|---|---|---|
| 2 | 3772 | 17.03 |
| 3 | 2884 | 13.02 |
| 19 | 2438 | 11.01 |
| 17 | 1615 | 7.29 |
| 22 | 1561 | 7.05 |
| 4 | 1497 | 6.76 |
| 9 | 1055 | 4.76 |
| 8 | 830 | 3.75 |
| 10 | 741 | 3.35 |
| 16 | 645 | 2.91 |
| 7 | 598 | 2.70 |
| 6 | 570 | 2.57 |
| 13 | 560 | 2.53 |
| 18 | 526 | 2.38 |
| 11 | 483 | 2.18 |
| 15 | 481 | 2.17 |
| 5 | 440 | 1.99 |
| 21 | 434 | 1.96 |
| 14 | 316 | 1.43 |
| 20 | 303 | 1.37 |
| 12 | 207 | 0.93 |
| 1 | 187 | 0.84 |
Las tablas de conteo permiten identificar las comunas con mayor participación antes de observar los mapas. En el caso del origen, las comunas 2 y 19 presentan los mayores volúmenes de viajes, lo que indica que son zonas importantes de generación de desplazamientos dentro de la ciudad. En el caso del destino, la comuna 2 se destaca con una diferencia mayor frente a las demás comunas, seguida por las comunas 3 y 19.
Esta primera lectura tabular permite anticipar el patrón espacial que posteriormente se observa en los mapas: la movilidad no se distribuye de manera uniforme, sino que se concentra en algunas comunas específicas.
# Transformar al sistema WGS84 para compatibilidad con leaflet
comunas2 <- spTransform(comunas,
CRS("+proj=longlat +ellps=WGS84 +datum=WGS84"))
cat("CRS después de la transformación:\n")
## CRS después de la transformación:
print(proj4string(comunas2))
## [1] "+proj=longlat +datum=WGS84 +no_defs"
# Función para integrar conteos al shapefile
integrar_conteos <- function(shp, conteo_df, campo_shp = campo_comuna_shp) {
# Campo de unión como integer en el shapefile
shp@data$comuna_join <- as.integer(shp@data[[campo_shp]])
# Completar con comunas sin viajes (n_viajes = 0)
todas <- data.frame(comuna_join = 1:22)
conteo_completo <- todas %>%
left_join(
conteo_df %>% mutate(comuna_join = as.integer(comuna)),
by = "comuna_join"
) %>%
mutate(n_viajes = ifelse(is.na(n_viajes), 0, n_viajes))
# Unir al @data del shapefile
shp@data <- shp@data %>%
left_join(conteo_completo[, c("comuna_join", "n_viajes")],
by = "comuna_join")
return(shp)
}
comunas_origen_gral <- integrar_conteos(comunas2, conteo_origen)
comunas_destino_gral <- integrar_conteos(comunas2, conteo_destino)
comunas_origen_bici <- integrar_conteos(comunas2, conteo_origen_modo %>% filter(modo == "bicicleta"))
comunas_origen_auto <- integrar_conteos(comunas2, conteo_origen_modo %>% filter(modo == "automovil"))
comunas_origen_moto <- integrar_conteos(comunas2, conteo_origen_modo %>% filter(modo == "moto"))
comunas_destino_bici <- integrar_conteos(comunas2, conteo_destino_modo %>% filter(modo == "bicicleta"))
comunas_destino_auto <- integrar_conteos(comunas2, conteo_destino_modo %>% filter(modo == "automovil"))
comunas_destino_moto <- integrar_conteos(comunas2, conteo_destino_modo %>% filter(modo == "moto"))
cat("Verificación de integración - origen general:\n")
## Verificación de integración - origen general:
head(comunas_origen_gral@data[, c(campo_comuna_shp, "n_viajes")])
Los mapas de coropletas se generan con spplot().
Este mapa muestra el total de viajes originados en cada comuna de Cali. Permite identificar las principales zonas generadoras de movilidad en la ciudad.
spplot(comunas_origen_gral["n_viajes"],
main = "Total de viajes por comuna de origen\nTodos los modos - Cali")
Figura 1. Total de viajes por comuna de origen.
Las comunas con tonalidades más intensas concentran el mayor número de viajes de salida, reflejando las principales zonas residenciales y de actividad desde las cuales los habitantes inician sus desplazamientos diarios.
El mapa general de origen muestra que las comunas 2 y 19 concentran los mayores volúmenes de viajes de salida. Esto permite interpretarlas como zonas generadoras de movilidad dentro de Cali. También se observa una participación relevante de las comunas 17, 3 y 18, lo que indica que la generación de viajes se concentra en varios sectores de la ciudad y no únicamente en una zona.
spplot(comunas_origen_bici["n_viajes"],
main = "Viajes en bicicleta por comuna de origen\nCali")
Figura 2. Viajes en bicicleta por comuna de origen.
La distribución de viajes en bicicleta por origen permite identificar los sectores donde este modo es más frecuente. Este comportamiento podría estar relacionado con trayectos más cortos o condiciones territoriales favorables, aunque para confirmarlo sería necesario incorporar información adicional sobre infraestructura y distancia de viaje.
spplot(comunas_origen_auto["n_viajes"],
main = "Viajes en automovil por comuna de origen\nCali")
Figura 3. Viajes en automóvil por comuna de origen.
El automóvil particular presenta mayor concentración en algunas comunas específicas. Este comportamiento podría estar relacionado con diferencias territoriales en el acceso al vehículo privado, aunque el análisis no permite explicarlo completamente sin variables socioeconómicas adicionales.
spplot(comunas_origen_moto["n_viajes"],
main = "Viajes en moto por comuna de origen\nCali")
Figura 4. Viajes en moto por comuna de origen.
Al diferenciar los viajes por modo de transporte, se observa que bicicleta, automóvil y moto no presentan exactamente el mismo comportamiento espacial. En automóvil, la comuna 19 aparece como el principal origen, seguida por las comunas 2, 3 y 17. En bicicleta y moto, la comuna 2 ocupa el primer lugar como origen, lo que muestra que esta comuna tiene un peso importante en distintos tipos de desplazamiento.
Esta comparación permite ver que el análisis por modo aporta una lectura más detallada que el mapa general, ya que cada medio de transporte responde a dinámicas espaciales diferentes.
Este mapa muestra el total de viajes que tienen como destino cada una de las 22 comunas, identificando las principales zonas atractoras de movilidad en la ciudad.
spplot(comunas_destino_gral["n_viajes"],
main = "Total de viajes por comuna de destino\nTodos los modos - Cali")
Figura 5. Total de viajes por comuna de destino.
En el mapa general de destino se observa una concentración más marcada en la comuna 2, que registra el mayor número de viajes recibidos. Las comunas 3 y 19 también presentan una participación importante. Este comportamiento sugiere la existencia de comunas con alta capacidad de atracción de viajes, posiblemente asociadas a actividades comerciales, laborales, educativas o de servicios.
spplot(comunas_destino_bici["n_viajes"],
main = "Viajes en bicicleta por comuna de destino\nCali")
Figura 6. Viajes en bicicleta por comuna de destino.
Los destinos frecuentes en bicicleta se concentran en algunas comunas específicas. Esto puede sugerir desplazamientos de menor distancia o mayor presencia de actividades cotidianas, aunque el análisis no permite confirmar directamente las condiciones de infraestructura ciclovial.
spplot(comunas_destino_auto["n_viajes"],
main = "Viajes en automovil por comuna de destino\nCali")
Figura 7. Viajes en automóvil por comuna de destino.
Los destinos en automóvil se concentran en algunas comunas específicas. Este patrón podría estar asociado con la presencia de actividades laborales, comerciales, educativas o de servicios, aunque para explicarlo con mayor precisión sería necesario incorporar variables adicionales.
spplot(comunas_destino_moto["n_viajes"],
main = "Viajes en moto por comuna de destino\nCali")
Figura 8. Viajes en moto por comuna de destino.
En los mapas de destino por modo de transporte se observa que la comuna 2 es el principal destino para automóvil, bicicleta y moto. Esto refuerza su papel como una zona atractora de viajes dentro de la ciudad. Las comunas 3, 19, 17 y 22 también aparecen de forma recurrente entre los principales destinos, lo que indica que concentran una parte importante de los desplazamientos registrados.
pal <- colorNumeric(palette = "YlOrRd",
domain = comunas_origen_gral$n_viajes)
leaflet(comunas_origen_gral) %>%
addTiles() %>%
addPolygons(
fillColor = ~pal(n_viajes),
fillOpacity = 0.7,
color = "gray40",
weight = 1,
popup = ~paste0(
"<b>Comuna ", get(campo_comuna_shp), "</b><br>",
"Viajes de origen: <b>", n_viajes, "</b>"
)
) %>%
addLegend(
pal = pal,
values = ~n_viajes,
title = "Viajes de origen",
position = "bottomright"
)
Para complementar la lectura de los mapas, se construyen tablas con las cinco comunas que concentran el mayor número de viajes por cada modo de transporte. Esto permite identificar con mayor precisión cuáles comunas tienen mayor peso en los viajes de origen y destino para bicicleta, automóvil y moto.
# ------------------------------------------------------------
# TOP 5 DE COMUNAS DE ORIGEN POR MODO DE TRANSPORTE
# ------------------------------------------------------------
top5_origen_modo <- conteo_origen_modo %>%
filter(modo %in% c("bicicleta", "automovil", "moto")) %>%
group_by(modo) %>%
mutate(
total_modo = sum(n_viajes, na.rm = TRUE),
porcentaje_modo = n_viajes / total_modo * 100
) %>%
arrange(modo, desc(n_viajes)) %>%
mutate(ranking = row_number()) %>%
filter(ranking <= 5) %>%
ungroup() %>%
mutate(
modo = recode(
modo,
"bicicleta" = "Bicicleta",
"automovil" = "Automóvil",
"moto" = "Moto"
),
porcentaje_modo = paste0(round(porcentaje_modo, 2), "%")
) %>%
select(
Modo = modo,
Ranking = ranking,
Comuna = comuna,
`Viajes de origen` = n_viajes,
`Participación dentro del modo` = porcentaje_modo
)
top5_origen_modo %>%
kable(
caption = "Top 5 comunas de origen por modo de transporte",
align = "c"
) %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE
)
| Modo | Ranking | Comuna | Viajes de origen | Participación dentro del modo |
|---|---|---|---|---|
| Automóvil | 1 | 19 | 922 | 10.72% |
| Automóvil | 2 | 2 | 860 | 10% |
| Automóvil | 3 | 3 | 678 | 7.88% |
| Automóvil | 4 | 17 | 662 | 7.7% |
| Automóvil | 5 | 4 | 443 | 5.15% |
| Bicicleta | 1 | 2 | 122 | 9.98% |
| Bicicleta | 2 | 19 | 113 | 9.24% |
| Bicicleta | 3 | 17 | 103 | 8.42% |
| Bicicleta | 4 | 18 | 85 | 6.95% |
| Bicicleta | 5 | 3 | 84 | 6.87% |
| Moto | 1 | 2 | 1063 | 10.32% |
| Moto | 2 | 19 | 995 | 9.66% |
| Moto | 3 | 17 | 853 | 8.28% |
| Moto | 4 | 3 | 702 | 6.81% |
| Moto | 5 | 18 | 593 | 5.76% |
# ------------------------------------------------------------
# TOP 5 DE COMUNAS DE DESTINO POR MODO DE TRANSPORTE
# ------------------------------------------------------------
top5_destino_modo <- conteo_destino_modo %>%
filter(modo %in% c("bicicleta", "automovil", "moto")) %>%
group_by(modo) %>%
mutate(
total_modo = sum(n_viajes, na.rm = TRUE),
porcentaje_modo = n_viajes / total_modo * 100
) %>%
arrange(modo, desc(n_viajes)) %>%
mutate(ranking = row_number()) %>%
filter(ranking <= 5) %>%
ungroup() %>%
mutate(
modo = recode(
modo,
"bicicleta" = "Bicicleta",
"automovil" = "Automóvil",
"moto" = "Moto"
),
porcentaje_modo = paste0(round(porcentaje_modo, 2), "%")
) %>%
select(
Modo = modo,
Ranking = ranking,
Comuna = comuna,
`Viajes de destino` = n_viajes,
`Participación dentro del modo` = porcentaje_modo
)
top5_destino_modo %>%
kable(
caption = "Top 5 comunas de destino por modo de transporte",
align = "c"
) %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE
)
| Modo | Ranking | Comuna | Viajes de destino | Participación dentro del modo |
|---|---|---|---|---|
| Automóvil | 1 | 2 | 1517 | 17.64% |
| Automóvil | 2 | 3 | 1096 | 12.74% |
| Automóvil | 3 | 19 | 924 | 10.74% |
| Automóvil | 4 | 17 | 650 | 7.56% |
| Automóvil | 5 | 4 | 596 | 6.93% |
| Bicicleta | 1 | 2 | 194 | 15.86% |
| Bicicleta | 2 | 3 | 169 | 13.82% |
| Bicicleta | 3 | 19 | 131 | 10.71% |
| Bicicleta | 4 | 17 | 95 | 7.77% |
| Bicicleta | 5 | 22 | 95 | 7.77% |
| Moto | 1 | 2 | 1734 | 16.83% |
| Moto | 2 | 3 | 1332 | 12.93% |
| Moto | 3 | 19 | 1151 | 11.17% |
| Moto | 4 | 22 | 766 | 7.43% |
| Moto | 5 | 17 | 743 | 7.21% |
Estas tablas permiten complementar el análisis espacial, ya que los mapas muestran la distribución territorial de los viajes, mientras que el Top 5 permite identificar de manera puntual cuáles comunas concentran los mayores volúmenes por cada modo de transporte.
El análisis espacial de la Encuesta Origen-Destino permite identificar que los viajes en Cali no se distribuyen de manera uniforme entre las 22 comunas. Por el contrario, existen comunas que concentran una mayor cantidad de viajes tanto como origen como destino, lo que evidencia diferencias en la función urbana de cada zona de la ciudad.
En términos de origen, las comunas con mayor número de viajes son la comuna 2, con 2.250 viajes, y la comuna 19, con 2.240 viajes. Ambas representan aproximadamente el 20% del total de viajes analizados. Les siguen las comunas 17, 3 y 18, que también presentan una participación importante dentro de la movilidad registrada.
Este resultado indica que las comunas 2 y 19 funcionan como zonas altamente generadoras de viajes. Esto puede estar asociado con su localización, la presencia de actividades residenciales, comerciales o de servicios, y su conexión con otros sectores de la ciudad.
En cuanto a los destinos, la comuna 2 concentra el mayor número de viajes, con 3.772 registros, equivalente al 17,03% del total. Le siguen la comuna 3, con 2.884 viajes, la comuna 19, con 2.438 viajes, la comuna 17, con 1.615 viajes, y la comuna 22, con 1.561 viajes.
Este patrón permite interpretar que la comuna 2 no solo es una zona importante de salida, sino también un nodo fuerte de atracción de viajes. La concentración de destinos en las comunas 2, 3 y 19 sugiere la presencia de centralidades urbanas, zonas de empleo, comercio, educación, salud o servicios que atraen desplazamientos desde diferentes sectores de Cali.
Las tablas de Top 5 por modo de transporte permiten observar con mayor claridad que la distribución de viajes no es igual para bicicleta, automóvil y moto. En bicicleta, los viajes tienden a concentrarse en un grupo específico de comunas. Esto puede estar relacionado con distancias más cortas o condiciones territoriales favorables, aunque no se puede afirmar una causa única con la información disponible.
En automóvil, las comunas con mayor participación pueden estar relacionadas con zonas que concentran actividades residenciales, comerciales, educativas o laborales, además de diferencias en el acceso al vehículo privado. Por su parte, la moto muestra un comportamiento relevante dentro de la movilidad cotidiana, ya que suele ser un modo flexible para trayectos laborales y desplazamientos entre diferentes sectores de la ciudad.
En conjunto, los resultados por modo permiten identificar que cada tipo de vehículo responde a patrones espaciales distintos. Esto refuerza la importancia de analizar la movilidad no solo desde el total general de viajes, sino también diferenciando los medios de transporte utilizados.
En conjunto, los mapas muestran que las comunas 2, 3, 17, 19 y 22 tienen un papel relevante en la movilidad urbana de Cali. Algunas de ellas funcionan principalmente como zonas generadoras de viajes, mientras que otras se destacan como zonas atractoras. La comuna 2 sobresale en ambos sentidos, lo cual permite interpretarla como una centralidad importante dentro de la estructura de movilidad de la ciudad.
Estos resultados permiten comprender cómo los desplazamientos se organizan espacialmente y cómo ciertos sectores concentran mayores flujos de movilidad. Esta información puede ser útil para la planeación del transporte, la priorización de infraestructura vial y el análisis de necesidades diferenciadas por modo de transporte.
El análisis realizado permitió identificar patrones espaciales claros en la movilidad de Cali a partir de la Encuesta Origen-Destino y la cartografía de comunas. Los resultados muestran que los viajes no se distribuyen de forma homogénea entre las 22 comunas, sino que existen zonas con mayor concentración de salidas y llegadas.
En términos de origen, las comunas 2 y 19 se destacan como las principales generadoras de viajes, seguidas por las comunas 17, 3 y 18. Esto indica que estos sectores tienen un papel importante en la producción de desplazamientos cotidianos dentro de la ciudad.
En términos de destino, la comuna 2 presenta la mayor concentración de viajes, seguida por las comunas 3, 19, 17 y 22. Este comportamiento permite interpretar que algunas comunas funcionan como zonas atractoras de movilidad, posiblemente por la presencia de actividades comerciales, laborales, educativas, institucionales o de servicios.
El análisis por modo de transporte evidencia que bicicleta, automóvil y moto no presentan exactamente el mismo patrón espacial. La inclusión del Top 5 por modo permitió complementar los mapas y reconocer de manera más precisa cuáles comunas concentran mayores volúmenes de viajes para cada tipo de vehículo.
En conclusión, la integración de datos alfanuméricos con cartografía de comunas permitió responder adecuadamente las preguntas del caso y visualizar la movilidad urbana desde una perspectiva espacial. Este tipo de análisis resulta útil para reconocer zonas generadoras y atractoras de viajes, así como para apoyar futuras decisiones relacionadas con planeación urbana, transporte e infraestructura.
cat("============================================================\n")
## ============================================================
cat("VALIDACIONES DEL ANÁLISIS\n")
## VALIDACIONES DEL ANÁLISIS
cat("============================================================\n\n")
## ============================================================
cat("1. Registros originales en el Excel:\n")
## 1. Registros originales en el Excel:
cat(" ", nrow(datos_raw), "registros\n\n")
## 35054 registros
cat("2. Registros después de filtrar municipio Cali:\n")
## 2. Registros después de filtrar municipio Cali:
cat(" ", n_reg_cali, "registros\n\n")
## 29383 registros
cat("3. Registros finales usados en el análisis espacial:\n")
## 3. Registros finales usados en el análisis espacial:
cat(" ", n_reg_final, "registros\n\n")
## 22143 registros
cat("4. Registros con comuna origen válida (1-22):\n")
## 4. Registros con comuna origen válida (1-22):
cat(" ", sum(!is.na(datos$comuna_origen) & between(datos$comuna_origen, 1, 22)), "\n\n")
## 22143
cat("5. Registros con comuna destino válida (1-22):\n")
## 5. Registros con comuna destino válida (1-22):
cat(" ", sum(!is.na(datos$comuna_destino) & between(datos$comuna_destino, 1, 22)), "\n\n")
## 22143
cat("6. Conteo por tipo de vehículo recodificado:\n")
## 6. Conteo por tipo de vehículo recodificado:
print(table(datos$modo))
##
## automovil bicicleta moto otro
## 8600 1223 10304 2016
cat("\n7. Comunas de origen representadas:\n")
##
## 7. Comunas de origen representadas:
cat(" ", length(unique(datos$comuna_origen)), "de 22\n")
## 22 de 22
cat(" Min:", min(datos$comuna_origen, na.rm = TRUE),
"| Max:", max(datos$comuna_origen, na.rm = TRUE), "\n\n")
## Min: 1 | Max: 22
cat("8. Verificación del shapefile:\n")
## 8. Verificación del shapefile:
cat(" Polígonos:", length(comunas), "\n")
## Polígonos: 22
cat(" ¿Tiene 22 comunas?", ifelse(length(comunas) == 22, "SÍ", "NO - revisar"), "\n\n")
## ¿Tiene 22 comunas? SÍ
cat("9. Verificación de la integración:\n")
## 9. Verificación de la integración:
cat(" Filas en comunas_origen_gral:", nrow(comunas_origen_gral@data), "\n")
## Filas en comunas_origen_gral: 22
cat(" Comunas sin viajes de origen (n=0):",
sum(comunas_origen_gral@data$n_viajes == 0, na.rm = TRUE), "\n")
## Comunas sin viajes de origen (n=0): 0
cat(" Filas en comunas_destino_gral:", nrow(comunas_destino_gral@data), "\n")
## Filas en comunas_destino_gral: 22
cat(" Comunas sin viajes de destino (n=0):",
sum(comunas_destino_gral@data$n_viajes == 0, na.rm = TRUE), "\n")
## Comunas sin viajes de destino (n=0): 0