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.
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.
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
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"
)
| 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"
)
| 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 |
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.
mapear("total_origen", "Origen: todos los medios", cortes_general)
mapear("bici_origen", "Origen: bicicleta", cortes_bici)
mapear("moto_origen", "Origen: motocicleta", cortes_motor)
mapear("auto_origen", "Origen: automóvil", cortes_motor)
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"
)
| 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.
Los mapas de esta sección muestran cuántos viajes llegan a cada comuna.
mapear("total_destino", "Destino: todos los medios", cortes_general)
mapear("bici_destino", "Destino: bicicleta", cortes_bici)
mapear("moto_destino", "Destino: motocicleta", cortes_motor)
mapear("auto_destino", "Destino: automóvil", cortes_motor)
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"
)
| 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.
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)"
)
| 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.
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.
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.
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.