1 Introducción

Este informe describe la distribución espacial de los viajes registrados en la Encuesta Origen-Destino de 2015 en Santiago de Cali, a partir de las comunas donde se originan y finalizan los desplazamientos. El análisis se presenta para el total de viajes y para tres medios de transporte: bicicleta, motocicleta y automóvil.

El propósito es identificar las comunas que concentran la generación y la atracción de viajes, como insumo para orientar decisiones de planificación de la movilidad, en particular las relacionadas con la infraestructura para la bicicleta.

2 Fuentes de información y procesamiento

2.1 Fuentes

Se utilizaron dos fuentes de información. La primera es la cartografía de las 22 comunas de Cali en formato shapefile, con geometría de polígonos y sistema de referencia MAGNA Colombia Cali. La segunda es la base de datos de la Encuesta Origen-Destino, en formato Excel, que contiene para cada viaje el municipio y la comuna de origen y destino, el tipo de vehículo y otras características del viajero.

2.2 Procesamiento

La base contiene 35.054 registros y 28 variables. Se seleccionaron únicamente los viajes cuyo origen y destino se encuentran dentro de Cali y en comunas identificadas con los códigos 01 a 22. Se excluyeron, por tanto, los viajes intermunicipales y los registros con comuna codificada como 0 o “Fuera de Cali”. Tras este filtro se conservaron 22.139 viajes.

Los tipos de vehículo se identificaron según la hoja de convenciones de la encuesta: bicicleta (código 1), motocicleta (código 2) y automóvil (código 3). Para cada comuna se contaron los viajes de salida y de llegada, y estos conteos se unieron a la cartografía mediante el código de comuna, verificando que los totales se conservaran después de la unión.

El código completo del procesamiento puede consultarse con el botón Code.

# Paquetes: lectura de Excel, datos espaciales y tablas
library(readxl)
library(sf)
library(knitr)

# Importación de la encuesta
encuesta <- read_excel("EncuestaOrigenDestino.xlsx", sheet = "Hoja1")

# Selección de viajes con origen y destino en las comunas 01 a 22 de Cali
codigos_cali <- sprintf("%02d", 1:22)
municipio_origen  <- toupper(trimws(encuesta$`MUNICIPIO...7`))
municipio_destino <- toupper(trimws(encuesta$`MUNICIPIO...11`))

viajes_cali <- encuesta[
  municipio_origen  %in% c("CALI", "SANTIAGO DE CALI") &
  municipio_destino %in% c("CALI", "SANTIAGO DE CALI") &
  encuesta$`comuna origen`  %in% codigos_cali &
  encuesta$`comuna destino` %in% codigos_cali,
]

# Subconjuntos por tipo de vehículo (1 = bicicleta, 2 = motocicleta, 3 = automóvil)
viajes_bici <- viajes_cali[viajes_cali$`TIPO DE VEHÍCULO` %in% 1, ]
viajes_moto <- viajes_cali[viajes_cali$`TIPO DE VEHÍCULO` %in% 2, ]
viajes_auto <- viajes_cali[viajes_cali$`TIPO DE VEHÍCULO` %in% 3, ]

# Conteo por comuna, conservando las 22 comunas aunque alguna no tenga viajes
contar <- function(datos, variable) {
  as.integer(table(factor(datos[[variable]], levels = codigos_cali)))
}

resumen <- data.frame(
  comuna        = 1:22,
  total_origen  = contar(viajes_cali, "comuna origen"),
  total_destino = contar(viajes_cali, "comuna destino"),
  bici_origen   = contar(viajes_bici, "comuna origen"),
  bici_destino  = contar(viajes_bici, "comuna destino"),
  moto_origen   = contar(viajes_moto, "comuna origen"),
  moto_destino  = contar(viajes_moto, "comuna destino"),
  auto_origen   = contar(viajes_auto, "comuna origen"),
  auto_destino  = contar(viajes_auto, "comuna destino")
)

# Cartografía y unión de los conteos
comunas <- st_read("cali/Comunas.shp", quiet = TRUE)
mapa <- merge(comunas, resumen, by = "comuna", all.x = TRUE)

