Introducción

Se presenta el siguienta caso de estudio en el cual se requiere identificar los despplazamientos realizados por las personas en la ciudad de Cali.

Reto

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.

1. Exploración y procesamiento de los datos

Procedemos al cargue de las librerías necesarias y el dataset con la información necesaria.

Carga de librerias necesarias

##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)

Carga del archivo de la base de datos

# 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 

Limpieza de la base de datos

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")

Conteo por agrupamiento para análisis de origen y 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`)

Verifiación del conteo

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

1.1 Visualización de viajes por Origen

# 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).

1.2 Segmentación del Origen por medio de transporte

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")
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)


1.3 Visualización de viajes por Destino

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")
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


1.4 Segmentación del Destino por medio de transporte

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")
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)


Conclusiones

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.