En mayo y junio de 2015, se realizó una encuesta de movilidad en la ciudad de Cali. Esta encuesta se centró en recopilar datos sobre las personas que describían, en un primer momento, su lugar de partida, conocido como origen, y su lugar de llegada, conocido como destino. El objetivo de este trabajo es identificar, a nivel espacial, los lugares con mayor y menor movilidad, tanto en relación con el origen como con el destino. Adicionalmente, se busca revisar las tendencias de movilidad de los vehículos de uso personal de los encuestados.
A continuación, se cargarán las librerías necesarias para realizar el análisis de movilidad dentro de la ciudad de Cali.
library(readxl)
library(sf)
library(tidyverse)
library(plotly)
Se inicia cargando los datos de la encuesta de origen y destino. El
objetivo es realizar un análisis a nivel comunal. Por lo tanto, se
utiliza la función st_read() para cargar el correspondiente
archivo espacial. Este archivo contiene información sobre los polígonos
de cada comuna de la ciudad como su georreferenciación y algunos
atributos adicionales.
EncuestaOrigenDestino <- read_excel("C:/Users/Andre/OneDrive/Escritorio/Datos geograficos y espaciales/Casos/EncuestaOrigenDestino.xlsx",
sheet = "Sheet4")
# Define la ruta del archivo .shp
file_path <- "C:/Users/Andre/OneDrive/Escritorio/Datos geograficos y espaciales/Casos/cali/comunas_up.shp"
# Carga el archivo .shp
comunas <- st_read(file_path, quiet = TRUE)
Ahora se revisan los atributos adicionales que posee la capa de datos.
# Imprime el contenido del archivo
print(comunas)
## Simple feature collection with 22 features and 8 fields
## Geometry type: POLYGON
## Dimension: XY
## Bounding box: xmin: -76.59284 ymin: 3.331802 xmax: -76.46125 ymax: 3.505871
## Geodetic CRS: WGS 84
## First 10 features:
## casos comuna nombre zona_recol area perimetro covid viajes
## 1 20 6 Comuna 6 <NA> 5385422 12496.285 19 998
## 2 10 4 Comuna 4 <NA> 4524983 11430.279 8 1493
## 3 8 5 Comuna 5 <NA> 4197624 8441.174 21 664
## 4 7 7 Comuna 7 <NA> 5107267 12547.823 9 734
## 5 3 8 Comuna 8 <NA> 5266743 12178.376 20 1124
## 6 2 9 Comuna 9 <NA> 2899409 7983.949 13 952
## 7 1 21 Comuna 21 <NA> 4828927 16149.224 9 818
## 8 10 13 Comuna 13 <NA> 4737262 10030.224 13 1238
## 9 15 1 Comuna 1 <NA> 3842243 15518.149 5 794
## 10 20 3 Comuna 3 <NA> 3704463 11003.318 18 2121
## geometry
## 1 POLYGON ((-76.49138 3.50558...
## 2 POLYGON ((-76.50317 3.48838...
## 3 POLYGON ((-76.49428 3.48559...
## 4 POLYGON ((-76.4745 3.465169...
## 5 POLYGON ((-76.51031 3.45726...
## 6 POLYGON ((-76.51856 3.45298...
## 7 POLYGON ((-76.4794 3.447593...
## 8 POLYGON ((-76.48711 3.44342...
## 9 POLYGON ((-76.58295 3.45756...
## 10 POLYGON ((-76.52185 3.46223...
También se revisa el contenido de los datos de la encuesta para determinar las variables que se desean cruzar con el shapefile de las comunas.
head(EncuestaOrigenDestino)
## # A tibble: 6 × 28
## FECHA IDESTACIÓN ESTACION ACCESO MOVIMIENTO HoradeEncuesta
## <dttm> <dbl> <chr> <chr> <chr> <chr>
## 1 2015-06-01 00:00:00 1 Avenida6NXCal… NORTE MOV1 6:10:00AM
## 2 2015-06-01 00:00:00 1 Avenida6NXCal… NORTE MOV1 6:11:00AM
## 3 2015-06-01 00:00:00 1 Avenida6NXCal… NORTE MOV1 6:12:00AM
## 4 2015-06-01 00:00:00 1 Avenida6NXCal… NORTE MOV1 6:13:00AM
## 5 2015-06-01 00:00:00 1 Avenida6NXCal… NORTE MOV1 6:14:00AM
## 6 2015-06-01 00:00:00 1 Avenida6NXCal… NORTE MOV1 6:15:00AM
## # ℹ 22 more variables: MUNICIPIO_ORGEN <chr>,
## # `DEPARTAMENTO/LOCALIDAD/COMUNA/DISTRITO/BARRIO/VEREDA/HITO/DIRECCION_ORIGEN` <chr>,
## # CodigoOrigen_SDG <chr>, `¿QUEESTABAHACIENDOENESELUGAR?` <chr>,
## # MUNICIPIO_DESTINO <chr>,
## # `DEPARTAMENTO/LOCALIDAD/COMUNA/DISTRITO/BARRIO/VEREDA/HITO/DIRECCION_DESTINO` <chr>,
## # CodigoDestino_SDG <chr>, `¿QUEVAHACERAESELUGAR?` <chr>,
## # ESTRATOENSUVIVIENDA <chr>, …
Se decide que las variables a revisar y necesarias del conjunto de
datos de la encuesta son “MUNICIPIO_ORIGEN”, “MUNICIPIO_DESTINO”,
“TipoVehiculo”, “ComunaOrigen” y “ComunaDestino”. Con estas variables,
se crea un nuevo dataframe llamado df y se depuran los
datos. Dado que el objetivo es determinar la movilidad dentro de la
ciudad por comunas, se filtra tanto el origen como el destino del
municipio para garantizar que sea CALI en ambos casos. Adicionalmente,
se eliminan los valores 0 y “Fuera de Cali” contenidos en las variables
ComunaOrigen y ComunaDestino, ya que estos
corresponden respectivamente a la movilidad que se da desde o hacia
corregimientos y la movilidad que se da desde o hacia lugares más
lejanos. Estos lugares suelen ser otros municipios del país, pero si la
movilidad ocurrió desde un país distinto, también se consolida en los
datos.
# Crea un nuevo dataframe 'df' con las variables que necesitas
df <- EncuestaOrigenDestino[, c("MUNICIPIO_ORGEN","MUNICIPIO_DESTINO","TipoVehiculo", "ComunaOrigen", "ComunaDestino")]
# Elimina las filas de 'df' donde 'ComunaOrigen' y 'ComunaDestino' son '0' o 'Fuera de Cali'
# y donde 'MUNICIPIO_ORIGEN' y 'MUNICIPIO_DESTINO' son diferentes de 'CALI'
df <- df[!(df$ComunaOrigen %in% c("0", "Fuera de Cali") |
df$ComunaDestino %in% c("0", "Fuera de Cali") |
df$MUNICIPIO_ORGEN != "CALI" |
df$MUNICIPIO_DESTINO != "CALI"), ]
# Convierte 'ComunaOrigen' y 'ComunaDestino' a numéricas
df$ComunaOrigen <- as.numeric(as.character(df$ComunaOrigen))
df$ComunaDestino <- as.numeric(as.character(df$ComunaDestino))
Para el análisis, se decide utilizar el shapefile de las comunas. Por lo tanto, se comienza revisando que los polígonos correspondan realmente a los de la ciudad en cuestión.
En este apartado, se utilizan finalmente tanto los datos de la
encuesta como los del shapefile para crear un nuevo shapefile con
atributos muy específicos. En este caso, los atributos corresponden a
los conteos del origen y el destino de la población encuestada en
general. Luego, el análisis se centra en tres tipos de vehículos
personales: la bicicleta, la moto y el auto. El resultado final de esto
se puede apreciar en comunas2.
# Selecciona solo la columna 'comuna'
comunas2 <- comunas[, "comuna"]
# Obtiene los conteos de ComunaOrigen y ComunaDestino
conteos_origen_general <- as.data.frame(table(df$ComunaOrigen))
conteos_destino_general <- as.data.frame(table(df$ComunaDestino))
# Cambia el nombre de las columnas para que sean 'conteo_origen_general' y 'conteo_destino_general'
names(conteos_origen_general) <- c("comuna", "conteo_origen_general")
names(conteos_destino_general) <- c("comuna", "conteo_destino_general")
# Convierte 'comuna' en conteos_origen y conteos_destino a entero
conteos_origen_general$comuna <- as.integer(as.character(conteos_origen_general$comuna))
conteos_destino_general$comuna <- as.integer(as.character(conteos_destino_general$comuna))
# Obtiene los conteos de ComunaOrigen y ComunaDestino
conteos_origen <- df %>%
filter(TipoVehiculo %in% 1:3) %>%
group_by(TipoVehiculo, ComunaOrigen) %>%
summarise(conteo = n(), .groups = "drop") %>%
spread(key = TipoVehiculo, value = conteo, fill = 0)
conteos_destino <- df %>%
filter(TipoVehiculo %in% 1:3) %>%
group_by(TipoVehiculo, ComunaDestino) %>%
summarise(conteo = n(), .groups = "drop") %>%
spread(key = TipoVehiculo, value = conteo, fill = 0)
# Cambia el nombre de las columnas
names(conteos_origen)[2:4] <- paste0("conteo_origen_", 1:3)
names(conteos_destino)[2:4] <- paste0("conteo_destino_", 1:3)
# Une los conteos a comunas2
comunas2 <- left_join(comunas2, conteos_origen, by = c("comuna" = "ComunaOrigen"))
comunas2 <- left_join(comunas2, conteos_destino, by = c("comuna" = "ComunaDestino"))
# Une los conteos generales a comunas2
comunas2 <- left_join(comunas2, conteos_origen_general, by = "comuna")
comunas2 <- left_join(comunas2, conteos_destino_general, by = "comuna")
Se inicia con la construcción de los respectivos mapas. Se decide
usar plotly para esto, debido a que los conteos se pueden
observar de manera precisa e interactiva, más que si solo se usara
ggplot. Adicionalmente, se muestran juntos con el objetivo
de comparar la movilidad que ocurre tanto en el origen como en el
destino de cada comuna.
# Crea los gráficos interactivos como antes
p_interactive1 <- ggplot() +
geom_sf(data = comunas2, aes(fill = conteo_origen_general, text = paste("Comuna:", comuna, "<br>Conteo Origen:", conteo_origen_general))) +
scale_fill_gradient(low = "blue", high = "green", limits = c(0, max(comunas2$conteo_origen_general, na.rm = TRUE)), guide = "none") +
theme_minimal() +
labs(title = "Movilidad poblacional en general", x = "Longitud", y = "Latitud", fill = "Conteos") +
theme(plot.title = element_text(hjust = 0.5),
axis.text.x = element_text(angle = 90, hjust = 1)) + # Esto centra el título
annotate("text", x = -76.58, y = 3.50, label = "Origen") # Esto agrega el texto "Origen" en las coordenadas especificadas
p_interactive1 <- ggplotly(p_interactive1, tooltip = "text")
p_interactive2 <- ggplot() +
geom_sf(data = comunas2, aes(fill = conteo_destino_general, text = paste("Comuna:", comuna, "<br>Conteo Destino:", conteo_destino_general))) +
scale_fill_gradient(low = "blue", high = "green", limits = c(0, max(comunas2$conteo_destino_general, na.rm = TRUE))) +
theme_minimal() +
labs(title = "Movilidad poblacional en general", x = "Longitud", y = "", fill = "") +
theme(plot.title = element_text(hjust = 0.5),
axis.text.x = element_text(angle = 90, hjust = 1), # Esto centra el título
axis.text.y = element_blank()) + # Esto oculta las etiquetas del eje Y
annotate("text", x = -76.58, y = 3.50, label = "Destino") # Esto agrega el texto "Destino" en las coordenadas especificadas
p_interactive2 <- ggplotly(p_interactive2, tooltip = "text")
# Usa subplot() para mostrar los gráficos uno al lado del otro
subplot(p_interactive1, p_interactive2, nrows = 1)
Para la movilidad de la población en general, se observa que la Comuna 2 es la que presenta los mayores valores de movilidad tanto a nivel de origen (2361) como de destino (3877), seguida de la Comuna 19. Por otro lado, la Comuna 12 es la que presenta la menor movilidad, con 275 en origen y 216 en destino. Cabe aclarar que el color verde describe las mayores movilidades y el color azul muestra las menores movilidades.
# Crea los gráficos interactivos para bicicletas
p_interactive3 <- ggplot() +
geom_sf(data = comunas2, aes(fill = conteo_origen_1, text = paste("Comuna:", comuna, "<br>Conteo Origen Bicicletas:", conteo_origen_1))) +
scale_fill_gradient(low = "blue", high = "yellow", limits = c(0, max(comunas2$conteo_origen_1, na.rm = TRUE)), guide = "none") +
theme_minimal() +
labs(title = "Movilidad en bicicleta", x = "Longitud", y = "Latitud", fill = "Conteos") +
theme(plot.title = element_text(hjust = 0.5),
axis.text.x = element_text(angle = 90, hjust = 1)) + # Esto centra el título
annotate("text", x = -76.58, y = 3.50, label = "Origen") # Esto agrega el texto "Origen" en las coordenadas especificadas
p_interactive3 <- ggplotly(p_interactive3, tooltip = "text")
p_interactive4 <- ggplot() +
geom_sf(data = comunas2, aes(fill = conteo_destino_1, text = paste("Comuna:", comuna, "<br>Conteo Destino Bicicletas:", conteo_destino_1))) +
scale_fill_gradient(low = "blue", high = "yellow", limits = c(0, max(comunas2$conteo_destino_1, na.rm = TRUE))) +
theme_minimal() +
labs(title = "Movilidad en bicicleta", x = "Longitud", y = "", fill = "") +
theme(plot.title = element_text(hjust = 0.5),
axis.text.x = element_text(angle = 90, hjust = 1), # Esto centra el título
axis.text.y = element_blank()) + # Esto oculta las etiquetas del eje Y
annotate("text", x = -76.58, y = 3.50, label = "Destino") # Esto agrega el texto "Destino" en las coordenadas especificadas
p_interactive4 <- ggplotly(p_interactive4, tooltip = "text")
# Usa subplot() para mostrar los gráficos uno al lado del otro
subplot(p_interactive3, p_interactive4, nrows = 1)
En cuanto a la movilidad de las bicicletas, la Comuna 2 presenta la mayor movilidad tanto en origen (127) como en destino (199). Por otro lado, la Comuna 12 muestra la menor movilidad con 11 en origen y 14 en destino. Un valor intermedio lo encontramos en la Comuna 10, con 85 bicicletas en origen y 170 en destino.
# Crea los gráficos interactivos para motos
p_interactive5 <- ggplot() +
geom_sf(data = comunas2, aes(fill = conteo_origen_2, text = paste("Comuna:", comuna, "<br>Conteo Origen Motos:", conteo_origen_2))) +
scale_fill_gradient(low = "red", high = "green", limits = c(0, max(comunas2$conteo_origen_2, na.rm = TRUE)), guide = "none") +
theme_minimal() +
labs(title = "Movilidad en motos", x = "Longitud", y = "Latitud", fill = "Conteos") +
theme(plot.title = element_text(hjust = 0.5),
axis.text.x = element_text(angle = 90, hjust = 1)) + # Esto centra el título
annotate("text", x = -76.58, y = 3.50, label = "Origen") # Esto agrega el texto "Origen" en las coordenadas especificadas
p_interactive5 <- ggplotly(p_interactive5, tooltip = "text")
p_interactive6 <- ggplot() +
geom_sf(data = comunas2, aes(fill = conteo_destino_2, text = paste("Comuna:", comuna, "<br>Conteo Destino Motos:", conteo_destino_2))) +
scale_fill_gradient(low = "red", high = "green", limits = c(0, max(comunas2$conteo_destino_2, na.rm = TRUE))) +
theme_minimal() +
labs(title = "Movilidad en motos", x = "Longitud", y = "", fill = "") +
theme(plot.title = element_text(hjust = 0.5),
axis.text.x = element_text(angle = 90, hjust = 1), # Esto centra el título
axis.text.y = element_blank()) + # Esto oculta las etiquetas del eje Y
annotate("text", x = -76.58, y = 3.50, label = "Destino") # Esto agrega el texto "Destino" en las coordenadas especificadas
p_interactive6 <- ggplotly(p_interactive6, tooltip = "text")
# Usa subplot() para mostrar los gráficos uno al lado del otro
subplot(p_interactive5, p_interactive6, nrows = 1)
Para las motos, nuevamente la Comuna 2 lidera con 1111 en origen y 1777 en destino. La Comuna 12 tiene la menor movilidad con 144 en origen y 112 en destino. La Comuna 18 presenta un valor intermedio con 626 motos en origen y 242 en destino.
# Crea los gráficos interactivos para carros
p_interactive7 <- ggplot() +
geom_sf(data = comunas2, aes(fill = conteo_origen_3, text = paste("Comuna:", comuna, "<br>Conteo Origen Carros:", conteo_origen_3))) +
scale_fill_gradient(low = "purple", high = "yellow", limits = c(0, max(comunas2$conteo_origen_3, na.rm = TRUE)), guide = "none") +
theme_minimal() +
labs(title = "Movilidad en carros", x = "Longitud", y = "Latitud", fill = "Conteos") +
theme(plot.title = element_text(hjust = 0.5),
axis.text.x = element_text(angle = 90, hjust = 1)) + # Esto centra el título
annotate("text", x = -76.58, y = 3.50, label = "Origen") # Esto agrega el texto "Origen" en las coordenadas especificadas
p_interactive7 <- ggplotly(p_interactive7, tooltip = "text")
p_interactive8 <- ggplot() +
geom_sf(data = comunas2, aes(fill = conteo_destino_3, text = paste("Comuna:", comuna, "<br>Conteo Destino Carros:", conteo_destino_3))) +
scale_fill_gradient(low = "purple", high = "yellow", limits = c(0, max(comunas2$conteo_destino_3, na.rm = TRUE))) +
theme_minimal() +
labs(title = "Movilidad en carros", x = "Longitud", y = "", fill = "") +
theme(plot.title = element_text(hjust = 0.5),
axis.text.x = element_text(angle = 90, hjust = 1), # Esto centra el título
axis.text.y = element_blank()) + # Esto oculta las etiquetas del eje Y
annotate("text", x = -76.58, y = 3.50, label = "Destino") # Esto agrega el texto "Destino" en las coordenadas especificadas
p_interactive8 <- ggplotly(p_interactive8, tooltip = "text")
# Usa subplot() para mostrar los gráficos uno al lado del otro
subplot(p_interactive7, p_interactive8, nrows = 1)
En el caso de los carros, la Comuna 2 sigue siendo la de mayor movilidad con 904 en origen y 1567 en destino. La Comuna 12 tiene la menor movilidad con 91 en origen y 73 en destino. Un valor intermedio lo encontramos en la Comuna 16, con 470 carros en origen y 293 en destino.
En términos generales, se observa que la Comuna 2 registra la mayor movilidad en todos los tipos de vehículos, mientras que la Comuna 12 presenta la menor. Esto podría sugerir que la Comuna 2 es un importante centro de actividad, en contraposición a la Comuna 12, que parece ser menos transitada. Sería beneficioso profundizar el análisis, considerando variables adicionales como una caracterización sociodemográfica de ambas comunas, así como la infraestructura que poseen. Esto permitiría una comprensión más detallada de las particularidades de estos lugares y, por ende, una mejor interpretación de los factores que contribuyen tanto a las altas como a las bajas movilidades.
En cuanto a los vehículos, las motos parecen ser el medio de transporte personal más utilizado en la ciudad, ya que muestran tener una mayor movilidad en comparación con los demás vehículos. Por otro lado, la bicicleta es el vehículo que presenta las menores frecuencias de movilidad. Estos hallazgos podrían indicar una preferencia por las motos debido a factores como la eficiencia en el tráfico y la economía. Sin embargo, la baja movilidad de las bicicletas podría reflejar la necesidad de mejorar la infraestructura para bicicletas y promover su uso como una alternativa de transporte sostenible.