library(readxl)
library(dplyr)
library(sf)
library(ggplot2)
library(janitor)
library(tidyr)
library(viridis)
library(knitr)
library(stringr)
knitr::opts_chunk$set(
echo = TRUE,
message = FALSE,
warning = FALSE
)
# Leer archivo Excel
encuesta <- read_excel("Casos/EncuestaOrigenDestino.xlsx", sheet = "Hoja1") %>%
clean_names()
# Leer shapefile de comunas
comunas <- st_read("Casos/cali/Comunas.shp")
## Reading layer `Comunas' from data source
## `C:\Users\Usuario\Documents\PROYECTOS GEO\ACTIVIDAD 1\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
# Revisar nombres de columnas
names(encuesta)
## [1] "fecha"
## [2] "id_estacion"
## [3] "estacion"
## [4] "acceso"
## [5] "movimiento"
## [6] "hora_de_encuesta"
## [7] "municipio_7"
## [8] "departamento_localidad_comuna_distrito_barrio_vereda_hito_direccion_8"
## [9] "codigo_origen_sdg"
## [10] "que_estaba_haciendo_en_ese_lugar"
## [11] "municipio_11"
## [12] "departamento_localidad_comuna_distrito_barrio_vereda_hito_direccion_12"
## [13] "codigo_destino_sdg"
## [14] "que_va_hacer_a_ese_lugar"
## [15] "estrato_en_su_vivienda"
## [16] "disponia_de_un_vehiculo_para_realizar_este_desplazamiento"
## [17] "otro_cual_17"
## [18] "antes"
## [19] "despues"
## [20] "edad"
## [21] "sexo"
## [22] "personas_en_el_vehiculo"
## [23] "tipo_de_vehiculo"
## [24] "otro_cual_24"
## [25] "tipo_de_viajero"
## [26] "comuna_origen"
## [27] "comuna_destino"
## [28] "intracomuna"
names(comunas)
## [1] "OBJECTID" "gid" "comuna" "nombre" "geometry"
# 4. RevisiĂ³n inicial de los datos
# Primeros registros de la encuesta
head(encuesta) %>%
kable(caption = "Primeros registros de la encuesta")
Primeros registros de la encuesta
| 2015-06-01 |
1 |
Avenida 6N X Calle 70N |
NORTE |
MOV 1 |
1899-12-31 06:10:00 |
CALI |
B CHIPICHAPE |
218 |
5 |
CALI |
B PANCE |
2216 |
1 |
3 |
0 |
NA |
NA |
NA |
35 |
2 |
1 |
2 |
NA |
1 |
02 |
22 |
0 |
| 2015-06-01 |
1 |
Avenida 6N X Calle 70N |
NORTE |
MOV 1 |
1899-12-31 06:11:00 |
CALIMA |
DARIEN |
4102 |
6 |
CALI |
TEQUENDAMA |
1904 |
4 |
2 |
NA |
NA |
NA |
NA |
40 |
2 |
4 |
3 |
NA |
1 |
Fuera de Cali |
19 |
0 |
| 2015-06-01 |
1 |
Avenida 6N X Calle 70N |
NORTE |
MOV 1 |
1899-12-31 06:12:00 |
YUMBO |
VALLE DEL CAUCA |
3102 |
6 |
CALI |
B EL PEÑON |
302 |
1 |
3 |
NA |
NA |
NA |
NA |
33 |
2 |
1 |
2 |
NA |
1 |
Fuera de Cali |
03 |
0 |
| 2015-06-01 |
1 |
Avenida 6N X Calle 70N |
NORTE |
MOV 1 |
1899-12-31 06:13:00 |
YUMBO |
VALLE DEL CAUCA |
3102 |
6 |
CALI |
B OBRERO |
910 |
1 |
2 |
NA |
NA |
NA |
NA |
28 |
2 |
1 |
2 |
NA |
1 |
Fuera de Cali |
09 |
0 |
| 2015-06-01 |
1 |
Avenida 6N X Calle 70N |
NORTE |
MOV 1 |
1899-12-31 06:14:00 |
PALMIRA |
VALLE DEL CAUCA |
3202 |
8 |
CALI |
B CENTENARIO |
223 |
1 |
3 |
NA |
NA |
NA |
NA |
25 |
2 |
2 |
2 |
NA |
1 |
Fuera de Cali |
02 |
0 |
| 2015-06-01 |
1 |
Avenida 6N X Calle 70N |
NORTE |
MOV 1 |
1899-12-31 06:15:00 |
PALMIRA |
VALLE DEL CAUCA |
3202 |
6 |
CALI |
B CENTENARIO |
223 |
1 |
2 |
NA |
NA |
NA |
NA |
31 |
2 |
3 |
3 |
NA |
1 |
Fuera de Cali |
02 |
0 |
# Primeros registros del shapefile sin geometrĂa
comunas %>%
st_drop_geometry() %>%
head() %>%
kable(caption = "Primeros registros de la cartografĂa de comunas")
Primeros registros de la cartografĂa de comunas
| 1 |
107 |
2 |
Comuna 2 |
| 2 |
108 |
1 |
Comuna 1 |
| 3 |
109 |
3 |
Comuna 3 |
| 4 |
110 |
19 |
Comuna 19 |
| 5 |
103 |
15 |
Comuna 15 |
| 6 |
104 |
17 |
Comuna 17 |
# 5. Limpieza y preparaciĂ³n de variables
encuesta_limpia <- encuesta %>%
mutate(
comuna_origen = as.character(comuna_origen),
comuna_destino = as.character(comuna_destino),
comuna_origen_num = suppressWarnings(as.numeric(comuna_origen)),
comuna_destino_num = suppressWarnings(as.numeric(comuna_destino)),
tipo_de_vehiculo = suppressWarnings(as.numeric(tipo_de_vehiculo)),
vehiculo_nombre = case_when(
tipo_de_vehiculo == 1 ~ "Bicicleta",
tipo_de_vehiculo == 2 ~ "Moto",
tipo_de_vehiculo == 3 ~ "AutomĂ³vil",
TRUE ~ "Otro"
)
)
comunas_limpias <- comunas %>%
mutate(
comuna_num = as.numeric(comuna)
)
encuesta_limpia %>%
count(tipo_de_vehiculo, vehiculo_nombre, sort = TRUE) %>%
kable(caption = "Frecuencia de viajes por tipo de vehĂculo")
Frecuencia de viajes por tipo de vehĂculo
| 2 |
Moto |
16077 |
| 3 |
AutomĂ³vil |
14100 |
| 5 |
Otro |
1999 |
| 1 |
Bicicleta |
1731 |
| 4 |
Otro |
459 |
| 6 |
Otro |
211 |
| 7 |
Otro |
167 |
| NA |
Otro |
115 |
| 8 |
Otro |
88 |
| 77 |
Otro |
77 |
| 9 |
Otro |
30 |
# 6. ValidaciĂ³n de comunas
comunas_limpias %>%
st_drop_geometry() %>%
select(comuna_num, nombre) %>%
arrange(comuna_num) %>%
kable(caption = "Comunas disponibles en la cartografĂa")
Comunas disponibles en la cartografĂa
| 1 |
Comuna 1 |
| 2 |
Comuna 2 |
| 3 |
Comuna 3 |
| 4 |
Comuna 4 |
| 5 |
Comuna 5 |
| 6 |
Comuna 6 |
| 7 |
Comuna 7 |
| 8 |
Comuna 8 |
| 9 |
Comuna 9 |
| 10 |
Comuna 10 |
| 11 |
Comuna 11 |
| 12 |
Comuna 12 |
| 13 |
Comuna 13 |
| 14 |
Comuna 14 |
| 15 |
Comuna 15 |
| 16 |
Comuna 16 |
| 17 |
Comuna 17 |
| 18 |
Comuna 18 |
| 19 |
Comuna 19 |
| 20 |
Comuna 20 |
| 21 |
Comuna 21 |
| 22 |
Comuna 22 |
encuesta_limpia %>%
count(comuna_origen_num, sort = TRUE) %>%
kable(caption = "Frecuencia de comunas de origen en la encuesta")
Frecuencia de comunas de origen en la encuesta
| NA |
6306 |
| 2 |
2968 |
| 19 |
2850 |
| 17 |
2377 |
| 3 |
2121 |
| 18 |
1536 |
| 4 |
1493 |
| 10 |
1401 |
| 13 |
1238 |
| 15 |
1171 |
| 22 |
1153 |
| 8 |
1124 |
| 6 |
998 |
| 16 |
993 |
| 9 |
952 |
| 11 |
925 |
| 21 |
818 |
| 1 |
794 |
| 7 |
734 |
| 20 |
733 |
| 14 |
685 |
| 0 |
672 |
| 5 |
664 |
| 12 |
348 |
encuesta_limpia %>%
count(comuna_destino_num, sort = TRUE) %>%
kable(caption = "Frecuencia de comunas de destino en la encuesta")
Frecuencia de comunas de destino en la encuesta
| NA |
6400 |
| 2 |
4810 |
| 3 |
3859 |
| 19 |
3158 |
| 17 |
2164 |
| 22 |
1860 |
| 4 |
1856 |
| 9 |
1279 |
| 8 |
1025 |
| 10 |
927 |
| 0 |
788 |
| 7 |
748 |
| 16 |
743 |
| 6 |
716 |
| 13 |
673 |
| 18 |
662 |
| 15 |
579 |
| 11 |
564 |
| 5 |
522 |
| 21 |
515 |
| 14 |
379 |
| 20 |
351 |
| 12 |
246 |
| 1 |
230 |
# 7. Mapa general de origen
origen_general <- encuesta_limpia %>%
filter(!is.na(comuna_origen_num)) %>%
count(comuna_origen_num, name = "total_viajes_origen")
mapa_origen_general <- comunas_limpias %>%
left_join(origen_general, by = c("comuna_num" = "comuna_origen_num")) %>%
mutate(total_viajes_origen = replace_na(total_viajes_origen, 0))
ggplot(mapa_origen_general) +
geom_sf(aes(fill = total_viajes_origen), color = "white", linewidth = 0.3) +
geom_sf_text(aes(label = comuna_num), size = 3) +
scale_fill_viridis_c(option = "C", name = "Viajes") +
labs(
title = "Mapa general de origen de viajes por comuna",
subtitle = "Cantidad de viajes que salen desde cada comuna",
caption = "Fuente: Encuesta Origen-Destino y cartografĂa de comunas"
) +
theme_minimal()

