Áreas de la estadística Espacial y conceptos de cartografía

Cargar librerías

Se establece una función dedicada a la instalación de librerías esenciales, simplificando así el proceso. Esto garantiza la instalación de todas las librerías necesarias de manera eficiente y evita la repetición de pasos en el documento.

cargar_libreria <- function(paquete) {
# Función para cargar una librería de R
if (!requireNamespace(paquete, quietly = TRUE)) {
# Verifica si el paquete no está cargado y lo instala si es necesario
install.packages(paquete)
} else {
# Si el paquete ya está instalado, muestra un mensaje indicándolo
message(paste("La librería", paquete, "ya está instalada."))
}
}
suppressMessages({
  suppressWarnings({
    # Cargar librerías con supresión de mensajes y advertencias
    cargar_libreria <- function(lib) {
      if (!requireNamespace(lib, quietly = TRUE)) {
        install.packages(lib, dependencies = TRUE)
        suppressWarnings(requireNamespace(lib, quietly = TRUE))
      } else {
        suppressWarnings(requireNamespace(lib, quietly = TRUE))
      }
    }

    cargar_libreria("readxl")
    cargar_libreria("sf")
    cargar_libreria("ggplot2")
    cargar_libreria("ggtext")
    cargar_libreria("dplyr")
    cargar_libreria("plotly")
    cargar_libreria("patchwork")
    
    library(patchwork)
    library(plotly)
    library(dplyr)
    library(readxl)
    library(sf)
    library(ggplot2)
    library(ggtext)
  })
})
## Reading layer `Comunas' from data source 
##   `C:\Users\karen\Desktop\casos\Casos\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
suppressMessages(library(readxl))
Encuesta <- read_excel("/Users/karen/Desktop/casos/Casos/Casos/EncuestaOrigenDestino.xlsx", sheet = "Sheet4")
## Warning: Coercing numeric to date in A2058 / R2058C1
## Warning: Coercing numeric to date in A2059 / R2059C1
## Warning: Coercing numeric to date in A2060 / R2060C1
## Warning: Coercing numeric to date in A2061 / R2061C1
## Warning: Coercing numeric to date in A2062 / R2062C1
## Warning: Coercing numeric to date in A2063 / R2063C1
## Warning: Coercing numeric to date in A2064 / R2064C1
## Warning: Coercing numeric to date in A2065 / R2065C1
## Warning: Coercing numeric to date in A2066 / R2066C1
## Warning: Coercing numeric to date in A2067 / R2067C1
## Warning: Coercing numeric to date in A2068 / R2068C1
## Warning: Coercing numeric to date in A2069 / R2069C1
## Warning: Coercing numeric to date in A2070 / R2070C1
## Warning: Coercing numeric to date in A2071 / R2071C1
## Warning: Coercing numeric to date in A2072 / R2072C1
## Warning: Coercing numeric to date in A2073 / R2073C1
## Warning: Coercing numeric to date in A2074 / R2074C1
## Warning: Coercing numeric to date in A2075 / R2075C1
## Warning: Coercing numeric to date in A2076 / R2076C1
## Warning: Coercing numeric to date in A2077 / R2077C1
## Warning: Coercing numeric to date in A2078 / R2078C1
## Warning: Coercing numeric to date in A2079 / R2079C1
## Warning: Coercing numeric to date in A2080 / R2080C1
## Warning: Coercing numeric to date in A2081 / R2081C1
## Warning: Coercing numeric to date in A2082 / R2082C1
## Warning: Coercing numeric to date in A2083 / R2083C1
## Warning: Coercing numeric to date in A2084 / R2084C1
## Warning: Coercing numeric to date in A2085 / R2085C1
## Warning: Coercing numeric to date in A2086 / R2086C1
## Warning: Coercing numeric to date in A2087 / R2087C1
## Warning: Coercing numeric to date in A2088 / R2088C1
## Warning: Coercing numeric to date in A2089 / R2089C1
## Warning: Coercing numeric to date in A2090 / R2090C1
## Warning: Coercing numeric to date in A2091 / R2091C1
## Warning: Coercing numeric to date in A2092 / R2092C1
## Warning: Coercing numeric to date in A2093 / R2093C1
## Warning: Coercing numeric to date in A2094 / R2094C1
## Warning: Coercing numeric to date in A2095 / R2095C1
## Warning: Coercing numeric to date in A2096 / R2096C1
## Warning: Coercing numeric to date in A2097 / R2097C1
## Warning: Coercing numeric to date in A2098 / R2098C1
## Warning: Coercing numeric to date in A2099 / R2099C1
## Warning: Coercing numeric to date in A2100 / R2100C1
## Warning: Coercing numeric to date in A2101 / R2101C1
## Warning: Coercing numeric to date in A2102 / R2102C1
## Warning: Coercing numeric to date in A2103 / R2103C1
## Warning: Coercing numeric to date in A2104 / R2104C1
## Warning: Coercing numeric to date in A2105 / R2105C1
## Warning: Coercing numeric to date in A2106 / R2106C1
## Warning: Coercing numeric to date in A2107 / R2107C1
## Warning: Coercing numeric to date in A2108 / R2108C1
## Warning: Coercing numeric to date in A2109 / R2109C1
## Warning: Coercing numeric to date in A2110 / R2110C1
## Warning: Coercing numeric to date in A2111 / R2111C1
## Warning: Coercing numeric to date in A2112 / R2112C1
## Warning: Coercing numeric to date in A2113 / R2113C1
## Warning: Coercing numeric to date in A2114 / R2114C1
## Warning: Coercing numeric to date in A2115 / R2115C1
## Warning: Coercing numeric to date in A2116 / R2116C1
## Warning: Coercing numeric to date in A2117 / R2117C1
## Warning: Coercing numeric to date in A2118 / R2118C1
## Warning: Coercing numeric to date in A2119 / R2119C1
## Warning: Coercing numeric to date in A2120 / R2120C1
## Warning: Coercing numeric to date in A2121 / R2121C1
## Warning: Coercing numeric to date in A2122 / R2122C1
## Warning: Coercing numeric to date in A2123 / R2123C1
## Warning: Coercing numeric to date in A2124 / R2124C1
## Warning: Coercing numeric to date in A2125 / R2125C1
## Warning: Coercing numeric to date in A2126 / R2126C1
## Warning: Coercing numeric to date in A2127 / R2127C1
## Warning: Coercing numeric to date in A2128 / R2128C1
## Warning: Coercing numeric to date in A2129 / R2129C1
## Warning: Coercing numeric to date in A2130 / R2130C1
## Warning: Coercing numeric to date in A2131 / R2131C1
## Warning: Coercing numeric to date in A2132 / R2132C1
## Warning: Coercing numeric to date in A2133 / R2133C1
## Warning: Coercing numeric to date in A2134 / R2134C1
## Warning: Coercing numeric to date in A2135 / R2135C1
## Warning: Coercing numeric to date in A2136 / R2136C1
## Warning: Coercing numeric to date in A2137 / R2137C1
## Warning: Coercing numeric to date in A2138 / R2138C1
## Warning: Coercing numeric to date in A33837 / R33837C1
## New names:
## • `MUNICIPIO` -> `MUNICIPIO...7`
## • `DEPARTAMENTO/LOCALIDAD/COMUNA/DISTRITO/BARRIO/VEREDA/HITO/DIRECCIÓN` ->
##   `DEPARTAMENTO/LOCALIDAD/COMUNA/DISTRITO/BARRIO/VEREDA/HITO/DIRECCIÓN...8`
## • `MUNICIPIO` -> `MUNICIPIO...11`
## • `DEPARTAMENTO/LOCALIDAD/COMUNA/DISTRITO/BARRIO/VEREDA/HITO/DIRECCIÓN` ->
##   `DEPARTAMENTO/LOCALIDAD/COMUNA/DISTRITO/BARRIO/VEREDA/HITO/DIRECCIÓN...12`
## • `OTRO¿CUÁL?` -> `OTRO¿CUÁL?...17`
## • `OTRO¿CUÁL?` -> `OTRO¿CUÁL?...24`

