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
fecha id_estacion estacion acceso movimiento hora_de_encuesta municipio_7 departamento_localidad_comuna_distrito_barrio_vereda_hito_direccion_8 codigo_origen_sdg que_estaba_haciendo_en_ese_lugar municipio_11 departamento_localidad_comuna_distrito_barrio_vereda_hito_direccion_12 codigo_destino_sdg que_va_hacer_a_ese_lugar estrato_en_su_vivienda disponia_de_un_vehiculo_para_realizar_este_desplazamiento otro_cual_17 antes despues edad sexo personas_en_el_vehiculo tipo_de_vehiculo otro_cual_24 tipo_de_viajero comuna_origen comuna_destino intracomuna
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
OBJECTID gid comuna nombre
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
tipo_de_vehiculo vehiculo_nombre n
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
comuna_num nombre
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
comuna_origen_num n
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
comuna_destino_num n
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
comuna_origen_num viajes_salida
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
comuna_destino_num viajes_llegada
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
vehiculo_nombre comuna_destino_num total_viajes
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
vehiculo_nombre comuna_origen_num total_viajes
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
comuna_origen_num comuna_destino_num total_viajes
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")