Formulación del Problema

A partir de la base de datos EncuestaOrigenDestino.xlsx, la cual contiene información sobre los desplazamientos de personas en la ciudad de Cali durante los meses de mayo y junio de 2015, se propone la elaboración de ocho mapas temáticos que permitan visualizar los siguientes aspectos:

Estos mapas permitirán identificar patrones de movilidad urbana y analizar la distribución espacial del uso de distintos medios de transporte.

Desarrollo de la Actividad

Carga de Archivos Cartográficos y de Datos

Para realizar el análisis requerido, se utilizarán dos archivos:
- Un archivo en formato .shp, que contiene la información geográfica (cartografía de comunas de Cali).
- Un archivo en formato .xlsx, que contiene los datos de la encuesta de origen y destino.

# Cargar el paquete sf para leer shapefiles
library(sf)
## Linking to GEOS 3.13.0, GDAL 3.10.1, PROJ 9.5.1; sf_use_s2() is TRUE
# Cargar el archivo shapefile
mapacomunas <- st_read("C:/Users/dmbuitrago/Downloads/Casos/cali/Comunas.shp")
## Reading layer `Comunas' from data source 
##   `C:\Users\dmbuitrago\Downloads\Casos\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
# Visualización básica con plot
plot(mapacomunas, main = "Mapa de Comunas de Cali")

  • Cargar base de datos
library(readxl)
datosod <- read_excel("C:/Users/dmbuitrago/Downloads/Casos/EncuestaOrigenDestino.xlsx")
## New names:
## • `MUNICIPIO` -> `MUNICIPIO...7`
## • `DEPARTAMENTO / LOCALIDAD / COMUNA / DISTRITO / BARRIO / VEREDA / HITO /
##   DIRECCIÓN` -> `DEPARTAMENTO / LOCALIDAD / COMUNA / DISTRITO / BARRIO / VEREDA
##   / HITO / DIRECCIÓN...8`
## • `MUNICIPIO` -> `MUNICIPIO...11`
## • `DEPARTAMENTO / LOCALIDAD / COMUNA / DISTRITO / BARRIO / VEREDA / HITO /
##   DIRECCIÓN` -> `DEPARTAMENTO / LOCALIDAD / COMUNA / DISTRITO / BARRIO / VEREDA
##   / HITO / DIRECCIÓN...12`
## • `OTRO ¿CUÁL?` -> `OTRO ¿CUÁL?...17`
## • `OTRO ¿CUÁL?` -> `OTRO ¿CUÁL?...24`
head(datosod)
## # A tibble: 6 × 28
##   FECHA               `ID ESTACIÓN` ESTACIÓN               ACCESO MOVIMIENTO
##   <dttm>                      <dbl> <chr>                  <chr>  <chr>     
## 1 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 2 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 3 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 4 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 5 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 6 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## # ℹ 23 more variables: `Hora de Encuesta` <dttm>, MUNICIPIO...7 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...8` <chr>,
## #   `Codigo Origen_SDG` <chr>, `¿QUE ESTABA HACIENDO EN ESE LUGAR?` <dbl>,
## #   MUNICIPIO...11 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...12` <chr>,
## #   `Codigo Destino_SDG` <chr>, `¿QUE VA HACER A ESE LUGAR?` <dbl>,
## #   `ESTRATO EN SU VIVIENDA` <dbl>, …

Preparación y Limpieza de los Datos

Antes de realizar el análisis espacial de los viajes registrados en la encuesta, es necesario preparar y depurar los datos. Este proceso incluye varias etapas clave:

Filtrado de viajes dentro de Cali

Como primer paso, se seleccionan únicamente los viajes cuyo origen y destino se encuentran dentro de las comunas válidas de la ciudad de Cali, descartando aquellos cuyo valor es “Fuera de Cali” o “0”.

fueracali = which(datosod$`comuna origen`!="Fuera de Cali" & datosod$`comuna destino`!="Fuera de Cali" & datosod$`comuna origen`!="0" & datosod$`comuna destino`!="0")
datoscali=datosod[fueracali,]
head(datoscali)
## # A tibble: 6 × 28
##   FECHA               `ID ESTACIÓN` ESTACIÓN               ACCESO MOVIMIENTO
##   <dttm>                      <dbl> <chr>                  <chr>  <chr>     
## 1 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 2 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 3 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 4 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 5 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 6 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## # ℹ 23 more variables: `Hora de Encuesta` <dttm>, MUNICIPIO...7 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...8` <chr>,
## #   `Codigo Origen_SDG` <chr>, `¿QUE ESTABA HACIENDO EN ESE LUGAR?` <dbl>,
## #   MUNICIPIO...11 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...12` <chr>,
## #   `Codigo Destino_SDG` <chr>, `¿QUE VA HACER A ESE LUGAR?` <dbl>,
## #   `ESTRATO EN SU VIVIENDA` <dbl>, …

Transformación de Comunas a Valores Numéricos

Para facilitar la asignación de coordenadas geográficas en pasos posteriores, es necesario transformar las variables categóricas correspondientes a las comunas de origen y destino en valores numéricos. Esto permite una mejor manipulación y análisis dentro del entorno de R.

A continuación, se realiza esta conversión para los campos comuna origen y comuna destino, creando dos nuevas variables: comuna_origen y comuna_destino.

datoscali$comuna_origen <- as.numeric(datoscali$`comuna origen`)
datoscali$comuna_destino <- as.numeric(datoscali$`comuna destino`)
head(datoscali)
## # A tibble: 6 × 30
##   FECHA               `ID ESTACIÓN` ESTACIÓN               ACCESO MOVIMIENTO
##   <dttm>                      <dbl> <chr>                  <chr>  <chr>     
## 1 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 2 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 3 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 4 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 5 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 6 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## # ℹ 25 more variables: `Hora de Encuesta` <dttm>, MUNICIPIO...7 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...8` <chr>,
## #   `Codigo Origen_SDG` <chr>, `¿QUE ESTABA HACIENDO EN ESE LUGAR?` <dbl>,
## #   MUNICIPIO...11 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...12` <chr>,
## #   `Codigo Destino_SDG` <chr>, `¿QUE VA HACER A ESE LUGAR?` <dbl>,
## #   `ESTRATO EN SU VIVIENDA` <dbl>, …