##Preparación de los datos

La realización del ejercicio implica que se cuente con informacion espacial de las comunas y la información alfanumérica de la encuesta

# Definir las columnas de interés para la Encuesta
columnas_de_interes <- c("IDESTACIÓN", "TIPODEVEHÍCULO", "comunaorigen", "comunadestino")

# Crear un nuevo dataframe con las columnas de interés de la Encuesta
Encuesta_filtrada <- Encuesta[columnas_de_interes]

# Filtrar las filas donde la comuna de origen no sea "Fuera de Cali"
Encuesta_filtrada <- subset(Encuesta_filtrada, Encuesta_filtrada$`comunaorigen` != "Fuera de Cali")

# Filtrar las filas donde la comuna de destino no sea "Fuera de Cali"
Encuesta_filtrada <- subset(Encuesta_filtrada, Encuesta_filtrada$`comunadestino` != "Fuera de Cali")

# Convertir las columnas de comuna de origen y destino a tipo entero
Encuesta_filtrada$`comunaorigen` <- as.integer(Encuesta_filtrada$`comunaorigen`)
## Warning: NAs introducidos por coerción
Encuesta_filtrada$`comunadestino` <- as.integer(Encuesta_filtrada$`comunadestino`)
## Warning: NAs introducidos por coerción
# Imprimir el dataframe filtrado
print(Encuesta_filtrada)
## # A tibble: 35,054 × 4
##    IDESTACIÓN TIPODEVEHÍCULO comunaorigen comunadestino
##         <dbl> <chr>                 <int>         <int>
##  1          1 2                         2            22
##  2          1 3                        NA            19
##  3          1 2                        NA             3
##  4          1 2                        NA             9
##  5          1 2                        NA             2
##  6          1 3                        NA             2
##  7          1 3                        NA            17
##  8          1 2                        NA            NA
##  9          1 2                        NA             2
## 10          1 3                        NA             2
## # ℹ 35,044 more rows
library(ggplot2)
ggplot(data = Encuesta_filtrada, aes(x = factor(`comunaorigen`))) +
  stat_count() +
  labs(x = "Comuna de origen", y = "Frecuencia", title = "Frecuencia de viajes por comuna de origen") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

