Introducción

Este documento presenta un análisis detallado de los patrones de movilidad en la ciudad de Cali, Colombia, basado en una encuesta sobre los orígenes y destinos de los ciudadanos. El estudio se centra exclusivamente en los desplazamientos internos, excluyendo los viajes entre el área municipal de Cali y otras ciudades del departamento del Valle del Cauca. El objetivo principal es comprender la dinámica de desplazamiento de los residentes, identificando las comunas de origen más frecuentes y los medios de transporte más utilizados.

Base de datos encuesta matrix origen - destino.

La base de datos de la Matriz Origen-Destino cuenta con un total de 35,054 observaciones, recopiladas mediante una encuesta de movilidad realizada en estaciones de servicio público entre mayo y junio de 2015. El conjunto de datos integra 28 variables, las cuales permiten un análisis multidimensional de la infraestructura y el comportamiento del transporte en la ciudad.

library(knitr)
library(kableExtra)

diccionario_variables <- data.frame(
  Variable = c(
    "FECHA", "ID ESTACIÓN", "ESTACIÓN", "ACCESO", "MOVIMIENTO", 
    "Hora de Encuesta", "MUNICIPIO.", "DIRECCIÓN.", "Codigo Origen_SDG", 
    "¿QUE ESTABA HACIENDO.?", "MUNICIPIO.", "DIRECCIÓN..", "Codigo Destino_SDG", 
    "¿QUE VA HACER.?", "ESTRATO", "DISPONIBILIDAD VEHÍCULO", "EDAD", "SEXO", 
    "PERSONAS VEHÍCULO", "TIPO DE VEHÍCULO", "TIPO DE VIAJERO", "comuna origen", 
    "comuna destino", "Intracomuna"
  ),
  Descripcion = c(
    "Fecha en la que se recolectó la información de movilidad.",
    "Identificador único de la estación de servicio público donde se realizó la encuesta.",
    "Nombre o ubicación cardinal del punto de control (Norte, Sur, etc.).",
    "Punto de acceso específico dentro de la estación de transporte.",
    "Sentido del flujo del viaje reportado (ej. de Norte a Sur).",
    "Hora exacta en la que se registró la observación del viajero.",
    "Municipio de origen (punto de partida del viaje).",
    "Detalle geográfico del origen (Barrio, Comuna o Hito).",
    "Código estandarizado del sector de origen.",
    "Actividad realizada en el lugar de origen antes de partir.",
    "Municipio de destino (punto de llegada del viaje).",
    "Detalle geográfico del destino (Barrio, Comuna o Hito).",
    "Código estandarizado del sector de destino.",
    "Actividad o propósito a realizar en el lugar de destino.",
    "Nivel socioeconómico de la vivienda del encuestado.",
    "Indica si el usuario contaba con vehículo propio para el trayecto.",
    "Edad cronológica del encuestado.",
    "Género del encuestado (Masculino/Femenino).",
    "Número de ocupantes presentes en el vehículo al momento del viaje.",
    "Categoría del medio de transporte (Particular, Moto, etc.).",
    "Clasificación del perfil del usuario según su frecuencia de viaje.",
    "Número de comuna de inicio del viaje dentro del área urbana de Cali.",
    "Número de comuna de finalización del viaje dentro del área urbana de Cali.",
    "Variable lógica que indica si el origen y destino pertenecen a la misma comuna."
  )
)

# Generar la tabla con formato profesional
diccionario_variables %>%
  kable(
    caption = "Diccionario de Datos: Matriz Origen-Destino Cali 2015",
    col.names = c("Nombre de la Variable", "Descripción Técnica"),
    align = "ll",
    booktabs = TRUE
  ) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed", "responsive"),
    full_width = F,
    position = "left"
  ) %>%
  column_spec(1, bold = TRUE, border_right = TRUE, color = "white", background = "#2c3e50") %>%
  column_spec(2, width = "30em")