Asignación de Coordenadas Geográficas a Origen y Destino

Una vez transformadas las comunas en variables numéricas, se procede a asignar las coordenadas geográficas correspondientes a cada registro de viaje. Para ello, se utiliza la geometría contenida en el objeto mapacomunas, que almacena la información espacial de cada comuna.

Mediante la función st_coordinates() del paquete sf, se extraen las coordenadas (latitud y longitud) de cada comuna —tanto de origen como de destino— y se asignan a nuevas columnas en la base de datos:

  • latitud_comuna_origen
  • longitud_comuna_origen
  • latitud_comuna_destino
  • longitud_comuna_destino

Estas columnas permitirán posteriormente la representación espacial de los desplazamientos en los mapas.

# Cargar el paquete sf
library(sf)

# Obtener coordenadas de las comunas de origen
datoscali$latitud_comuna_origen = as.numeric(apply(datoscali["comuna_origen"], 1, function(x)
{
  coords <- st_coordinates(mapacomunas)[x,]  # Obtener coordenadas con st_coordinates
  return(coords[2])  # Latitud
}))

datoscali$longitud_comuna_origen = as.numeric(apply(datoscali["comuna_origen"], 1, function(x)
{
  coords <- st_coordinates(mapacomunas)[x,]  # Obtener coordenadas con st_coordinates
  return(coords[1])  # Longitud
}))

# Obtener coordenadas de las comunas de destino
datoscali$latitud_comuna_destino = as.numeric(apply(datoscali["comuna_destino"], 1, function(x)
{
  coords <- st_coordinates(mapacomunas)[x,]  # Obtener coordenadas con st_coordinates
  return(coords[2])  # Latitud
}))

datoscali$longitud_comuna_destino = as.numeric(apply(datoscali["comuna_destino"], 1, function(x)
{
  coords <- st_coordinates(mapacomunas)[x,]  # Obtener coordenadas con st_coordinates
  return(coords[1])  # Longitud
}))

head(datoscali)
## # A tibble: 6 × 34
##   FECHA               `ID ESTACIÓN` ESTACIÓN               ACCESO MOVIMIENTO
##   <dttm>                      <dbl> <chr>                  <chr>  <chr>     
## 1 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 2 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 3 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 4 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 5 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 6 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## # ℹ 29 more variables: `Hora de Encuesta` <dttm>, MUNICIPIO...7 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...8` <chr>,
## #   `Codigo Origen_SDG` <chr>, `¿QUE ESTABA HACIENDO EN ESE LUGAR?` <dbl>,
## #   MUNICIPIO...11 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...12` <chr>,
## #   `Codigo Destino_SDG` <chr>, `¿QUE VA HACER A ESE LUGAR?` <dbl>,
## #   `ESTRATO EN SU VIVIENDA` <dbl>, …

Verificación de Valores Nulos en Coordenadas

Luego de asignar las coordenadas geográficas a las comunas de origen y destino, se realiza una verificación para identificar posibles valores faltantes (nulos) en las columnas recién creadas. Esto permite asegurar la calidad de los datos antes de continuar con la representación espacial.

Se cuentan los valores NA en las siguientes variables:

  • latitud_comuna_origen
  • longitud_comuna_origen
  • latitud_comuna_destino
  • longitud_comuna_destino

El objetivo es identificar si alguna comuna no recibió correctamente sus coordenadas, lo cual podría deberse a errores en la codificación o a inconsistencias entre los datos de la encuesta y el archivo cartográfico.

# Contar los nulos para las 4 variables
nulos_latitud_origen <- sum(is.na(datoscali$latitud_comuna_origen))
nulos_longitud_origen <- sum(is.na(datoscali$longitud_comuna_origen))
nulos_latitud_destino <- sum(is.na(datoscali$latitud_comuna_destino))
nulos_longitud_destino <- sum(is.na(datoscali$longitud_comuna_destino))

# Mostrar los resultados
print("Cantidad de valores nulos en latitud_comuna_origen:")
## [1] "Cantidad de valores nulos en latitud_comuna_origen:"

Mapas de Origen

Con el fin de representar espacialmente los puntos de origen de los viajes registrados en la encuesta, se construye un nuevo objeto geográfico de tipo sf (simple features) utilizando las coordenadas geográficas previamente asignadas.

Este objeto, denominado origentotal, se crea mediante la función st_as_sf(), que convierte el data frame datoscali en un objeto espacial a partir de las columnas longitud_comuna_origen y latitud_comuna_origen. Estas coordenadas representan los centroides de las comunas de origen de cada viaje.

Además, se especifica el sistema de referencia espacial (crs) para asegurar la compatibilidad con el shapefile de las comunas (mapacomunas), lo que permite una correcta visualización e integración en mapas posteriores.

Este paso es fundamental para el análisis espacial, ya que permite geolocalizar cada observación de origen y asociarla con una comuna específica dentro del área urbana de Cali.

# Cargar el paquete sf
library(sf)

# Crear el objeto sf directamente con coordenadas
origentotal <- st_as_sf(datoscali, coords = c("longitud_comuna_origen", "latitud_comuna_origen"), crs = st_crs(mapacomunas))

# Ver el objeto sf
origentotal
## Simple feature collection with 22151 features and 32 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: 1059648 ymin: 874236.3 xmax: 1060978 ymax: 876497.2
## Projected CRS: MAGNA_Colombia_Cali
## # A tibble: 22,151 × 33
##    FECHA               `ID ESTACIÓN` ESTACIÓN               ACCESO MOVIMIENTO
##  * <dttm>                      <dbl> <chr>                  <chr>  <chr>     
##  1 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  2 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  3 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  4 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  5 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  6 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  7 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  8 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  9 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 10 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## # ℹ 22,141 more rows
## # ℹ 28 more variables: `Hora de Encuesta` <dttm>, MUNICIPIO...7 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...8` <chr>,
## #   `Codigo Origen_SDG` <chr>, `¿QUE ESTABA HACIENDO EN ESE LUGAR?` <dbl>,
## #   MUNICIPIO...11 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...12` <chr>,
## #   `Codigo Destino_SDG` <chr>, `¿QUE VA HACER A ESE LUGAR?` <dbl>, …
# Copia del dataframe de origen
origen1 = origentotal