ggplot(data = Encuesta_filtrada, aes(x = factor(`comunadestino`))) +
  geom_bar() +
  labs(x = "Comuna de destino", y = "Frecuencia", title = "Frecuencia de viajes por comuna de destino")

Encuesta_filtrada$`TIPODEVEHÍCULO` <- factor(Encuesta_filtrada$`TIPODEVEHÍCULO`,
                                   levels = c(1, 2, 3),
                                   labels = c("Bicicleta", "Moto", "Automovil"))
frecuencias1 <- table(Encuesta_filtrada$`TIPODEVEHÍCULO`)
print(frecuencias1)
## 
## Bicicleta      Moto Automovil 
##      1731     16077     14100
frecuencias_df1 <- as.data.frame(frecuencias1)

names(frecuencias_df1) <- c("TIPO_DE_VEHÍCULO", "Frecuencia")

frecuencias_df1$label_position <- cumsum(frecuencias_df1$Frecuencia) - (frecuencias_df1$Frecuencia / 2)

ggplot(frecuencias_df1, aes(x = "", y = Frecuencia, fill = `TIPO_DE_VEHÍCULO`)) +
  geom_bar(width = 1, stat = "identity") +
  coord_polar(theta = "y") +
  theme_void() +
  labs(fill = "Tipo de Vehículo") +
  geom_text(aes(y = label_position, label = Frecuencia), color = "black") 