# 8. FunciĂ³n para mapas de origen por vehĂculo
crear_mapa_origen_vehiculo <- function(nombre_vehiculo) {
origen_vehiculo <- encuesta_limpia %>%
filter(
vehiculo_nombre == nombre_vehiculo,
!is.na(comuna_origen_num)
) %>%
count(comuna_origen_num, name = "total_viajes")
mapa <- comunas_limpias %>%
left_join(origen_vehiculo, by = c("comuna_num" = "comuna_origen_num")) %>%
mutate(total_viajes = replace_na(total_viajes, 0))
ggplot(mapa) +
geom_sf(aes(fill = total_viajes), color = "white", linewidth = 0.3) +
geom_sf_text(aes(label = comuna_num), size = 3) +
scale_fill_viridis_c(option = "C", name = "Viajes") +
labs(
title = paste("Origen de viajes en", nombre_vehiculo, "por comuna"),
subtitle = paste("Cantidad de viajes en", nombre_vehiculo, "que salen desde cada comuna"),
caption = "Fuente: Encuesta Origen-Destino y cartografĂa de comunas"
) +
theme_minimal()
}
# 9. Mapa de origen en bicicleta
crear_mapa_origen_vehiculo("Bicicleta")

# 10. Mapa de origen en moto
crear_mapa_origen_vehiculo("Moto")

