1. Resumen Ejecutivo

Se realizará un estudio sobre el conteo de personas cuya comuna de origen se encuentra en la ciudad de Cali, con el propósito de identificar el número de personas que se movilizan desde Cali utilizando tres tipos de vehículos: bicicleta, motocicleta y automóvil. Los resultados se visualizarán en diferentes mapas temáticos, con el fin de analizar en qué comunas es más común el uso de cada tipo de vehículo y, en general, desde qué zonas de la ciudad se presenta mayor movimiento poblacional.

# 1. Carga archivo shapefile "Comunas.shp" de la ruta.
comunas <- st_read("/Users/jesusposso/Documents/Maestria/2025-2/SIG/M1U1/Actividad1/Actividad1/Datos/cali/Comunas.shp",
  quiet = TRUE # Esto suprime los mensajes informativos
)

# 2. Carga archivo de Excel para ser transformado en archivo .shp
datos_excel <- read_excel("/Users/jesusposso/Documents/Maestria/2025-2/SIG/M1U1/Actividad1/Actividad1/Datos/EncuestaOrigenDestino.xlsx", sheet = "Hoja1")

# 3. Aplica la limpieza del nombre de las columnas después de cargar el Excel
datos_excel <- datos_excel %>% clean_names()

2. Mapas de comunas origen

Mapa 1 - general

A continuación, se presentará un conteo general del archivo EncuestaOrigenDestino.xlsx, en el cual se filtrarán las personas cuyo origen corresponda a alguna comuna de la ciudad de Cali. Posteriormente, se realizará un conteo del número de personas por comuna de origen, con el fin de visualizar el movimiento poblacional dentro de la ciudad.

# 1. Realizar el conteo de registros por comuna
conteo_excel <- datos_excel %>%
  # Agrupar por el nombre de la comuna
  group_by(comuna_origen) %>%
  # Contar cuántos registros hay en cada grupo (comuna)
  summarise(
    Total_Registros = n(), # La función n() cuenta el número de filas en cada grupo
    .groups = 'drop'       # Quita la agrupación al finalizar
  )

# 2. Filtrar los valores deseados (el nombre númerico de las comunas de Cali)

## 2.1 Crear filtro númerico mediante expresión regular
conteo_excel_filtrar <- conteo_excel %>%
  mutate(
    num_comuna = str_extract(comuna_origen, "[0-9]+"),
    num_comuna = as.numeric(num_comuna)
  )

## 2.2 Fltrar columnas de tipo númerico
conteo_filtrado <- conteo_excel_filtrar %>%
  # Filtrar para incluir solo las comunas cuyo número esté entre 1 y 22
  filter(num_comuna >= 1 & num_comuna <= 22) %>%
  # Quitar la columna auxiliar si ya no la necesitas
  select(-comuna_origen)

# 3. Unir el shapefile con el dataframe de conteo 
comunas_final <- comunas %>%
  rename(num_comuna = comuna) %>% # Renombrar la columna del SHP para que coincida con la tabla de conteo
  # Realizar la unión (join)
  left_join(conteo_filtrado, by = "num_comuna")

# 4. Mapa 1: conteo de registros por comuna origen del dataset filtrando dentro de Cali

# 4.1. Calcular el centroide de cada comuna para posicionar la etiqueta
comunas_etiquetas <- comunas_final %>%
  st_centroid() # Convierte cada polígono en un punto central (el centroide)

# 4.2. Definir los puntos de visualización de la escala (breaks)
breaks_a_mostrar <- comunas_final %>%
  pull(Total_Registros) %>%
  # Se ajusta valores para la visualización de la escala
  quantile(probs = c(0, 0.25, 0.65, 0.82, 0.86, 0.92, 1), na.rm = TRUE)

# 4.2. Generar el mapa con la escala ajustada
ggplot(data = comunas_final) +
  geom_sf(aes(fill = Total_Registros), color = "grey") +
  
  # Capa de Etiquetas (los números de comuna)
  geom_sf_text(
    data = comunas_etiquetas, # Usamos el objeto con centroides
    aes(label = num_comuna),  # Mapeamos el texto al número de comuna
    size = 3,                 # Tamaño de la fuente (ajusta según necesidad)
    color = "white",          # Color del texto
    check_overlap = TRUE      # Ayuda a evitar que las etiquetas se superpongan
  ) +  

  # Añade títulos y subtítulos (labs)
  labs(
    title = "Conteo de Registros por Comuna de Origen en Cali",
    subtitle = "Distribución del Total de Registros",
    fill = "Total Registros"
  ) +
  theme_minimal() +
  
  # Usar los 7 valores de visualización calculadas
  scale_fill_gradient(
    low = "lightblue", 
    high = "darkblue",
    # Asigna las cuatro rupturas
    breaks = breaks_a_mostrar,
    # Formatea las etiquetas con comas (si son números grandes)
    labels = scales::label_comma() 
  )

# 1. Reordenar el dataframe y luego ordenar por conteo
conteo_filtrado <- conteo_filtrado %>%
  select(num_comuna, Total_Registros) %>% # Ordenar las columnas
  arrange(desc(Total_Registros)) # desc() ordena de mayor a menor

# 2. Mostrar la tabla con el nuevo orden
kable(
  conteo_filtrado, # Usamos el data frame ordenado
  caption = "Tabla 1. TOP Comunas con Mayor Conteo de Registros",
  format = "html",
  align = c("l", "c"),
  digits = 0, 
  row.names = FALSE
) %>%
  kable_styling(
    full_width = FALSE,
    bootstrap_options = c("striped", "hover", "responsive"),
    position = "center",
    font_size = 12,
    row_label_position = "c"
  )  %>%
  column_spec(1, bold = TRUE) %>% # Hace la columna de la comuna en negrita
  row_spec(0, bold = TRUE, color = "white", background = "#2C3E50") %>%
  scroll_box(width = "100%", height = "400px")  # Scroll vertical para tabla larga
Tabla 1. TOP Comunas con Mayor Conteo de Registros
num_comuna Total_Registros
2 2968
19 2850
17 2377
3 2121
18 1536
4 1493
10 1401
13 1238
15 1171
22 1153
8 1124
6 998
16 993
9 952
11 925
21 818
1 794
7 734
20 733
14 685
5 664
12 348


Conclusión: Distribución Desigual de Registros por Comuna en Cali

El análisis del mapa coroplético que ilustra el “Conteo de Registros por Comuna de Origen en Cali” revela una marcada disparidad espacial en la distribución del fenómeno estudiado a lo largo de las divisiones administrativas de la ciudad.

Puntos Clave: Concentración en el Eje Central-Noroccidental: Los mayores volúmenes de registros se concentran fuertemente en las comunas ubicadas en el eje central y noroccidental de Cali. La Comuna 2 (con el máximo de 2.968 registros) y las Comunas 17 y 19 (con 2.850 y 2.377 de registros, respectivamente) son los principales focos de concentración.

Baja Densidad en la Periferia y Oriente: En contraste, las zonas con el menor número de registros se sitúan predominantemente en la periferia, especialmente en las comunas del extremo este y ciertas áreas periféricas occidentales, como la Comuna 5 y la Comuna 12, que presentan los mínimos (664 y 348 registros, respectivamente).

En resumen, la distribución de los registros no es homogénea, sino que está altamente concentrada en un número reducido de comunas. Esto indica que cualquier política o intervención relacionada con estos registros debe priorizar o diseñar estrategias diferenciadas para las áreas de alta concentración (Comunas 2, 17, 19) y las de baja concentración (Comunas 5, 12, 14), dado el amplio rango de variación en los conteos.

Mapa 2 - bicicletas

A continuación, se continuará con el análisis geográfico de la ciudad de Cali, enfocándose en las personas cuyo medio de transporte es la bicicleta.