Diccionario de Datos: Matriz Origen-Destino Cali 2015
Nombre de la Variable Descripción Técnica
FECHA Fecha en la que se recolectó la información de movilidad.
ID ESTACIÓN Identificador único de la estación de servicio público donde se realizó la encuesta.
ESTACIÓN Nombre o ubicación cardinal del punto de control (Norte, Sur, etc.).
ACCESO Punto de acceso específico dentro de la estación de transporte.
MOVIMIENTO Sentido del flujo del viaje reportado (ej. de Norte a Sur).
Hora de Encuesta Hora exacta en la que se registró la observación del viajero.
MUNICIPIO. Municipio de origen (punto de partida del viaje).
DIRECCIÓN. Detalle geográfico del origen (Barrio, Comuna o Hito).
Codigo Origen_SDG Código estandarizado del sector de origen.
¿QUE ESTABA HACIENDO.? Actividad realizada en el lugar de origen antes de partir.
MUNICIPIO. Municipio de destino (punto de llegada del viaje).
DIRECCIÓN.. Detalle geográfico del destino (Barrio, Comuna o Hito).
Codigo Destino_SDG Código estandarizado del sector de destino.
¿QUE VA HACER.? Actividad o propósito a realizar en el lugar de destino.
ESTRATO Nivel socioeconómico de la vivienda del encuestado.
DISPONIBILIDAD VEHÍCULO Indica si el usuario contaba con vehículo propio para el trayecto.
EDAD Edad cronológica del encuestado.
SEXO Género del encuestado (Masculino/Femenino).
PERSONAS VEHÍCULO Número de ocupantes presentes en el vehículo al momento del viaje.
TIPO DE VEHÍCULO Categoría del medio de transporte (Particular, Moto, etc.).
TIPO DE VIAJERO Clasificación del perfil del usuario según su frecuencia de viaje.
comuna origen Número de comuna de inicio del viaje dentro del área urbana de Cali.
comuna destino Número de comuna de finalización del viaje dentro del área urbana de Cali.
Intracomuna Variable lógica que indica si el origen y destino pertenecen a la misma comuna.

Base de Datos Geográfica: Comunas de Cali

Para la visualización espacial de los datos, se utiliza un archivo de tipo Simple Features (sf) que contiene la delimitación cartográfica de las 22 comunas que integran el área urbana del municipio de Cali. Este archivo permite proyectar los flujos calculados en la matriz de origen-destino sobre la división política real de la ciudad, facilitando la identificación de clústeres de movilidad y zonas de alta demanda.

library(sf)
library(ggplot2)

comunas <- st_read("cali/Comunas.shp")
## Reading layer `Comunas' from data source 
##   `C:\Users\USUARIO\Desktop\Espacial\cali\Comunas.shp' using driver `ESRI Shapefile'
## Simple feature collection with 22 features and 4 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: 1053868 ymin: 860190.2 xmax: 1068492 ymax: 879441.5
## Projected CRS: MAGNA_Colombia_Cali
ggplot(data = comunas) +
  geom_sf(fill = "gray", color = "white", size = 0.3) + 
  labs(
    title = "Mapa de Comunas de Cali",
    x = "Longitud",
    y = "Latitud"
  ) +
  theme_minimal() +
  theme(
    panel.grid.major = element_line(color = "gray90", linetype = "dashed"),
    plot.title = element_text(face = "bold", size = 14),
    axis.title = element_text(size = 10, color = "gray40")
  )

Preparación de los datos.

En la fase de preparación, se realizó un proceso de depuración sobre las variables comuna origen y comuna destino. Primero, se eliminaron los registros con codificación igual a 0, debido a que representan errores de digitación o inconsistencias lógicas (no existe una comuna 0 en la división política de Cali).

Posteriormente, se aplicó un filtro para excluir los desplazamientos fuera de los límites urbanos de la ciudad. Dado que el análisis se centra exclusivamente en la movilidad intramunicipal.

Finalmente, se realizó una operación de unión espacial (spatial join) para integrar las coordenadas geográficas del archivo sf con los datos de la encuesta.

Al final de esta operación el número de observaciones se contrajo de 35045 a 22151 observaciones.

Promedio de viajes por comuna de origen

Mapa del Promedio de Viajes por Comuna de Origen