## Mapa general

Se genera un mapa general mostrando las comunas de la ciudad de Cali.

# Crear un gráfico de ggplot utilizando los datos del shapefile y añadir un título
m1_comunas_gral <- ggplot(datos_shape) + 
  geom_sf(aes(fill = nombre), color = "grey") +  # Añadir polígonos de las comunas con el nombre de cada comuna
  geom_sf_text(aes(label = comuna), size = 3, color = "black", check_overlap = TRUE) +  # Añadir etiquetas de texto para las comunas
  theme_minimal() +  # Utilizar un tema minimalista para el gráfico
  theme(
    axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1),  # Rotar etiquetas del eje x
    axis.title.x = element_blank(),  # Eliminar título del eje x
    axis.title.y = element_blank(),  # Eliminar título del eje y
    plot.title = element_text(hjust = 0.5)  # Ajustar la posición horizontal del título
  ) +
  labs(title = "Mapa de Comunas")  # Añadir un título al gráfico usando labs()

# Convertir el gráfico de ggplot a un objeto interactivo de Plotly
ggplotly(m1_comunas_gral)

Mapas de salidas y llegadas

A continuación, se llevan a cabo algunas consultas con el propósito de generar los mapas correspondientes a las salidas y llegadas.

# Contar la cantidad de salidas desde cada comuna de origen y almacenar los resultados en un dataframe
conteo_origen <- as.data.frame(table(Encuesta_filtrada$`comunaorigen`))

# Renombrar las columnas del dataframe de conteo de origen
names(conteo_origen) <- c("c_origen", "cantidad_salidas")

# Contar la cantidad de llegadas a cada comuna de destino y almacenar los resultados en un dataframe
conteo_destino <- as.data.frame(table(Encuesta_filtrada$`comunadestino`))

# Renombrar las columnas del dataframe de conteo de destino
names(conteo_destino) <- c("c_destino", "cantidad_llegadas")

# Fusionar los datos de conteo de origen con los datos del shapefile por la columna "comuna"
datos_shape <- merge(datos_shape, conteo_origen, by.x = "comuna", by.y = "c_origen", all = TRUE)

# Fusionar los datos de conteo de destino con los datos del shapefile por la columna "comuna"
datos_shape <- merge(datos_shape, conteo_destino, by.x = "comuna", by.y = "c_destino", all = TRUE)

# Filtrar las filas donde la comuna no sea "0"
datos_shape <- subset(datos_shape, comuna != "0")

Se modifican los ajustes de color, las características a mostrar en la leyenda y se ajustan los títulos para crear los mapas utilizando ggplot

# Crear un gráfico de ggplot utilizando los datos fusionados
m1_comunas_gral2 <- ggplot(datos_shape) + 
  geom_sf(aes(fill = cantidad_salidas), color = "grey") +  # Añadir polígonos de las comunas con el número de salidas como variable de color
  geom_sf_text(aes(label = comuna), size = 3, color = "black", check_overlap = TRUE) +  # Añadir etiquetas de texto para las comunas
  scale_fill_gradient(low = "white", high = "skyblue") +  # Ajustar la paleta de colores para el relleno
  theme_minimal() +  # Utilizar un tema minimalista para el gráfico
  theme(
    axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1),  # Rotar etiquetas del eje x
    axis.title.x = element_blank(),  # Eliminar título del eje x
    axis.title.y = element_blank(),  # Eliminar título del eje y
    plot.title = element_text(hjust = 0.5)  # Ajustar la posición horizontal del título
  ) +
  labs(title = "Mapa de salidas")  # Añadir un título al gráfico