# 1. Realizar el conteo de registros por comuna
conteo_excel_b <- datos_excel %>%
  # Filtrar solo registros donde tipo_de_vehiculo sea 1 (Bicicleta)
  filter(tipo_de_vehiculo == 1) %>% 
  # Agrupar por el nombre de la comuna
  group_by(comuna_origen) %>%
  # Contar cuántos registros hay en cada grupo (comuna)
  summarise(
    Total_Registros = n(), # La función n() cuenta el número de filas en cada grupo
    .groups = 'drop'       # Quita la agrupación al finalizar
  )

# 2. Filtrar los valores deseados (el nombre númerico de las comunas de Cali)

## 2.1 Crear filtro númerico mediante expresión regular
conteo_excel_filtrar_b <- conteo_excel_b %>%
  mutate(
    num_comuna = str_extract(comuna_origen, "[0-9]+"),
    num_comuna = as.numeric(num_comuna)
  )

## 2.2 Fltrar columnas de tipo númerico
conteo_filtrado_b <- conteo_excel_filtrar_b %>%
  # Filtrar para incluir solo las comunas cuyo número esté entre 1 y 22
  filter(num_comuna >= 1 & num_comuna <= 22) %>%
  # Quitar la columna auxiliar si ya no la necesitas
  select(-comuna_origen)

# 3. Unir el shapefile con el dataframe de conteo 
comunas_final_b <- comunas %>%
  rename(num_comuna = comuna) %>% # Renombrar la columna del SHP para que coincida con la tabla de conteo
  # Realizar la unión (join)
  left_join(conteo_filtrado_b, by = "num_comuna")

# 4. Mapa 1: conteo de registros por comuna origen del dataset filtrando dentro de Cali

# 4.1. Calcular el centroide de cada comuna para posicionar la etiqueta
comunas_etiquetas <- comunas_final %>%
  st_centroid() # Convierte cada polígono en un punto central (el centroide)

# 4.2. Definir los puntos de visualización de la escala (breaks)
breaks_a_mostrar_b <- comunas_final_b %>%
  pull(Total_Registros) %>%
  # Se ajusta valores para la visualización de la escala
  quantile(probs = c(0, 0.25, 0.65, 0.82, 0.86, 0.92, 1), na.rm = TRUE)

# 4.3. Generar el mapa con la escala ajustada
ggplot(data = comunas_final_b) +
  geom_sf(aes(fill = Total_Registros), color = "grey") +
  
  # Capa de Etiquetas (los números de comuna)
  geom_sf_text(
    data = comunas_etiquetas, # Usamos el objeto con centroides
    aes(label = num_comuna),  # Mapeamos el texto al número de comuna
    size = 3,                 # Tamaño de la fuente (ajusta según necesidad)
    color = "white",          # Color del texto
    check_overlap = TRUE      # Ayuda a evitar que las etiquetas se superpongan
  ) +
  
  # Añade títulos y subtítulos (labs)
  labs(
    title = "Conteo de Registros por Comuna de Origen en Cali",
    subtitle = "Distribución del Total de Registros, tipo de vehiculo bicicleta",
    fill = "Total Registros"
  ) +
  theme_minimal() +
  
  # Usar los 7 valores de visualización calculadas
  scale_fill_gradient(
    low = "lightblue", 
    high = "darkblue",
    # Asigna las cuatro rupturas
    breaks = breaks_a_mostrar_b,
    # Formatea las etiquetas con comas (si son números grandes)
    labels = scales::label_comma() 
  )

# 1. Reordenar el dataframe y luego ordenar por conteo
conteo_filtrado_b <- conteo_filtrado_b %>%
  select(num_comuna, Total_Registros) %>% # Ordenar las columnas
  arrange(desc(Total_Registros)) # desc() ordena de mayor a menor

# 2. Mostrar la tabla con el nuevo orden
kable(
  conteo_filtrado_b, # Usamos el data frame ordenado
  caption = "Tabla 2. TOP Comunas con Mayor Conteo de Registros - Bicicleta",
  format = "html",
  align = c("l", "c"),
  digits = 0, 
  row.names = FALSE
) %>%
  kable_styling(
    full_width = FALSE,
    bootstrap_options = c("striped", "hover", "responsive"),
    position = "center",
    font_size = 12,
    row_label_position = "c"
  )  %>%
  column_spec(1, bold = TRUE) %>% # Hace la columna de la comuna en negrita
  row_spec(0, bold = TRUE, color = "white", background = "#2C3E50") %>%
  scroll_box(width = "100%", height = "400px")  # Scroll vertical para tabla larga
Tabla 2. TOP Comunas con Mayor Conteo de Registros - Bicicleta
num_comuna Total_Registros
2 159
17 141
19 141
18 111
3 99
10 82
13 76
4 74
16 73
15 70
22 55
9 53
8 52
11 52
20 46
6 44
21 44
5 38
14 37
1 36
7 35
12 14


Conclusión: Distribución de Registros de Bicicletas por Comuna

El análisis de la distribución de registros relacionados con bicicletas revela un patrón de uso o incidencia que, aunque presenta ciertas coincidencias con la distribución general de registros, también muestra particularidades importantes.

  1. Desigualdad y Concentración: Al igual que en el conteo general, la distribución es altamente desigual. La variación va desde un máximo de 159 registros hasta un mínimo de 14, lo que indica que el fenómeno relacionado con bicicletas se concentra fuertemente en unas pocas áreas.

  2. Liderazgo en el Norte: La Comuna 2 se reafirma como el área con la mayor incidencia de registros, encabezando el listado con 159 registros de bicicleta. Esto sugiere que esta comuna es un punto neurálgico, tanto para el registro total como para el relacionado específicamente con bicicletas.

  3. Emergencia de Zonas Sur y Suroccidental: A diferencia del conteo general donde la Comuna 19 era muy prominente, en los registros de bicicleta: La Comuna 17 y la Comuna 19 comparten el segundo lugar con 141 registros cada una, destacando la importancia del sur (17) y el occidente central (19). La Comuna 18 (suroccidente) aparece en cuarto lugar con 111 registros, una posición relativamente más alta que la que podría tener en el conteo total (que no se detalla en el mapa).

  4. Coincidencias con el Patrón General: Las comunas que suelen estar en el rango medio-alto de la distribución general (como la Comuna 3 con 99 registros y la Comuna 10 con 82) mantienen posiciones prominentes también en el conteo de bicicletas, reforzando la concentración en el área central de la ciudad.

  5. Baja Incidencia: Las comunas con la menor cantidad de registros de bicicleta incluyen la Comuna 7 (35 registros) y la Comuna 12 (el mínimo, con 14 registros).

En conclusión, los registros relacionados con bicicletas muestran una clara concentración en las Comunas 2, 17, 19 y 18. Esta distribución puede reflejar zonas de alta densidad poblacional y actividad, áreas con mayor infraestructura para bicicletas, o sectores con mayor incidencia de eventos relacionados con el uso de este vehículo. La Comuna 2 mantiene su posición como el área de mayor actividad, mientras que las Comunas 17 y 18 demuestran ser puntos clave para la bicicleta en las zonas sur y suroccidental de Cali.

Mapa 3 - motos

A continuación, se continuará con el análisis geográfico de la ciudad de Cali, enfocándose en las personas cuyo medio de transporte es la moto.

# 1. Realizar el conteo de registros por comuna
conteo_excel_m <- datos_excel %>%
  # Filtrar solo registros donde tipo_de_vehiculo sea 2 (Moto)
  filter(tipo_de_vehiculo == 2) %>% 
  # Agrupar por el nombre de la comuna
  group_by(comuna_origen) %>%
  # Contar cuántos registros hay en cada grupo (comuna)
  summarise(
    Total_Registros = n(), # La función n() cuenta el número de filas en cada grupo
    .groups = 'drop'       # Quita la agrupación al finalizar
  )

# 2. Filtrar los valores deseados (el nombre númerico de las comunas de Cali)

## 2.1 Crear filtro númerico mediante expresión regular
conteo_excel_filtrar_m <- conteo_excel_m %>%
  mutate(
    num_comuna = str_extract(comuna_origen, "[0-9]+"),
    num_comuna = as.numeric(num_comuna)
  )