El siguiente mapa presenta el promedio de viajes registrados entre mayo y junio del año 2015, agregado por comuna de origen. La visualización ilustra la cantidad media de desplazamientos efectuados desde cada punto de partida dentro del área urbana de la ciudad de cali, permitiendo así identificar las zonas que actúan como los principales generadores de movilidad en la ciudad no correguido por población por comuna.

library(readxl)
library(dplyr)
library(sf)
library(plotly)
library(lubridate)
library(ggplot2)
library(sf)

origendestino <- read_excel("EncuestaOrigenDestino.xlsx", sheet = 1)

origendestino_clean <- origendestino %>%
  filter(`comuna origen` != "Fuera de Cali", 
         `comuna origen` != "0")


origendestino_clean <- origendestino_clean %>%
  filter(`comuna destino` != "Fuera de Cali", 
         `comuna destino` != "0")

comunas <- st_read("cali/Comunas.shp")
## Reading layer `Comunas' from data source 
##   `C:\Users\USUARIO\Desktop\Espacial\cali\Comunas.shp' using driver `ESRI Shapefile'
## Simple feature collection with 22 features and 4 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: 1053868 ymin: 860190.2 xmax: 1068492 ymax: 879441.5
## Projected CRS: MAGNA_Colombia_Cali
comunas <- comunas %>%
  mutate(comuna_id = sprintf("%02d", as.numeric(comuna)))


origendestino_geo <- origendestino_clean %>%
  left_join(comunas %>% select(comuna_id, geometry), 
            by = c("comuna origen" = "comuna_id")) %>%
  rename(geom_origen = geometry)



origendestino_geo <- origendestino_geo %>%
  left_join(comunas %>% select(comuna_id, geometry), 
            by = c("comuna destino" = "comuna_id")) %>%
  rename(geom_destino = geometry)




origendestino_clean <- origendestino_clean %>%
  mutate(fecha_dt = as.Date(FECHA))
viajes_por_dia <- origendestino_clean %>%
  group_by(`comuna origen`, fecha_dt) %>%
  summarise(viajes_totales = n(), .groups = 'drop')
promedio_por_comuna <- viajes_por_dia %>%
  group_by(`comuna origen`) %>%
  summarise(promedio_viajes = round(mean(viajes_totales), 0), .groups = 'drop')
mapa_promedio <- comunas %>%
  left_join(promedio_por_comuna, by = c("comuna_id" = "comuna origen")) %>%
  mutate(promedio_viajes = ifelse(is.na(promedio_viajes), 0, promedio_viajes))

mi_mapa <- ggplot(mapa_promedio) +
  geom_sf(aes(fill = promedio_viajes, 
              text = paste("Comuna:", as.numeric(comuna_id), 
                           "<br>Promedio diario:", promedio_viajes)), 
          color = "white", size = 0.2) +
  
  geom_sf_text(aes(label = as.numeric(comuna_id)), 
               color = "black", 
               size = 3, 
               fontface = "bold") +
  
  scale_fill_gradient(low = "yellow", high = "red", name = "Promedio\nDiario") +
  
  theme_void() + 
  theme(
    panel.background = element_rect(fill = "white", color = NA),
    plot.background = element_rect(fill = "white", color = NA),
    text = element_text(color = "black"),
    plot.title = element_text(size = 14, face = "bold", hjust = 0.5, margin = margin(t = 15, b = 5)),
    plot.subtitle = element_text(size = 11, hjust = 0.5, margin = margin(b = 15)),
    plot.margin = margin(15, 15, 15, 15)
  ) +
    labs(
    title = "Promedio Diario de Viajes  totales\nComuna de Origen - Cali (Mayo - Junio 2015)",
    x = NULL,
    y = NULL
  )
ggplotly(mi_mapa, tooltip = "text")

ILUSTRACIÓN 1: Promedio Diario de Viajes por Comuna de Origen (Totales)

