Introducción a la estadística espacial

En el presente ejercicio, realizamos una exploración y aplicación inicial de los conceptos de la estadística espacial con el objetivo de resolver e interpretar un problema relacionado con los movimientos que se generan al interior de las diferentes comunas de la ciudad de Cali y fuera del municipio. Para ello, comenzaremos el proceso cargando el dataframe y realizando una exploración inicial de los datos

Carga de datos y análisis inicial

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("readxl")  
    cargar_libreria("sf")      
    cargar_libreria("ggplot2") 
    cargar_libreria("ggtext")  
    cargar_libreria("dplyr")   
    cargar_libreria("plotly")  
    cargar_libreria("patchwork") 
    library(patchwork)
    require(plotly)            
    library(plotly)           
    library(dplyr)            
    library(readxl)           
    library(sf)                
    library(ggplot2)           
    library(ggtext)            
  })
})

Procedemos a caragar el archivo de shapefiles

datos_shape <- st_read("/Users/juan/Downloads/Casos/cali/Comunas.shp")
## Reading layer `Comunas' from data source 
##   `/Users/juan/Downloads/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/juan/Downloads/Casos/EncuestaOrigenDestino.xlsx", sheet = "Sheet4")
## 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`

Luego de cargar los datos, procedemos a generar un dataframe con los datos requeridos para el desarrollo del ejercicio. En ese orden de ideas, se seleccionan las variables: “comuna origen”, “comuna destino”, y “TIPO DE VEHÍCULO”.

# 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 introduced by coercion
Encuesta_filtrada$`comunadestino` <- as.integer(Encuesta_filtrada$`comunadestino`)
## Warning: NAs introduced by coercion
# 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

Con lo anterior obtenemos los datos para realizar el análisis descriptivo que realizamos a continuación.

Estadística descriptiva

Luego de realizar la preparación de los datos, procedemos el análisis con estadistica descriptiva de las variables a considerar. Para ello, en un primer momento comenzamos evaluando las frecuencias que se obtienen de cada variable

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

En la anterior gráfica podemos observar que las mayores comunes de origen donde viven las personas que se desplazan diariamente son 2, 19, 17 y 3. Este primer análisis nos da indicios de cómo se comportaran los datos al momento de graficarlos en el mapa de la ciudad.

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

En relación con los principales destinos de las personas encuestadas se evidencia nuevamente, que la mayor parte de ellas tiene como lugar final de movilización sitios las comunas 2, 3 y 19. Posteriormente se encuentran las comunas 22,17 y 4. Con los datos presentados anteriormente, podemos evidenciar en qué comunas se va a presentar una mayor llegada de personas y movilizaciones al momento de realizar los mapas por cada región analizada.

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

Luego de obtener las frecuencias de bibicletas, motos y automóviles procedemos a graficarlos.

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

on los datos anteriores, podemos observar que el medio de transporte más utilizado son las motos, seguidos de los automóviles y finalmente las bicicletas.

Gráficos generales

Luego de realizar la preparación de los datos, procedemos el análisis con estadistica descriptiva de las variables a considerar. Para ello, en un primer momento comenzamos evaluando las frecuencias que se obtienen de cada variable

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

Ahora procedemos a realizar la selección de las variables de interés para el presente taller

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

Resolución de problemas

Ahora procedemos a solucionar los problemas planteados en el ejercicio

Mapa sobre cantidad de viajes en total

Luego de realizar el primer procedimiento, comenzamos graficando el total de viajes que se realizan con los tres medios de transportes contenidos en la base de datos. En esta primera gráfica solo tendremos en cuenta el total de viajes en cada una de las comunas de la ciudad de Cali.

# 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

Generamos la integración de los mapas

ggplotly(m1_comunas_gral2)

De acuerdo con la anterior gráfica, podemos visualizar que la mayor cantidad de personas que salen de Cali (sin considerar el tipo de transporte) se generan en las comunas 19, 2 y 17. En efecto, los resultados que aquí se encuentran son similares a la estadistica descriptiva que se realizó en un primer momento. En contraste, las comunas con menos salidas son las 12 y 5.

Gráfica general de principales comunas de recepción de viajes

ggplotly(m1_comunas_gral3)

En relación con las principales comunas donde las personas llegan luego del traslado, se evidencia nuevamente que son principalmente las comunas 2, 19, 17 y 22.

Análisis de los traslados considerando el tipo de transporte