## 2.2 Fltrar columnas de tipo númerico
conteo_filtrado_m <- conteo_excel_filtrar_m %>%
  # Filtrar para incluir solo las comunas cuyo número esté entre 1 y 22
  filter(num_comuna >= 1 & num_comuna <= 22) %>%
  # Quitar la columna auxiliar si ya no la necesitas
  select(-comuna_origen)

# 3. Unir el shapefile con el dataframe de conteo 
comunas_final_m <- comunas %>%
  rename(num_comuna = comuna) %>% # Renombrar la columna del SHP para que coincida con la tabla de conteo
  # Realizar la unión (join)
  left_join(conteo_filtrado_m, by = "num_comuna")

# 4. Mapa 1: conteo de registros por comuna origen del dataset filtrando dentro de Cali

# 4.1. Calcular el centroide de cada comuna para posicionar la etiqueta
comunas_etiquetas <- comunas_final %>%
  st_centroid() # Convierte cada polígono en un punto central (el centroide)

# 4.2. Definir los puntos de visualización de la escala (breaks)
breaks_a_mostrar_m <- comunas_final_m %>%
  pull(Total_Registros) %>%
  # Se ajusta valores para la visualización de la escala
  quantile(probs = c(0, 0.25, 0.65, 0.82, 0.86, 0.92, 1), na.rm = TRUE)

# 4.3. Generar el mapa con la escala ajustada
ggplot(data = comunas_final_m) +
  geom_sf(aes(fill = Total_Registros), color = "grey") +
  
  # Capa de Etiquetas (los números de comuna)
  geom_sf_text(
    data = comunas_etiquetas, # Usamos el objeto con centroides
    aes(label = num_comuna),  # Mapeamos el texto al número de comuna
    size = 3,                 # Tamaño de la fuente (ajusta según necesidad)
    color = "white",          # Color del texto
    check_overlap = TRUE      # Ayuda a evitar que las etiquetas se superpongan
  ) +
  
  # Añade títulos y subtítulos (labs)
  labs(
    title = "Conteo de Registros por Comuna de Origen en Cali",
    subtitle = "Distribución del Total de Registros, tipo de vehiculo moto",
    fill = "Total Registros"
  ) +
  theme_minimal() +
  
  # Usar los 7 valores de visualización calculadas
  scale_fill_gradient(
    low = "lightblue", 
    high = "darkblue",
    # Asigna las cuatro rupturas
    breaks = breaks_a_mostrar_m,
    # Formatea las etiquetas con comas (si son números grandes)
    labels = scales::label_comma() 
  )

# 1. Reordenar el dataframe y luego ordenar por conteo
conteo_filtrado_m <- conteo_filtrado_m %>%
  select(num_comuna, Total_Registros) %>% # Ordenar las columnas
  arrange(desc(Total_Registros)) # desc() ordena de mayor a menor

# 2. Mostrar la tabla con el nuevo orden
kable(
  conteo_filtrado_m, # Usamos el data frame ordenado
  caption = "Tabla 3. TOP Comunas con Mayor Conteo de Registros - Moto",
  format = "html",
  align = c("l", "c"),
  digits = 0, 
  row.names = FALSE
) %>%
  kable_styling(
    full_width = FALSE,
    bootstrap_options = c("striped", "hover", "responsive"),
    position = "center",
    font_size = 12,
    row_label_position = "c"
  )  %>%
  column_spec(1, bold = TRUE) %>% # Hace la columna de la comuna en negrita
  row_spec(0, bold = TRUE, color = "white", background = "#2C3E50") %>%
  scroll_box(width = "100%", height = "400px")  # Scroll vertical para tabla larga
Tabla 3. TOP Comunas con Mayor Conteo de Registros - Moto
num_comuna Total_Registros
2 1414
19 1280
17 1136
3 970
18 746
4 720
10 675
13 554
8 552
15 536
22 515
6 473
16 450
11 431
9 413
21 378
1 375
7 350
20 339
5 319
14 310
12 176


Conclusión: Distribución de Registros de Motocicletas por Comuna

La distribución de los registros de motocicletas muestra un patrón de concentración muy alto que es el principal impulsor de la distribución general observada en el primer mapa, pero con algunas diferencias notables en el orden de las comunas principales.

  1. Extrema Concentración en el Top 3: El fenómeno de los registros de motos está extraordinariamente concentrado:
  • La Comuna 2 lidera claramente con 1,414 registros.
  • La Comuna 19 le sigue de cerca con 1,280 registros.
  • La Comuna 17 completa el top 3 con 1,136 registros. Estas tres comunas (2, 19 y 17) son los puntos neurálgicos, superando significativamente al resto de las comunas.
  1. Alto Impacto de las Motos en el Conteo Total: Al comparar las cifras de la Tabla 3 (motos) con la Tabla del Mapa 1 (conteo total), se observa que los registros de motos son una proporción muy grande del total. Por ejemplo: La Comuna 2 tiene 1,414 registros de moto, lo cual es casi la mitad del total de su categoría (máx. 2,968). Las Comunas 19 y 17, con más de 1,100 registros de moto cada una, son las principales responsables de que estas comunas figuren en los niveles más altos del conteo general.

  2. Coincidencia con Áreas Centrales y de Servicios: Las comunas que tradicionalmente albergan grandes centros comerciales, zonas de servicios y vías arteriales clave (como la Comuna 3 con 970 registros, la Comuna 18 con 746 y la Comuna 4 con 720) demuestran ser cruciales para el uso o la incidencia de registros relacionados con motocicletas.

  3. Distribución Geográfica del Rango Medio: El rango medio de registros (aproximadamente entre 720 y 515) incluye comunas del sur (22), el norte (4), y el centro-oriental (8, 15, 13), lo que sugiere que la actividad de las motocicletas se dispersa más ampliamente, aunque con menor intensidad, en estas zonas de crecimiento urbano.

  4. Baja Incidencia: Las comunas con la menor cantidad de registros de moto siguen siendo las áreas más periféricas o menos densas, con la Comuna 12 registrando el mínimo de 176 registros.

En resumen, los registros de motocicleta son el principal motor del patrón de concentración observado en el estudio geográfico general. La Comuna 2, la Comuna 19 y la Comuna 17 son los puntos de mayor actividad o incidencia de registros de motos. Cualquier estudio o política de movilidad, seguridad o infraestructura en Cali debe tomar en cuenta que el fenómeno de las motocicletas está hiperconcentrado en estas tres divisiones administrativas.

Mapa 4 - carros

A continuación, se continuará con el análisis geográfico de la ciudad de Cali, enfocándose en las personas cuyo medio de transporte es el carro.

# 1. Realizar el conteo de registros por comuna
conteo_excel_c <- datos_excel %>%
  # Filtrar solo registros donde tipo_de_vehiculo sea 3 (Carro)
  filter(tipo_de_vehiculo == 3) %>% 
  # Agrupar por el nombre de la comuna
  group_by(comuna_origen) %>%
  # Contar cuántos registros hay en cada grupo (comuna)
  summarise(
    Total_Registros = n(), # La función n() cuenta el número de filas en cada grupo
    .groups = 'drop'       # Quita la agrupación al finalizar
  )

# 2. Filtrar los valores deseados (el nombre númerico de las comunas de Cali)

## 2.1 Crear filtro númerico mediante expresión regular
conteo_excel_filtrar_c <- conteo_excel_c %>%
  mutate(
    num_comuna = str_extract(comuna_origen, "[0-9]+"),
    num_comuna = as.numeric(num_comuna)
  )

## 2.2 Fltrar columnas de tipo númerico
conteo_filtrado_c <- conteo_excel_filtrar_c %>%
  # Filtrar para incluir solo las comunas cuyo número esté entre 1 y 22
  filter(num_comuna >= 1 & num_comuna <= 22) %>%
  # Quitar la columna auxiliar si ya no la necesitas
  select(-comuna_origen)