La Ilustración 1 presenta la distribución espacial del promedio diario de viajes por comuna de origen. Se observa que las comunas 2, 17 y 19 registran la mayor afluencia de viajes promedio durante los días hábiles (lunes a viernes) del periodo encuestado entre mayo y junio de 2015. En contraste, las comunas 1, 12 y 20, entre otras, muestran volúmenes de viaje significativamente menores. Es importante precisar que estos valores representan datos absolutos de la muestra y no están ponderados por la población total de cada comúna.

Mapa del Promedio de Viajes por Comuna de Origen Bicicleta.

origendestino_bicicletas <- origendestino_clean %>%
  filter(`TIPO DE VEHÍCULO` == 1)
origendestino_bicicletas <- origendestino_bicicletas %>%
  mutate(fecha_dt = as.Date(FECHA))
viajes_por_dia_bici <- origendestino_bicicletas %>%
  group_by(`comuna origen`, fecha_dt) %>%
  summarise(viajes_totales = n(), .groups = 'drop')
promedio_por_comuna_bici <- viajes_por_dia_bici %>%
  group_by(`comuna origen`) %>%
  summarise(promedio_viajes = round(mean(viajes_totales), 0), .groups = 'drop')
mapa_promedio_bici <- comunas %>%
  left_join(promedio_por_comuna_bici, by = c("comuna_id" = "comuna origen")) %>%
  mutate(promedio_viajes = ifelse(is.na(promedio_viajes), 0, promedio_viajes))
mi_mapa_bici <- ggplot(mapa_promedio_bici) +
  geom_sf(aes(fill = promedio_viajes, 
              text = paste("Comuna:", as.numeric(comuna_id), 
                           "<br>Promedio diario (Bicis):", promedio_viajes)), 
          color = "white", size = 0.2) +
  
  geom_sf_text(aes(label = as.numeric(comuna_id)), 
               color = "black", 
               size = 3, 
               fontface = "bold") +
  scale_fill_gradient(low = "#e0f3db", high = "#0868ac", name = "Promedio\nDiario Bici") +
  
  theme_void() + 
  theme(
    panel.background = element_rect(fill = "white", color = NA),
    plot.background = element_rect(fill = "white", color = NA),
    text = element_text(color = "black"),
    plot.title = element_text(size = 14, face = "bold", hjust = 0.5, margin = margin(t = 15, b = 5)),
    plot.subtitle = element_text(size = 11, hjust = 0.5, margin = margin(b = 15)),
    plot.margin = margin(15, 15, 15, 15)
  ) +
  labs(
    title = "Promedio Diario de Viajes \nComuna de Origen Bicicletas - Cali (Mayo - Junio 2015)",
    x = NULL,
    y = NULL
  )
ggplotly(mi_mapa_bici, tooltip = "text")

ILUSTRACIÓN 2: Promedio Diario de Viajes por Comuna de Origen (Bicicletas)

La Ilustración 2 muestra el volumen diario de viajes de los usuarios que utilizaron la bicicleta para acceder a las estaciones de encuesta. Los datos revelan una participación notablemente reducida de este modo de transporte; las comunas 2 y 17 registran los promedios más altos con solo 9 viajes por punto de origen, mientras que la comuna 12 reporta un flujo mínimo de 2 viajes diarios. Estas cifras corresponden a la franja matutina de los días hábiles (lunes a viernes) durante el periodo de recolección de información entre mayo y junio de 2015. De vuelta los datos no fueron ponderados por la población total en cada comuna.

Mapa del Promedio de Viajes por Comuna de Origen - Moto.

origendestino_motos <- origendestino_clean %>%
  filter(`TIPO DE VEHÍCULO` == 2) %>%
  mutate(fecha_dt = as.Date(FECHA))
viajes_por_dia_moto <- origendestino_motos %>%
  group_by(`comuna origen`, fecha_dt) %>%
  summarise(viajes_totales = n(), .groups = 'drop')
promedio_por_comuna_moto <- viajes_por_dia_moto %>%
  group_by(`comuna origen`) %>%
  summarise(promedio_viajes = round(mean(viajes_totales), 0), .groups = 'drop')
mapa_promedio_moto <- comunas %>%
  left_join(promedio_por_comuna_moto, by = c("comuna_id" = "comuna origen")) %>%
  mutate(promedio_viajes = ifelse(is.na(promedio_viajes), 0, promedio_viajes))