# Funciones auxiliares
azules <- colorRampPalette(c("#eff3ff", "#08519c"))

mapear <- function(variable, titulo, cortes) {
  plot(mapa[variable], main = titulo, pal = azules,
       breaks = cortes, border = "gray40")
}

miles <- function(x) format(x, big.mark = ".", decimal.mark = ",", trim = TRUE)

top_texto <- function(variable) {
  orden <- order(-resumen[[variable]])[1:3]
  paste0("Comuna ", resumen$comuna[orden], " (", miles(resumen[[variable]][orden]), ")")
}

tabla_top <- function(variables) {
  m <- t(sapply(variables, top_texto))
  data.frame(
    Medio = c("Todos los medios", "Bicicleta", "Motocicleta", "Automóvil"),
    Primera = m[, 1], Segunda = m[, 2], Tercera = m[, 3],
    row.names = NULL
  )
}

cortes_general <- c(0, 800, 1600, 2400, 3200, 4000)
cortes_bici    <- c(0, 40, 80, 120, 160, 200)
cortes_motor   <- c(0, 400, 800, 1200, 1600, 2000)

# Verificación: los totales deben coincidir antes y después de la unión
c(viajes = nrow(viajes_cali),
  origen_en_mapa = sum(mapa$total_origen),
  destino_en_mapa = sum(mapa$total_destino))
##          viajes  origen_en_mapa destino_en_mapa 
##           22139           22139           22139

3 Estructura de los datos

La siguiente tabla presenta el número de viajes analizados por medio de transporte.

totales <- data.frame(
  Medio = c("Todos los medios", "Bicicleta", "Motocicleta", "Automóvil"),
  Viajes = c(nrow(viajes_cali), nrow(viajes_bici), nrow(viajes_moto), nrow(viajes_auto))
)
totales$Porcentaje <- round(100 * totales$Viajes / nrow(viajes_cali), 1)

kable(
  totales,
  col.names = c("Medio de transporte", "Viajes", "% del total"),
  format.args = list(big.mark = ".", decimal.mark = ","),
  caption = "Viajes con origen y destino dentro de Cali según medio de transporte"
)
Viajes con origen y destino dentro de Cali según medio de transporte
Medio de transporte Viajes % del total
Todos los medios 22.139 100,0
Bicicleta 1.223 5,5
Motocicleta 10.302 46,5
Automóvil 8.598 38,8

Los tres medios analizados representan el 90,9 % de los viajes; el 9,1 % restante corresponde a otros tipos de vehículo registrados en la encuesta.

La tabla completa de salidas y llegadas por comuna y medio de transporte se presenta a continuación.

kable(
  resumen,
  col.names = c("Comuna",
                "Total salidas", "Total llegadas",
                "Bicicleta salidas", "Bicicleta llegadas",
                "Moto salidas", "Moto llegadas",
                "Auto salidas", "Auto llegadas"),
  format.args = list(big.mark = "."),
  caption = "Viajes de salida y llegada por comuna según medio de transporte"
)
Viajes de salida y llegada por comuna según medio de transporte
Comuna Total salidas Total llegadas Bicicleta salidas Bicicleta llegadas Moto salidas Moto llegadas Auto salidas Auto llegadas
1 626 187 32 9 296 90 234 73
2 2.249 3.772 122 194 1.062 1.734 860 1.517
3 1.608 2.881 84 169 701 1.330 678 1.095
4 1.193 1.496 58 80 571 678 443 595
5 521 440 28 38 260 183 185 181
6 796 570 29 31 377 255 313 208
7 583 598 30 36 272 279 229 224
8 862 830 46 46 421 382 319 325
9 737 1.055 36 56 317 512 295 382
10 1.094 741 71 34 535 353 404 291
11 717 483 42 26 339 217 268 204
12 257 207 10 13 133 106 88 71
13 1.031 560 62 28 453 285 412 189
14 574 316 32 20 258 150 235 120
15 974 481 55 17 455 232 377 199
16 836 645 65 31 383 290 320 275
17 1.762 1.615 103 95 853 743 662 650
18 1.208 526 85 28 593 240 433 216
19 2.240 2.438 113 131 995 1.151 922 924
20 599 303 33 22 278 124 228 131
21 693 434 35 24 323 202 272 164
22 979 1.561 52 95 427 766 421 564