# Establecer el CRS de origen1 como el mismo que tiene mapacomunas
st_crs(origen1) <- st_crs(mapacomunas)  # Usar st_crs en lugar de crs

# Realizar el conteo de registros por comuna
conteo_por_comuna <- table(origen1$comuna_origen)

# Nueva variable en mapacomunas y asignar los resultados del conteo
mapacomunas$origen1 <- conteo_por_comuna[match(mapacomunas$comuna, names(conteo_por_comuna))]
mapacomunas$origen1 <- as.numeric(mapacomunas$origen1)

# Mostrar el resultado
head(mapacomunas$origen1, 25)
##  [1] 2250  626 1610 2241  974 1762 1208  985  797 1193  521  583  862  737  693
## [16] 1031  257  575  717 1094  599  836
# Cargar el paquete sf
library(sf)

# Crear el objeto sf directamente con coordenadas
origentotal <- st_as_sf(datoscali, coords = c("longitud_comuna_origen", "latitud_comuna_origen"), crs = st_crs(mapacomunas))

# Ver el objeto sf
origentotal
## Simple feature collection with 22151 features and 32 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: 1059648 ymin: 874236.3 xmax: 1060978 ymax: 876497.2
## Projected CRS: MAGNA_Colombia_Cali
## # A tibble: 22,151 × 33
##    FECHA               `ID ESTACIÓN` ESTACIÓN               ACCESO MOVIMIENTO
##  * <dttm>                      <dbl> <chr>                  <chr>  <chr>     
##  1 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  2 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  3 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  4 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  5 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  6 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  7 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  8 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  9 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 10 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## # ℹ 22,141 more rows
## # ℹ 28 more variables: `Hora de Encuesta` <dttm>, MUNICIPIO...7 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...8` <chr>,
## #   `Codigo Origen_SDG` <chr>, `¿QUE ESTABA HACIENDO EN ESE LUGAR?` <dbl>,
## #   MUNICIPIO...11 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...12` <chr>,
## #   `Codigo Destino_SDG` <chr>, `¿QUE VA HACER A ESE LUGAR?` <dbl>, …
# Cargar las librerías necesarias
library(ggplot2)
library(sf)

# Generar el mapa con ggplot
ggplot(data = mapacomunas) +
  geom_sf(aes(fill = origen1)) +
  scale_fill_viridis_c() +  # Escala de colores para representar 'origen1'
  labs(title = "Comunas Origen para viajes en Carro, moto y bicicleta",
       fill = "Viajes") +
  theme_minimal()

Conclusión

El mapa generado muestra la distribución espacial de los puntos de origen de los viajes realizados en automóvil, motocicleta y bicicleta dentro del área urbana de Cali. A través de la variable origen1, que representa la cantidad de viajes originados por comuna, se puede identificar un patrón claro de concentración de la movilidad.

Se observa que las comunas con mayor densidad de viajes de origen son la comuna 1, 4, 6 y 7, mientras que comunas como la comuna 17 y 22 muestran una menor participación en los desplazamientos registrados para estos modos de transporte.

Este comportamiento sugiere que las zonas del norte y centro-oriente de la ciudad concentran un mayor número de viajes, posiblemente debido a una mayor densidad poblacional o una infraestructura vial que favorece el uso de medios de transporte como el automóvil, la motocicleta o la bicicleta. En contraste, las comunas del sur y suroccidente reflejan una menor intensidad de origen de viajes, lo cual podría estar relacionado con factores socioeconómicos o diferencias en el acceso a estos medios.

Este análisis espacial preliminar permite establecer una base para futuras comparaciones por modo de transporte individual, y también para estudios de accesibilidad, planificación urbana y evaluación de necesidades de movilidad sostenible.

Mapa Origen Carros

Con el objetivo de analizar de forma específica los patrones de movilidad de quienes utilizan el automóvil como medio de transporte, se realiza un filtrado de los registros de la encuesta en los que el campo TIPO DE VEHÍCULO corresponde al valor 3, que representa los viajes realizados en carro particular.

A partir de este subconjunto, se construye un nuevo objeto espacial denominado origen2, que contiene exclusivamente los puntos de origen asociados a este tipo de transporte. Esta segmentación permite generar mapas temáticos enfocados únicamente en el uso del automóvil, facilitando el análisis detallado de su distribución espacial y la identificación de comunas con mayor intensidad de desplazamientos en carro.

# Filtrar las filas donde 'TIPO DE VEHÍCULO' es igual a 3 (carros)
carros = which(origentotal$`TIPO DE VEHÍCULO` == 3)

# Crear el nuevo objeto sf con solo los carros
origen2 = origentotal[carros, ]

# Ver el objeto origen2
origen2
## Simple feature collection with 8605 features and 32 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: 1059648 ymin: 874236.3 xmax: 1060978 ymax: 876497.2
## Projected CRS: MAGNA_Colombia_Cali
## # A tibble: 8,605 × 33
##    FECHA               `ID ESTACIÓN` ESTACIÓN               ACCESO MOVIMIENTO
##    <dttm>                      <dbl> <chr>                  <chr>  <chr>     
##  1 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  2 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  3 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  4 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  5 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  6 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  7 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  8 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  9 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 10 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## # ℹ 8,595 more rows
## # ℹ 28 more variables: `Hora de Encuesta` <dttm>, MUNICIPIO...7 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...8` <chr>,
## #   `Codigo Origen_SDG` <chr>, `¿QUE ESTABA HACIENDO EN ESE LUGAR?` <dbl>,
## #   MUNICIPIO...11 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...12` <chr>,
## #   `Codigo Destino_SDG` <chr>, `¿QUE VA HACER A ESE LUGAR?` <dbl>, …
# Copia del dataframe de carros
origencarro = origen2