mi_mapa_moto <- ggplot(mapa_promedio_moto) +
  geom_sf(aes(fill = promedio_viajes, 
              text = paste("Comuna:", as.numeric(comuna_id), 
                           "<br>Promedio diario (Motos):", promedio_viajes)), 
          color = "white", size = 0.2) +
  
  geom_sf_text(aes(label = as.numeric(comuna_id)), 
               color = "black", 
               size = 3, 
               fontface = "bold") +
  scale_fill_gradient(low = "#efedf5", high = "#4a1486", name = "Promedio\nDiario Moto") +
  
  theme_void() + 
  theme(
    panel.background = element_rect(fill = "white", color = NA),
    plot.background = element_rect(fill = "white", color = NA),
    text = element_text(color = "black"),
    plot.title = element_text(size = 14, face = "bold", hjust = 0.5, margin = margin(t = 15, b = 5)),
    plot.margin = margin(15, 15, 15, 15)
  ) +
  labs(
    title = "Promedio Diario de Viajes en Moto \nComuna de Origen - Cali (Mayo - Junio 2015)",
    x = NULL,
    y = NULL
  )

ggplotly(mi_mapa_moto, tooltip = "text") %>%
  layout(margin = list(t = 80))

ILUSTRACIÓN 3: Promedio Diario de Viajes por Comuna de Origen (Motocicletas)

La Ilustración 3 presenta el promedio diario de viajes en motocicleta para el periodo y los días previamente descritos. Se observa un patrón similar al de los promedios totales, donde las comunas 2, 17 y 19 mantienen la mayor generación de viajes bajo este modo de transporte para acceder a las estaciones. En contraste, la comuna 12 vuelve a registrar los volúmenes más bajos de la muestra.

Mapa del Promedio de Viajes por Comuna de Origen - Carro.

origendestino_autos <- origendestino_clean %>%
  filter(`TIPO DE VEHÍCULO` == 3) %>%
  mutate(fecha_dt = as.Date(FECHA))
viajes_por_dia_auto <- origendestino_autos %>%
  group_by(`comuna origen`, fecha_dt) %>%
  summarise(viajes_totales = n(), .groups = 'drop')
promedio_por_comuna_auto <- viajes_por_dia_auto %>%
  group_by(`comuna origen`) %>%
  summarise(promedio_viajes = round(mean(viajes_totales), 0), .groups = 'drop')
mapa_promedio_auto <- comunas %>%
  left_join(promedio_por_comuna_auto, by = c("comuna_id" = "comuna origen")) %>%
  mutate(promedio_viajes = ifelse(is.na(promedio_viajes), 0, promedio_viajes))
mi_mapa_auto <- ggplot(mapa_promedio_auto) +
  geom_sf(aes(fill = promedio_viajes, 
              text = paste("Comuna:", as.numeric(comuna_id), 
                           "<br>Promedio diario (Autos):", promedio_viajes)), 
          color = "white", size = 0.2) +
  
  geom_sf_text(aes(label = as.numeric(comuna_id)), 
               color = "black", 
               size = 3, 
               fontface = "bold") +
  scale_fill_gradient(low = "#fee0d2", high = "#de2d26", name = "Promedio\nDiario Auto") +
  
  theme_void() + 
  theme(
    panel.background = element_rect(fill = "white", color = NA),
    plot.background = element_rect(fill = "white", color = NA),
    text = element_text(color = "black"),
    plot.title = element_text(size = 14, face = "bold", hjust = 0.5, margin = margin(t = 15, b = 5)),
    plot.margin = margin(15, 15, 15, 15)
  ) +
  labs(
    title = "Promedio Diario de Viajes en Automóvil \nCComuna de Origen - Cali (Mayo - Junio 2015)",
    x = NULL,
    y = NULL
  )
ggplotly(mi_mapa_auto, tooltip = "text") %>%
  layout(margin = list(t = 80))

ILUSTRACIÓN 4: Promedio Diario de Viajes por Comuna de Origen (Carros)