# 3. Unir el shapefile con el dataframe de conteo 
comunas_final_c <- comunas %>%
  rename(num_comuna = comuna) %>% # Renombrar la columna del SHP para que coincida con la tabla de conteo
  # Realizar la unión (join)
  left_join(conteo_filtrado_c, by = "num_comuna")

# 4. Mapa 1: conteo de registros por comuna origen del dataset filtrando dentro de Cali

# 4.1. Calcular el centroide de cada comuna para posicionar la etiqueta
comunas_etiquetas <- comunas_final %>%
  st_centroid() # Convierte cada polígono en un punto central (el centroide)

# 4.2. Definir los puntos de visualización de la escala (breaks)
breaks_a_mostrar_c <- comunas_final_c %>%
  pull(Total_Registros) %>%
  # Se ajusta valores para la visualización de la escala
  quantile(probs = c(0, 0.25, 0.65, 0.82, 0.86, 0.92, 1), na.rm = TRUE)

# 4.3. Generar el mapa con la escala ajustada
ggplot(data = comunas_final_c) +
  geom_sf(aes(fill = Total_Registros), color = "grey") +

  # Capa de Etiquetas (los números de comuna)
  geom_sf_text(
    data = comunas_etiquetas, # Usamos el objeto con centroides
    aes(label = num_comuna),  # Mapeamos el texto al número de comuna
    size = 3,                 # Tamaño de la fuente (ajusta según necesidad)
    color = "white",          # Color del texto
    check_overlap = TRUE      # Ayuda a evitar que las etiquetas se superpongan
  ) +
  
  # Añade títulos y subtítulos (labs)
  labs(
    title = "Conteo de Registros por Comuna de Origen en Cali",
    subtitle = "Distribución del Total de Registros, tipo de vehiculo carro",
    fill = "Total Registros"
  ) +
  theme_minimal() +
  
  # Usar los 7 valores de visualización calculadas
  scale_fill_gradient(
    low = "lightblue", 
    high = "darkblue",
    # Asigna las cuatro rupturas
    breaks = breaks_a_mostrar_c,
    # Formatea las etiquetas con comas (si son números grandes)
    labels = scales::label_comma() 
  )

# 1. Reordenar el dataframe y luego ordenar por conteo
conteo_filtrado_c <- conteo_filtrado_c %>%
  select(num_comuna, Total_Registros) %>% # Ordenar las columnas
  arrange(desc(Total_Registros)) # desc() ordena de mayor a menor

# 2. Mostrar la tabla con el nuevo orden
kable(
  conteo_filtrado_c, # Usamos el data frame ordenado
  caption = "Tabla 4. TOP Comunas con Mayor Conteo de Registros - Carro",
  format = "html",
  align = c("l", "c"),
  digits = 0, 
  row.names = FALSE
) %>%
  kable_styling(
    full_width = FALSE,
    bootstrap_options = c("striped", "hover", "responsive"),
    position = "center",
    font_size = 12,
    row_label_position = "c"
  )  %>%
  column_spec(1, bold = TRUE) %>% # Hace la columna de la comuna en negrita
  row_spec(0, bold = TRUE, color = "white", background = "#2C3E50") %>%
  scroll_box(width = "100%", height = "400px")  # Scroll vertical para tabla larga
Tabla 4. TOP Comunas con Mayor Conteo de Registros - Carro
num_comuna Total_Registros
19 1165
2 1121
17 899
3 854
18 559
4 551
10 529
22 489
13 486
15 456
8 420
6 389
16 385
9 382
11 361
21 328
1 301
7 283
14 272
20 272
5 241
12 123


Conclusión: Distribución de Registros de Automóviles (Carros) por Comuna La distribución de los registros de automóviles, si bien es desigual, presenta un patrón de concentración que enfatiza las zonas socioeconómicas y residenciales consolidadas, y difiere en el orden de importancia respecto a los registros de motocicleta.

  1. Desplazamiento del Liderazgo: Por primera vez en esta serie de tablas, la Comuna 2 pierde el primer puesto:
  • La Comuna 19 asume el liderazgo con 1.165 registros de carro, superando a las demás.
  • La Comuna 2 se ubica en el segundo lugar con 1.121 registros. Esto sugiere que, aunque ambas comunas son importantes, el fenómeno medido para automóviles tiene una incidencia ligeramente mayor en la Comuna 19 (ubicada en el suroccidente central y que incluye zonas de alta densidad residencial y comercial).
  1. Importancia Consolidada de la Franja Suroccidental: Las comunas que típicamente albergan barrios de estratos medios y altos, y centros de actividad importantes, mantienen posiciones destacadas, reforzando la concentración de registros de vehículos particulares:
  • La Comuna 17 se mantiene en el tercer lugar con 899 registros.
  • La Comuna 3 (centro) tiene 854 registros.
  • La Comuna 18 (suroccidente) con 559 registros.
  1. Emergencia de Zonas Residenciales del Sur: Se destaca la Comuna 22 con 489 registros, ubicándose en el octavo lugar. La Comuna 22, que corresponde al extremo sur (zonas de expansión urbana y desarrollo residencial de alto nivel), muestra una mayor relevancia en el registro de automóviles en comparación con su posición en las listas de bicicleta y moto, lo que es coherente con un mayor uso de vehículos particulares en esa zona.

  2. Baja Incidencia: Al igual que en las tablas anteriores, la Comuna 12 registra el número más bajo de registros de carro, con solo 123. Las comunas orientales y periféricas, como la Comuna 5 y 14, también se encuentran consistentemente en los puestos inferiores.

En resumen, los registros de automóviles reflejan una concentración ligeramente diferente a la de las motocicletas, con un enfoque principal en la Comuna 19, seguida de cerca por la Comuna 2. El patrón de distribución refuerza la importancia de las comunas centrales, suroccidentales y las zonas de expansión de alto nivel (Comuna 22) para este tipo de vehículo. Esta información es crucial para planificar la infraestructura vial y de estacionamiento en las áreas centrales de la ciudad.

3. Mapas de comunas destino

Mapa 5 - general

A continuación, se presentará un conteo general del archivo EncuestaOrigenDestino.xlsx, en el cual se filtrarán las personas cuyo destino corresponda a alguna comuna de la ciudad de Cali. Posteriormente, se realizará un conteo del número de personas por comuna de destino, con el fin de visualizar el movimiento poblacional dentro de la ciudad.

# 1. Realizar el conteo de registros por comuna
conteo_excel2 <- datos_excel %>%
  # Agrupar por el nombre de la comuna
  group_by(comuna_destino) %>%
  # Contar cuántos registros hay en cada grupo (comuna)
  summarise(
    Total_Registros = n(), # La función n() cuenta el número de filas en cada grupo
    .groups = 'drop'       # Quita la agrupación al finalizar
  )

# 2. Filtrar los valores deseados (el nombre númerico de las comunas de Cali)

## 2.1 Crear filtro númerico mediante expresión regular
conteo_excel_filtrar2 <- conteo_excel2 %>%
  mutate(
    num_comuna = str_extract(comuna_destino, "[0-9]+"),
    num_comuna = as.numeric(num_comuna)
  )

## 2.2 Fltrar columnas de tipo númerico
conteo_filtrado2 <- conteo_excel_filtrar2 %>%
  # Filtrar para incluir solo las comunas cuyo número esté entre 1 y 22
  filter(num_comuna >= 1 & num_comuna <= 22) %>%
  # Quitar la columna auxiliar si ya no la necesitas
  select(-comuna_destino)

# 3. Unir el shapefile con el dataframe de conteo 
comunas_final2 <- comunas %>%
  rename(num_comuna = comuna) %>% # Renombrar la columna del SHP para que coincida con la tabla de conteo
  # Realizar la unión (join)
  left_join(conteo_filtrado2, by = "num_comuna")

# 4. Mapa 1: conteo de registros por comuna origen del dataset filtrando dentro de Cali

# 4.1. Calcular el centroide de cada comuna para posicionar la etiqueta
comunas_etiquetas2 <- comunas_final2 %>%
  st_centroid() # Convierte cada polígono en un punto central (el centroide)