# 11. Mapa de origen en automĂ³vil
crear_mapa_origen_vehiculo("AutomĂ³vil")

# 12. Mapa general de destino
destino_general <- encuesta_limpia %>%
filter(!is.na(comuna_destino_num)) %>%
count(comuna_destino_num, name = "total_viajes_destino")
mapa_destino_general <- comunas_limpias %>%
left_join(destino_general, by = c("comuna_num" = "comuna_destino_num")) %>%
mutate(total_viajes_destino = replace_na(total_viajes_destino, 0))
ggplot(mapa_destino_general) +
geom_sf(aes(fill = total_viajes_destino), color = "white", linewidth = 0.3) +
geom_sf_text(aes(label = comuna_num), size = 3) +
scale_fill_viridis_c(option = "C", name = "Viajes") +
labs(
title = "Mapa general de destino de viajes por comuna",
subtitle = "Cantidad de viajes que llegan a cada comuna",
caption = "Fuente: Encuesta Origen-Destino y cartografĂa de comunas"
) +
theme_minimal()

# 13. FunciĂ³n para mapas de destino por vehĂculo
crear_mapa_destino_vehiculo <- function(nombre_vehiculo) {
destino_vehiculo <- encuesta_limpia %>%
filter(
vehiculo_nombre == nombre_vehiculo,
!is.na(comuna_destino_num)
) %>%
count(comuna_destino_num, name = "total_viajes")
mapa <- comunas_limpias %>%
left_join(destino_vehiculo, by = c("comuna_num" = "comuna_destino_num")) %>%
mutate(total_viajes = replace_na(total_viajes, 0))
ggplot(mapa) +
geom_sf(aes(fill = total_viajes), color = "white", linewidth = 0.3) +
geom_sf_text(aes(label = comuna_num), size = 3) +
scale_fill_viridis_c(option = "C", name = "Viajes") +
labs(
title = paste("Destino de viajes en", nombre_vehiculo, "por comuna"),
subtitle = paste("Cantidad de viajes en", nombre_vehiculo, "que llegan a cada comuna"),
caption = "Fuente: Encuesta Origen-Destino y cartografĂa de comunas"
) +
theme_minimal()
}
# 14. Mapa de destino en bicicleta
crear_mapa_destino_vehiculo("Bicicleta")