# Establecer el CRS de origencarro como el mismo que tiene mapacomunas
st_crs(origencarro) <- st_crs(mapacomunas)  # Usamos st_crs en lugar de crs

# Realizar el conteo de registros por comuna
conteo_por_comuna2 <- table(origencarro$comuna_origen)

# Crear nueva variable en mapacomunas y asignar los resultados del conteo
mapacomunas$origencarro <- conteo_por_comuna2[match(mapacomunas$comuna, names(conteo_por_comuna2))]
mapacomunas$origencarro <- as.numeric(mapacomunas$origencarro)

# Mostrar el resultado
head(mapacomunas$origencarro, 25)  # Accedemos directamente a la columna 'origencarro'
##  [1] 860 234 679 923 377 662 433 424 314 443 185 229 319 295 272 412  88 236 268
## [20] 404 228 320
# Cargar las librerías necesarias
library(ggplot2)
library(sf)

# Generar el mapa con ggplot2
ggplot(data = mapacomunas) +
  geom_sf(aes(fill = origencarro)) +  # Usamos 'origencarro' para el relleno
  scale_fill_viridis_c() +  # Escala de colores para la variable 'origencarro'
  labs(title = "Comunas Origen para viajes en Carro",  # Título del mapa
       fill = "Viajes en Carro") +  # Leyenda para el relleno
  theme_minimal()  # Estilo visual minimalista

Conclusión Mapa de Origen Carro

El mapa generado permite observar la distribución espacial de los viajes cuyo origen está asociado al uso del carro particular como medio de transporte en la ciudad de Cali. A partir del conteo de registros por comuna, se evidencia que las comunas con mayor número de viajes originados en automóvil son:

Este patrón sugiere una fuerte actividad vehicular en comunas del centro y sur de la ciudad, lo que puede relacionarse con factores como la densidad residencial de estratos medios y altos, la disponibilidad de vías principales, y el nivel de acceso a vehículos particulares.

En contraste, comunas como la 12, 5 y 21 muestran una menor cantidad de viajes en carro, lo cual podría estar vinculado a condiciones socioeconómicas, menor tenencia de vehículos o una mayor dependencia de otros modos de transporte como motocicletas o el sistema de transporte público.

Este análisis es útil para orientar estrategias de planificación vial, diseño de infraestructura, y políticas de movilidad sostenible enfocadas en reducir la dependencia del automóvil y mejorar la conectividad en las comunas con menor acceso.

Mapa Origen bicicleta

Para analizar los patrones de movilidad asociados al uso de la bicicleta, se realiza un filtrado específico de los registros de la encuesta cuyo valor en la variable TIPO DE VEHÍCULO corresponde a 1, identificando así los viajes efectuados en bicicleta.

Con estos datos, se genera un nuevo objeto espacial denominado origen3, que contiene exclusivamente los puntos de origen de los viajes en bicicleta. Este objeto permite visualizar de forma diferenciada las zonas de la ciudad donde este medio de transporte es más utilizado para iniciar desplazamientos.

Esta segmentación es fundamental para identificar las comunas donde la bicicleta tiene mayor presencia como medio de transporte, lo cual aporta insumos valiosos para el diseño de infraestructura ciclista, como ciclovías, parqueaderos de bicicletas y estrategias de promoción de la movilidad activa.

La representación espacial de estos datos facilitará también el contraste con los patrones de uso de otros medios de transporte y permitirá detectar posibles desigualdades en el acceso a opciones sostenibles de movilidad urbana.

# Filtrar las filas donde 'TIPO DE VEHÍCULO' es igual a 1 (bicicleta)
bicicleta = which(origentotal$`TIPO DE VEHÍCULO` == 1)

# Crear el nuevo objeto sf con solo las bicicletas
origen3 = origentotal[bicicleta, ]

# Ver el objeto origen3
origen3
## Simple feature collection with 1223 features and 32 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: 1059648 ymin: 874236.3 xmax: 1060978 ymax: 876497.2
## Projected CRS: MAGNA_Colombia_Cali
## # A tibble: 1,223 × 33
##    FECHA               `ID ESTACIÓN` ESTACIÓN                  ACCESO MOVIMIENTO
##    <dttm>                      <dbl> <chr>                     <chr>  <chr>     
##  1 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N    NORTE  MOV 1     
##  2 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N    NORTE  MOV 1     
##  3 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N    NORTE  MOV 1     
##  4 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N    NORTE  MOV 1     
##  5 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N    NORTE  MOV 1     
##  6 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N    SUR    MOV 2     
##  7 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N    SUR    MOV 2     
##  8 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N    SUR    MOV 2     
##  9 2015-06-01 00:00:00             2 Autopista Cali-Yumbo X  … NORTE  MOV 1     
## 10 2015-06-01 00:00:00             2 Autopista Cali-Yumbo X  … NORTE  MOV 1     
## # ℹ 1,213 more rows
## # ℹ 28 more variables: `Hora de Encuesta` <dttm>, MUNICIPIO...7 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...8` <chr>,
## #   `Codigo Origen_SDG` <chr>, `¿QUE ESTABA HACIENDO EN ESE LUGAR?` <dbl>,
## #   MUNICIPIO...11 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...12` <chr>,
## #   `Codigo Destino_SDG` <chr>, `¿QUE VA HACER A ESE LUGAR?` <dbl>, …
# Copia del dataframe de bicicletas
origenbicicleta = origen3

# Establecer el CRS de origenbicicleta como el mismo que tiene mapacomunas
st_crs(origenbicicleta) <- st_crs(mapacomunas)  # Usamos st_crs en lugar de crs

# Realizar el conteo de registros por comuna
conteo_por_comuna3 <- table(origenbicicleta$comuna_origen)