La Ilustración 4 presenta el promedio diario de viajes donde se utilizó el vehículo particular (automóvil) exclusivamente como medio de acceso a la estación de trasporte donde se realizo la encuesta. En este análisis se identifica un cambio en el patron de movilidad: la comuna 19 lidera el volumen de estos desplazamientos de aproximación, seguida de cerca por la comuna 2. Es relevante destacar que la comuna 17 pierde peso en comparación con los patrones de motocicletas y viajes totales vistos anteriormente. Por su parte, la comuna 12 mantiene su tendencia de baja afluencia por punto de origen.

Promedio de viajes por comuna de Destino

Mapa del Promedio de Viajes por Comuna de Destino

viajes_por_dia_destino <- origendestino_clean %>%
  group_by(`comuna destino`, fecha_dt) %>%
  summarise(viajes_totales = n(), .groups = 'drop')
promedio_por_comuna_destino <- viajes_por_dia_destino %>%
  group_by(`comuna destino`) %>%
  summarise(promedio_viajes = round(mean(viajes_totales), 0), .groups = 'drop')
mapa_promedio_destino <- comunas %>%
  left_join(promedio_por_comuna_destino, by = c("comuna_id" = "comuna destino")) %>%
  mutate(promedio_viajes = ifelse(is.na(promedio_viajes), 0, promedio_viajes))
mi_mapa_destino <- ggplot(mapa_promedio_destino) +
  geom_sf(aes(fill = promedio_viajes, 
              text = paste("Comuna de Destino:", as.numeric(comuna_id), 
                           "<br>Promedio diario:", promedio_viajes)), 
          color = "white", size = 0.2) +
  
  geom_sf_text(aes(label = as.numeric(comuna_id)), 
               color = "black", 
               size = 3, 
               fontface = "bold") +
  
  scale_fill_gradient(low = "yellow", high = "red", name = "Promedio\nDiario") +
  
  theme_void() + 
  theme(
    panel.background = element_rect(fill = "white", color = NA),
    plot.background = element_rect(fill = "white", color = NA),
    text = element_text(color = "black"),
    plot.title = element_text(size = 14, face = "bold", hjust = 0.5, margin = margin(t = 15, b = 5)),
    plot.margin = margin(15, 15, 15, 15)
  ) +
  labs(
    title = "Promedio Diario de Viajes totales \nComuna de Destino - Cali (Mayo - Junio 2015)",
    x = NULL,
    y = NULL
  )
suppressWarnings(
  ggplotly(mi_mapa_destino, tooltip = "text") %>%
    layout(margin = list(t = 80))
)

ILUSTRACIÓN 5: Promedio Diario de Viajes por Comuna de Destino

La Ilustración 5 presenta la distribución espacial de los viajes según su comuna de destino. A diferencia del mapa de viajes dde origen, aquí se observa una concentración geográfica mucho más marcada hacia el norte y el oeste de la ciudad. Específicamente, las comunas 2, 3 y 19 representan los mayores puntos de destino. En contraste, la comuna 1 reporta el volumen más bajo de llegadas. Al igual que en los análisis previos, estos datos corresponden a los días laborales del periodo evaluado en 2015 y representan valores absolutos sin ponderación poblacional.

Mapa del Promedio de Viajes por Comuna de destino Bicicleta.

viajes_por_dia_destino_bici <- origendestino_bicicletas %>%
  group_by(`comuna destino`, fecha_dt) %>%
  summarise(viajes_totales = n(), .groups = 'drop')
promedio_por_comuna_destino_bici <- viajes_por_dia_destino_bici %>%
  group_by(`comuna destino`) %>%
  summarise(promedio_viajes = round(mean(viajes_totales), 0), .groups = 'drop')
mapa_promedio_destino_bici <- comunas %>%
  left_join(promedio_por_comuna_destino_bici, by = c("comuna_id" = "comuna destino")) %>%
  mutate(promedio_viajes = ifelse(is.na(promedio_viajes), 0, promedio_viajes))