# 4.2. Definir los puntos de visualización de la escala (breaks)
breaks_a_mostrar2 <- comunas_final2 %>%
  pull(Total_Registros) %>%
  # Se ajusta valores para la visualización de la escala
  quantile(probs = c(0, 0.65, 0.75, 0.87, 0.91, 0.96, 1), na.rm = TRUE)

# 4.2. Generar el mapa con la escala ajustada
ggplot(data = comunas_final2) +
  geom_sf(aes(fill = Total_Registros), color = "grey") +
  
  # Capa de Etiquetas (los números de comuna)
  geom_sf_text(
    data = comunas_etiquetas2, # Usamos el objeto con centroides
    aes(label = num_comuna),  # Mapeamos el texto al número de comuna
    size = 3,                 # Tamaño de la fuente (ajusta según necesidad)
    color = "white",          # Color del texto
    check_overlap = TRUE      # Ayuda a evitar que las etiquetas se superpongan
  ) +  

  # Añade títulos y subtítulos (labs)
  labs(
    title = "Conteo de Registros por Comuna de Destino en Cali",
    subtitle = "Distribución del Total de Registros",
    fill = "Total Registros"
  ) +
  theme_minimal() +
  
  # Usar los 7 valores de visualización calculadas
  scale_fill_gradient(
    low = "lightblue", 
    high = "darkblue",
    # Asigna las cuatro rupturas
    breaks = breaks_a_mostrar2,
    # Formatea las etiquetas con comas (si son números grandes)
    labels = scales::label_comma() 
  )

# 1. Reordenar el dataframe y luego ordenar por conteo
conteo_filtrado2 <- conteo_filtrado2 %>%
  select(num_comuna, Total_Registros) %>% # Ordenar las columnas
  arrange(desc(Total_Registros)) # desc() ordena de mayor a menor

# 2. Mostrar la tabla con el nuevo orden
kable(
  conteo_filtrado2, # Usamos el data frame ordenado
  caption = "Tabla 5. TOP Comunas con Mayor Conteo de Registros",
  format = "html",
  align = c("l", "c"),
  digits = 0, 
  row.names = FALSE
) %>%
  kable_styling(
    full_width = FALSE,
    bootstrap_options = c("striped", "hover", "responsive"),
    position = "center",
    font_size = 12,
    row_label_position = "c"
  )  %>%
  column_spec(1, bold = TRUE) %>% # Hace la columna de la comuna en negrita
  row_spec(0, bold = TRUE, color = "white", background = "#2C3E50") %>%
  scroll_box(width = "100%", height = "400px")  # Scroll vertical para tabla larga
Tabla 5. TOP Comunas con Mayor Conteo de Registros
num_comuna Total_Registros
2 4810
3 3859
19 3158
17 2164
22 1860
4 1856
9 1279
8 1025
10 927
7 748
16 743
6 716
13 673
18 662
15 579
11 564
5 522
21 515
14 379
20 351
12 246
1 230


Conclusión: Distribución General de Registros por Comuna de Destino El análisis de los registros de destino revela una centralización extrema de las actividades en unas pocas comunas, las cuales funcionan como los grandes atrayentes de la movilidad diaria de la ciudad.

  1. Centralización Extrema del Destino La concentración en las primeras comunas es significativamente más alta que en los registros de origen (analizados en el primer mapa), lo que es típico de la movilidad urbana (muchos orígenes residenciales se dirigen a pocos destinos laborales/educativos):
  • La Comuna 2 se consolida como el principal polo de destino con 4.810 registros, el valor más alto registrado en toda la serie.
  • La Comuna 3 se dispara al segundo lugar con 3.859 registros.
  • La Comuna 19 mantiene su relevancia como un gran atractor con 3.158 registros.

El volumen de registros de destino en estas tres comunas es muy superior al resto, señalando que el centro geográfico y financiero/de servicios de Cali (Comunas 2 y 3) y el centro ampliado/suroccidente (Comuna 19) son, con gran diferencia, los mayores receptores de viajes.

  1. Comunas que Transforman su Rol (De Origen a Destino) Varias comunas cambian su importancia relativa:
  • La Comuna 3 (el norte histórico/comercial) asciende drásticamente en el ranking de destino (2º lugar) en comparación con su ranking de origen (3º lugar en el mapa general), confirmándola como una zona principalmente atractora de flujos de personas.
  • La Comuna 22 (extremo sur) asciende notablemente al quinto lugar con 1.860 registros de destino, lo que indica que esta comuna, que es un polo residencial, también ha crecido en importancia como un polo de actividad (trabajo/estudio), debido a universidades, centros empresariales o centros comerciales.
  1. Patrón de Atracción del Norte y Sur El top 6 de destinos (Comunas 2, 3, 19, 17, 22 y 4) se extiende por las principales arterias y centros de actividad:
  • Norte/Central (2, 3, 4).
  • Suroccidente (19).
  • Sur (17, 22). Esto confirma que las áreas de mayor desarrollo de servicios y comercio son los principales destinos de la ciudad.
  1. Baja Atracción Periférica Las comunas ubicadas en los extremos y áreas periféricas (ej. Comunas 20, 14, 1 y 12) consistentemente muestran la menor capacidad de atracción de viajes, lo que sugiere que sus residentes deben movilizarse hacia los centros de destino para trabajar o estudiar. La Comuna 1 registra la menor cantidad de destinos con 230 registros.

En resumen, la movilidad en Cali está fuertemente orientada hacia un “triángulo” de destinos compuesto principalmente por la Comuna 2, 3 y 19, las cuales concentran la mayor parte de las actividades. La Comuna 22 emerge como un polo de destino importante en el sur de la ciudad.

Mapa 6 - bicicletas

A continuación, se continuará con el análisis geográfico de la ciudad de Cali, enfocándose en las personas cuyo medio de transporte es la bicicleta.

# 1. Realizar el conteo de registros por comuna
conteo_excel_b2 <- datos_excel %>%
  # Filtrar solo registros donde tipo_de_vehiculo sea 1 (Bicicleta)
  filter(tipo_de_vehiculo == 1) %>% 
  # Agrupar por el nombre de la comuna
  group_by(comuna_destino) %>%
  # Contar cuántos registros hay en cada grupo (comuna)
  summarise(
    Total_Registros = n(), # La función n() cuenta el número de filas en cada grupo
    .groups = 'drop'       # Quita la agrupación al finalizar
  )

# 2. Filtrar los valores deseados (el nombre númerico de las comunas de Cali)

## 2.1 Crear filtro númerico mediante expresión regular
conteo_excel_filtrar_b2 <- conteo_excel_b2 %>%
  mutate(
    num_comuna = str_extract(comuna_destino, "[0-9]+"),
    num_comuna = as.numeric(num_comuna)
  )

## 2.2 Fltrar columnas de tipo númerico
conteo_filtrado_b2 <- conteo_excel_filtrar_b2 %>%
  # Filtrar para incluir solo las comunas cuyo número esté entre 1 y 22
  filter(num_comuna >= 1 & num_comuna <= 22) %>%
  # Quitar la columna auxiliar si ya no la necesitas
  select(-comuna_destino)

# 3. Unir el shapefile con el dataframe de conteo 
comunas_final_b2 <- comunas %>%
  rename(num_comuna = comuna) %>% # Renombrar la columna del SHP para que coincida con la tabla de conteo
  # Realizar la unión (join)
  left_join(conteo_filtrado_b2, by = "num_comuna")

# 4. Mapa 1: conteo de registros por comuna origen del dataset filtrando dentro de Cali

# 4.1. Calcular el centroide de cada comuna para posicionar la etiqueta
comunas_etiquetas <- comunas_final %>%
  st_centroid() # Convierte cada polígono en un punto central (el centroide)