# Crear nueva variable en mapacomunas y asignar los resultados del conteo
mapacomunas$origenbicicleta <- conteo_por_comuna3[match(mapacomunas$comuna, names(conteo_por_comuna3))]
mapacomunas$origenbicicleta <- as.numeric(mapacomunas$origenbicicleta)

# Mostrar el resultado
head(mapacomunas$origenbicicleta, 25)  # Accedemos a la nueva variable directamente
##  [1] 122  32  84 113  55 103  85  52  29  58  28  30  46  36  35  62  10  32  42
## [20]  71  33  65
# Cargar las librerías necesarias
library(ggplot2)
library(sf)

# Generar el mapa con ggplot2
ggplot(data = mapacomunas) +
  geom_sf(aes(fill = origenbicicleta)) +  # Rellenar con la variable 'origenbicicleta'
  scale_fill_viridis_c() +  # Escala de colores para 'origenbicicleta'
  labs(title = "Comunas Origen para viajes en bicicleta",  # Título del mapa
       fill = "Viajes en Bicicleta") +  # Leyenda del color
  theme_minimal()  # Tema visual minimalista

Conclusión Mapa de Origen Bicicleta

El análisis espacial de los viajes en bicicleta permite identificar las comunas de Cali donde este medio de transporte es más utilizado como punto de partida. Según los datos, las comunas con mayor número de viajes originados en bicicleta son:

Estas comunas presentan una alta participación en la movilidad ciclista, lo que podría estar relacionado con factores como topografía favorable, infraestructura ciclista existente, cercanía a zonas universitarias o comerciales, y cultura de uso de la bicicleta.

En contraste, comunas como la 12, 5 y 6 registran un número significativamente menor de viajes en bicicleta. Esto podría indicar barreras físicas, falta de infraestructura, percepción de inseguridad vial, o menor apropiación del uso de la bicicleta como medio de transporte cotidiano.

Este tipo de análisis es esencial para el diseño de políticas de movilidad sostenible, pues permite priorizar intervenciones en infraestructura (como ciclovías o zonas 30), fortalecer estrategias de seguridad vial y fomentar la cultura ciclista en sectores con menor participación.

Mapa Origen Moto

# Filtrar las filas donde 'TIPO DE VEHÍCULO' es igual a 2 (moto)
moto = which(origentotal$`TIPO DE VEHÍCULO` == 2)

# Crear el nuevo objeto sf con solo las motos
origen4 = origentotal[moto, ]

# Ver el objeto origen4
origen4
## Simple feature collection with 10307 features and 32 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: 1059648 ymin: 874236.3 xmax: 1060978 ymax: 876497.2
## Projected CRS: MAGNA_Colombia_Cali
## # A tibble: 10,307 × 33
##    FECHA               `ID ESTACIÓN` ESTACIÓN               ACCESO MOVIMIENTO
##    <dttm>                      <dbl> <chr>                  <chr>  <chr>     
##  1 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  2 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  3 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  4 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  5 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  6 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  7 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  8 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  9 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 10 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## # ℹ 10,297 more rows
## # ℹ 28 more variables: `Hora de Encuesta` <dttm>, MUNICIPIO...7 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...8` <chr>,
## #   `Codigo Origen_SDG` <chr>, `¿QUE ESTABA HACIENDO EN ESE LUGAR?` <dbl>,
## #   MUNICIPIO...11 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...12` <chr>,
## #   `Codigo Destino_SDG` <chr>, `¿QUE VA HACER A ESE LUGAR?` <dbl>, …
# Copia del dataframe de motos
origenmoto = origen4

# Establecer el CRS de origenmoto como el mismo que tiene mapacomunas
st_crs(origenmoto) <- st_crs(mapacomunas)  # Usamos st_crs en lugar de crs

# Realizar el conteo de registros por comuna
conteo_por_comuna4 <- table(origenmoto$comuna_origen)

# Crear nueva variable en mapacomunas y asignar los resultados del conteo
mapacomunas$origenmoto <- conteo_por_comuna4[match(mapacomunas$comuna, names(conteo_por_comuna4))]
mapacomunas$origenmoto <- as.numeric(mapacomunas$origenmoto)

# Mostrar el resultado
head(mapacomunas$origenmoto, 25)  # Accedemos a la nueva columna directamente
##  [1] 1063  296  702  995  455  853  593  430  377  571  260  272  421  317  323
## [16]  453  133  258  339  535  278  383
# Cargar las librerías necesarias
library(ggplot2)
library(sf)

# Generar el mapa con ggplot2
ggplot(data = mapacomunas) +
  geom_sf(aes(fill = origenmoto)) +  # Rellenar con la variable 'origenmoto'
  scale_fill_viridis_c() +  # Escala de colores para 'origenmoto'
  labs(title = "Comunas Origen para viajes en moto",  # Título del mapa
       fill = "Viajes en Moto") +  # Leyenda del color
  theme_minimal()  # Tema visual minimalista

Conclusión Mapa Origen Moto

El análisis del origen de los viajes realizados en moto revela una distribución espacial muy similar a la observada en el uso de la bicicleta, lo cual sugiere que ambos modos de transporte comparten zonas de alta demanda en la ciudad de Cali.

Las comunas con mayor número de viajes originados en moto son:

Estas comunas, ubicadas principalmente en el centro y suroriente de la ciudad, parecen tener una alta dependencia del uso de la motocicleta como medio de transporte diario. Este comportamiento puede estar relacionado con condiciones socioeconómicas, eficiencia del tiempo de viaje, y la flexibilidad que ofrece este vehículo para trayectos urbanos.

Por otro lado, comunas como la 12, 5, y 6 presentan una menor proporción de viajes en motocicleta, lo que puede reflejar distintos patrones de movilidad o limitaciones en el acceso a este medio de transporte.

Estos hallazgos son útiles para orientar acciones de seguridad vial, diseño de zonas de parqueo para motos, y establecimiento de regulaciones que garanticen una movilidad más ordenada y segura en las zonas de mayor concentración.

Mapa destino

