Se presenta el siguienta caso de estudio en el cual se requiere identificar los despplazamientos realizados por las personas en la ciudad de Cali.
El reto principal consiste en identeificar los origenes y los destinos de las personas entre las diferentes comunas de la ciudad de Cali, a su vez realizar segmentación por tipo de vehículo empleado.
Procedemos al cargue de las librerías necesarias y el dataset con la información necesaria.
##Cargue de librerias neceesarias
require(raster)
require(rgdal)
require(readxl)
library(readxl)
library(dplyr)
library(sp)
library(RColorBrewer)
library(classInt)
library(kableExtra)
library(gridExtra)
library(viridis)
library(ggplot2)
library(sf)
# Ruta del archivo
archivo <- "~/Geoespacial/Casos/EncuestaOrigenDestino.xlsx"
# Leer el archivo
df_encuesta <- read_excel(archivo)
# Mostrar las primeras filas
head(df_encuesta)
# 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>, …
## Cargue de archivo Shapefile en R
comunas=shapefile("~/Geoespacial/Casos/cali/Comunas.shp")
comunas
class : SpatialPolygonsDataFrame
features : 22
extent : 1053868, 1068492, 860190.2, 879441.5 (xmin, xmax, ymin, ymax)
crs : +proj=tmerc +lat_0=3.441883333 +lon_0=-76.5205625 +k=1 +x_0=1061900.18 +y_0=872364.63 +a=6379137 +rf=298.257222101 +units=m +no_defs
variables : 4
names : OBJECTID, gid, comuna, nombre
min values : 1, 89, 1, Comuna 1
max values : 22, 110, 22, Comuna 9
Solo necesitamos los desplazamientos en las comunas de Cali, se eliminan las entradas o salidas que son Fuera de Cali o tienen valor 0.
df_encuesta <- df_encuesta %>%
filter(
!`comuna origen` %in% c("0", "Fuera de Cali"),
!`comuna destino` %in% c("0", "Fuera de Cali")
)
# Selección de variables a analizar:
df_encuesta = df_encuesta %>%
dplyr::select("TIPO DE VEHÍCULO", "comuna origen", "comuna destino")
origen = df_encuesta%>%group_by(`comuna origen`)%>%summarise(conteo = n())
destino = df_encuesta%>%group_by(`comuna destino`)%>%summarise(conteo = n())
# conversión a tipo numérico
origen$`comuna origen`= as.numeric(origen$`comuna origen`)
destino$`comuna destino`= as.numeric(destino$`comuna destino`)
comunas$conteo = origen[comunas$comuna,]$conteo
comunas_db=comunas@data
# Ordenar el data frame de mayor a menor según 'conteo'
comunas_db <- comunas_db[order(comunas_db$conteo, decreasing = TRUE), ]
# Mostrar el data frame ordenado
comunas_db
OBJECTID gid comuna nombre conteo
1 1 107 2 Comuna 2 2250
4 4 110 19 Comuna 19 2241
6 6 104 17 Comuna 17 1762
3 3 109 3 Comuna 3 1610
7 7 105 18 Comuna 18 1208
10 10 90 4 Comuna 4 1193
20 20 100 10 Comuna 10 1094
16 16 96 13 Comuna 13 1031
8 8 106 22 Comuna 22 985
5 5 103 15 Comuna 15 974
13 13 93 8 Comuna 8 862
22 22 102 16 Comuna 16 836
9 9 89 6 Comuna 6 797
14 14 94 9 Comuna 9 737
19 19 99 11 Comuna 11 717
15 15 95 21 Comuna 21 693
2 2 108 1 Comuna 1 626
21 21 101 20 Comuna 20 599
12 12 92 7 Comuna 7 583
18 18 98 14 Comuna 14 575
11 11 91 5 Comuna 5 521
17 17 97 12 Comuna 12 257
# Crear una paleta de colores
color_palette <- brewer.pal(9, "RdYlBu")
# Calcular los centroides de los polígonos para posicionar las etiquetas
centroids <- coordinates(comunas)
# Crear etiquetas combinando el número de comuna y el conteo
# Suponiendo que la columna 3 tiene el número de comuna y la columna 5 el conteo
labels <- paste("#Com:", comunas@data[,3], "\n", ":", comunas@data[,5])
# Crear el gráfico
spplot(comunas[,5],
main = "Comunas de origen de viajes",
col.regions = color_palette,
cuts = 6,
sp.layout = list(
list("sp.text", centroids, labels, cex = 0.7, font = 1)
)
)
Se observa que la mayoría de los orígenes de los movimientos se
concentran en el occidente de la ciudad, así las personas que se
desplazan son principalmente de: Comuna 2 (2.250),Comuna 19 (2.241),
Comuna 17(1.762) y la Comuna 3 (1.610).
Para realizar un análisis específico para los orígenes de viajes realizados en bicicleta, moto y automóvil, se realiza el filtro y conteo de dichas cantidades y se anexan al data frame asociado al shapefile de “comunas”
# creación de conteos para cada tipo de vehículo
origen_bici = df_encuesta%>% filter(`TIPO DE VEHÍCULO`==1) %>%group_by(`comuna origen`)%>%summarise(conteo = n())
origen_moto = df_encuesta%>% filter(`TIPO DE VEHÍCULO`==2) %>%group_by(`comuna origen`)%>%summarise(conteo = n())
origen_auto = df_encuesta%>% filter(`TIPO DE VEHÍCULO`==3) %>%group_by(`comuna origen`)%>%summarise(conteo = n())
# creación de paletas de colores individuales
pallete_bici = brewer.pal(n=9, name = "Reds")
pallete_moto = brewer.pal(n=9, name = "Greens")
pallete_auto = brewer.pal(n=9, name = "Blues")
#modificación del dataframe
comunas$conteo_bici = origen_bici[comunas$comuna,]$conteo
comunas$conteo_moto = origen_moto[comunas$comuna,]$conteo
comunas$conteo_auto = origen_auto[comunas$comuna,]$conteo
# revisión de dataframe
# revisión de dataframe
comunas_db=comunas@data
tabla_or <- comunas_db %>%
dplyr::select(comuna, conteo, conteo_bici, conteo_moto, conteo_auto) %>% arrange(desc(conteo))
kable(tabla_or, caption = "Orígenes de viajes por comuna")
| comuna | conteo | conteo_bici | conteo_moto | conteo_auto |
|---|---|---|---|---|
| 2 | 2250 | 122 | 1063 | 860 |
| 19 | 2241 | 113 | 995 | 923 |
| 17 | 1762 | 103 | 853 | 662 |
| 3 | 1610 | 84 | 702 | 679 |
| 18 | 1208 | 85 | 593 | 433 |
| 4 | 1193 | 58 | 571 | 443 |
| 10 | 1094 | 71 | 535 | 404 |
| 13 | 1031 | 62 | 453 | 412 |
| 22 | 985 | 52 | 430 | 424 |
| 15 | 974 | 55 | 455 | 377 |
| 8 | 862 | 46 | 421 | 319 |
| 16 | 836 | 65 | 383 | 320 |
| 6 | 797 | 29 | 377 | 314 |
| 9 | 737 | 36 | 317 | 295 |
| 11 | 717 | 42 | 339 | 268 |
| 21 | 693 | 35 | 323 | 272 |
| 1 | 626 | 32 | 296 | 234 |
| 20 | 599 | 33 | 278 | 228 |
| 7 | 583 | 30 | 272 | 229 |
| 14 | 575 | 32 | 258 | 236 |
| 5 | 521 | 28 | 260 | 185 |
| 12 | 257 | 10 | 133 | 88 |
El comportamiento de los viajes en bicicleta, moto y automóvil
presentan comportamientos similares en cuanto a la distribución que
tienen los orígenes por comuna, siguiendo el patrón de movilidad y
transporte de la generalidad de la ciudad, las comunas desde las cuales
más personas se movilizan son: 2, 19, 17 y 3, mientras que las que menos
son 7, 14, 5 y 12
# Se construyen los mapas
or_bici =spplot(comunas[,6],
sub = "Bicicleta",
cuts = 6, col.regions = pallete_bici)
or_moto =spplot(comunas[,7],
main = list(label = "Segmentación Origen -Viajes-Transporte", cex = 1),
sub = "Moto",
col.regions = pallete_moto, cuts = 6)
or_auto =spplot(comunas[,8],
sub = "Automóvil",
col.regions = pallete_auto, cuts = 6)
grid.arrange(or_bici, or_moto, or_auto, ncol = 3, nrow = 1)
Alternativamente, se requiere determinar las comunas destino a los cuales se dirigen las personas en la ciudad de Cali.
# Cargue de base de datos para analizar destinos.
comunas_des =shapefile("~/Geoespacial/Casos/cali/Comunas.shp")
# Generación de conteos
comunas_des$conteo = destino[comunas$comuna,]$conteo
comunas_db_des=comunas_des@data
# Ordenar el data frame de mayor a menor según 'conteo'
comunas_db_des <- comunas_db_des[order(comunas_db_des$conteo, decreasing = TRUE), ]
# Mostrar el data frame ordenado
comunas_db_des
OBJECTID gid comuna nombre conteo
1 1 107 2 Comuna 2 3773
3 3 109 3 Comuna 3 2887
4 4 110 19 Comuna 19 2441
6 6 104 17 Comuna 17 1616
8 8 106 22 Comuna 22 1561
10 10 90 4 Comuna 4 1497
14 14 94 9 Comuna 9 1055
13 13 93 8 Comuna 8 830
20 20 100 10 Comuna 10 741
22 22 102 16 Comuna 16 645
12 12 92 7 Comuna 7 598
9 9 89 6 Comuna 6 570
16 16 96 13 Comuna 13 560
7 7 105 18 Comuna 18 526
19 19 99 11 Comuna 11 483
5 5 103 15 Comuna 15 481
11 11 91 5 Comuna 5 440
15 15 95 21 Comuna 21 434
18 18 98 14 Comuna 14 316
21 21 101 20 Comuna 20 303
17 17 97 12 Comuna 12 207
2 2 108 1 Comuna 1 187
Como se puede observar, con patrones similares al comportamiento de los orígenes, las principales comunas a las que se dirigen las personas son 2, 3, 19 y 17.
# Definir la paleta de colores utilizando "RdYlBu" con 9 tonalidades
color_palette2 <- brewer.pal(9, "RdYlBu")
# Calcular los centroides de los polígonos para colocar las etiquetas
centroids <- coordinates(comunas_des)
# Crear etiquetas que incluyan el nombre de la comuna (columna 3) y la cantidad de vehículos (columna 5)
labels <- paste("#Com:", comunas_des@data[, 3], ":", comunas_des@data[, 5])
# Generar el gráfico utilizando spplot
spplot(comunas_des[, 5],
main = "Comunas de destino de viajes",
col.regions = color_palette2,
cuts = 6,
sp.layout = list(
list("sp.text", centroids, labels, cex = 0.7, font = 1)
)
)
comunas_db2=comunas_des@data
tabla2 <- comunas_db2 %>%
dplyr::select(comuna, conteo) %>%
arrange(desc(conteo))
kable(tabla2, caption = "Destinos de viajes por comuna")
| comuna | conteo |
|---|---|
| 2 | 3773 |
| 3 | 2887 |
| 19 | 2441 |
| 17 | 1616 |
| 22 | 1561 |
| 4 | 1497 |
| 9 | 1055 |
| 8 | 830 |
| 10 | 741 |
| 16 | 645 |
| 7 | 598 |
| 6 | 570 |
| 13 | 560 |
| 18 | 526 |
| 11 | 483 |
| 15 | 481 |
| 5 | 440 |
| 21 | 434 |
| 14 | 316 |
| 20 | 303 |
| 12 | 207 |
| 1 | 187 |
En cuanto a cada modo de transporte se encuentra que:
# creación de conteos para cada tipo de vehículo
destino_bici = df_encuesta%>% filter(`TIPO DE VEHÍCULO`==1) %>%group_by(`comuna destino`)%>%summarise(conteo = n())
destino_moto = df_encuesta%>% filter(`TIPO DE VEHÍCULO`==2) %>%group_by(`comuna destino`)%>%summarise(conteo = n())
destino_auto = df_encuesta%>% filter(`TIPO DE VEHÍCULO`==3) %>%group_by(`comuna destino`)%>%summarise(conteo = n())
#modificación del dataframe
comunas_des$conteo_bici = destino_bici[comunas_des$comuna,]$conteo
comunas_des$conteo_moto = destino_moto[comunas_des$comuna,]$conteo
comunas_des$conteo_auto = destino_auto[comunas_des$comuna,]$conteo
comunas_db2=comunas_des@data
tabla_des <- comunas_db2 %>%
dplyr::select(comuna, conteo, conteo_bici, conteo_moto, conteo_auto) %>%
arrange(desc(conteo))
kable(tabla_des, caption = "Destinos de viajes por comuna")
| comuna | conteo | conteo_bici | conteo_moto | conteo_auto |
|---|---|---|---|---|
| 2 | 3773 | 194 | 1734 | 1518 |
| 3 | 2887 | 169 | 1333 | 1098 |
| 19 | 2441 | 131 | 1152 | 926 |
| 17 | 1616 | 95 | 744 | 650 |
| 22 | 1561 | 95 | 766 | 564 |
| 4 | 1497 | 80 | 678 | 596 |
| 9 | 1055 | 56 | 512 | 382 |
| 8 | 830 | 46 | 382 | 325 |
| 10 | 741 | 34 | 353 | 291 |
| 16 | 645 | 31 | 290 | 275 |
| 7 | 598 | 36 | 279 | 224 |
| 6 | 570 | 31 | 255 | 208 |
| 13 | 560 | 28 | 285 | 189 |
| 18 | 526 | 28 | 240 | 216 |
| 11 | 483 | 26 | 217 | 204 |
| 15 | 481 | 17 | 232 | 199 |
| 5 | 440 | 38 | 183 | 181 |
| 21 | 434 | 24 | 202 | 164 |
| 14 | 316 | 20 | 150 | 120 |
| 20 | 303 | 22 | 124 | 131 |
| 12 | 207 | 13 | 106 | 71 |
| 1 | 187 | 9 | 90 | 73 |
Similar a como ocurre con los orígenes, los destinos discriminados por modo de transporte siguen, en términos generales, el patrón de la generalidad de viajes que se realizan en la ciudad.
des_bici =spplot(comunas_des[,6],
sub = "Bicicleta",
cuts = 6, col.regions = pallete_bici)
des_moto =spplot(comunas_des[,7],
main = list(label = "Comuna destino de viajes", cex = 1),
sub = "Moto",
col.regions = pallete_moto, cuts = 6)
des_auto =spplot(comunas_des[,8],
sub = "Automóvil",
col.regions = pallete_auto, cuts = 6)
grid.arrange(des_bici, des_moto, des_auto, ncol = 3, nrow = 1)
Las zonas centrales de la ciudad, de donde más se movilizan las
personas son las comunas 2, 19, 7 , 3, 18 , 4, 10 y 13 los cuales son
12839 personas. Las comunas de donde menos se movilizan personas
(origen) son las comunas 14, 5 y 12 en la cual se movilizan 1353
personas.
De manera análoga los destinos a donde más se movilizan las personas
son las comunas 2, 3, 19,17,22, 4, 9, 8, 10, 17, 6, y 13 los cuales son
18774 personas. Las comunas a donde se movilizan menos las personas
(destinos) son las comunas 14, 20,12 y 1los cuales son 1013
personas.