# Crear un gráfico de ggplot utilizando los datos fusionados y añadir un título
m1_comunas_gral3 <- ggplot(datos_shape) + 
  geom_sf(aes(fill = cantidad_llegadas), color = "grey") +  # Añadir polígonos de las comunas con el número de llegadas como variable de color
  geom_sf_text(aes(label = comuna), size = 3, color = "black", check_overlap = TRUE) +  # Añadir etiquetas de texto para las comunas
  scale_fill_gradient(low = "white", high = "brown") +  # Ajustar la paleta de colores para el relleno
  theme_minimal() +  # Utilizar un tema minimalista para el gráfico
  theme(
    axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1),  # Rotar etiquetas del eje x
    axis.title.x = element_blank(),  # Eliminar título del eje x
    axis.title.y = element_blank(),  # Eliminar título del eje y
    plot.title = element_text(hjust = 0.5)  # Ajustar la posición horizontal del título
  ) +
  labs(title = "Mapa de llegadas")  # Añadir un título al gráfico

Análisis de los datos

Se llevan a cabo cambios en los datos, agrupando por tipo de vehículo y extrayendo subconjuntos del dataframe de Encuestas, focalizándose en las comunas de origen. Esto se realiza con el fin de combinar esta información con el archivo shapefile de las comunas, permitiendo generar visualizaciones que muestren la frecuencia de viajes según el tipo de vehículo para cada comuna en la ciudad de Cali.

ggplotly(m1_comunas_gral2)

Gráfica de comunas de recepción de viajes

ggplotly(m1_comunas_gral3)

Se llevan a cabo cambios en los datos, agrupándolos por tipo de vehículo y extrayendo subconjuntos específicos del dataframe “Encuestas” para las comunas de destino. Esto se realiza con el propósito de combinar esta información con el archivo shapefile de las comunas, permitiendo crear visualizaciones que muestren la frecuencia de viajes según el tipo de vehículo para cada comuna en la ciudad de Cali.

# Convertir la columna "TIPO DE VEHÍCULO" a tipo entero en el dataframe Encuesta_filtrada
Encuesta_filtrada$`TIPO DE VEHÍCULO` <- as.integer(Encuesta_filtrada$`TIPODEVEHÍCULO`)

# Realizar el conteo de salidas por comuna de origen y tipo de vehículo
data_final <- Encuesta_filtrada %>%
  group_by(`comunaorigen`, `TIPODEVEHÍCULO`) %>%
  summarise(contador = n())
## `summarise()` has grouped output by 'comunaorigen'. You can override using the
## `.groups` argument.
# Renombrar las columnas del dataframe de conteo de origen
df_final <- c("comuna_org", "vehiculo", "cantidad_salidas")
colnames(data_final) <- df_final

# Filtrar las filas correspondientes a bicicletas
conteo_bici <- subset(data_final, vehiculo == "Bicicleta")

# Renombrar la columna de cantidad de salidas para bicicletas
conteo_bici <- conteo_bici %>%
  rename(cantidad_salidas_bici = cantidad_salidas) 

# Filtrar las filas correspondientes a motos
conteo_moto <- subset(data_final, vehiculo == "Moto")

# Renombrar la columna de cantidad de salidas para motos
conteo_moto <- conteo_moto %>%
  rename(cantidad_salidas_moto = cantidad_salidas)

# Filtrar las filas correspondientes a autos
conteo_auto <- subset(data_final, vehiculo == "Automovil")

# Renombrar la columna de cantidad de salidas para autos
conteo_auto <- conteo_auto %>%
  rename(cantidad_salidas_auto = cantidad_salidas)

# Fusionar los datos de bicicletas con los datos del shapefile por la columna "comuna"
datos_shape <- merge(datos_shape, conteo_bici, by.x = "comuna", by.y = "comuna_org", all = TRUE)

# Fusionar los datos de motos con los datos del shapefile por la columna "comuna"
datos_shape <- merge(datos_shape, conteo_moto, by.x = "comuna", by.y = "comuna_org", all = TRUE)