mi_mapa_destino_bici <- ggplot(mapa_promedio_destino_bici) +
  geom_sf(aes(fill = promedio_viajes, 
              text = paste("Comuna de Destino:", as.numeric(comuna_id), 
                           "<br>Promedio diario (Bicis):", promedio_viajes)), 
          color = "white", size = 0.2) +
  
  geom_sf_text(aes(label = as.numeric(comuna_id)), 
               color = "black", 
               size = 3, 
               fontface = "bold") +
  scale_fill_gradient(low = "#e0f3db", high = "#0868ac", name = "Promedio\nDiario Bici") +
  
  theme_void() + 
  theme(
    panel.background = element_rect(fill = "white", color = NA),
    plot.background = element_rect(fill = "white", color = NA),
    text = element_text(color = "black"),
    plot.title = element_text(size = 14, face = "bold", hjust = 0.5, margin = margin(t = 15, b = 5)),
    plot.margin = margin(15, 15, 15, 15)
  ) +
  labs(
    title = "Promedio Diario de Viajes en Bicicleta \nComuna de Destino - Cali (Mayo - Junio 2015)",
    x = NULL,
    y = NULL
  )
suppressWarnings(
  ggplotly(mi_mapa_destino_bici, tooltip = "text") %>%
    layout(margin = list(t = 80))
)

ILUSTRACIÓN 6: Promedio Diario de Viajes por Comuna de Destino (Bicicletas)

La Ilustración 6 presenta la distribución espacial de las comunas de destino de los usuarios que reportaron la bicicleta como su medio de transporte inicial. Aunque los volúmenes totales hacia el destino son reducidos, se observa que la comuna 2 es la principal comuna de atracción con un promedio de 15 viajes, seguida por las comunas 3, 19 y 4. Asimismo, destaca un flujo importante de llegadas hacia la comuna 22 en el polo más sur de la ciudad.

Mapa del Promedio de Viajes por Comuna de destino Motos.

viajes_por_dia_destino_moto <- origendestino_motos %>%
  group_by(`comuna destino`, fecha_dt) %>%
  summarise(viajes_totales = n(), .groups = 'drop')
promedio_por_comuna_destino_moto <- viajes_por_dia_destino_moto %>%
  group_by(`comuna destino`) %>%
  summarise(promedio_viajes = round(mean(viajes_totales), 0), .groups = 'drop')
mapa_promedio_destino_moto <- comunas %>%
  left_join(promedio_por_comuna_destino_moto, by = c("comuna_id" = "comuna destino")) %>%
  mutate(promedio_viajes = ifelse(is.na(promedio_viajes), 0, promedio_viajes))
mi_mapa_destino_moto <- ggplot(mapa_promedio_destino_moto) +
  geom_sf(aes(fill = promedio_viajes, 
              text = paste("Comuna de Destino:", as.numeric(comuna_id), 
                           "<br>Promedio diario (Motos):", promedio_viajes)), 
          color = "white", size = 0.2) +
  
  geom_sf_text(aes(label = as.numeric(comuna_id)), 
               color = "black", 
               size = 3, 
               fontface = "bold") +
  scale_fill_gradient(low = "#efedf5", high = "#4a1486", name = "Promedio\nDiario Moto") +
  
  theme_void() + 
  theme(
    panel.background = element_rect(fill = "white", color = NA),
    plot.background = element_rect(fill = "white", color = NA),
    text = element_text(color = "black"),
    plot.title = element_text(size = 14, face = "bold", hjust = 0.5, margin = margin(t = 15, b = 5)),
    plot.margin = margin(15, 15, 15, 15)
  ) +
  labs(
    title = "Promedio Diario de Viajes en Moto \nComuna de Destino - Cali (Mayo - Junio 2015)",
    x = NULL,
    y = NULL
  )
suppressWarnings(
  ggplotly(mi_mapa_destino_moto, tooltip = "text") %>%
    layout(margin = list(t = 80))
)

ILUSTRACIÓN 7: Promedio Diario de Viajes por Comuna de Destino (Motocicletas)