Luego de visualizar las comunas donde las personas sales y llegan más (sin considerar el tipo de transporte), procedemos a analizar los mapas de salida y llegada de individuos considerando el tipo de transporte mediante el cual se movilizan. Para ello, debemos realizar el siguiente proceso:

  • En un primer momento, necesitamos realizar un proceso de agrupación de los datos tal y como se describe a continuación
# 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.

Ahora procedemos a renombrar los grupos creados.

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

Ahora procedemos a analizar los mapas de salidas y/o desplazamiento considerando el tipo de vechiculo de las bicicletas.

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)

Al analizar el gráfico de salida por comunas considerando el tipo vehículo bicileta, logramos evidenciar que la mayor frecuencia de salidas se genera en las comunas 2, 19 y 17. Esta información es consistente con el gráfico general de salidas que se presentó previamente.

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)

En relación con la frecuencia de salidas por motos y comunas, nuevamente, evidenciamos que la mayor parte de ellas se generan en las comunas 2, 19 y 17 en contraste con la comuna 12. Este fenómeno se explica porque la mayor parte de las salidas de individuos está concentrado en estas áreas de la ciudad. Otra conclusión a la cual podemos llegar es que el medio de transporte de moto es mucha más frecuente que la bicicleta al considerar que en la comuna 2 se registran 1096 salidas por moto en comparación con las 124 registradas por bicicleta.

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)

Nuevamente, al analizar la frecuencia de salidas por comunas con el tipo de vehículo automovil, podemos evidenciar que estos se concentran en las comunas 19, 2 y 17, en contraste las comunas 12 y 5 son las que registran las menores salidas. Al analizar el número de veces que se utilizó el automóvil para salir de la ciudad, se encontró que el auto es el segunto tipo de vehículo con mayor frecuencia de uso por parte de los individuos por detrás de la motocicleta y por delante de la bicleta.

Luego de analizar los gráficas de salidas y comunas de acuerdo al tipo de vehículo ahora procedemos a analizar las llegadas de personas considerando el tipo de transporte.

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

Procedemos a crear los gráficos

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

En relación con las principales comunas de recepción de personas con el tipo de vehículo de bicileta, se evidencia que la comuna 2 es la principal área de recepción. Sin embargo, también se evidencia que las comunas 3, 19, 17 y 22 también son áreas con alta recepción de personas en este tipo de vehículo.

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

En relación con la llegada de personas a las comunas se evidencia que la comuna 2 es la principal fuente de recepción. De igual manera, se logra reconocer que la comunas 3, 19, 17 y 22 también tienen una alta frecuencia de recepción de personas. Una conclusión importante es que al considerar la frecuencia de salida y de llegada de motocicletas, se logra reconocer que en relación con la llegada existe una mayor dispersión en las diferentes comunas de la ciudad de Cali.

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

Finalmente, en relación a la cantidad de personas que llegan en auto a las diferentes comunas nuevamente se evidencia una concentración en las comunas 2, 19, 17 y 22. Un dato importante es que las frecuencias de llegada en auto se concentran principalmente en la comuna 2, mientras que en la de salidas, se concentraban en la comuna 19.

Conclusiones

El análisis sobre los desplazamientos en la ciudad de Cali, evidencian que el flujo de llegadas y salidas entre las diferentes comunas son similares, sin embargo, se reconoce que la frecuencia de personas que llegan a la ciudad de Cali es mayor que la sale de la ciudad. Lo anterior, se puede explicar al reconocer que muchas personas en municipios aledaños pueden desplazarse a la ciudad de Cali por motivos laborales o educativos, lo cual genera que existan mayor cantidad de personas que ingresan al municipio.

De igual manera, es importante reconocer que las comunas donde se evidencian la mayor parte de los desplazamientos en el Municipio de Cali se concentran en las comunas 2, 19, 17 y 22. Sin embargo, es importante reconocer e identificar algunas tendencias particulares. Por ejemplo, en términos de salidas, las comunas donde se evidencian las mayores frecuencias son 2, 19 y 17; en contraste, en el ingreso o comuna de destino se evidencia una mayor dispersión de datos, ya que, se reconoce que las comunas 2, 19, 17 y 22 son los principales receptores de personas. Una posible explicación del incremento de personas que llegan a la comuna 22 puede ser porque en está área se concentran algunas universidad de la ciudad de Cali.

Finalmente, en relación al tipo de vehículo, se evidenció que la mayor parte de la población se desplaza en motocicleta, seguida del auto y finalmente la bicleta.