# Fusionar los datos de autos con los datos del shapefile por la columna "comuna"
datos_shape <- merge(datos_shape, conteo_auto, by.x = "comuna", by.y = "comuna_org", all = TRUE)

# Eliminar las filas donde la comuna es "0"
datos_shape <- subset(datos_shape, comuna != "0")
m1_comunas_bici <- ggplot(datos_shape) + 
  geom_sf(aes(fill = cantidad_salidas_bici), color = "grey") + 
  geom_sf_text(aes(label = comuna), size = 3, color = "black", check_overlap = TRUE) +  
  scale_fill_gradient(low = "white", high = "red") +  
  theme_minimal() +  
  theme(
    axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1), 
    axis.title.x = element_blank(), 
    axis.title.y = element_blank(),  
    plot.title = element_text(hjust = 0.5)  
  ) +
  labs(title = "Mapa de salidas en bicicleta") 

ggplotly(m1_comunas_bici)
m1_comunas_moto <- ggplot(datos_shape) + 
  geom_sf(aes(fill = cantidad_salidas_moto), color = "grey") + 
  geom_sf_text(aes(label = comuna), size = 3, color = "black", check_overlap = TRUE) +  
  scale_fill_gradient(low = "white", high = "darkblue") +  
  theme_minimal() +  
  theme(
    axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1), 
    axis.title.x = element_blank(), 
    axis.title.y = element_blank(),  
    plot.title = element_text(hjust = 0.5)  
  ) +
  labs(title = "Mapa de salidas en motos") 

ggplotly(m1_comunas_moto)
m1_comunas_auto <- ggplot(datos_shape) + 
  geom_sf(aes(fill = cantidad_salidas_auto), color = "grey") + 
  geom_sf_text(aes(label = comuna), size = 3, color = "black", check_overlap = TRUE) +  
  scale_fill_gradient(low = "white", high = "purple") +  
  theme_minimal() +  
  theme(
    axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1), 
    axis.title.x = element_blank(), 
    axis.title.y = element_blank(),  
    plot.title = element_text(hjust = 0.5)  
  ) +
  labs(title = "Mapa de salidas en auto") 

ggplotly(m1_comunas_auto)
# Realizar el conteo de llegadas por comuna de destino y tipo de vehículo
conteo_destino <- Encuesta_filtrada %>%
  group_by(`comunadestino`, `TIPODEVEHÍCULO`) %>%
  summarise(contador = n())
## `summarise()` has grouped output by 'comunadestino'. You can override using the
## `.groups` argument.
# Renombrar las columnas del dataframe de conteo de destino
nombres_nuevos <- c("comuna_dest", "vehiculo", "cantidad_llegadas") 
colnames(conteo_destino) <- nombres_nuevos

# Filtrar las filas correspondientes a bicicletas
conteo_destino_bici <- subset(conteo_destino, vehiculo == "Bicicleta")

# Renombrar la columna de cantidad de llegadas para bicicletas
conteo_destino_bici <- conteo_destino_bici %>%
  rename(cantidad_llegadas_bici = cantidad_llegadas ) 

# Filtrar las filas correspondientes a motos
conteo_destino_moto <- subset(conteo_destino, vehiculo == "Moto")

# Renombrar la columna de cantidad de llegadas para motos
conteo_destino_moto <- conteo_destino_moto %>%
  rename(cantidad_llegadas_moto = cantidad_llegadas)

# Filtrar las filas correspondientes a autos
conteo_destino_auto <- subset(conteo_destino, vehiculo == "Automovil")

# Renombrar la columna de cantidad de llegadas para autos
conteo_destino_auto <- conteo_destino_auto %>%
  rename(cantidad_llegadas_auto = cantidad_llegadas)