Como etapa final del análisis, se procede a la elaboración de los mapas correspondientes a las comunas de destino de los viajes registrados en la encuesta. Tras haber presentado previamente los resultados enfocados en las comunas de origen, esta sección abordará los lugares a los que se dirigen los desplazamientos. La metodología utilizada será equivalente a la aplicada anteriormente, asegurando coherencia en la estructura del análisis y facilitando la comparación entre los patrones de origen y destino.

# Cargar el paquete sf
library(sf)

# Crear el objeto sf con las coordenadas de destino
destinototal <- st_as_sf(datoscali, coords = c("longitud_comuna_destino", "latitud_comuna_destino"), crs = st_crs(mapacomunas))

# Ver el objeto sf
destinototal
## Simple feature collection with 22151 features and 32 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: 1059648 ymin: 874236.3 xmax: 1060978 ymax: 876497.2
## Projected CRS: MAGNA_Colombia_Cali
## # A tibble: 22,151 × 33
##    FECHA               `ID ESTACIÓN` ESTACIÓN               ACCESO MOVIMIENTO
##  * <dttm>                      <dbl> <chr>                  <chr>  <chr>     
##  1 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  2 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  3 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  4 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  5 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  6 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  7 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  8 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  9 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 10 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## # ℹ 22,141 more rows
## # ℹ 28 more variables: `Hora de Encuesta` <dttm>, MUNICIPIO...7 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...8` <chr>,
## #   `Codigo Origen_SDG` <chr>, `¿QUE ESTABA HACIENDO EN ESE LUGAR?` <dbl>,
## #   MUNICIPIO...11 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...12` <chr>,
## #   `Codigo Destino_SDG` <chr>, `¿QUE VA HACER A ESE LUGAR?` <dbl>, …
# Copia del dataframe de destino
destino1 = destinototal

# Establecer el CRS de destino1 como el mismo que tiene mapacomunas
st_crs(destino1) <- st_crs(mapacomunas)  # Usamos st_crs en lugar de crs

# Realizar el conteo de registros por comuna
conteo_por_comuna5 <- table(destino1$comuna_destino)

# Nueva variable en mapacomunas y asignar los resultados del conteo
mapacomunas$destino1 <- conteo_por_comuna5[match(mapacomunas$comuna, names(conteo_por_comuna5))]
mapacomunas$destino1 <- as.numeric(mapacomunas$destino1)

# Mostrar el resultado
head(mapacomunas$destino1, 25)  # Accedemos directamente a la columna 'destino1'
##  [1] 3773  187 2887 2441  481 1616  526 1561  570 1497  440  598  830 1055  434
## [16]  560  207  316  483  741  303  645
# Cargar las librerías necesarias
library(ggplot2)
library(sf)
library(RColorBrewer)

# Generar la paleta de colores con 'RColorBrewer'
num_colors <- 9
color_paleta <- brewer.pal(num_colors, "OrRd")

# Generar el mapa con ggplot2
ggplot(data = mapacomunas) +
  geom_sf(aes(fill = destino1)) +  # Usamos 'destino1' para el relleno
  scale_fill_gradientn(colors = color_paleta) +  # Usamos la paleta de colores
  labs(title = "Comunas destino para viajes en Carro, moto y bicicleta",  # Título del mapa
       fill = "Viajes en Destino") +  # Leyenda para el color
  theme_minimal()  # Estilo visual minimalista

Análisis del Mapa de Comunas de Destino

La visualización del mapa de comunas de destino permite identificar las zonas de la ciudad que reciben mayor cantidad de viajes, independientemente del medio de transporte utilizado (carro, moto o bicicleta). Para ello, se construyó una nueva variable denominada destino1, que representa el número total de viajes que llegan a cada comuna, la cual fue calculada a partir del conteo de registros de la variable comuna_destino.

Los resultados revelan que las comunas con mayor concentración de destinos son:

Estas comunas destacan como centros de atracción de desplazamientos dentro de Cali, lo cual podría estar vinculado a la presencia de zonas comerciales, instituciones educativas, centros administrativos o polos de empleo. En especial, la Comuna 2 presenta un valor significativamente alto, lo que sugiere un papel central en la dinámica urbana.

Por el contrario, comunas como la 1, 5, 12, y 21 registran valores considerablemente más bajos, lo que podría reflejar un menor peso como destinos de viaje en la ciudad, ya sea por características residenciales, limitada oferta de servicios o menor conectividad vial.

El uso de un mapa de coropletas para representar esta información permite visualizar de forma clara las diferencias espaciales entre comunas y sirve como herramienta clave para la toma de decisiones en materia de planificación urbana y transporte.

Mapa Destino Carros

# Filtrar las filas donde 'TIPO DE VEHÍCULO' es igual a 3 (carros)
carros2 = which(destinototal$`TIPO DE VEHÍCULO` == 3)

# Crear el nuevo objeto sf con solo los carros
destino2 = destinototal[carros2, ]

# Ver el objeto destino2
destino2
## Simple feature collection with 8605 features and 32 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: 1059648 ymin: 874236.3 xmax: 1060978 ymax: 876497.2
## Projected CRS: MAGNA_Colombia_Cali
## # A tibble: 8,605 × 33
##    FECHA               `ID ESTACIÓN` ESTACIÓN               ACCESO MOVIMIENTO
##    <dttm>                      <dbl> <chr>                  <chr>  <chr>     
##  1 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  2 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  3 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  4 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  5 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  6 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  7 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  8 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  9 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 10 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## # ℹ 8,595 more rows
## # ℹ 28 more variables: `Hora de Encuesta` <dttm>, MUNICIPIO...7 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...8` <chr>,
## #   `Codigo Origen_SDG` <chr>, `¿QUE ESTABA HACIENDO EN ESE LUGAR?` <dbl>,
## #   MUNICIPIO...11 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...12` <chr>,
## #   `Codigo Destino_SDG` <chr>, `¿QUE VA HACER A ESE LUGAR?` <dbl>, …
# Copia del dataframe de destino de carros
destinocarro = destino2

