1 Introducción

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:

  1. Datos espaciales: cartografía de comunas de Cali en formato shapefile, que representa las unidades territoriales como polígonos.
  2. Datos no espaciales o temáticos: registros de viajes provenientes de una Encuesta Origen-Destino, con información sobre punto de partida, destino y modo de transporte.
  3. Visualización espacial: mapas de coropletas por comuna para identificar concentraciones de movilidad.

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.


2 Planteamiento del Problema

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:

  • ¿Desde qué comunas salen más viajes en Cali?
  • ¿Hacia qué comunas llegan más viajes?
  • ¿Qué diferencias existen entre los patrones de movilidad según el modo de transporte (bicicleta, automóvil y moto)?
  • ¿Qué zonas de la ciudad concentran mayor movilidad como origen y como destino?

3 Carga de Librerías

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)

4 Importación de la Cartografía

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)


5 Importación del Archivo Excel

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"
  )
Tabla 1. Convenciones de variables - Encuesta Origen-Destino
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")
Tabla 2. Primeras 10 filas de la Encuesta Origen-Destino
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

6 Definición de Variables del Análisis

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"

7 Limpieza y Preparación de los Datos

# 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.


8 Tablas de Conteo por Comuna

# 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)
Tabla 3. Viajes por comuna de origen (total)
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)
Tabla 4. Viajes por comuna de destino (total)
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.


9 Integración Espacial con la Cartografía

# 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")])

10 Mapas por Comuna de Origen

Los mapas de coropletas se generan con spplot().

10.1 Mapa General de Origen

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.

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.


10.2 Mapa de Origen - Bicicleta

spplot(comunas_origen_bici["n_viajes"],
       main = "Viajes en bicicleta por comuna de origen\nCali")
Figura 2. Viajes en bicicleta por comuna de origen.

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.


10.3 Mapa de Origen - Automóvil

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.

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.


10.4 Mapa de Origen - Moto

spplot(comunas_origen_moto["n_viajes"],
       main = "Viajes en moto por comuna de origen\nCali")
Figura 4. Viajes en moto por comuna de origen.

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.


11 Mapas por Comuna de Destino

11.1 Mapa General de Destino

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.

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.


11.2 Mapa de Destino - Bicicleta

spplot(comunas_destino_bici["n_viajes"],
       main = "Viajes en bicicleta por comuna de destino\nCali")
Figura 6. Viajes en bicicleta por comuna de destino.

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.


11.3 Mapa de Destino - Automóvil

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.

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.


11.4 Mapa de Destino - Moto

spplot(comunas_destino_moto["n_viajes"],
       main = "Viajes en moto por comuna de destino\nCali")
Figura 8. Viajes en moto por comuna de destino.

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.


12 Visualización Interactiva con Leaflet

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"
  )

13 Top 5 de comunas por modo de transporte

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
  )
Top 5 comunas de origen por modo de transporte
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
  )
Top 5 comunas de destino por modo de transporte
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.


14 Análisis de Resultados

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.

14.1 Comunas generadoras de viajes

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.

14.2 Comunas atractoras de viajes

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.

14.3 Diferencias por modo de transporte

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.

14.4 Lectura espacial general

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.

15 Conclusiones

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.


16 Validaciones del Análisis

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