La Ilustración 7 detalla la configuración espacial de los destinos para los usuarios que optan por la motocicleta como medio de transporte primario. En este escenario, se identifican magnitudes importantes, al igual que en las tendencias observadas anteriormente, las zonas norte y oeste consolidan los mayores volúmenes de destino. La Comuna 2 se posiciona como el principal comuna de recepción, seguida por la Comuna 4, mientras que la Comuna 1 exhibe el comportamiento opuesto, registrando la menor afluencia de llegada.

Mapa del Promedio de Viajes por Comuna de destino Autos.

viajes_por_dia_destino_auto <- origendestino_autos %>%
  group_by(`comuna destino`, fecha_dt) %>%
  summarise(viajes_totales = n(), .groups = 'drop')
promedio_por_comuna_destino_auto <- viajes_por_dia_destino_auto %>%
  group_by(`comuna destino`) %>%
  summarise(promedio_viajes = round(mean(viajes_totales), 0), .groups = 'drop')
mapa_promedio_destino_auto <- comunas %>%
  left_join(promedio_por_comuna_destino_auto, by = c("comuna_id" = "comuna destino")) %>%
  mutate(promedio_viajes = ifelse(is.na(promedio_viajes), 0, promedio_viajes))
mi_mapa_destino_auto <- ggplot(mapa_promedio_destino_auto) +
  geom_sf(aes(fill = promedio_viajes, 
              text = paste("Comuna de Destino:", as.numeric(comuna_id), 
                           "<br>Promedio diario (Autos):", promedio_viajes)), 
          color = "white", size = 0.2) +
  
  geom_sf_text(aes(label = as.numeric(comuna_id)), 
               color = "black", 
               size = 3, 
               fontface = "bold") +
  scale_fill_gradient(low = "#fee0d2", high = "#de2d26", name = "Promedio\nDiario Auto") +
  
  theme_void() + 
  theme(
    panel.background = element_rect(fill = "white", color = NA),
    plot.background = element_rect(fill = "white", color = NA),
    text = element_text(color = "black"),
    plot.title = element_text(size = 14, face = "bold", hjust = 0.5, margin = margin(t = 15, b = 5)),
    plot.margin = margin(15, 15, 15, 15)
  ) +
  labs(
    title = "Promedio Diario de Viajes en Automóvil \nComuna de Destino - Cali (Mayo - Junio 2015)",
    x = NULL,
    y = NULL
  )
suppressWarnings(
  ggplotly(mi_mapa_destino_auto, tooltip = "text") %>%
    layout(margin = list(t = 80))
)

ILUSTRACIÓN 8: Promedio Diario de Viajes por Comuna de Destino (Automoviles)

Finalmente, la Ilustración 7 detalla la configuración espacial de los destinos para los usuarios que optaron por el automóvil como medio de transporte inicial. En consonancia con las tendencias identificadas previamente, las zonas norte y oeste consolidan los mayores volúmenes de destino, siendo la Comuna 2 el principal nodo de atracción, seguida por la Comuna 4. En contraste, se observan flujos de intensidad intermedia en las Comunas 17 y 22, mientras que las Comunas 1 y 12 registran los niveles mínimos de llegada

Conclusión

El análisis permite identificar que las Comunas 2, 4 y 19 (zona norte y oeste) junto con la Comuna 17 (zona sur), constituyen las principales comunas de origen y destino de viajes en el área de estudio. Al contrastar los medios de transporte, se observa que la motocicleta lidera la elección del acceso a las estaciones, en contraposición a la bicicleta, que registra los volúmenes más bajos. Este fenómeno podría estar vinculado a variables externas como la percepción de inseguridad o la carencia de infraestructura de estacionamiento de bicicletas.

No obstante, es imperativo señalar dos observaciones clave: Primero, la representatividad de la muestra, pues falta determinar si la preeminencia de la moto es estadísticamente significativa y segundo, el sesgo temporal, ya que los datos reflejan exclusivamente el comportamiento en días laborales (lunes a viernes) y las horas de la mañana de 6 a.m a 12 p.m . Finalmente, para una interpretación más realista, se recomienda realizar una normalización por población total, permitiendo determinar si estos patrones son estructurales o simplemente un reflejo de la densidad demográfica en cada comuna.