# 4.2. Definir los puntos de visualización de la escala (breaks)
breaks_a_mostrar_b2 <- comunas_final_b2 %>%
  pull(Total_Registros) %>%
  # Se ajusta valores para la visualización de la escala
  quantile(probs = c(0, 0.5, 0.73, 0.82, 0.9, 0.94, 1), na.rm = TRUE)

# 4.3. Generar el mapa con la escala ajustada
ggplot(data = comunas_final_b2) +
  geom_sf(aes(fill = Total_Registros), color = "grey") +
  
  # Capa de Etiquetas (los números de comuna)
  geom_sf_text(
    data = comunas_etiquetas, # Usamos el objeto con centroides
    aes(label = num_comuna),  # Mapeamos el texto al número de comuna
    size = 3,                 # Tamaño de la fuente (ajusta según necesidad)
    color = "white",          # Color del texto
    check_overlap = TRUE      # Ayuda a evitar que las etiquetas se superpongan
  ) +
  
  # Añade títulos y subtítulos (labs)
  labs(
    title = "Conteo de Registros por Comuna de Origen en Cali",
    subtitle = "Distribución del Total de Registros, tipo de vehiculo bicicleta",
    fill = "Total Registros"
  ) +
  theme_minimal() +
  
  # Usar los 7 valores de visualización calculadas
  scale_fill_gradient(
    low = "lightblue", 
    high = "darkblue",
    # Asigna las cuatro rupturas
    breaks = breaks_a_mostrar_b2,
    # Formatea las etiquetas con comas (si son números grandes)
    labels = scales::label_comma() 
  )

# 1. Reordenar el dataframe y luego ordenar por conteo
conteo_filtrado_b2 <- conteo_filtrado_b2 %>%
  select(num_comuna, Total_Registros) %>% # Ordenar las columnas
  arrange(desc(Total_Registros)) # desc() ordena de mayor a menor

# 2. Mostrar la tabla con el nuevo orden
kable(
  conteo_filtrado_b2, # Usamos el data frame ordenado
  caption = "Tabla 6. TOP Comunas con Mayor Conteo de Registros - Bicicleta",
  format = "html",
  align = c("l", "c"),
  digits = 0, 
  row.names = FALSE
) %>%
  kable_styling(
    full_width = FALSE,
    bootstrap_options = c("striped", "hover", "responsive"),
    position = "center",
    font_size = 12,
    row_label_position = "c"
  )  %>%
  column_spec(1, bold = TRUE) %>% # Hace la columna de la comuna en negrita
  row_spec(0, bold = TRUE, color = "white", background = "#2C3E50") %>%
  scroll_box(width = "100%", height = "400px")  # Scroll vertical para tabla larga
Tabla 6. TOP Comunas con Mayor Conteo de Registros - Bicicleta
num_comuna Total_Registros
2 218
3 189
19 147
17 115
22 100
4 85
9 65
8 54
10 43
5 41
7 41
16 35
6 34
13 33
18 31
11 29
21 26
20 25
14 22
15 20
12 15
1 12


Conclusión: Polos de Destino para Movilidad en Bicicleta El análisis del destino en bicicleta refuerza el patrón de centralización de la movilidad, destacando qué áreas concentran el empleo y los servicios a los que los ciclistas se dirigen, y cómo este patrón difiere ligeramente del destino general.

  1. Consolidación de los Centros Tradicionales Los principales polos de atracción en bicicleta son las mismas comunas centrales que dominan el conteo general de destinos:
  • La Comuna 2 es el principal destino para ciclistas con 218 registros.
  • La Comuna 3 se mantiene en segundo lugar con 189 registros.
  • La Comuna 19 sigue siendo un destino clave con 147 registros. Esto subraya que los viajes en bicicleta están fuertemente orientados hacia las zonas de mayor actividad laboral y comercial, que suelen estar en el centro geográfico de la ciudad.
  1. Baja Relevancia del Suroccidente en Destino de Bicicleta A pesar de que las comunas 17, 18 y 19 mostraron un alto origen de viajes en bicicleta, en el destino se observa una caída.
  • La Comuna 17 se mantiene en cuarto lugar con 115 registros.
  • La Comuna 18 desciende significativamente en el ranking de destino (puesto 14 con solo 31 registros), sugiriendo que es una comuna principalmente generadora de viajes en bicicleta (residencial) y no tanto atractora de empleo/servicios.
  1. Emergencia de la Comuna 4 La Comuna 4 (norte) se ubica en el sexto lugar (85 registros), una posición relevante para la movilidad en bicicleta, lo que podría indicar la presencia de centros de trabajo o estudio a los que se accede fácilmente en este medio de transporte desde las comunas del norte.

  2. Baja Atracción General y Periférica Los valores totales de destino en bicicleta son, por naturaleza, mucho menores que los de moto o carro. La mayoría de las comunas registraron menos de 50 destinos. Las comunas con la menor capacidad de atracción en bicicleta son las Comunas 1 (12 registros) y 12 (15 registros), las cuales están en los extremos de la ciudad.

En resumen, los viajes en bicicleta confirman la Comuna 2, la Comuna 3 y la Comuna 19 como los principales destinos de actividad. Es crucial notar la baja capacidad atractora de ciertas comunas residenciales como la Comuna 18, lo que indica que los ciclistas de esa área se desplazan principalmente hacia los centros urbanos (2, 3, 19) para cumplir sus propósitos (trabajo/estudio).

Mapa 7 - motos

A continuación, se continuará con el análisis geográfico de la ciudad de Cali, enfocándose en las personas cuyo medio de transporte es la motos.

# 1. Realizar el conteo de registros por comuna
conteo_excel_m2 <- datos_excel %>%
  # Filtrar solo registros donde tipo_de_vehiculo sea 2 (Motos)
  filter(tipo_de_vehiculo == 2) %>% 
  # Agrupar por el nombre de la comuna
  group_by(comuna_destino) %>%
  # Contar cuántos registros hay en cada grupo (comuna)
  summarise(
    Total_Registros = n(), # La función n() cuenta el número de filas en cada grupo
    .groups = 'drop'       # Quita la agrupación al finalizar
  )

# 2. Filtrar los valores deseados (el nombre númerico de las comunas de Cali)

## 2.1 Crear filtro númerico mediante expresión regular
conteo_excel_filtrar_m2 <- conteo_excel_m2 %>%
  mutate(
    num_comuna = str_extract(comuna_destino, "[0-9]+"),
    num_comuna = as.numeric(num_comuna)
  )

## 2.2 Fltrar columnas de tipo númerico
conteo_filtrado_m2 <- conteo_excel_filtrar_m2 %>%
  # Filtrar para incluir solo las comunas cuyo número esté entre 1 y 22
  filter(num_comuna >= 1 & num_comuna <= 22) %>%
  # Quitar la columna auxiliar si ya no la necesitas
  select(-comuna_destino)

# 3. Unir el shapefile con el dataframe de conteo 
comunas_final_m2 <- comunas %>%
  rename(num_comuna = comuna) %>% # Renombrar la columna del SHP para que coincida con la tabla de conteo
  # Realizar la unión (join)
  left_join(conteo_filtrado_m2, by = "num_comuna")

# 4. Mapa 1: conteo de registros por comuna origen del dataset filtrando dentro de Cali

# 4.1. Calcular el centroide de cada comuna para posicionar la etiqueta
comunas_etiquetas <- comunas_final %>%
  st_centroid() # Convierte cada polígono en un punto central (el centroide)

# 4.2. Definir los puntos de visualización de la escala (breaks)
breaks_a_mostrar_m2 <- comunas_final_m2 %>%
  pull(Total_Registros) %>%
  # Se ajusta valores para la visualización de la escala
  quantile(probs = c(0, 0.55, 0.73, 0.87, 0.9, 0.96, 1), na.rm = TRUE)