# Fusionar los datos de bicicletas con los datos del shapefile por la columna "comuna"
datos_shape <- merge(datos_shape, conteo_destino_bici, by.x = "comuna", by.y = "comuna_dest", all = TRUE)
## Warning in merge.data.frame(datos_shape, conteo_destino_bici, by.x = "comuna",
## : column names 'vehiculo.x', 'vehiculo.y' are duplicated in the result
# Fusionar los datos de motos con los datos del shapefile por la columna "comuna"
datos_shape <- merge(datos_shape, conteo_destino_moto, by.x = "comuna", by.y = "comuna_dest", all = TRUE)

# Fusionar los datos de autos con los datos del shapefile por la columna "comuna"
datos_shape <- merge(datos_shape, conteo_destino_auto, by.x = "comuna", by.y = "comuna_dest", all = TRUE)
## Warning in merge.data.frame(datos_shape, conteo_destino_auto, by.x = "comuna",
## : column names 'vehiculo.x', 'vehiculo.y' are duplicated in the result
datos_shape <- subset(datos_shape, comuna != "0")
# Crear un gráfico de ggplot para las llegadas en bicicleta y añadir un título
m1_comunas_llegar_bici <- ggplot(datos_shape) + 
  geom_sf(aes(fill = cantidad_llegadas_bici), color = "grey") +  
  geom_sf_text(aes(label = comuna), size = 3, color = "black", check_overlap = TRUE) +  
  scale_fill_gradient(low = "white", high = "red") +  
  theme_minimal() +  
  theme(
    axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1),  
    axis.title.x = element_blank(),  
    axis.title.y = element_blank(), 
    plot.title = element_text(hjust = 0.5)  
  ) +
  labs(title = "Mapa de llegadas en bicicleta")  

ggplotly(m1_comunas_llegar_bici)
# Crear un gráfico de ggplot para las llegadas en bicicleta y añadir un título
m1_comunas_llegar_moto <- ggplot(datos_shape) + 
  geom_sf(aes(fill = cantidad_llegadas_moto), color = "grey") +  
  geom_sf_text(aes(label = comuna), size = 3, color = "black", check_overlap = TRUE) +  
  scale_fill_gradient(low = "white", high = "darkblue") +  
  theme_minimal() +  
  theme(
    axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1),  
    axis.title.x = element_blank(),  
    axis.title.y = element_blank(), 
    plot.title = element_text(hjust = 0.5)  
  ) +
  labs(title = "Mapa de llegadas en moto")  

ggplotly(m1_comunas_llegar_moto)
# Crear un gráfico de ggplot para las llegadas en bicicleta y añadir un título
m1_comunas_llegar_auto <- ggplot(datos_shape) + 
  geom_sf(aes(fill = cantidad_llegadas_auto), color = "grey") +  
  geom_sf_text(aes(label = comuna), size = 3, color = "black", check_overlap = TRUE) +  
  scale_fill_gradient(low = "white", high = "purple") +  
  theme_minimal() +  
  theme(
    axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1),  
    axis.title.x = element_blank(),  
    axis.title.y = element_blank(), 
    plot.title = element_text(hjust = 0.5)  
  ) +
  labs(title = "Mapa de llegadas en auto")  

ggplotly(m1_comunas_llegar_auto)

Conclusiones

En términos generales, se observa un mayor flujo de movimientos tanto en salidas como en llegadas para las comunas 2, 19 y 17, siendo especialmente notable la frecuencia más alta de llegadas a estos lugares. Por otro lado, resalta la comuna 12, la cual registra un número muy bajo tanto de salidas como de llegadas, lo que posiblemente se deba a su posición central en la ciudad. En relación al tipo de vehículo utilizado para desplazarse, las encuestas indican que la motocicleta es el medio predominante tanto para las salidas como para las llegadas. Nuevamente, se confirma que las comunas 2, 19 y 17 son los principales puntos de actividad para cada tipo de vehículo, destacándose como áreas de mayor movimiento en la ciudad.