El análisis espacial de datos se enfoca en examinar los fenómenos que ocurren sobre la superficie terrestre, con el propósito de comprender mejor el entorno que habitamos. A través de este análisis se busca reconocer patrones, vínculos y formas de distribución de dichos fenómenos, lo que resulta de gran utilidad en áreas como la planeación urbana, la administración de recursos, la salud pública y el cuidado ambiental.
Este proyecto, desarrollado a partir de la revisión de una encuesta aplicada a personas del área metropolitana de Cali, tiene como finalidad determinar los puntos de origen y destino de los individuos. Asimismo, busca analizar la frecuencia de uso de distintos medios de transporte, como bicicletas, motocicletas y automóviles, y conocer los flujos de movilidad entre las diferentes zonas y comunas de la ciudad.
Para la elaboración de este informe se emplearán técnicas y herramientas de análisis estadístico y espacial, con el propósito de organizar, sintetizar y presentar la información recolectada en la encuesta de origen y destino correspondiente a la actividad 1 de la asignatura Análisis de Información Geográfica y Espacial. El trabajo se desarrollará en las siguientes fases:
Comprensión de los datos: análisis exploratorio y preparación de la información.
Elaboración de mapas y análisis de resultados.
Conclusiones.
De acuerdo con la necesidad de análisis de información, se procede a cargar las siguientes librerias
Posteriormente, se carga la base de datos Encuesta Origen - Destino, la cual contiene diversas variables relacionadas con la movilidad de las personas en la ciudad de Cali y sus alrededores. Entre sus principales características se encuentran datos como los municipios de origen y destino, el barrio, la dirección, el estrato socioeconómico, el medio de transporte utilizado, la edad, el sexo, entre otros aspectos.
library(readxl)
Encuesta <- read_excel("C:/Users/Cristian Restrepo/OneDrive - PUJ Cali/Geogra_Espacial/Casos/EncuestaOrigenDestino.xlsx")
print(Encuesta)## # A tibble: 35,054 × 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
## 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
## # ℹ 35,044 more rows
## # ℹ 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>, …
Se proceder a cargar el Data Frame Spacial (Polinomios) de las comunas correspondientes a la ciudad de Santiago de Cali, Colombia.
comunas <- st_read("C:/Users/Cristian Restrepo/OneDrive - PUJ Cali/Geogra_Espacial/Casos/cali/Comunas.shp")## Reading layer `Comunas' from data source
## `C:\Users\Cristian Restrepo\OneDrive - PUJ Cali\Geogra_Espacial\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
## 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
## First 10 features:
## OBJECTID gid comuna nombre geometry
## 1 1 107 2 Comuna 2 POLYGON ((1059648 874236.3,...
## 2 2 108 1 Comuna 1 POLYGON ((1054094 875172.8,...
## 3 3 109 3 Comuna 3 POLYGON ((1061757 874615.5,...
## 4 4 110 19 Comuna 19 POLYGON ((1057817 873269.4,...
## 5 5 103 15 Comuna 15 POLYGON ((1065485 869864.1,...
## 6 6 104 17 Comuna 17 POLYGON ((1061675 868320.9,...
## 7 7 105 18 Comuna 18 POLYGON ((1059061 867223.6,...
## 8 8 106 22 Comuna 22 POLYGON ((1059486 864976.4,...
## 9 9 89 6 Comuna 6 POLYGON ((1065143 879409.5,...
## 10 10 90 4 Comuna 4 POLYGON ((1063833 877507.1,...
Antes de iniciar el procesamiento de la información, es importante revisar la estructura y composición de los datos. Para esto, se lleva a cabo un análisis exploratorio que incluye la revisión de los siguientes aspectos:
Durante esta revisión se evidencia que algunas variables presentan una alta cantidad de datos faltantes, especialmente en campos como “otro, cuál”, “antes”, “después”, “¿disponía de vehículo?”, entre otros. No obstante, estas variables no tienen una participación significativa en el análisis que se desarrollará.
faltantes <- colSums(is.na(Encuesta)) %>%
as.data.frame()
colnames(faltantes) <- "Datos Faltantes"
kableExtra::kable(faltantes, caption = "Datos faltantes por variable") %>%
kableExtra::kable_styling(
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center"
)| Datos Faltantes | |
|---|---|
| FECHA | 0 |
| ID ESTACIÓN | 0 |
| ESTACIÓN | 0 |
| ACCESO | 0 |
| MOVIMIENTO | 0 |
| Hora de Encuesta | 0 |
| MUNICIPIO…7 | 38 |
| DEPARTAMENTO / LOCALIDAD / COMUNA / DISTRITO / BARRIO / VEREDA / HITO / DIRECCIÓN…8 | 0 |
| Codigo Origen_SDG | 0 |
| ¿QUE ESTABA HACIENDO EN ESE LUGAR? | 383 |
| MUNICIPIO…11 | 41 |
| DEPARTAMENTO / LOCALIDAD / COMUNA / DISTRITO / BARRIO / VEREDA / HITO / DIRECCIÓN…12 | 1 |
| Codigo Destino_SDG | 0 |
| ¿QUE VA HACER A ESE LUGAR? | 154 |
| ESTRATO EN SU VIVIENDA | 1231 |
| ¿DISPONIA DE UN VEHÍCULO PARA REALIZAR ESTE DESPLAZAMIENTO? | 18189 |
| OTRO ¿CUÁL?…17 | 35054 |
| ANTES | 34919 |
| DESPUES | 35001 |
| EDAD | 479 |
| SEXO | 731 |
| PERSONAS EN EL VEHÍCULO | 118 |
| TIPO DE VEHÍCULO | 115 |
| OTRO ¿CUÁL?…24 | 35054 |
| TIPO DE VIAJERO | 129 |
| comuna origen | 0 |
| comuna destino | 0 |
| Intracomuna | 0 |
A continuación, se puede observar la frecuencia de las comunas de origen. Inicialmente, se identifican valores como 0 y “fuera de Cali”, los cuales serán eliminados, ya que no resultan útiles para el análisis. Asimismo, se evidencia que las comunas con mayor participación a nivel general son la 2, 19, 17 y 3.
tabla_comuna <- addmargins(
table(Encuesta$`comuna origen`, useNA = "ifany")
)
kbl(
tabla_comuna,
caption = "Tabla 1. Frecuencia de la variable Comuna Origen",
col.names = c("Comuna", "Frecuencia")
) %>%
kable_classic(full_width = FALSE)| Comuna | Frecuencia |
|---|---|
| 0 | 672 |
| 01 | 794 |
| 02 | 2968 |
| 03 | 2121 |
| 04 | 1493 |
| 05 | 664 |
| 06 | 998 |
| 07 | 734 |
| 08 | 1124 |
| 09 | 952 |
| 10 | 1401 |
| 11 | 925 |
| 12 | 348 |
| 13 | 1238 |
| 14 | 685 |
| 15 | 1171 |
| 16 | 993 |
| 17 | 2377 |
| 18 | 1536 |
| 19 | 2850 |
| 20 | 733 |
| 21 | 818 |
| 22 | 1153 |
| Fuera de Cali | 6306 |
| Sum | 35054 |
La Tabla 1 presenta la frecuencia de la variable Comuna Origen, permitiendo identificar desde qué zonas se originan con mayor frecuencia los desplazamientos registrados en la encuesta.
Se observa que la categoría con mayor número de registros corresponde a “Fuera de Cali”, con 6.306 casos, lo que indica que una parte importante de los viajes tiene origen en municipios o zonas externas a la ciudad. Sin embargo, dado que el análisis se enfoca en las comunas de Cali, esta categoría podría excluirse para evitar distorsiones en la interpretación espacial interna.
Dentro de las comunas de Cali, las que presentan mayor frecuencia son la Comuna 02, con 2.968 registros, seguida de la Comuna 19, con 2.850 registros, la Comuna 17, con 2.377 registros, y la Comuna 03, con 2.121 registros. Esto evidencia que estas comunas tienen una alta participación como puntos de origen de los desplazamientos, posiblemente por su concentración de población, actividades económicas, servicios o conectividad vial.
Por otro lado, las comunas con menor frecuencia son la Comuna 12, con 348 registros, la Comuna 05, con 664 registros, y la Comuna 14, con 685 registros. Esto sugiere una menor representación de viajes originados en estas zonas dentro de la encuesta.
También se identifica la presencia de la categoría 0, con 672 registros, la cual no corresponde a una comuna específica. Por esta razón, sería conveniente depurar estos datos antes de realizar el análisis final, ya que pueden representar registros incompletos, mal clasificados o sin información clara de origen.
En general, la tabla muestra que los desplazamientos no se distribuyen de manera uniforme entre las comunas, sino que se concentran principalmente en algunas zonas específicas de la ciudad, especialmente en las comunas 2, 19, 17 y 3.
#Ver frecuencia de categorías en la variable "Comuna Destino"
kbl(addmargins(table(Encuesta$`comuna destino`, useNA = "ifany")), caption = "<center><b>Tabla 2. Frecuencia de la variable Comuna Destino</b></center>", col.names=c("Comuna","Frecuencia"))%>%
kable_classic(full_width = F)| Comuna | Frecuencia |
|---|---|
| 0 | 788 |
| 01 | 230 |
| 02 | 4810 |
| 03 | 3859 |
| 04 | 1856 |
| 05 | 522 |
| 06 | 716 |
| 07 | 748 |
| 08 | 1025 |
| 09 | 1279 |
| 10 | 927 |
| 11 | 564 |
| 12 | 246 |
| 13 | 673 |
| 14 | 379 |
| 15 | 579 |
| 16 | 743 |
| 17 | 2164 |
| 18 | 662 |
| 19 | 3158 |
| 20 | 351 |
| 21 | 515 |
| 22 | 1860 |
| Fuera de Cali | 6400 |
| Sum | 35054 |
La Tabla 2 muestra la frecuencia de la variable Comuna Destino, permitiendo identificar las zonas hacia donde se dirigen principalmente los desplazamientos.
Se observa que la categoría con mayor frecuencia es “Fuera de Cali”, con 6.400 registros, lo que indica una alta presencia de viajes con destino fuera de la ciudad. Dentro de Cali, las comunas con mayor participación son la Comuna 02 con 4.810 registros, la Comuna 03 con 3.859, la Comuna 19 con 3.158 y la Comuna 17 con 2.164.
Por otro lado, las comunas con menor frecuencia son la Comuna 12, Comuna 01, Comuna 20 y Comuna 14, lo que refleja una menor concentración de viajes hacia estas zonas. Además, la categoría 0 debería revisarse o eliminarse, ya que no representa una comuna válida para el análisis.
En general, los destinos se concentran principalmente en las comunas 2, 3, 19 y 17, lo que sugiere que estas zonas tienen una mayor atracción de viajes dentro de la ciudad.
Ahora bien, se valida que la base no tenga datos faltantes para la nueva base organizada para el análisis de información
library(dplyr)
# 1. Seleccionar variables
df <- Encuesta %>%
select(
`TIPO DE VEHÍCULO`,
`MUNICIPIO...7`,
`comuna origen`,
`MUNICIPIO...11`,
`comuna destino`
)
# 2. Limpiar espacios y caracteres raros
df <- df %>%
mutate(
`comuna origen` = trimws(`comuna origen`),
`comuna destino` = trimws(`comuna destino`)
)
# 3. Filtrar valores válidos
df <- df %>%
filter(
!(`comuna origen` %in% c("0", "Fuera de Cali", "")),
!(`comuna destino` %in% c("0", "Fuera de Cali", "")),
`TIPO DE VEHÍCULO` %in% c("1", "2", "3"),
`MUNICIPIO...7` == "CALI",
`MUNICIPIO...11` == "CALI"
)
# 4. Renombrar columnas
df <- df %>%
rename(
`municipio de origen` = `MUNICIPIO...7`,
`municipio destino` = `MUNICIPIO...11`,
`tipo de vehículo` = `TIPO DE VEHÍCULO`
)
# 5. Recodificar tipo de vehículo
df <- df %>%
mutate(
`tipo de vehículo` = recode(`tipo de vehículo`,
"1" = "Bicicleta",
"2" = "Moto",
"3" = "Automóvil"
)
)
# 6. Convertir comunas a numéricas (esto puede generar NA)
df <- df %>%
mutate(
`comuna origen` = as.numeric(`comuna origen`),
`comuna destino` = as.numeric(`comuna destino`)
)
# 7. Eliminar valores faltantes (ahora sí correctamente)
library(tidyr)
df <- df %>%
drop_na()
# 8. Verificar resultado
summary(df)## tipo de vehículo municipio de origen comuna origen municipio destino
## Length :20123 Length :20123 Min. : 1.00 Length :20123
## N.unique : 3 N.unique : 1 1st Qu.: 4.00 N.unique : 1
## N.blank : 0 N.blank : 0 Median :12.00 N.blank : 0
## Min.nchar: 4 Min.nchar: 4 Mean :11.47 Min.nchar: 4
## Max.nchar: 9 Max.nchar: 4 3rd Qu.:18.00 Max.nchar: 4
## Max. :22.00
## comuna destino
## Min. : 1.00
## 1st Qu.: 3.00
## Median : 9.00
## Mean :10.21
## 3rd Qu.:17.00
## Max. :22.00
Despues de filtrado identificamos como se comportan los datos faltantes
#Conocer los datos faltantes de la nueva BD filtrada
faltantes = colSums(is.na(df)) %>%
as.data.frame()
colnames(faltantes) = "Datos Faltantes"
kable(faltantes, caption = " ") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = FALSE, position = "center")| Datos Faltantes | |
|---|---|
| tipo de vehículo | 0 |
| municipio de origen | 0 |
| comuna origen | 0 |
| municipio destino | 0 |
| comuna destino | 0 |
# Agrupar y contar los movimientos por comuna de origen
conteo_movimientos_or = df %>%
group_by(`comuna origen`) %>%
summarize(total_movimientos = n(), .groups = "drop")
# Calcular el porcentaje sobre el total
conteo_movimientos_or = conteo_movimientos_or %>%
mutate(porcentaje = round((total_movimientos / sum(total_movimientos)) * 100, 2))
# Mostrar el dataframe resultante
formattable(conteo_movimientos_or)| comuna origen | total_movimientos | porcentaje |
|---|---|---|
| 1 | 562 | 2.79 |
| 2 | 2044 | 10.16 |
| 3 | 1463 | 7.27 |
| 4 | 1072 | 5.33 |
| 5 | 473 | 2.35 |
| 6 | 719 | 3.57 |
| 7 | 531 | 2.64 |
| 8 | 786 | 3.91 |
| 9 | 648 | 3.22 |
| 10 | 1010 | 5.02 |
| 11 | 649 | 3.23 |
| 12 | 231 | 1.15 |
| 13 | 927 | 4.61 |
| 14 | 525 | 2.61 |
| 15 | 887 | 4.41 |
| 16 | 768 | 3.82 |
| 17 | 1618 | 8.04 |
| 18 | 1111 | 5.52 |
| 19 | 2030 | 10.09 |
| 20 | 539 | 2.68 |
| 21 | 630 | 3.13 |
| 22 | 900 | 4.47 |
Las comunas desde donde se origina el mayor número de viajes, independientemente del medio de transporte utilizado, son la Comuna 2, con 2.044 viajes, equivalente al 10,16%; seguida de la Comuna 19, con 2.030 viajes y una participación del 10,09%; la Comuna 17, con 1.618 viajes, correspondiente al 8,04%; y la Comuna 3, con 1.463 viajes, equivalente al 7,27%.
En contraste, la comuna con menor número de viajes de origen es la Comuna 12, con 231 viajes, lo que representa el 1,15%.
library(sf)
library(dplyr)
library(ggplot2)
library(RColorBrewer)
# 1. Unir datos correctamente (sf + dplyr)
ComunaOrigen <- comunas %>%
left_join(
conteo_movimientos_or,
by = c("comuna" = "comuna origen")
)
# 2. Reemplazar NA por 0
ComunaOrigen <- ComunaOrigen %>%
mutate(
total_movimientos = ifelse(is.na(total_movimientos), 0, total_movimientos)
)
# 3. Calcular centroides (forma correcta en sf)
centroids_origen <- st_centroid(ComunaOrigen)
# 4. Mapa
grafico_origen <- ggplot(ComunaOrigen) +
geom_sf(aes(fill = total_movimientos), color = "black", linewidth = 0.2) +
geom_sf_text(
data = centroids_origen,
aes(label = comuna),
size = 3
) +
scale_fill_distiller(
palette = "Spectral",
direction = -1,
name = "Total viajes"
) +
labs(
title = "Comuna de origen de los viajes",
subtitle = "Distribución espacial de viajes en Cali"
) +
theme_minimal()
grafico_origen# Agrupar y contar los movimientos por comuna de destino
conteo_movimientos_destino = df %>%
group_by(`comuna destino`) %>%
summarize(total_movimientos = n(), .groups = "drop")
# Calcular el porcentaje sobre el total
conteo_movimientos_destino = conteo_movimientos_destino %>%
mutate(porcentaje = round((total_movimientos / sum(total_movimientos)) * 100, 2))
# Mostrar la tabla completa
formattable(conteo_movimientos_destino)| comuna destino | total_movimientos | porcentaje |
|---|---|---|
| 1 | 172 | 0.85 |
| 2 | 3445 | 17.12 |
| 3 | 2594 | 12.89 |
| 4 | 1353 | 6.72 |
| 5 | 402 | 2.00 |
| 6 | 494 | 2.45 |
| 7 | 539 | 2.68 |
| 8 | 753 | 3.74 |
| 9 | 950 | 4.72 |
| 10 | 678 | 3.37 |
| 11 | 447 | 2.22 |
| 12 | 190 | 0.94 |
| 13 | 502 | 2.49 |
| 14 | 290 | 1.44 |
| 15 | 448 | 2.23 |
| 16 | 596 | 2.96 |
| 17 | 1488 | 7.39 |
| 18 | 484 | 2.41 |
| 19 | 2206 | 10.96 |
| 20 | 277 | 1.38 |
| 21 | 390 | 1.94 |
| 22 | 1425 | 7.08 |
library(sf)
library(dplyr)
library(ggplot2)
# Unir datos espaciales con movimientos de destino
ComunaDestino <- comunas %>%
left_join(
conteo_movimientos_destino,
by = c("comuna" = "comuna destino")
)
# Reemplazar NA por 0
ComunaDestino <- ComunaDestino %>%
mutate(
total_movimientos = ifelse(is.na(total_movimientos), 0, total_movimientos),
porcentaje = ifelse(is.na(porcentaje), 0, porcentaje)
)
# Calcular centroides
centroids_destino <- st_centroid(ComunaDestino)
# Mapa de destino
grafico_destino <- ggplot(ComunaDestino) +
geom_sf(aes(fill = total_movimientos), color = "black", linewidth = 0.2) +
geom_sf_text(
data = centroids_destino,
aes(label = comuna),
size = 3,
color = "black"
) +
scale_fill_distiller(
palette = "Spectral",
direction = -1,
name = "Total viajes"
) +
labs(
title = "Comuna destino de los viajes",
subtitle = "Distribucion espacial de viajes en Cali"
) +
theme_minimal()
grafico_destinoDe acuerdo con la información presentada, se evidencia que, sin importar el medio de transporte utilizado, las comunas con mayor concentración de viajes como destino son la 2, 3 y 19, con participaciones del 17,1%, 12,9% y 11%, respectivamente. En conjunto, estas tres comunas reúnen un poco más del 40% de los desplazamientos registrados hacia destinos dentro del análisis.
Para lo requerido, se necesita filtrat por tipo de desplazamiento
library(dplyr)
library(janitor)
# Renombrar columnas para evitar problemas de tildes y espacios
df_limpio <- df %>%
clean_names()
# Verifica nombres
names(df_limpio)## [1] "tipo_de_vehiculo" "municipio_de_origen" "comuna_origen"
## [4] "municipio_destino" "comuna_destino"
# Agrupar y contar movimientos por comuna de origen y tipo de vehículo
conteo_movimientos_origen <- df_limpio %>%
filter(tipo_de_vehiculo %in% c("Moto", "Bicicleta", "Automóvil")) %>%
group_by(tipo_de_vehiculo, comuna_origen) %>%
summarise(
total_movimientos = n(),
.groups = "drop"
) %>%
group_by(tipo_de_vehiculo) %>%
mutate(
porcentaje = round((total_movimientos / sum(total_movimientos)) * 100, 2)
) %>%
ungroup()
# Filtrar por tipo de vehículo
bicicleta_origen <- conteo_movimientos_origen %>%
filter(tipo_de_vehiculo == "Bicicleta")
moto_origen <- conteo_movimientos_origen %>%
filter(tipo_de_vehiculo == "Moto")
automovil_origen <- conteo_movimientos_origen %>%
filter(tipo_de_vehiculo == "Automóvil")
conteo_movimientos_origen| tipo_de_vehiculo | comuna_origen | total_movimientos | porcentaje |
|---|---|---|---|
| Bicicleta | 1 | 32 | 2.62 |
| Bicicleta | 2 | 122 | 9.98 |
| Bicicleta | 3 | 84 | 6.87 |
| Bicicleta | 4 | 58 | 4.74 |
| Bicicleta | 5 | 28 | 2.29 |
| Bicicleta | 6 | 29 | 2.37 |
| Bicicleta | 7 | 30 | 2.45 |
| Bicicleta | 8 | 46 | 3.76 |
| Bicicleta | 9 | 36 | 2.94 |
| Bicicleta | 10 | 71 | 5.81 |
| Bicicleta | 11 | 42 | 3.43 |
| Bicicleta | 12 | 10 | 0.82 |
| Bicicleta | 13 | 62 | 5.07 |
| Bicicleta | 14 | 32 | 2.62 |
| Bicicleta | 15 | 55 | 4.50 |
| Bicicleta | 16 | 65 | 5.31 |
| Bicicleta | 17 | 103 | 8.42 |
| Bicicleta | 18 | 85 | 6.95 |
| Bicicleta | 19 | 113 | 9.24 |
| Bicicleta | 20 | 33 | 2.70 |
| Bicicleta | 21 | 35 | 2.86 |
| Bicicleta | 22 | 52 | 4.25 |
library(dplyr)
library(sf)
library(ggplot2)
library(janitor)
# Renombrar columnas para evitar tildes y espacios
df_limpio <- df %>%
clean_names()
# Filtrar tipo de vehículo Bicicleta
Bicicleta <- df_limpio %>%
filter(tipo_de_vehiculo == "Bicicleta")
# Consolidar datos para bicicletas
ComunaOrigenBici <- Bicicleta %>%
group_by(comuna_origen) %>%
summarise(conteo = n(), .groups = "drop") %>%
rename(comuna = comuna_origen)
# Asegurar que las llaves tengan el mismo tipo
comunas <- comunas %>%
mutate(comuna = as.numeric(comuna))
ComunaOrigenBici <- ComunaOrigenBici %>%
mutate(comuna = as.numeric(comuna))
# Unir datos espaciales
ComunaOrigenBici_mp <- comunas %>%
left_join(ComunaOrigenBici, by = "comuna") %>%
mutate(conteo = ifelse(is.na(conteo), 0, conteo))
# Mapa
bicicleta_origen <- ggplot(ComunaOrigenBici_mp) +
geom_sf(aes(fill = conteo), color = "black", linewidth = 0.2) +
geom_sf_text(aes(label = comuna), size = 3) +
scale_fill_gradient(
low = "blue",
high = "darkblue",
name = "Viajes"
) +
labs(
title = "Origen Bicicleta",
subtitle = "Viajes originados por comuna"
) +
theme_minimal()
bicicleta_origen
La movilidad en bicicleta presenta una participación reducida, ya que
solo en algunos casos supera los 100 desplazamientos originados por las
personas. En este sentido, las comunas 2 y 19 registran la mayor
cantidad de movimientos, con 122 y 103 viajes, equivalentes al 9,98% y
9,24%, respectivamente. Por su parte, la Comuna 12 presenta la menor
proporción de viajes en bicicleta desde el origen, con un 0,82%.
Asimismo, se identifica la presencia de un corredor vial para bicicletas en la zona occidental de la ciudad, lo que podría explicar una mayor dinámica de este medio de transporte en dicha área y una menor salida de personas en bicicleta desde la zona oriental.
| tipo_de_vehiculo | comuna_origen | total_movimientos | porcentaje |
|---|---|---|---|
| Moto | 1 | 296 | 2.87 |
| Moto | 2 | 1062 | 10.31 |
| Moto | 3 | 701 | 6.80 |
| Moto | 4 | 571 | 5.54 |
| Moto | 5 | 260 | 2.52 |
| Moto | 6 | 377 | 3.66 |
| Moto | 7 | 272 | 2.64 |
| Moto | 8 | 421 | 4.09 |
| Moto | 9 | 317 | 3.08 |
| Moto | 10 | 535 | 5.19 |
| Moto | 11 | 339 | 3.29 |
| Moto | 12 | 133 | 1.29 |
| Moto | 13 | 453 | 4.40 |
| Moto | 14 | 258 | 2.50 |
| Moto | 15 | 455 | 4.42 |
| Moto | 16 | 383 | 3.72 |
| Moto | 17 | 853 | 8.28 |
| Moto | 18 | 593 | 5.76 |
| Moto | 19 | 995 | 9.66 |
| Moto | 20 | 278 | 2.70 |
| Moto | 21 | 323 | 3.14 |
| Moto | 22 | 427 | 4.14 |
library(dplyr)
library(sf)
library(ggplot2)
library(janitor)
# Renombrar columnas para evitar tildes y espacios
df_limpio <- df %>%
clean_names()
# Filtrar datos para motos
Motos <- df_limpio %>%
filter(tipo_de_vehiculo == "Moto")
# Consolidar datos para motos por comuna de origen
ComunaOrigenMoto <- Motos %>%
group_by(comuna_origen) %>%
summarise(conteo = n(), .groups = "drop") %>%
rename(comuna = comuna_origen)
# Asegurar que las llaves tengan el mismo tipo
comunas <- comunas %>%
mutate(comuna = as.numeric(comuna))
ComunaOrigenMoto <- ComunaOrigenMoto %>%
mutate(comuna = as.numeric(comuna))
# Unir datos espaciales
ComunaOrigenMoto_mp <- comunas %>%
left_join(ComunaOrigenMoto, by = "comuna") %>%
mutate(conteo = ifelse(is.na(conteo), 0, conteo))
# Mapa
moto_origen <- ggplot(ComunaOrigenMoto_mp) +
geom_sf(aes(fill = conteo), color = "black", linewidth = 0.2) +
geom_sf_text(aes(label = comuna), size = 3) +
scale_fill_gradient(
low = "lightcoral",
high = "darkred",
name = "Viajes"
) +
labs(
title = "Origen Motos",
subtitle = "Viajes originados por comuna"
) +
theme_minimal()
moto_origen| tipo_de_vehiculo | comuna_origen | total_movimientos | porcentaje |
|---|---|---|---|
| Automóvil | 1 | 234 | 2.72 |
| Automóvil | 2 | 860 | 10.00 |
| Automóvil | 3 | 678 | 7.89 |
| Automóvil | 4 | 443 | 5.15 |
| Automóvil | 5 | 185 | 2.15 |
| Automóvil | 6 | 313 | 3.64 |
| Automóvil | 7 | 229 | 2.66 |
| Automóvil | 8 | 319 | 3.71 |
| Automóvil | 9 | 295 | 3.43 |
| Automóvil | 10 | 404 | 4.70 |
| Automóvil | 11 | 268 | 3.12 |
| Automóvil | 12 | 88 | 1.02 |
| Automóvil | 13 | 412 | 4.79 |
| Automóvil | 14 | 235 | 2.73 |
| Automóvil | 15 | 377 | 4.38 |
| Automóvil | 16 | 320 | 3.72 |
| Automóvil | 17 | 662 | 7.70 |
| Automóvil | 18 | 433 | 5.04 |
| Automóvil | 19 | 922 | 10.72 |
| Automóvil | 20 | 228 | 2.65 |
| Automóvil | 21 | 272 | 3.16 |
| Automóvil | 22 | 421 | 4.90 |
library(dplyr)
library(sf)
library(ggplot2)
library(janitor)
# 1. Limpiar nombres de columnas
df_limpio <- df %>%
clean_names()
# 2. Filtrar datos para automóviles
Automoviles <- df_limpio %>%
filter(tipo_de_vehiculo == "Automóvil")
# 3. Consolidar datos por comuna de origen
ComunaOrigenAuto <- Automoviles %>%
group_by(comuna_origen) %>%
summarise(conteo = n(), .groups = "drop") %>%
rename(comuna = comuna_origen)
# 4. Asegurar tipo de dato para el join
comunas <- comunas %>%
mutate(comuna = as.numeric(comuna))
ComunaOrigenAuto <- ComunaOrigenAuto %>%
mutate(comuna = as.numeric(comuna))
# 5. Unir con shapefile
ComunaOrigenAuto_mp <- comunas %>%
left_join(ComunaOrigenAuto, by = "comuna") %>%
mutate(conteo = ifelse(is.na(conteo), 0, conteo))
# 6. Mapa con escala amarilla
auto_origen <- ggplot(ComunaOrigenAuto_mp) +
geom_sf(aes(fill = conteo), color = "black", linewidth = 0.2) +
geom_sf_text(aes(label = comuna), size = 3) +
scale_fill_gradient(
low = "#FFF7BC", # amarillo claro
high = "#B58900", # amarillo oscuro
name = "Viajes"
) +
labs(
title = "Origen Automovil",
subtitle = "Distribucion espacial de viajes"
) +
theme_minimal()
auto_origenLas comunas con mayor importancia como destino son la 2, 3, 19 y 17. En este caso, la Comuna 2 concentra el mayor flujo de viajes, seguida por algunas comunas cercanas que también presentan una participación significativa. Esta comuna está conformada por barrios ubicados en el noroccidente de Cali, como Altos de Menga, Alameda del Río, Arboleda, Brisas de los Álamos, Centenario, Chipichape, Ciudad Los Álamos, El Bosque, entre otros.
Por otro lado, las zonas del centro y del oriente muestran una baja representación en los datos. Esto podría estar relacionado con algún sesgo en la recolección de la información de la encuesta, ya que comunas como la 13 y la 14 se encuentran entre las más pobladas de la ciudad, con aproximadamente 171 mil y 174 mil habitantes, respectivamente. Estas comunas del oriente de Cali suelen concentrar una alta población debido a su densidad y extensión territorial.
En cuanto a los medios de transporte, la motocicleta se destaca como uno de los más utilizados por la ciudadanía caleña. Esto puede explicarse por su facilidad de adquisición, menor costo de uso y mantenimiento, así como por su practicidad frente al espacio que ocupan los automóviles. Además, factores propios de la ciudad, como el clima, pueden favorecer el uso frecuente de este medio de transporte.
Por su parte, la bicicleta presenta una menor participación dentro de los medios analizados. Al ser un modo de transporte más asociado a trayectos cortos, es probable que muchos desplazamientos se realicen dentro de la misma comuna. Aunque en años recientes la ciudad ha implementado estrategias para promover su uso, sería necesario revisar información más actualizada para identificar si su participación ha aumentado. Además, algunas instituciones han incentivado este medio mediante beneficios, premios u obsequios, especialmente para promover su uso en horas de alta congestión.