# 15. Mapa de destino en moto
crear_mapa_destino_vehiculo("Moto")

# 16. Mapa de destino en automĂ³vil
crear_mapa_destino_vehiculo("AutomĂ³vil")

top_origenes <- encuesta_limpia %>%
filter(!is.na(comuna_origen_num)) %>%
count(comuna_origen_num, name = "viajes_salida") %>%
arrange(desc(viajes_salida))
top_origenes %>%
slice_head(n = 10) %>%
kable(caption = "Diez comunas con mayor cantidad de viajes de origen")
Diez comunas con mayor cantidad de viajes de origen
| 2 |
2968 |
| 19 |
2850 |
| 17 |
2377 |
| 3 |
2121 |
| 18 |
1536 |
| 4 |
1493 |
| 10 |
1401 |
| 13 |
1238 |
| 15 |
1171 |
| 22 |
1153 |
top_destinos <- encuesta_limpia %>%
filter(!is.na(comuna_destino_num)) %>%
count(comuna_destino_num, name = "viajes_llegada") %>%
arrange(desc(viajes_llegada))
top_destinos %>%
slice_head(n = 10) %>%
kable(caption = "Diez comunas con mayor cantidad de viajes de destino")
Diez comunas con mayor cantidad de viajes de destino
| 2 |
4810 |
| 3 |
3859 |
| 19 |
3158 |
| 17 |
2164 |
| 22 |
1860 |
| 4 |
1856 |
| 9 |
1279 |
| 8 |
1025 |
| 10 |
927 |
| 0 |
788 |
# 19. Principales destinos por tipo de vehĂculo
tabla_destinos_vehiculo <- encuesta_limpia %>%
filter(
vehiculo_nombre %in% c("Bicicleta", "Moto", "AutomĂ³vil"),
!is.na(comuna_destino_num)
) %>%
count(vehiculo_nombre, comuna_destino_num, name = "total_viajes") %>%
arrange(vehiculo_nombre, desc(total_viajes))
tabla_destinos_vehiculo %>%
group_by(vehiculo_nombre) %>%
slice_max(order_by = total_viajes, n = 5, with_ties = FALSE) %>%
ungroup() %>%
kable(caption = "Cinco principales comunas de destino por tipo de vehĂculo")
Cinco principales comunas de destino por tipo de
vehĂculo
| AutomĂ³vil |
2 |
2006 |
| AutomĂ³vil |
3 |
1557 |
| AutomĂ³vil |
19 |
1302 |
| AutomĂ³vil |
17 |
959 |
| AutomĂ³vil |
4 |
757 |
| Bicicleta |
2 |
218 |
| Bicicleta |
3 |
189 |
| Bicicleta |
19 |
147 |
| Bicicleta |
17 |
115 |
| Bicicleta |
22 |
100 |
| Moto |
2 |
2177 |
| Moto |
3 |
1734 |
| Moto |
19 |
1421 |
| Moto |
17 |
927 |
| Moto |
22 |
911 |
# 20. Principales orĂgenes por tipo de vehĂculo
tabla_origenes_vehiculo <- encuesta_limpia %>%
filter(
vehiculo_nombre %in% c("Bicicleta", "Moto", "AutomĂ³vil"),
!is.na(comuna_origen_num)
) %>%
count(vehiculo_nombre, comuna_origen_num, name = "total_viajes") %>%
arrange(vehiculo_nombre, desc(total_viajes))
tabla_origenes_vehiculo %>%
group_by(vehiculo_nombre) %>%
slice_max(order_by = total_viajes, n = 5, with_ties = FALSE) %>%
ungroup() %>%
kable(caption = "Cinco principales comunas de origen por tipo de vehĂculo")
Cinco principales comunas de origen por tipo de
vehĂculo
| AutomĂ³vil |
19 |
1165 |
| AutomĂ³vil |
2 |
1121 |
| AutomĂ³vil |
17 |
899 |
| AutomĂ³vil |
3 |
854 |
| AutomĂ³vil |
18 |
559 |
| Bicicleta |
2 |
159 |
| Bicicleta |
17 |
141 |
| Bicicleta |
19 |
141 |
| Bicicleta |
18 |
111 |
| Bicicleta |
3 |
99 |
| Moto |
2 |
1414 |
| Moto |
19 |
1280 |
| Moto |
17 |
1136 |
| Moto |
3 |
970 |
| Moto |
18 |
746 |
# 21. Tabla origen-destino general
tabla_od <- encuesta_limpia %>%
filter(
!is.na(comuna_origen_num),
!is.na(comuna_destino_num)
) %>%
count(comuna_origen_num, comuna_destino_num, name = "total_viajes") %>%
arrange(desc(total_viajes))
tabla_od %>%
slice_head(n = 20) %>%
kable(caption = "Principales relaciones origen-destino entre comunas")
Principales relaciones origen-destino entre comunas
| 2 |
2 |
496 |
| 19 |
2 |
492 |
| 17 |
2 |
340 |
| 2 |
19 |
306 |
| 17 |
22 |
294 |
| 18 |
2 |
256 |
| 2 |
3 |
253 |
| 19 |
19 |
248 |
| 3 |
2 |
244 |
| 17 |
3 |
236 |
| 3 |
19 |
216 |
| 18 |
3 |
210 |
| 19 |
3 |
205 |
| 22 |
17 |
186 |
| 10 |
2 |
181 |
| 1 |
2 |
179 |
| 19 |
22 |
179 |
| 2 |
17 |
178 |
| 18 |
19 |
168 |
| 22 |
2 |
164 |
# 22. FunciĂ³n para destinos desde una comuna especĂfica
crear_mapa_destino_desde_origen <- function(origen_elegido) {
destinos <- encuesta_limpia %>%
filter(
comuna_origen_num == origen_elegido,
!is.na(comuna_destino_num)
) %>%
count(comuna_destino_num, name = "viajes_destino")
mapa <- comunas_limpias %>%
left_join(destinos, by = c("comuna_num" = "comuna_destino_num")) %>%
mutate(viajes_destino = replace_na(viajes_destino, 0))
ggplot(mapa) +
geom_sf(aes(fill = viajes_destino), color = "white", linewidth = 0.3) +
geom_sf_text(aes(label = comuna_num), size = 3) +
scale_fill_viridis_c(option = "C", name = "Viajes") +
labs(
title = paste("Destinos de los viajes que salen desde la comuna", origen_elegido),
subtitle = "DistribuciĂ³n espacial de los destinos",
caption = "Fuente: Encuesta Origen-Destino y cartografĂa de comunas"
) +
theme_minimal()
}
# 23. Mapa de destino desde la comuna con mayor origen
comuna_mayor_origen <- top_origenes$comuna_origen_num[1]
crear_mapa_destino_desde_origen(comuna_mayor_origen)