# 4.3. Generar el mapa con la escala ajustada
ggplot(data = comunas_final_m2) +
  geom_sf(aes(fill = Total_Registros), color = "grey") +
  
  # Capa de Etiquetas (los números de comuna)
  geom_sf_text(
    data = comunas_etiquetas, # Usamos el objeto con centroides
    aes(label = num_comuna),  # Mapeamos el texto al número de comuna
    size = 3,                 # Tamaño de la fuente (ajusta según necesidad)
    color = "white",          # Color del texto
    check_overlap = TRUE      # Ayuda a evitar que las etiquetas se superpongan
  ) +
  
  # Añade títulos y subtítulos (labs)
  labs(
    title = "Conteo de Registros por Comuna de Origen en Cali",
    subtitle = "Distribución del Total de Registros, tipo de vehiculo motos",
    fill = "Total Registros"
  ) +
  theme_minimal() +
  
  # Usar los 7 valores de visualización calculadas
  scale_fill_gradient(
    low = "lightblue", 
    high = "darkblue",
    # Asigna las cuatro rupturas
    breaks = breaks_a_mostrar_m2,
    # Formatea las etiquetas con comas (si son números grandes)
    labels = scales::label_comma() 
  )

# 1. Reordenar el dataframe y luego ordenar por conteo
conteo_filtrado_m2 <- conteo_filtrado_m2 %>%
  select(num_comuna, Total_Registros) %>% # Ordenar las columnas
  arrange(desc(Total_Registros)) # desc() ordena de mayor a menor

# 2. Mostrar la tabla con el nuevo orden
kable(
  conteo_filtrado_m2, # Usamos el data frame ordenado
  caption = "Tabla 7. TOP Comunas con Mayor Conteo de Registros - Motos",
  format = "html",
  align = c("l", "c"),
  digits = 0, 
  row.names = FALSE
) %>%
  kable_styling(
    full_width = FALSE,
    bootstrap_options = c("striped", "hover", "responsive"),
    position = "center",
    font_size = 12,
    row_label_position = "c"
  )  %>%
  column_spec(1, bold = TRUE) %>% # Hace la columna de la comuna en negrita
  row_spec(0, bold = TRUE, color = "white", background = "#2C3E50") %>%
  scroll_box(width = "100%", height = "400px")  # Scroll vertical para tabla larga
Tabla 7. TOP Comunas con Mayor Conteo de Registros - Motos
num_comuna Total_Registros
2 2177
3 1734
19 1421
17 927
22 911
4 846
9 608
8 470
10 419
7 353
13 346
16 327
6 323
18 302
15 271
11 254
21 243
5 215
14 188
20 151
12 128
1 112


Conclusión: Polos de Destino para Movilidad en Motocicleta El análisis de destino para motocicletas muestra que este tipo de movilidad está fuertemente orientada hacia los mismos grandes centros de actividad económica y servicios, consolidando la primacía de los polos centrales.

  1. Extrema Concentración en los Destinos Centrales La concentración de viajes de moto es la más intensa entre todos los modos de transporte, lo cual es coherente con el uso masivo de motocicletas para desplazamientos rápidos al trabajo:
  • La Comuna 2 se reafirma como el polo de atracción dominante con 2.177 registros.
  • La Comuna 3 se mantiene en segundo lugar con 1.734 registros, solidificando el centro tradicional como el mayor receptor de flujos de moto.
  • La Comuna 19 sigue siendo un atractor vital con 1.421 registros. Estos tres destinos suman un volumen de viajes de moto tan grande que justifica la necesidad de infraestructura de parqueo y regulación de tráfico específicas para motocicletas en el centro de Cali.
  1. Importancia de los Destinos del Sur Las zonas de actividad en el sur mantienen su relevancia como atractores para motociclistas:
  • La Comuna 17 se ubica en cuarto lugar con 927 registros.
  • La Comuna 22 sube al quinto puesto con 911 registros.
  • La alta incidencia en la Comuna 22 confirma que los centros de trabajo/estudio en el extremo sur son un destino muy importante para los motociclistas, quienes utilizan este medio para recorrer largas distancias desde el origen.
  1. Comunas que son Generadoras, no Atractoras Al igual que con las bicicletas, algunas comunas que son importantes en el origen de viajes, caen en el ranking de destino. Por ejemplo, la Comuna 18 tiene solo 302 registros de destino (puesto 14), lo que reitera su rol principal como zona residencial generadora de viajes que se dirigen a los centros de actividad (Comunas 2, 3, 19).

  2. Baja Atracción Periférica Las comunas periféricas y menos desarrolladas en términos de empleo (Comunas 1, 12, 14, 20) presentan los menores números de destino, siendo la Comuna 1 la de menor atracción con 112 registros.

En resumen, la Comuna 2, Comuna 3 y Comuna 19 son los puntos focales de la movilidad en motocicleta en Cali, actuando como los principales destinos de trabajo y estudio. El alto volumen de registros de moto en estas comunas y en el polo sur (Comuna 22) exige la priorización de políticas de movilidad y seguridad vial en estos corredores y destinos clave.

Mapa 8 - carros

A continuación, se continuará con el análisis geográfico de la ciudad de Cali, enfocándose en las personas cuyo medio de transporte son los carros.

# 1. Realizar el conteo de registros por comuna
conteo_excel_c2 <- datos_excel %>%
  # Filtrar solo registros donde tipo_de_vehiculo sea 3 (Carros)
  filter(tipo_de_vehiculo == 3) %>% 
  # Agrupar por el nombre de la comuna
  group_by(comuna_destino) %>%
  # Contar cuántos registros hay en cada grupo (comuna)
  summarise(
    Total_Registros = n(), # La función n() cuenta el número de filas en cada grupo
    .groups = 'drop'       # Quita la agrupación al finalizar
  )

# 2. Filtrar los valores deseados (el nombre númerico de las comunas de Cali)

## 2.1 Crear filtro númerico mediante expresión regular
conteo_excel_filtrar_c2 <- conteo_excel_c2 %>%
  mutate(
    num_comuna = str_extract(comuna_destino, "[0-9]+"),
    num_comuna = as.numeric(num_comuna)
  )

## 2.2 Fltrar columnas de tipo númerico
conteo_filtrado_c2 <- conteo_excel_filtrar_c2 %>%
  # Filtrar para incluir solo las comunas cuyo número esté entre 1 y 22
  filter(num_comuna >= 1 & num_comuna <= 22) %>%
  # Quitar la columna auxiliar si ya no la necesitas
  select(-comuna_destino)

# 3. Unir el shapefile con el dataframe de conteo 
comunas_final_c2 <- comunas %>%
  rename(num_comuna = comuna) %>% # Renombrar la columna del SHP para que coincida con la tabla de conteo
  # Realizar la unión (join)
  left_join(conteo_filtrado_c2, by = "num_comuna")

# 4. Mapa 1: conteo de registros por comuna origen del dataset filtrando dentro de Cali

# 4.1. Calcular el centroide de cada comuna para posicionar la etiqueta
comunas_etiquetas <- comunas_final %>%
  st_centroid() # Convierte cada polígono en un punto central (el centroide)

# 4.2. Definir los puntos de visualización de la escala (breaks)
breaks_a_mostrar_c2 <- comunas_final_c2 %>%
  pull(Total_Registros) %>%
  # Se ajusta valores para la visualización de la escala
  quantile(probs = c(0, 0.65, 0.78, 0.86, 0.9, 0.96, 1), na.rm = TRUE)

# 4.3. Generar el mapa con la escala ajustada
ggplot(data = comunas_final_c2) +
  geom_sf(aes(fill = Total_Registros), color = "grey") +
  
  # Capa de Etiquetas (los números de comuna)
  geom_sf_text(
    data = comunas_etiquetas, # Usamos el objeto con centroides
    aes(label = num_comuna),  # Mapeamos el texto al número de comuna
    size = 3,                 # Tamaño de la fuente (ajusta según necesidad)
    color = "white",          # Color del texto
    check_overlap = TRUE      # Ayuda a evitar que las etiquetas se superpongan
  ) +
  
  # Añade títulos y subtítulos (labs)
  labs(
    title = "Conteo de Registros por Comuna de Origen en Cali",
    subtitle = "Distribución del Total de Registros, tipo de vehiculo carros",
    fill = "Total Registros"
  ) +
  theme_minimal() +
  
  # Usar los 7 valores de visualización calculadas
  scale_fill_gradient(
    low = "lightblue", 
    high = "darkblue",
    # Asigna las cuatro rupturas
    breaks = breaks_a_mostrar_c2,
    # Formatea las etiquetas con comas (si son números grandes)
    labels = scales::label_comma() 
  )