4 Generación de viajes: comunas de origen

Los mapas de esta sección muestran cuántos viajes salen de cada comuna. Para cada medio de transporte, los mapas de origen y destino comparten la misma escala, de modo que pueden compararse directamente.

4.1 Todos los medios

mapear("total_origen", "Origen: todos los medios", cortes_general)

4.2 Bicicleta

mapear("bici_origen", "Origen: bicicleta", cortes_bici)

4.3 Motocicleta

mapear("moto_origen", "Origen: motocicleta", cortes_motor)

4.4 Automóvil

mapear("auto_origen", "Origen: automóvil", cortes_motor)

4.5 Principales comunas de origen

kable(
  tabla_top(c("total_origen", "bici_origen", "moto_origen", "auto_origen")),
  col.names = c("Medio de transporte", "Primera", "Segunda", "Tercera"),
  caption = "Tres comunas con mayor número de salidas según medio de transporte"
)
Tres comunas con mayor número de salidas según medio de transporte
Medio de transporte Primera Segunda Tercera
Todos los medios Comuna 2 (2.249) Comuna 19 (2.240) Comuna 17 (1.762)
Bicicleta Comuna 2 (122) Comuna 19 (113) Comuna 17 (103)
Motocicleta Comuna 2 (1.062) Comuna 19 (995) Comuna 17 (853)
Automóvil Comuna 19 (922) Comuna 2 (860) Comuna 3 (678)

Las comunas 2, 19 y 17 concentran el mayor número de salidas en el total de viajes, en bicicleta y en motocicleta. En automóvil, la comuna 19 ocupa el primer lugar con 922 salidas, seguida por las comunas 2 y 3.

5 Atracción de viajes: comunas de destino

Los mapas de esta sección muestran cuántos viajes llegan a cada comuna.

5.1 Todos los medios

mapear("total_destino", "Destino: todos los medios", cortes_general)

5.2 Bicicleta

mapear("bici_destino", "Destino: bicicleta", cortes_bici)

5.3 Motocicleta

mapear("moto_destino", "Destino: motocicleta", cortes_motor)

5.4 Automóvil

mapear("auto_destino", "Destino: automóvil", cortes_motor)

5.5 Principales comunas de destino

kable(
  tabla_top(c("total_destino", "bici_destino", "moto_destino", "auto_destino")),
  col.names = c("Medio de transporte", "Primera", "Segunda", "Tercera"),
  caption = "Tres comunas con mayor número de llegadas según medio de transporte"
)
Tres comunas con mayor número de llegadas según medio de transporte
Medio de transporte Primera Segunda Tercera
Todos los medios Comuna 2 (3.772) Comuna 3 (2.881) Comuna 19 (2.438)
Bicicleta Comuna 2 (194) Comuna 3 (169) Comuna 19 (131)
Motocicleta Comuna 2 (1.734) Comuna 3 (1.330) Comuna 19 (1.151)
Automóvil Comuna 2 (1.517) Comuna 3 (1.095) Comuna 19 (924)

En los cuatro casos, las tres comunas con más llegadas son la 2, la 3 y la 19, en ese orden. Las llegadas se concentran en menos comunas que las salidas: en el total de viajes, las tres principales comunas de destino reúnen el 41,1 % de las llegadas (9.091 de 22.139), mientras que las tres principales comunas de origen reúnen el 28,2 % de las salidas (6.251 de 22.139). Además, las comunas 2 y 3 reúnen cerca del 30 % de los destinos en cada medio de transporte.

6 Balance entre llegadas y salidas

El balance se calcula como la diferencia entre los viajes que llegan a una comuna y los que salen de ella. Un valor positivo indica que la comuna recibe más viajes de los que genera; un valor negativo, que genera más de los que recibe.

mapa$balance <- mapa$total_destino - mapa$total_origen

plot(
  mapa["balance"],
  main = "Balance de viajes (llegadas menos salidas): todos los medios",
  pal = colorRampPalette(c("#b2182b", "#f7f7f7", "#2166ac")),
  breaks = c(-800, -400, 0, 400, 800, 1200, 1600),
  border = "gray40"
)