# Establecer el CRS de destinocarro como el mismo que tiene mapacomunas
st_crs(destinocarro) <- st_crs(mapacomunas)  # Usamos st_crs en lugar de crs

# Realizar el conteo de registros por comuna
conteo_por_comuna6 <- table(destinocarro$comuna_destino)

# Crear nueva variable en mapacomunas y asignar los resultados del conteo
mapacomunas$destinocarro <- conteo_por_comuna6[match(mapacomunas$comuna, names(conteo_por_comuna6))]
mapacomunas$destinocarro <- as.numeric(mapacomunas$destinocarro)

# Mostrar el resultado
head(mapacomunas$destinocarro, 25)  # Usamos $ para acceder a la columna 'destinocarro'
##  [1] 1518   73 1098  926  199  650  216  564  208  596  181  224  325  382  164
## [16]  189   71  120  204  291  131  275
# Cargar las librerías necesarias
library(ggplot2)
library(sf)
library(RColorBrewer)

# Generar la paleta de colores con 'RColorBrewer'
num_colors <- 9
color_paleta <- brewer.pal(num_colors, "OrRd")

# Generar el mapa con ggplot2
ggplot(data = mapacomunas) +
  geom_sf(aes(fill = destinocarro)) +  # Usamos 'destinocarro' para el relleno
  scale_fill_gradientn(colors = color_paleta) +  # Usamos la paleta de colores generada
  labs(title = "Comunas destino para viajes en Carro",  # Título del mapa
       fill = "Viajes en Carro") +  # Leyenda de la variable 'destinocarro'
  theme_minimal()  # Tema visual minimalista

Conclusión Mapa Destino Carro

El mapa generado permite visualizar la distribución espacial de los destinos de los viajes realizados en carro particular dentro de la ciudad de Cali. A partir del filtrado de registros y el conteo por comuna, se identificaron las zonas que concentran un mayor número de llegadas de este tipo de transporte.

Entre las comunas con mayor cantidad de destinos de viajes en carro se encuentran:

Estas comunas destacan como focos de atracción vehicular, probablemente debido a la presencia de áreas comerciales, administrativas, centros educativos o de servicios que generan una fuerte demanda de desplazamientos en vehículo particular.

Por el contrario, comunas como la 12, 5 y 21 muestran una menor participación como destinos de viajes en carro, lo cual puede estar relacionado con su vocación residencial, menor conectividad vial o menor concentración de equipamientos urbanos.

Este análisis espacial es clave para la planificación del tráfico vehicular, la identificación de zonas con potenciales problemas de congestión, y el diseño de estrategias orientadas a mejorar la accesibilidad y gestión del flujo automotor en las comunas con mayor carga de destino.

Mapa Moto

# Filtrar las filas donde 'TIPO DE VEHÍCULO' es igual a 2 (moto)
moto2 = which(destinototal$`TIPO DE VEHÍCULO` == 2)

# Crear el nuevo objeto sf con solo las motos
destino3 = destinototal[moto2, ]

# Ver el objeto destino3
destino3
## Simple feature collection with 10307 features and 32 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: 1059648 ymin: 874236.3 xmax: 1060978 ymax: 876497.2
## Projected CRS: MAGNA_Colombia_Cali
## # A tibble: 10,307 × 33
##    FECHA               `ID ESTACIÓN` ESTACIÓN               ACCESO MOVIMIENTO
##    <dttm>                      <dbl> <chr>                  <chr>  <chr>     
##  1 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  2 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  3 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  4 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  5 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  6 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  7 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  8 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
##  9 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## 10 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N NORTE  MOV 1     
## # ℹ 10,297 more rows
## # ℹ 28 more variables: `Hora de Encuesta` <dttm>, MUNICIPIO...7 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...8` <chr>,
## #   `Codigo Origen_SDG` <chr>, `¿QUE ESTABA HACIENDO EN ESE LUGAR?` <dbl>,
## #   MUNICIPIO...11 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...12` <chr>,
## #   `Codigo Destino_SDG` <chr>, `¿QUE VA HACER A ESE LUGAR?` <dbl>, …
# Copia del dataframe de destino de motos
destinomoto = destino3

# Establecer el CRS de destinomoto como el mismo que tiene mapacomunas
st_crs(destinomoto) <- st_crs(mapacomunas)  # Usamos st_crs en lugar de crs

# Realizar el conteo de registros por comuna
conteo_por_comuna7 <- table(destinomoto$comuna_destino)

# Crear nueva variable en mapacomunas y asignar los resultados del conteo
mapacomunas$destinomoto <- conteo_por_comuna7[match(mapacomunas$comuna, names(conteo_por_comuna7))]
mapacomunas$destinomoto <- as.numeric(mapacomunas$destinomoto)

# Mostrar el resultado
head(mapacomunas$destinomoto, 25)  # Usamos $ para acceder a la columna 'destinomoto'
##  [1] 1734   90 1333 1152  232  744  240  766  255  678  183  279  382  512  202
## [16]  285  106  150  217  353  124  290
# Cargar las librerías necesarias
library(ggplot2)
library(sf)
library(RColorBrewer)

# Generar la paleta de colores con 'RColorBrewer'
num_colors <- 9
color_paleta <- brewer.pal(num_colors, "OrRd")

# Generar el mapa con ggplot2
ggplot(data = mapacomunas) +
  geom_sf(aes(fill = destinomoto)) +  # Usamos 'destinomoto' para el relleno
  scale_fill_gradientn(colors = color_paleta) +  # Usamos la paleta de colores generada
  labs(title = "Comunas destino para viajes en moto",  # Título del mapa
       fill = "Viajes en Moto") +  # Leyenda de la variable 'destinomoto'
  theme_minimal()  # Tema visual minimalista

Conclusión Mapa Destino Moto

El análisis de los destinos de los viajes realizados en moto permite identificar las comunas de Cali que funcionan como puntos de llegada más frecuentes para este tipo de transporte. A partir del filtrado de datos y el conteo de registros por comuna, se observa que las motocicletas tienen una presencia significativa como modo de transporte en buena parte del área urbana.