# 24. Mapas de destino desde las tres comunas con mayor origen
top_3_origenes <- top_origenes$comuna_origen_num[1:3]
for (origen in top_3_origenes) {
print(crear_mapa_destino_desde_origen(origen))
}



# 25. FunciĂ³n para destinos desde una comuna segĂºn vehĂculo
crear_mapa_destino_desde_origen_vehiculo <- function(origen_elegido, nombre_vehiculo) {
destinos <- encuesta_limpia %>%
filter(
comuna_origen_num == origen_elegido,
vehiculo_nombre == nombre_vehiculo,
!is.na(comuna_destino_num)
) %>%
count(comuna_destino_num, name = "viajes_destino")
mapa <- comunas_limpias %>%
left_join(destinos, by = c("comuna_num" = "comuna_destino_num")) %>%
mutate(viajes_destino = replace_na(viajes_destino, 0))
ggplot(mapa) +
geom_sf(aes(fill = viajes_destino), color = "white", linewidth = 0.3) +
geom_sf_text(aes(label = comuna_num), size = 3) +
scale_fill_viridis_c(option = "C", name = "Viajes") +
labs(
title = paste("Destinos desde comuna", origen_elegido, "en", nombre_vehiculo),
subtitle = paste("Viajes con origen en la comuna", origen_elegido),
caption = "Fuente: Encuesta Origen-Destino y cartografĂa de comunas"
) +
theme_minimal()
}
# 26. Destinos desde la comuna principal por tipo de vehĂculo
crear_mapa_destino_desde_origen_vehiculo(comuna_mayor_origen, "Bicicleta")

crear_mapa_destino_desde_origen_vehiculo(comuna_mayor_origen, "Moto")

crear_mapa_destino_desde_origen_vehiculo(comuna_mayor_origen, "AutomĂ³vil")