balance <- data.frame(
  Comuna      = resumen$comuna,
  Todos       = resumen$total_destino - resumen$total_origen,
  Bicicleta   = resumen$bici_destino  - resumen$bici_origen,
  Motocicleta = resumen$moto_destino  - resumen$moto_origen,
  Automovil   = resumen$auto_destino  - resumen$auto_origen
)

kable(
  balance,
  col.names = c("Comuna", "Todos los medios", "Bicicleta", "Motocicleta", "Automóvil"),
  format.args = list(big.mark = "."),
  caption = "Balance de viajes por comuna (llegadas menos salidas)"
)
Balance de viajes por comuna (llegadas menos salidas)
Comuna Todos los medios Bicicleta Motocicleta Automóvil
1 -439 -23 -206 -161
2 1.523 72 672 657
3 1.273 85 629 417
4 303 22 107 152
5 -81 10 -77 -4
6 -226 2 -122 -105
7 15 6 7 -5
8 -32 0 -39 6
9 318 20 195 87
10 -353 -37 -182 -113
11 -234 -16 -122 -64
12 -50 3 -27 -17
13 -471 -34 -168 -223
14 -258 -12 -108 -115
15 -493 -38 -223 -178
16 -191 -34 -93 -45
17 -147 -8 -110 -12
18 -682 -57 -353 -217
19 198 18 156 2
20 -296 -11 -154 -97
21 -259 -11 -121 -108
22 582 43 339 143

La comuna 2 presenta el mayor balance positivo, con 1.523 llegadas más que salidas en el total de viajes, seguida por la comuna 3, con 1.273. Las comunas 2, 3, 4, 9 y 22 reciben más viajes de los que generan en los tres medios analizados, mientras que las comunas 1, 10, 13, 14, 15, 18, 20 y 21 generan más viajes de los que reciben en los tres medios.

7 Conclusiones y recomendaciones

7.1 Conclusiones

En los tres medios de transporte analizados, las salidas se distribuyen de forma más dispersa en el territorio que las llegadas, las cuales se concentran en un número reducido de comunas. Las comunas 2 y 3 reúnen cerca del 30 % de los destinos en cada medio: 363 de 1.223 viajes en bicicleta, 3.064 de 10.302 en motocicleta y 2.612 de 8.598 en automóvil. Este patrón indica que ambas comunas funcionan como los principales polos de atracción de viajes de la ciudad, independientemente del vehículo utilizado.

En cuanto a los orígenes, las comunas 2, 19 y 17 se ubican entre las de mayor número de salidas en bicicleta y en motocicleta, y la comuna 19 encabeza las salidas en automóvil con 922 viajes. La comuna 19 presenta además un comportamiento equilibrado, con un volumen de llegadas similar al de salidas, en particular en automóvil (922 salidas y 924 llegadas).

Al comparar llegadas y salidas, se distinguen comunas predominantemente receptoras de viajes (2, 3, 4, 9 y 22) y comunas predominantemente emisoras (1, 10, 13, 14, 15, 18, 20 y 21), con un comportamiento consistente en los tres medios de transporte.

7.2 Recomendaciones

Para la planificación de la movilidad en bicicleta, los corredores que conectan las comunas emisoras con las comunas 2 y 3 son prioritarios para evaluar la suficiencia de la infraestructura de ciclorrutas. Esta evaluación requiere contrastar los mapas con la red de ciclorrutas existente.

Se recomienda complementar este análisis con la matriz de viajes entre pares de comunas, que permitiría identificar los corredores específicos de mayor demanda, y con la variable de motivo del viaje, para explicar la concentración de destinos en las comunas 2 y 3.

7.3 Limitaciones

Los valores presentados corresponden a viajes registrados en la Encuesta Origen-Destino 2015 y no a totales poblacionales, por lo que reflejan la distribución relativa de los desplazamientos y no su magnitud absoluta en la ciudad. Además, el análisis se restringe a los viajes con origen y destino dentro de las 22 comunas, por lo que no describe los desplazamientos intermunicipales.