Las comunas con mayor número de viajes de destino en moto son:

Estas cifras indican que las motocicletas tienden a tener una distribución de destino similar a la del automóvil, con una fuerte concentración en comunas del centro, sur y oriente de la ciudad. Esto puede estar relacionado con la alta flexibilidad, bajo costo de operación y facilidad de desplazamiento de este medio, especialmente en zonas con mayor tráfico o limitada oferta de transporte público.

En contraste, comunas como la 12, 14 y 1 presentan valores relativamente bajos, lo cual podría reflejar diferencias en la dinámica socioeconómica, la infraestructura vial disponible o las actividades que se desarrollan en esos territorios.

Este tipo de análisis es clave para diseñar políticas de seguridad vial, infraestructura de parqueo y control de flujo vehicular en zonas de alta recepción de motos, así como para entender la lógica territorial de este modo de transporte en contextos urbanos como Cali.

Mapa Bicicleta

# Filtrar las filas donde 'TIPO DE VEHÍCULO' es igual a 1 (bicicleta)
bicicleta2 = which(destinototal$`TIPO DE VEHÍCULO` == 1)

# Crear el nuevo objeto sf con solo las bicicletas
destino4 = destinototal[bicicleta2, ]

# Ver el objeto destino4
destino4
## Simple feature collection with 1223 features and 32 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: 1059648 ymin: 874236.3 xmax: 1060978 ymax: 876497.2
## Projected CRS: MAGNA_Colombia_Cali
## # A tibble: 1,223 × 33
##    FECHA               `ID ESTACIÓN` ESTACIÓN                  ACCESO MOVIMIENTO
##    <dttm>                      <dbl> <chr>                     <chr>  <chr>     
##  1 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N    NORTE  MOV 1     
##  2 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N    NORTE  MOV 1     
##  3 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N    NORTE  MOV 1     
##  4 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N    NORTE  MOV 1     
##  5 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N    NORTE  MOV 1     
##  6 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N    SUR    MOV 2     
##  7 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N    SUR    MOV 2     
##  8 2015-06-01 00:00:00             1 Avenida 6N X Calle 70N    SUR    MOV 2     
##  9 2015-06-01 00:00:00             2 Autopista Cali-Yumbo X  … NORTE  MOV 1     
## 10 2015-06-01 00:00:00             2 Autopista Cali-Yumbo X  … NORTE  MOV 1     
## # ℹ 1,213 more rows
## # ℹ 28 more variables: `Hora de Encuesta` <dttm>, MUNICIPIO...7 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...8` <chr>,
## #   `Codigo Origen_SDG` <chr>, `¿QUE ESTABA HACIENDO EN ESE LUGAR?` <dbl>,
## #   MUNICIPIO...11 <chr>,
## #   `DEPARTAMENTO / LOCALIDAD  / COMUNA / DISTRITO / BARRIO / VEREDA  / HITO / DIRECCIÓN...12` <chr>,
## #   `Codigo Destino_SDG` <chr>, `¿QUE VA HACER A ESE LUGAR?` <dbl>, …
# Copia del dataframe de destino de bicicletas
destinobicicleta = destino4

# Establecer el CRS de destinobicicleta como el mismo que tiene mapacomunas
st_crs(destinobicicleta) <- st_crs(mapacomunas)  # Usamos st_crs en lugar de crs

# Realizar el conteo de registros por comuna
conteo_por_comuna8 <- table(destinobicicleta$comuna_destino)

# Crear nueva variable en mapacomunas y asignar los resultados del conteo
mapacomunas$destinobicicleta <- conteo_por_comuna8[match(mapacomunas$comuna, names(conteo_por_comuna8))]
mapacomunas$destinobicicleta <- as.numeric(mapacomunas$destinobicicleta)

# Mostrar el resultado
head(mapacomunas$destinobicicleta, 25)  # Usamos $ para acceder a la columna 'destinobicicleta'
##  [1] 194   9 169 131  17  95  28  95  31  80  38  36  46  56  24  28  13  20  26
## [20]  34  22  31
# Cargar las librerías necesarias
library(ggplot2)
library(sf)
library(RColorBrewer)

# Generar la paleta de colores con 'RColorBrewer'
num_colors <- 9
color_paleta <- brewer.pal(num_colors, "OrRd")

# Generar el mapa con ggplot2
ggplot(data = mapacomunas) +
  geom_sf(aes(fill = destinobicicleta)) +  # Usamos 'destinobicicleta' para el relleno
  scale_fill_gradientn(colors = color_paleta) +  # Usamos la paleta de colores generada
  labs(title = "Comunas destino para viajes en bicicleta",  # Título del mapa
       fill = "Viajes en Bicicleta") +  # Leyenda para el color
  theme_minimal()  # Tema visual minimalista

Conclusión: Mapa de Destino en Bicicleta

El análisis de los destinos de viajes realizados en bicicleta dentro de Cali permite evidenciar una distribución más concentrada y selectiva en comparación con otros modos de transporte motorizados como el carro o la moto. En este caso, se identifican las comunas que reciben una mayor cantidad de viajes realizados en bicicleta, destacando los siguientes resultados:

Estas comunas presentan una fuerte atracción para los viajes en bicicleta, lo cual podría estar asociado con factores como:

En contraste, comunas como la 12, 1 y 14 muestran una menor recepción de viajes en bicicleta, lo cual puede estar relacionado con barreras geográficas (como pendientes), menor conectividad ciclística o menor cultura de uso de este medio.

La menor dispersión y volumen total de viajes en comparación con la moto o el carro sugiere que la bicicleta se utiliza principalmente para viajes de distancias más cortas, posiblemente intra-comunales o entre comunas vecinas, lo que subraya su rol como medio de transporte sostenible en entornos urbanos compactos.

Este tipo de análisis es fundamental para identificar áreas donde se debe reforzar la infraestructura, promover la intermodalidad con transporte público y diseñar campañas que fomenten el uso seguro y eficiente de la bicicleta en la ciudad.