La presente actividad busca analizar los patrones espaciales de movilidad en la ciudad de Cali a partir de la Encuesta Origen-Destino, la cual recopila trayectos realizados por distintos medios de transporte.
El objetivo principal es identificar desde qué comunas se originan la mayoría de los viajes y hacia dónde se dirigen, además de comparar los patrones según el tipo de vehículo utilizado: bicicleta, motocicleta y automóvil.
El análisis combina herramientas de procesamiento de datos en R y cartografía en formato shapefile, generando mapas interactivos que permiten visualizar la distribución espacial de los flujos de transporte urb
# Cargar datos
datos <- read_excel("EncuestaOrigenDestino.xlsx", sheet = "Hoja1") %>%
clean_names() %>%
rename(tipo_vehiculo = tipo_de_vehiculo)
# Convertir códigos numéricos en texto ("COMUNA X")
datos <- datos %>%
mutate(
comuna_origen_nom = paste("COMUNA", as.numeric(comuna_origen)),
comuna_destino_nom = paste("COMUNA", as.numeric(comuna_destino))
)
# Estandarizar a mayúsculas
datos <- datos %>%
mutate(across(ends_with("_nom"), str_to_upper))
# Reemplazar los códigos de tipo de vehículo
datos <- datos %>%
mutate(
tipo_vehiculo = case_when(
tipo_vehiculo == 1 ~ "Bicicleta",
tipo_vehiculo == 2 ~ "Moto",
tipo_vehiculo == 3 ~ "Automovil",
TRUE ~ NA_character_
)
)
# Cargar shapefile y transformar CRS
comunas <- st_read("Comunas.shp", quiet = TRUE) %>%
st_transform(crs = 4326) %>%
mutate(nombre = str_trim(str_to_upper(nombre)))
El procesamiento de datos constituye una etapa esencial para garantizar la calidad y consistencia de la información empleada en el análisis espacial. En esta fase se ejecutan tareas de estandarización, conteo y vinculación con la cartografía base de las comunas de Cali, permitiendo preparar los datos para su visualización en los mapas temáticos posteriores.
Se homogenizan los nombres de las comunas tanto de origen como de destino para evitar inconsistencias derivadas de mayúsculas, minúsculas o espacios.
Se emplearon técnicas de análisis espacial en R mediante los
paquetes sf, dplyr y tmap, lo que permitió integrar
datos tabulares y geográficos a través de uniones
(left_join()).
Los datos fueron proyectados en el sistema de coordenadas
geográficas EPSG:4326, garantizando coherencia espacial con la
cartografía de comunas de Cali.
Los mapas se generaron en modo interactivo utilizando
tmap y leaflet, asegurando una visualización clara,
dinámica y fácilmente exploratoria de los resultados.
En esta sección se presenta un conteo general de los registros
contenidos en el archivo EncuestaOrigenDestino.xlsx, considerando
únicamente a las personas cuyo lugar de origen pertenece a alguna de las
comunas de la ciudad de Cali.
A partir de este filtrado, se obtiene el número total de
individuos por comuna de origen, con el propósito de analizar y
representar gráficamente los flujos de movilidad dentro del
territorio urbano.
Este análisis permite identificar las comunas con mayor y menor
participación en la generación de viajes, proporcionando una base sólida
para la interpretación espacial de los patrones de desplazamiento en la
ciudad.
tmap_mode("view")
tm_shape(comunas_origen) +
tm_polygons(
col = "viajes_origen",
palette = "-YlOrRd",
style = "quantile",
alpha = 0.9,
border.col = "gray40",
id = "nombre",
popup.vars = c("Comuna:" = "nombre", "Viajes:" = "viajes_origen"),
title = "Número de viajes"
) +
tm_bubbles(size = "viajes_origen", col = "darkred", alpha = 0.5, border.col = "white") +
tm_layout(
title = "Mapa 1. Comuna de Origen - Todos los vehículos",
frame = FALSE,
legend.outside = TRUE,
main.title.size = 1.3
)
# Calcular top 5 y bottom 5 comunas según número de viajes de origen
top5_origen <- comunas_origen %>%
st_drop_geometry() %>% # elimina la geometría para poder ordenar
arrange(desc(viajes_origen)) %>%
slice_head(n = 5)
bottom5_origen <- comunas_origen %>%
st_drop_geometry() %>%
arrange(viajes_origen) %>%
slice_head(n = 5)
# Mostrar tablas en consola o en el documento
knitr::kable(top5_origen, caption = "Top 5 comunas con mayor número de viajes de origen")
| OBJECTID | gid | comuna | nombre | viajes_origen |
|---|---|---|---|---|
| 1 | 107 | 2 | COMUNA 2 | 2968 |
| 4 | 110 | 19 | COMUNA 19 | 2850 |
| 6 | 104 | 17 | COMUNA 17 | 2377 |
| 3 | 109 | 3 | COMUNA 3 | 2121 |
| 7 | 105 | 18 | COMUNA 18 | 1536 |
knitr::kable(bottom5_origen, caption = "Top 5 comunas con menor número de viajes de origen")
| OBJECTID | gid | comuna | nombre | viajes_origen |
|---|---|---|---|---|
| 17 | 97 | 12 | COMUNA 12 | 348 |
| 11 | 91 | 5 | COMUNA 5 | 664 |
| 18 | 98 | 14 | COMUNA 14 | 685 |
| 21 | 101 | 20 | COMUNA 20 | 733 |
| 12 | 92 | 7 | COMUNA 7 | 734 |
En esta subsección se analiza el uso de la bicicleta como
medio de transporte, a partir del conteo de registros por comuna de
origen.
El objetivo es identificar las zonas de Cali donde se concentra el uso
de este vehículo y reconocer patrones espaciales de movilidad sostenible
dentro de la ciudad.
datos_bici <- datos %>% filter(tipo_vehiculo == "Bicicleta")
conteo_bici <- datos_bici %>% count(comuna_origen_nom, name = "viajes_bici")
comunas_bici <- comunas %>%
left_join(conteo_bici, by = c("nombre" = "comuna_origen_nom"))
comunas_bici$viajes_bici[is.na(comunas_bici$viajes_bici)] <- 0
tm_shape(comunas_bici) +
tm_polygons(
"viajes_bici",
palette = "Greens",
style = "quantile",
alpha = 0.9,
id = "nombre",
popup.vars = c("Comuna:" = "nombre", "Viajes (bici):" = "viajes_bici")
) +
tm_bubbles(size = "viajes_bici", col = "darkgreen", alpha = 0.5) +
tm_layout(title = "Mapa 2. Origen - Bicicleta", frame = FALSE)
# Calcular top 5 y bottom 5 comunas según número de viajes bici
top5_origen_bici <- comunas_bici %>%
st_drop_geometry() %>% # elimina la geometría para poder ordenar
arrange(desc(viajes_bici)) %>%
slice_head(n = 5)
bottom5_origen_bici <- comunas_bici %>%
st_drop_geometry() %>%
arrange(viajes_bici) %>%
slice_head(n = 5)
# Mostrar tablas en consola o en el documento
knitr::kable(top5_origen_bici, caption = "Top 5 comunas con mayor número de viajes de bici")
| OBJECTID | gid | comuna | nombre | viajes_bici |
|---|---|---|---|---|
| 1 | 107 | 2 | COMUNA 2 | 159 |
| 4 | 110 | 19 | COMUNA 19 | 141 |
| 6 | 104 | 17 | COMUNA 17 | 141 |
| 7 | 105 | 18 | COMUNA 18 | 111 |
| 3 | 109 | 3 | COMUNA 3 | 99 |
knitr::kable(bottom5_origen_bici, caption = "Top 5 comunas con menor número de viajes de bici")
| OBJECTID | gid | comuna | nombre | viajes_bici |
|---|---|---|---|---|
| 17 | 97 | 12 | COMUNA 12 | 14 |
| 12 | 92 | 7 | COMUNA 7 | 35 |
| 2 | 108 | 1 | COMUNA 1 | 36 |
| 18 | 98 | 14 | COMUNA 14 | 37 |
| 11 | 91 | 5 | COMUNA 5 | 38 |
En este apartado se analizan los desplazamientos cuyo medio de
transporte es la motocicleta.
El objetivo es identificar las comunas que concentran la mayor cantidad
de viajes en este tipo de vehículo y comprender cómo su distribución
contribuye a los patrones generales de movilidad en la ciudad de
Cali.
datos_moto <- datos %>% filter(tipo_vehiculo == "Moto")
conteo_moto <- datos_moto %>% count(comuna_origen_nom, name = "viajes_moto")
comunas_moto <- comunas %>%
left_join(conteo_moto, by = c("nombre" = "comuna_origen_nom"))
comunas_moto$viajes_moto[is.na(comunas_moto$viajes_moto)] <- 0
tm_shape(comunas_moto) +
tm_polygons(
"viajes_moto",
palette = "Blues",
style = "quantile",
alpha = 0.9,
id = "nombre",
popup.vars = c("Comuna:" = "nombre", "Viajes (moto):" = "viajes_moto")
) +
tm_bubbles(size = "viajes_moto", col = "navy", alpha = 0.5) +
tm_layout(title = "Mapa 3. Origen - Moto", frame = FALSE)
# Calcular top 5 y bottom 5 comunas según número de viajes moto
top5_origen_moto <- comunas_moto %>%
st_drop_geometry() %>% # elimina la geometría para poder ordenar
arrange(desc(viajes_moto)) %>%
slice_head(n = 5)
bottom5_origen_moto <- comunas_moto %>%
st_drop_geometry() %>%
arrange(viajes_moto) %>%
slice_head(n = 5)
# Mostrar tablas en consola o en el documento
knitr::kable(top5_origen_moto, caption = "Top 5 comunas con mayor número de viajes de moto")
| OBJECTID | gid | comuna | nombre | viajes_moto |
|---|---|---|---|---|
| 1 | 107 | 2 | COMUNA 2 | 1414 |
| 4 | 110 | 19 | COMUNA 19 | 1280 |
| 6 | 104 | 17 | COMUNA 17 | 1136 |
| 3 | 109 | 3 | COMUNA 3 | 970 |
| 7 | 105 | 18 | COMUNA 18 | 746 |
knitr::kable(bottom5_origen_moto, caption = "Top 5 comunas con menor número de viajes de moto")
| OBJECTID | gid | comuna | nombre | viajes_moto |
|---|---|---|---|---|
| 17 | 97 | 12 | COMUNA 12 | 176 |
| 18 | 98 | 14 | COMUNA 14 | 310 |
| 11 | 91 | 5 | COMUNA 5 | 319 |
| 21 | 101 | 20 | COMUNA 20 | 339 |
| 12 | 92 | 7 | COMUNA 7 | 350 |
En esta sección se analizan los viajes cuyo medio de transporte es el
automóvil, con el fin de identificar las comunas que generan la
mayor cantidad de desplazamientos particulares.
El propósito es reconocer cómo el uso del vehículo privado contribuye a
los flujos de movilidad urbana y su relación con los patrones espaciales
observados en la ciudad de Cali.
datos_auto <- datos %>% filter(tipo_vehiculo == "Automovil")
conteo_auto <- datos_auto %>% count(comuna_origen_nom, name = "viajes_auto")
comunas_auto <- comunas %>%
left_join(conteo_auto, by = c("nombre" = "comuna_origen_nom"))
comunas_auto$viajes_auto[is.na(comunas_auto$viajes_auto)] <- 0
tm_shape(comunas_auto) +
tm_polygons(
"viajes_auto",
palette = "Purples",
style = "quantile",
alpha = 0.9,
id = "nombre",
popup.vars = c("Comuna:" = "nombre", "Viajes (automóvil):" = "viajes_auto")
) +
tm_bubbles(size = "viajes_auto", col = "purple4", alpha = 0.5) +
tm_layout(title = "Mapa 4. Origen - Automóvil", frame = FALSE)
# Calcular top 5 y bottom 5 comunas según número de viajes auto
top5_origen_auto <- comunas_auto %>%
st_drop_geometry() %>% # elimina la geometría para poder ordenar
arrange(desc(viajes_auto)) %>%
slice_head(n = 5)
bottom5_origen_auto <- comunas_auto %>%
st_drop_geometry() %>%
arrange(viajes_auto) %>%
slice_head(n = 5)
# Mostrar tablas en consola o en el documento
knitr::kable(top5_origen_auto, caption = "Top 5 comunas con mayor número de viajes de auto")
| OBJECTID | gid | comuna | nombre | viajes_auto |
|---|---|---|---|---|
| 4 | 110 | 19 | COMUNA 19 | 1165 |
| 1 | 107 | 2 | COMUNA 2 | 1121 |
| 6 | 104 | 17 | COMUNA 17 | 899 |
| 3 | 109 | 3 | COMUNA 3 | 854 |
| 7 | 105 | 18 | COMUNA 18 | 559 |
knitr::kable(bottom5_origen_auto, caption = "Top 5 comunas con menor número de viajes de auto")
| OBJECTID | gid | comuna | nombre | viajes_auto |
|---|---|---|---|---|
| 17 | 97 | 12 | COMUNA 12 | 123 |
| 11 | 91 | 5 | COMUNA 5 | 241 |
| 18 | 98 | 14 | COMUNA 14 | 272 |
| 21 | 101 | 20 | COMUNA 20 | 272 |
| 12 | 92 | 7 | COMUNA 7 | 283 |
En esta nueva sección se analizan los patrones de destino de
los desplazamientos dentro de la ciudad de Cali.
El objetivo es identificar las comunas que actúan como principales
polos de atracción de viajes según el medio de transporte utilizado
(bicicleta, motocicleta y automóvil), contrastando estos resultados con
los patrones observados en las comunas de origen.
tm_shape(comunas_destino) +
tm_polygons(
"viajes_destino",
palette = "YlGnBu",
style = "quantile",
alpha = 0.9,
id = "nombre",
popup.vars = c("Comuna:" = "nombre", "Viajes destino:" = "viajes_destino")
) +
tm_bubbles(size = "viajes_destino", col = "blue", alpha = 0.4) +
tm_layout(title = "Mapa 5. Comuna de Destino - Todos los vehículos", frame = FALSE)
# Calcular top 5 y bottom 5 comunas según número de viajes
top5_destino <- comunas_destino %>%
st_drop_geometry() %>% # elimina la geometría para poder ordenar
arrange(desc(viajes_destino)) %>%
slice_head(n = 5)
bottom5_destino <- comunas_destino %>%
st_drop_geometry() %>%
arrange(viajes_destino) %>%
slice_head(n = 5)
# Mostrar tablas en consola o en el documento
knitr::kable(top5_destino, caption = "Top 5 comunas con mayor número de viajes")
| OBJECTID | gid | comuna | nombre | viajes_destino |
|---|---|---|---|---|
| 1 | 107 | 2 | COMUNA 2 | 4810 |
| 3 | 109 | 3 | COMUNA 3 | 3859 |
| 4 | 110 | 19 | COMUNA 19 | 3158 |
| 6 | 104 | 17 | COMUNA 17 | 2164 |
| 8 | 106 | 22 | COMUNA 22 | 1860 |
knitr::kable(bottom5_destino, caption = "Top 5 comunas con menor número de viajes")
| OBJECTID | gid | comuna | nombre | viajes_destino |
|---|---|---|---|---|
| 2 | 108 | 1 | COMUNA 1 | 230 |
| 17 | 97 | 12 | COMUNA 12 | 246 |
| 21 | 101 | 20 | COMUNA 20 | 351 |
| 18 | 98 | 14 | COMUNA 14 | 379 |
| 15 | 95 | 21 | COMUNA 21 | 515 |
En este apartado se analizan los desplazamientos cuyo medio de
transporte es la bicicleta, con el fin de identificar las comunas
que reciben la mayor cantidad de viajes realizados en este tipo de
vehículo.
El objetivo es reconocer los principales polos de atracción para
la movilidad sostenible dentro del territorio urbano de Cali y comparar
su comportamiento frente a los patrones observados en el origen.
# Conteo y unión para bicicleta (destinos)
conteo_dest_bici <- datos_bici %>%
count(comuna_destino_nom, name = "viajes_dest_bici")
comunas_dest_bici <- comunas %>%
left_join(conteo_dest_bici, by = c("nombre" = "comuna_destino_nom"))
comunas_dest_bici$viajes_dest_bici[is.na(comunas_dest_bici$viajes_dest_bici)] <- 0
# Mapa interactivo
tm_shape(comunas_dest_bici) +
tm_polygons(
"viajes_dest_bici",
palette = "Greens",
style = "quantile",
alpha = 0.9,
id = "nombre",
popup.vars = c("Comuna:" = "nombre", "Viajes destino (bici):" = "viajes_dest_bici")
) +
tm_bubbles(size = "viajes_dest_bici", col = "darkgreen", alpha = 0.5, border.col = "white") +
tm_layout(
title = "Mapa 6. Destino - Bicicleta",
frame = FALSE,
legend.outside = TRUE
)
# Calcular top 5 y bottom 5 comunas según número de viajes
top5_destino_bici <- comunas_dest_bici %>%
st_drop_geometry() %>% # elimina la geometría para poder ordenar
arrange(desc(viajes_dest_bici)) %>%
slice_head(n = 5)
bottom5_destino_bici <- comunas_dest_bici %>%
st_drop_geometry() %>%
arrange(viajes_dest_bici) %>%
slice_head(n = 5)
# Mostrar tablas en consola o en el documento
knitr::kable(top5_destino_bici, caption = "Top 5 comunas con mayor número de viajes Bici")
| OBJECTID | gid | comuna | nombre | viajes_dest_bici |
|---|---|---|---|---|
| 1 | 107 | 2 | COMUNA 2 | 218 |
| 3 | 109 | 3 | COMUNA 3 | 189 |
| 4 | 110 | 19 | COMUNA 19 | 147 |
| 6 | 104 | 17 | COMUNA 17 | 115 |
| 8 | 106 | 22 | COMUNA 22 | 100 |
knitr::kable(bottom5_destino_bici, caption = "Top 5 comunas con menor número de viajes Bici")
| OBJECTID | gid | comuna | nombre | viajes_dest_bici |
|---|---|---|---|---|
| 2 | 108 | 1 | COMUNA 1 | 12 |
| 17 | 97 | 12 | COMUNA 12 | 15 |
| 5 | 103 | 15 | COMUNA 15 | 20 |
| 18 | 98 | 14 | COMUNA 14 | 22 |
| 21 | 101 | 20 | COMUNA 20 | 25 |
En esta sección se examinan los desplazamientos cuyo medio de
transporte es la motocicleta, con el propósito de identificar las
comunas que actúan como principales polos de atracción de este
tipo de viajes.
Este análisis permite comprender cómo la moto contribuye al patrón
general de movilidad urbana en Cali y qué sectores concentran la mayor
llegada de vehículos motorizados de dos ruedas.
# Conteo y unión para moto (destinos)
conteo_dest_moto <- datos_moto %>%
count(comuna_destino_nom, name = "viajes_dest_moto")
comunas_dest_moto <- comunas %>%
left_join(conteo_dest_moto, by = c("nombre" = "comuna_destino_nom"))
comunas_dest_moto$viajes_dest_moto[is.na(comunas_dest_moto$viajes_dest_moto)] <- 0
# Mapa interactivo
tm_shape(comunas_dest_moto) +
tm_polygons(
"viajes_dest_moto",
palette = "Blues",
style = "quantile",
alpha = 0.9,
id = "nombre",
popup.vars = c("Comuna:" = "nombre", "Viajes destino (moto):" = "viajes_dest_moto")
) +
tm_bubbles(size = "viajes_dest_moto", col = "navy", alpha = 0.5, border.col = "white") +
tm_layout(
title = "Mapa 7. Destino - Moto",
frame = FALSE,
legend.outside = TRUE
)
# Calcular top 5 y bottom 5 comunas según número de viajes moto
top5_destino_moto <- comunas_dest_moto %>%
st_drop_geometry() %>% # elimina la geometría para poder ordenar
arrange(desc(viajes_dest_moto)) %>%
slice_head(n = 5)
bottom5_destino_moto <- comunas_dest_moto %>%
st_drop_geometry() %>%
arrange(viajes_dest_moto) %>%
slice_head(n = 5)
# Mostrar tablas en consola o en el documento
knitr::kable(top5_destino_moto, caption = "Top 5 comunas con mayor número de viajes Moto")
| OBJECTID | gid | comuna | nombre | viajes_dest_moto |
|---|---|---|---|---|
| 1 | 107 | 2 | COMUNA 2 | 2177 |
| 3 | 109 | 3 | COMUNA 3 | 1734 |
| 4 | 110 | 19 | COMUNA 19 | 1421 |
| 6 | 104 | 17 | COMUNA 17 | 927 |
| 8 | 106 | 22 | COMUNA 22 | 911 |
knitr::kable(bottom5_destino_moto, caption = "Top 5 comunas con menor número de viajes Moto")
| OBJECTID | gid | comuna | nombre | viajes_dest_moto |
|---|---|---|---|---|
| 2 | 108 | 1 | COMUNA 1 | 112 |
| 17 | 97 | 12 | COMUNA 12 | 128 |
| 21 | 101 | 20 | COMUNA 20 | 151 |
| 18 | 98 | 14 | COMUNA 14 | 188 |
| 11 | 91 | 5 | COMUNA 5 | 215 |
En este apartado se analizan los desplazamientos cuyo medio de
transporte es el automóvil, con el fin de identificar las comunas
que reciben la mayor cantidad de viajes particulares.
El propósito es reconocer las áreas de la ciudad con mayor atracción
de vehículos privados y comprender su relación con los ejes de
actividad económica y residencial de Cali.
# Conteo y unión para automóvil (destinos)
conteo_dest_auto <- datos_auto %>%
count(comuna_destino_nom, name = "viajes_dest_auto")
comunas_dest_auto <- comunas %>%
left_join(conteo_dest_auto, by = c("nombre" = "comuna_destino_nom"))
comunas_dest_auto$viajes_dest_auto[is.na(comunas_dest_auto$viajes_dest_auto)] <- 0
# Mapa interactivo
tm_shape(comunas_dest_auto) +
tm_polygons(
"viajes_dest_auto",
palette = "Purples",
style = "quantile",
alpha = 0.9,
id = "nombre",
popup.vars = c("Comuna:" = "nombre", "Viajes destino (auto):" = "viajes_dest_auto")
) +
tm_bubbles(size = "viajes_dest_auto", col = "purple4", alpha = 0.5, border.col = "white") +
tm_layout(
title = "Mapa 8. Destino - Automóvil",
frame = FALSE,
legend.outside = TRUE
)
# Calcular top 5 y bottom 5 comunas según número de viajes auto
top5_destino_auto <- comunas_dest_auto %>%
st_drop_geometry() %>% # elimina la geometría para poder ordenar
arrange(desc(viajes_dest_auto)) %>%
slice_head(n = 5)
bottom5_destino_auto <- comunas_dest_auto %>%
st_drop_geometry() %>%
arrange(viajes_dest_auto) %>%
slice_head(n = 5)
# Mostrar tablas en consola o en el documento
knitr::kable(top5_destino_auto, caption = "Top 5 comunas con mayor número de viajes Auto")
| OBJECTID | gid | comuna | nombre | viajes_dest_auto |
|---|---|---|---|---|
| 1 | 107 | 2 | COMUNA 2 | 2006 |
| 3 | 109 | 3 | COMUNA 3 | 1557 |
| 4 | 110 | 19 | COMUNA 19 | 1302 |
| 6 | 104 | 17 | COMUNA 17 | 959 |
| 10 | 90 | 4 | COMUNA 4 | 757 |
knitr::kable(bottom5_destino_auto, caption = "Top 5 comunas con menor número de viajes Auto")
| OBJECTID | gid | comuna | nombre | viajes_dest_auto |
|---|---|---|---|---|
| 17 | 97 | 12 | COMUNA 12 | 85 |
| 2 | 108 | 1 | COMUNA 1 | 86 |
| 18 | 98 | 14 | COMUNA 14 | 138 |
| 21 | 101 | 20 | COMUNA 20 | 144 |
| 15 | 95 | 21 | COMUNA 21 | 198 |
El análisis de los patrones de movilidad en la ciudad de Cali, basado en la Encuesta Origen–Destino y segmentado por tipo de vehículo (bicicleta, motocicleta y automóvil), permite identificar una estructura urbana policéntrica, aunque con una fuerte centralización funcional en torno a unas pocas comunas que concentran la mayor parte de los flujos de origen y destino.
Los resultados confirman que las Comunas 2, 3, 17, 19 y 22 conforman el eje dominante de la movilidad caleña, actuando como polos tanto de generación como de atracción de viajes.
La Comuna 2 emerge como el máximo centro de destino para todos los modos de transporte, especialmente moto y carro, lo que refuerza su rol como núcleo de servicios, oficinas, comercio y empleo.
La Comuna 3 (centro histórico) mantiene una función estructural de conexión y actividad, recibiendo altos flujos diarios.
Las Comunas 17 y 19, en el suroccidente, combinan funciones residenciales de estratos medio-altos con una creciente centralidad comercial y educativa, configurándose como subcentros urbanos consolidados.
La Comuna 22, aunque originalmente residencial, muestra un rol dual: punto de origen de viajes y nuevo destino emergente vinculado al desarrollo universitario y empresarial del sur.
El estudio revela una marcada desigualdad espacial en la
distribución de los desplazamientos.
Las comunas periféricas (como la 1, 5, 12, 14 y 20) tienen baja
participación tanto en origen como en destino, lo que evidencia
limitaciones de conectividad, acceso a empleo y concentración de
servicios en el eje central y suroccidental de la ciudad.
Esta asimetría indica que la movilidad en Cali no solo responde a
patrones de transporte, sino también a desigualdades socioespaciales
históricas entre el centro y la periferia.
El análisis por medio de transporte muestra patrones complementarios que refuerzan la estructura general:
Los resultados evidencian la necesidad de políticas de movilidad diferenciadas por zona y modo de transporte.
En el centro y norte (Comunas 2 y 3), urge priorizar la gestión del tráfico, el estacionamiento y el acceso al transporte público, dada la enorme presión de vehículos y motos.
En el suroccidente (Comunas 17, 19 y 22), se recomienda consolidar corredores integrados que equilibren el flujo entre zonas residenciales y de servicios.
En las comunas periféricas, las estrategias deben centrarse en mejorar la accesibilidad y conectividad mediante transporte público eficiente, ciclovías seguras y soluciones de micromovilidad.
En conjunto, el patrón de movilidad en Cali describe una ciudad que,
pese a su expansión hacia el sur y occidente, mantiene un corazón
funcional altamente concentrado en pocas comunas centrales.
La coexistencia de zonas generadoras y atractoras en el eje
2–3–19–17–22 revela un sistema urbano con flujo pendular
dominante, donde los desplazamientos diarios reafirman la relación
entre residencia y actividad económica.
Comprender esta estructura es fundamental para orientar las futuras
decisiones en infraestructura vial, transporte público, planeación
territorial y sostenibilidad urbana.