# 1. Reordenar el dataframe y luego ordenar por conteo
conteo_filtrado_c2 <- conteo_filtrado_c2 %>%
  select(num_comuna, Total_Registros) %>% # Ordenar las columnas
  arrange(desc(Total_Registros)) # desc() ordena de mayor a menor

# 2. Mostrar la tabla con el nuevo orden
kable(
  conteo_filtrado_c2, # Usamos el data frame ordenado
  caption = "Tabla 8. TOP Comunas con Mayor Conteo de Registros - Carros",
  format = "html",
  align = c("l", "c"),
  digits = 0, 
  row.names = FALSE
) %>%
  kable_styling(
    full_width = FALSE,
    bootstrap_options = c("striped", "hover", "responsive"),
    position = "center",
    font_size = 12,
    row_label_position = "c"
  )  %>%
  column_spec(1, bold = TRUE) %>% # Hace la columna de la comuna en negrita
  row_spec(0, bold = TRUE, color = "white", background = "#2C3E50") %>%
  scroll_box(width = "100%", height = "400px")  # Scroll vertical para tabla larga
Tabla 8. TOP Comunas con Mayor Conteo de Registros - Carros
num_comuna Total_Registros
2 2006
3 1557
19 1302
17 959
4 757
22 694
9 489
8 403
10 384
16 321
7 286
18 276
6 275
15 245
11 239
13 226
5 225
21 198
20 144
14 138
1 86
12 85


Conclusión:Polos de Destino para Movilidad en Automóvil El análisis de destino para automóviles confirma la alta concentración en los centros de actividad, pero subraya la importancia de las zonas de infraestructura y centros empresariales para este modo de transporte.

  1. Reafirmación del Liderazgo de la Comuna 2 A diferencia de los registros de origen de carro (donde la Comuna 19 lideraba), en los registros de destino, la Comuna 2 retoma el primer puesto como el principal atractor de automóviles con 2.006 registros. Esto es consistente con ser el centro de negocios y servicios más grande de la ciudad, requiriendo un gran flujo de vehículos particulares.

  2. Concentración Central Dominante El patrón de concentración sigue siendo fuerte en los tres polos centrales:

  • Comuna 3 (1.557 registros) mantiene su posición como el segundo destino más importante, siendo el centro histórico y comercial.
  • Comuna 19 (1.302 registros) se consolida como el tercer gran atractor, probablemente debido a su combinación de centros médicos, comerciales y oficinas.
  1. La Importancia de las Comunas con Infraestructura Vial Las comunas que tienen importantes corredores viales y centros de servicios muestran una alta capacidad de atracción:
  • La Comuna 17 se mantiene en cuarto lugar con 959 registros.
  • La Comuna 4 (norte) es un destino importante con 757 registros.
  • La Comuna 22 (sur) atrae 694 registros de carro.
  • La relevancia de la Comuna 22 y 17 como destino de carros es lógica, dado que muchas zonas de oficinas, universidades y centros comerciales que atraen a usuarios de vehículos particulares se ubican en estos sectores.
  1. Baja Atracción Periférica y Generadora de Viajes Las comunas ubicadas en la periferia o con un rol predominantemente residencial mantienen su baja capacidad de atracción, con las Comunas 1 y 12 registrando los mínimos (86 y 85 registros, respectivamente).

Destaca que la Comuna 18 tiene solo 276 registros de destino, mientras que su conteo de origen de carro era de 559. Esto refuerza su rol como una comuna netamente generadora de viajes (residencial) en automóvil, cuyos ocupantes se dirigen en gran medida hacia las comunas 2, 3 y 19.

En resumen, la movilidad en automóvil se dirige predominantemente a la Comuna 2, la Comuna 3 y la Comuna 19, con la Comuna 2 consolidada como el destino más significativo. La planificación de la infraestructura de tráfico y parqueo debe enfocarse en estas áreas, reconociendo el alto volumen de vehículos que atraen. Además, las comunas 18 y 22 muestran una diferencia clara entre el origen (residencia) y el destino (actividad) de los viajes en carro.

Conclusiones

Conclusión Final: Movilidad y Usos del Suelo en Cali. El estudio combinado de los patrones de origen (presumiblemente residencia) y destino (presumiblemente trabajo/estudio) con la información sobre los sectores económicos y residenciales de Cali revela una estructura urbana policéntrica de la movilidad, pero fuertemente centralizada en la actividad.

  1. El Eje Central-Norte: Máximo Polo de Destino y Concentración de Actividad
  • Zonificación: La Comuna 2 (Norte/Centro ampliado) y la Comuna 3 (Centro Histórico) se confirman como los máximos polos de destino para todos los tipos de vehículos (liderando consistentemente en destino general, moto y carro).
  • Contexto Económico: Esto es coherente con la concentración de grandes empresas (Comuna 2), el centro de negocios y servicios financieros y el comercio tradicional (Comuna 3). La Comuna 2, en particular, alberga zonas residenciales de estrato alto (Santa Rita, La Flora) y de uso mixto (comercial e industrial), lo que genera un alto volumen de flujos de entrada y salida.
  1. El Eje Suroccidental: El Gran Atractor/Generador de Doble Rol
  • Comuna 19: Es clave como el principal atractor de carros y el segundo atractor de motos/general. Su alto conteo de registros generales (origen y destino) coincide con su rol de uso mixto predominante (residencial y comercial), incluyendo barrios de estratos altos (San Fernando, Bellavista) y centros médicos/universidades, lo que la convierte en un destino importante y un generador significativo.
  • Comuna 17: Se consolida como un polo de actividad de alto valor y un gran generador residencial (estratos 5-6). Su rol de destino es alto (alberga Unicentro, Ciudad Jardín) y su capacidad de generar viajes (origen) es igualmente alta, especialmente en carro y moto.
  1. Las Comunas Residenciales Generadoras de Flujo (Comunas Dormitorio)
  • Comuna 18: Es el ejemplo más claro de una comuna netamente generadora de viajes (residencial). A pesar de su alta tasa de ocupación, muestra una baja atracción de destino en todos los vehículos, lo que significa que sus residentes deben desplazarse masivamente a los polos centrales (2, 3, 19) para trabajar/estudiar.
  • Comuna 22: Esta comuna (extremo sur) tiene un rol dual: es una importante zona residencial de estrato alto (Pance, Ciudad Jardín) y, a su vez, un polo de destino emergente (universidades y centros empresariales), lo que explica su alta relevancia en el destino de carro y moto.
  1. La Movilidad y el Medio de Transporte
  • Moto: Es el medio con la mayor concentración de destino en los centros de trabajo (Comuna 2 y 3), lo que indica su importancia crítica para el acceso rápido a la actividad económica central.
  • Carro: Se concentra fuertemente en la Comuna 19 (origen) y la Comuna 2 (destino), reflejando la movilidad de los residentes de estratos medio-alto que acceden a sus trabajos en los centros de servicios.
  • Bicicleta: Los destinos se alinean con los centros tradicionales (2 y 3), pero con una menor participación total y una clara caída en la capacidad de atracción de las comunas más residenciales (como la 18).

En conclusión, la estructura de Cali se define por un fuerte eje de atracción de actividad (Comunas 2, 3, 19, y en menor medida 17/22) al cual se dirigen los flujos desde las comunas predominantemente residenciales y periféricas (como la 18 y 22, esta última con un doble rol). Cualquier planificación de infraestructura de transporte o desarrollo urbano debe priorizar la gestión de estos flujos masivos de destino y considerar estrategias de transporte público eficiente y micromovilidad hacia y dentro de los tres grandes atractores centrales.