El presente estudio se enfoca en analizar la distribución espacial de eventos reportados en la plataforma Waze en la ciudad de Chia, Colombia el 27 de septiembre de 2024. Esta plataforma de navegación colaborativa proporciona datos sobre las condiciones del tráfico en tiempo real, incluyendo reportes de peligros, congestión, accidentes y cierres de vía, de suma importancia para mejorar la movilidad y seguridad vial. En el desarrollo del ejercicio, se evaluarán y visualizarán los eventos en diferentes mapas interactivo, analizando patrones temporales y espaciales. De igual forma, se utilizarán paquetes y herramientas para visualizar la densidad y distribución de puntos, con mapas de calor que resalten las áreas con mayor incidencia de eventos.
Se consolida los paquetes de librerías a utilizar para el desarrollo del ejercicio.
require(readxl)
require(lubridate)
require(dplyr)
require(ggplot2)
require(mapview)
require(leaflet)
require(sf)
require(raster)
require(sp)
require(spatstat)
require(terra)
require(knitr)
require(kableExtra)
require(leaflet.extras)
require(leaflet.extras2)
La primera etapa consiste en la carga y limpieza de los datos. Se utiliza la librería readxl para cargar el archivo de Excel, y la librería lubridate para procesar y estandarizar los datos temporales. Los datos geográficos, como latitud y longitud, se ajustaron para garantizar su correcta visualización en mapas.
En la carga de la base de datos original se puede observar que cuenta con un total de 5070 registros y 17 variables con información geográfica y espacial, además de atributos destacados como la fecha, el país, el tipo de evento registrado en la aplicación y una subvariable de esta misma.
#Carga de la base de datos
waze_origen = read_excel("C:/Users/gustavo.moreno/OneDrive - PUJ Cali/Desktop/Gustavo 2024/Georef/Actividad_4_WAZE/Trama Waze (1).xlsx")
Al realizar el análisis para las horas, se encuentra que entre las 5 y las 8 pm fue donde más registros de usuarios se realizaron, coincide con al hora pico de la tarde. Llama la atencón que el periodo de 8 y 9 am no hubo registros.
#Cambio del formato de las fechas
waze_origen$fecha = as.Date(waze_origen$creation_Date, format = "%Y-%m-%d %H:%M")
#Convertir la fecha y extraer hora y día
fecha_hora = ymd_hms(waze_origen$creation_Date)
hora = hour(fecha_hora)
dia = day(fecha_hora)
#Agregar las nuevas variables en el DF
waze_origen$hora = hora
waze_origen$dia = dia
# Crear la tabla de frecuencias para la variable "Hora"
tabla_frecuencias_hora = table(waze_origen$hora)
tabla_df_hora = as.data.frame(tabla_frecuencias_hora)
kable(tabla_df_hora,
caption = "<center><b>Frecuencia por hora</b></center>",
col.names = c("Hora", "Frecuencia")) %>%
kable_classic(full_width = F)
| Hora | Frecuencia |
|---|---|
| 0 | 226 |
| 1 | 136 |
| 2 | 139 |
| 3 | 73 |
| 4 | 60 |
| 5 | 6 |
| 6 | 37 |
| 7 | 15 |
| 10 | 52 |
| 11 | 197 |
| 12 | 343 |
| 13 | 278 |
| 14 | 251 |
| 15 | 203 |
| 16 | 270 |
| 17 | 514 |
| 18 | 341 |
| 19 | 391 |
| 20 | 456 |
| 21 | 332 |
| 22 | 376 |
| 23 | 374 |
Al realizar la división de las fechas y horas, nos encontramos que el registro de la base de datos se tomó para 3 días: 26, 27 y 28 de septiembre del 2024.
# Crear la tabla de frecuencias para la variable "Día"
tabla_frecuencias_dia = table(waze_origen$dia)
tabla_df_dia = as.data.frame(tabla_frecuencias_dia)
kable(tabla_df_dia,
caption = "<center><b>Frecuencia por día</b></center>",
col.names = c("Hora", "Frecuencia")) %>%
kable_classic(full_width = F)
| Hora | Frecuencia |
|---|---|
| 26 | 1804 |
| 27 | 2302 |
| 28 | 964 |
Para un mejor entendimiento, se realiza el cambio de nombres de los tipos de eventos en idioma español.
Se puede observar que, en general el mayor número de registros lo tiene el atributo de congestión, seguido de las vias cerradas, algun peligro y por ultimo accidentes reportados para esas fechas.
# Cambiar los nombres de los tipos de eventos a español
waze_origen$tipo_evento = recode(waze_origen$type,
"ACCIDENT" = "ACCIDENTE",
"HAZARD" = "PELIGRO",
"JAM" = "CONGESTIÓN",
"ROAD_CLOSED" = "VÍA CERRADA")
# Crear la tabla de frecuencias para la variable "Evento"
tabla_frecuencias_evento = table(waze_origen$tipo_evento)
tabla_df_evento = as.data.frame(tabla_frecuencias_evento)
kable(tabla_df_evento,
caption = "<center><b>Frecuencia por evento</b></center>",
col.names = c("Tipo Evento", "Frecuencia")) %>%
kable_classic(full_width = F)
| Tipo Evento | Frecuencia |
|---|---|
| ACCIDENTE | 125 |
| CONGESTIÓN | 3205 |
| PELIGRO | 719 |
| VÍA CERRADA | 1021 |
Lo anterior, lo podemos representar mejor en el siguiente gráfico de barras, que muestra la frecuencia de los tipos de evento mencionados: tráfico, riesgos o peligros, accidentes y cierres de vías.
Este análisis es clave para identificar qué eventos son más frecuentes y cuáles requieren mayor atención. Además, proporciona una visión general de las categorías más comunes de eventos reportados por los usuarios y puede influir en la priorización de recursos para la gestión del tráfico. Por lo anterior, se decide en principio visualizar la variable de congestión, realizando un filtro en el día de mayor registros, como lo fue el día 27.
#Distribución del tipo de evento (accidente, congestión, peligro, via cerrada)
# Calcular la frecuencia de cada tipo de evento en Trama_Waze
frecuencia_eventos = waze_origen %>%
group_by(tipo_evento) %>% # Agrupar por tipo de evento
summarise(Frecuencia = n()) %>% # Contar la frecuencia de cada tipo
arrange(desc(Frecuencia)) # Ordenar por frecuencia descendente
# Crear un gráfico de barras con ggplot2
ggplot(frecuencia_eventos, aes(x = tipo_evento, y = Frecuencia, fill = tipo_evento)) +
geom_bar(stat = "identity") +
theme_minimal() +
labs(title = "Distribución de Tipos de Eventos",
x = "Tipo de Evento", y = "Frecuencia") +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
# Eliminar las líneas de la cuadrícula
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()) +
scale_fill_brewer(palette = "Set2")
En esta sección se analiza la congestión reportada para el día 27 de Septiembre, el cual tiene 2302 registros. Se filtran los eventos de congestión para centrarse en los reportes de ese día y se estudia cómo se distribuyen en términos espaciales y temporales.
El análisis de la congestión es vital para la planificación del tráfico en una ciudad, ya que permite identificar las áreas donde el tráfico es más denso y los momentos del día en que se presentan mayores problemas de movilidad. Estos datos pueden ser utilizados para optimizar la programación de semáforos o la gestión de rutas alternas.
#Mapa de TRAFICO O CONGESTIÓN (JAM)
pos1 = which(waze_origen$tipo_evento=="CONGESTIÓN" & dia==27)
jam_27 = waze_origen[pos1,]
#Truco para coordenadas
jam_27$lat = jam_27$location_y/10^(nchar(jam_27$location_y)-1)
jam_27$long = jam_27$location_x/10^(nchar(jam_27$location_x)-3) #porque incluye el negativo
#filtrar solo las coordenadas entre 4 y 5 de latitud
jam_27 = jam_27[jam_27$lat>4&jam_27$lat<5,]
#Gráfico 1
m_jam_27 = leaflet() %>% addTiles() %>% addCircleMarkers(lng = jam_27$long,lat = jam_27$lat, clusterOptions = markerClusterOptions(),label = jam_27$hora) %>%
addControl(html = "<h3>Mapa de Congestión<h3>", position = "topleft")
m_jam_27
Utilizando leaflet, se visualizan los puntos de congestión en un mapa geográfico, donde los usuarios pueden interactuar con los marcadores para obtener más detalles sobre los eventos.
Este mapa es útil para explorar visualmente las áreas de la ciudad más afectadas por el tráfico, proporcionando información valiosa para los planificadores urbanos y las autoridades encargadas de la gestión del tráfico.
De igual forma, un gráfico con la librería mapview permite observar las zonas horarias con mayor afectación y reporte de la congestión.
#Ejercicio para mapview
jam_27_spatial = SpatialPointsDataFrame(
coords = as.data.frame(jam_27)[, 23:22], # Convertir a data.frame y seleccionar las columnas de coordenadas
data = as.data.frame(jam_27), # Convertir a data.frame para los datos
proj4string = CRS("+proj=longlat +datum=WGS84 +no_defs")
)
mapview(jam_27_spatial, zcol="hora")
Al utilizar herramientas como spatstat y terra, podemos estudiar la distribución geográfica de estos eventos y entender si hay patrones de congestión que se repiten en ciertas áreas.
Este tipo de análisis es importante para identificar las zonas más congestionadas de la ciudad, lo que puede ayudar a las autoridades a tomar decisiones sobre mejoras en la infraestructura o cambios en las rutas de tráfico para aliviar la congestión.
# Definir la zona de interés
zona = owin(xrange = c(-74.04331, -73.9929), yrange = c(4.885736, 4.948562))
# Crear un patrón de puntos espaciales a partir de los eventos CONGESTIÓN
patron_congestion <- ppp(x = jam_27$long, y = jam_27$lat, window = zona)
# Visualizar el patrón de puntos
par(mfrow = c(1, 1)) # Asegurarse de que solo haya una gráfica
# Graficar el test de cuadrantes
plot(quadratcount(patron_congestion), main = "Patrón de Puntos y Test de Cuadrantes")
# Superponer los puntos sobre los cuadrantes
points(patron_congestion, col = "red")
De acuerdo con la Función K, se puede clasificar el patrón como agregado o clusterizado.
# Calcular la función K-estimación
plot(Kest(patron_congestion))
A continuación, se genera un mapa de densidad basado en los eventos de congestión. Este mapa resalta las áreas con mayor densidad de tráfico, proporcionando una visualización clara de los puntos críticos de congestión en la ciudad.
El mapa de densidad es una herramienta útil para los planificadores urbanos y las autoridades de tránsito, ya que permite visualizar los focos de tráfico más problemáticos y evaluar posibles soluciones para mejorar la fluidez del tránsito.
# Calcular la densidad espacial del patrón de puntos
im1 <- density(patron_congestion)
# Convertir la densidad en un raster utilizando terra
mapa_congestion = rast(im1)
# Convertir el objeto raster a un data.frame para usarlo en leaflet
df_congestion = as.data.frame(mapa_congestion, xy = TRUE)
colnames(df_congestion) = c("long", "lat", "intensity")
# Normalizar los valores de intensidad entre 0 y 1
df_congestion$intensity = (df_congestion$intensity - min(df_congestion$intensity)) /
(max(df_congestion$intensity) - min(df_congestion$intensity))
# Crear un mapa interactivo usando leaflet
leaflet(df_congestion) %>%
addProviderTiles("OpenStreetMap") %>% # Añadir la capa base
addHeatmap(
lng = ~long, lat = ~lat, # Coordenadas de longitud y latitud
intensity = ~intensity, # Intensidad normalizada
blur = 35, # Incrementar el desenfoque para suavizar el mapa
max = max(df_congestion$intensity) * 2, # Ajustar el valor máximo de intensidad
radius = 25 # Aumentar el radio para que se vea más suave
) %>%
addLegend("bottomright", # Añadir la leyenda para interpretar el mapa de calor
title = "Mapa de Calor de Congestión",
colors = c("blue", "green", "yellow", "red"),
labels = c("Bajo", "Moderado", "Alto", "Muy Alto"))
En esta sección se genera un mapa de densidad basado en la distribución espacial de los eventos de cierre de vías reportados el día 27. El objetivo de este análisis es identificar las zonas más afectadas por los cierres de vías, lo que puede ayudar en la planificación de desvíos y la optimización de la movilidad urbana.
El mapa de densidad resalta las áreas con mayor número de cierres de vías, proporcionando una visualización clara de las zonas de mayor impacto. Esta información es crucial para que las autoridades tomen decisiones informadas sobre cómo gestionar el tráfico en estas áreas.
#Realizamos un filtro para el día 27, que tiene 2302 registros, y para este análisis
#se incluirá el tipo de evento Road Close o Calle cerrada.
pos2 = which(waze_origen$tipo_evento=="VÍA CERRADA" & dia==27)
closed_27 = waze_origen[pos2,]
#Truco de ajuste para coordenadas
closed_27$lat = closed_27$location_y/10^(nchar(closed_27$location_y)-1)
closed_27$long = closed_27$location_x/10^(nchar(closed_27$location_x)-3) #incluye el negativo
#filtrar solo las coordenadas en el rango geográfico adecuado
closed_27 = closed_27[closed_27$lat>4&closed_27$lat<5,]
#Grafico con leaflet
m_closed_27 = leaflet() %>% addTiles() %>% addCircleMarkers(lng = closed_27$long,lat = closed_27$lat, clusterOptions = markerClusterOptions(),label = closed_27$hora) %>%
addControl(html = "<h3>Mapa Cierre de Vías<h3>", position = "topleft")
m_closed_27
Con el gráfico de mapview, podemos observar que la mayoria de los reportes se realizaron a las 5am, y unos cuantos en la tarde.
#Ejercicio para mapview
closed_27_spatial = SpatialPointsDataFrame(
coords = as.data.frame(closed_27)[, 23:22], # Convertir a data.frame y seleccionar las columnas de coordenadas
data = as.data.frame(closed_27), # Convertir a data.frame para los datos
proj4string = CRS("+proj=longlat +datum=WGS84 +no_defs")
)
mapview(closed_27_spatial, zcol="hora")
Esta sección está dedicada al análisis espacial de los cierres de vías utilizando herramientas como spatstat y terra. El objetivo es estudiar cómo están distribuidos geográficamente los eventos de cierre de vías reportados el día 27 y analizar si existen patrones en la concentración de estos eventos.
Este tipo de análisis ayuda a entender la extensión geográfica de los cierres de vías, lo que puede ser útil para identificar áreas críticas que podrían necesitar intervenciones inmediatas o planificación a largo plazo.
# Crear un patrón de puntos espaciales a partir de los eventos VÍA CERRADA
patron_via_cerrada = ppp(x = closed_27$long, y = closed_27$lat, window = zona)
# Gráfico combinado: Test de Cuadrantes y Patrón de Puntos
par(mfrow = c(1, 1)) # Asegurarse de que solo haya una gráfica
# Graficar el test de cuadrantes
plot(quadratcount(patron_via_cerrada), main = "Patrón de Puntos y Test de Cuadrantes")
points(patron_via_cerrada, col = "red" ) # Superponer los puntos sobre los cuadrantes
La prueba de Función K, arroja igualmente un patrón clusterizado.
# Calcular la función K-estimación
plot(Kest(patron_via_cerrada))
A continuación, se genera un segundo mapa de densidad basado en los eventos de cierre de vías, pero con un enfoque más detallado en las áreas de mayor afectación. Este mapa destaca las zonas con la mayor cantidad de eventos de cierre de vías, permitiendo identificar áreas donde los cierres de vías son más frecuentes.
El uso de este mapa es clave para comprender la severidad de los cierres de vías en ciertas áreas de la ciudad y cómo pueden afectar la movilidad en general.
###Mapa de densidad de Vía Cerrada
# Calcular la densidad espacial
im2 = density(patron_via_cerrada)
# Convertir la densidad a un objeto raster usando terra
mapa_closed = rast(im2)
# Convertir el raster a data.frame para leaflet
df_closed = as.data.frame(mapa_closed, xy = TRUE)
colnames(df_closed) = c("long", "lat", "intensity")
# Normalizar los valores de intensidad entre 0 y 1
df_closed$intensity = (df_closed$intensity - min(df_closed$intensity)) /
(max(df_closed$intensity) - min(df_closed$intensity))
#Analisis espacial distribución de riesgos
# Crear un mapa interactivo con leaflet y addHeatmap
leaflet(df_closed) %>%
addProviderTiles("OpenStreetMap") %>% # Añadir la capa base
addHeatmap(
lng = ~long, lat = ~lat, # Coordenadas de longitud y latitud
intensity = ~intensity, # Intensidad normalizada
blur = 35, # Incrementar el desenfoque para suavizar el mapa
max = max(df_closed$intensity) * 2, # Ajustar el valor máximo de intensidad
radius = 25 # Aumentar el radio para que se vea más suave
) %>%
addLegend("bottomright", # Añadir la leyenda para interpretar el mapa de calor
title = "Mapa de Calor de Congestión",
colors = c("blue", "green", "yellow", "red"),
labels = c("Bajo", "Moderado", "Alto", "Muy Alto"))
En este apartado, se filtran los eventos de tipo peligrosos o riesgoso que ocurrieron específicamente el día 27. El propósito es reducir el volumen de datos y centrarse en los eventos de riesgo, lo que permite un análisis más profundo y detallado de estos incidentes.
Este filtrado es esencial para poder focalizar el análisis en los eventos que realmente presentan peligros potenciales en las vías, facilitando así la identificación de las áreas más críticas.
#Realizamos un filtro para el día 27, que tiene 2302 registros,
#además de incluir el tipo RIESGO O PELIGRO.
pos3 = which(waze_origen$type=="HAZARD" & dia==27)
hazard_27 = waze_origen[pos3,]
#Truco para coordenadas
hazard_27$lat = hazard_27$location_y/10^(nchar(hazard_27$location_y)-1)
hazard_27$long = hazard_27$location_x/10^(nchar(hazard_27$location_x)-3) #porque incluye el negativo
#filtrar solo las coordenadas entre 4 y 5 de latitud
hazard_27 = hazard_27[hazard_27$lat>4&hazard_27$lat<5,]
#Gráfico
m_hazard_27 = leaflet() %>% addTiles() %>% addCircleMarkers(lng = hazard_27$long,lat = hazard_27$lat, clusterOptions = markerClusterOptions(),label = hazard_27$hora) %>%
addControl(html = "<h3>Mapa Riesgos<h3>", position = "topleft")
m_hazard_27
Una vez filtrados los eventos Peligro, se procede a visualizarlos en un mapa interactivo utilizando la librería leaflet. Este mapa permite explorar las ubicaciones exactas de los peligros reportados, representando los eventos sobre un mapa geográfico y agrupándolos en clusters para mejorar la legibilidad.
Los usuarios pueden interactuar con el mapa, lo que facilita la identificación visual de los puntos con mayor concentración de eventos y ayuda a identificar patrones espaciales en la distribución de peligros.
hazard_27_spatial = SpatialPointsDataFrame(
coords = as.data.frame(hazard_27)[, 23:22], # Convertir a data.frame y seleccionar las columnas de coordenadas
data = as.data.frame(hazard_27), # Convertir a data.frame para los datos
proj4string = CRS("+proj=longlat +datum=WGS84 +no_defs")
)
mapview(hazard_27_spatial, zcol="hora")
# Crear un patrón de puntos espaciales a partir de los eventos CONGESTIÓN
patron_riesgo = ppp(x = hazard_27$long, y = hazard_27$lat, window = zona)
# Visualizar el patrón de puntos
par(mfrow = c(1, 1)) # Asegurarse de que solo haya una gráfica
# Graficar el test de cuadrantes
plot(quadratcount(patron_riesgo), main = "Patrón de Puntos y Test de Cuadrantes")
# Superponer los puntos sobre los cuadrantes
points(patron_riesgo, col = "red")
El patrón para este atributo, nuevamente se registra como agregado o clusterizado.
# Calcular la función K-estimación
plot(Kest(patron_riesgo))
En esta sección, se realiza un análisis espacial de los eventos de peligro del día 27 utilizando herramientas avanzadas como spatstat y terra. El objetivo es estudiar la distribución geográfica de los eventos de riesgo y generar mapas de calor que destaquen las áreas más afectadas.
Este tipo de análisis espacial es crucial para identificar patrones de concentración de eventos y zonas de alto riesgo, lo que puede ser útil para la toma de decisiones en la gestión de tráfico y la planificación urbana.
# Calcular la densidad espacial del patrón de puntos
im3 = density(patron_riesgo)
# Convertir la densidad en un raster utilizando terra
mapa_riesgo = rast(im3)
# Convertir el objeto raster a un data.frame para usarlo en leaflet
df_riesgo <- as.data.frame(mapa_riesgo, xy = TRUE)
colnames(df_riesgo) = c("long", "lat", "intensity")
# Normalizar los valores de intensidad entre 0 y 1
df_riesgo$intensity = (df_riesgo$intensity - min(df_riesgo$intensity)) /
(max(df_riesgo$intensity) - min(df_riesgo$intensity))
# Crear un mapa interactivo usando leaflet
leaflet(df_riesgo) %>%
addProviderTiles("OpenStreetMap") %>% # Añadir la capa base
addHeatmap(
lng = ~long, lat = ~lat, # Coordenadas de longitud y latitud
intensity = ~intensity, # Intensidad normalizada
blur = 35, # Incrementar el desenfoque para suavizar el mapa
max = max(df_congestion$intensity) * 2, # Ajustar el valor máximo de intensidad
radius = 25 # Aumentar el radio para que se vea más suave
) %>%
addLegend("bottomright", # Añadir la leyenda para interpretar el mapa de calor
title = "Mapa de Calor de Congestión",
colors = c("blue", "green", "yellow", "red"),
labels = c("Bajo", "Moderado", "Alto", "Muy Alto"))
En esta sección se realiza un análisis detallado de los eventos de accidentes ocurridos el día 27. Se filtran estos eventos para enfocarse exclusivamente en los accidentes reportados en esa fecha, con el objetivo de entender mejor su distribución espacial y su impacto en la movilidad.
El análisis de accidentes es crucial para identificar áreas peligrosas y planificar medidas de seguridad vial, como la instalación de señalización adicional o la mejora de la infraestructura vial en zonas críticas.
#Mapa de ACCIDENTES
pos4 = which(waze_origen$tipo_evento=="ACCIDENTE" & dia==27)
Accident_27 = waze_origen[pos4,]
#Truco para coordenadas
Accident_27$lat = Accident_27$location_y/10^(nchar(Accident_27$location_y)-1)
Accident_27$long = Accident_27$location_x/10^(nchar(Accident_27$location_x)-3) #porque incluye el negativo
#filtrar solo las coordenadas entre 4 y 5 de latitud
Accident_27 = Accident_27[Accident_27$lat>4&Accident_27$lat<5,]
m_Accident_27 = leaflet() %>% addTiles() %>% addCircleMarkers(lng = Accident_27$long,lat = Accident_27$lat, clusterOptions = markerClusterOptions(),label = Accident_27$hora) %>%
addControl(html = "<h3>Mapa Accidentes<h3>", position = "topleft")
m_Accident_27
Aquí se presenta un mapa interactivo que muestra los eventos de accidentes del día 27. Al igual que en los mapas anteriores, se utiliza leaflet para visualizar los puntos donde ocurrieron accidentes, permitiendo a los usuarios hacer clic en los marcadores para obtener más detalles sobre cada incidente.
El mapa interactivo proporciona una herramienta visual para entender la distribución espacial de los accidentes, facilitando la identificación de zonas donde se concentran más incidentes y donde podrían implementarse mejoras para la seguridad vial.
Accident_27_spatial = SpatialPointsDataFrame(
coords = as.data.frame(Accident_27)[, 23:22], # Convertir a data.frame y seleccionar las columnas de coordenadas
data = as.data.frame(Accident_27), # Convertir a data.frame para los datos
proj4string = CRS("+proj=longlat +datum=WGS84 +no_defs")
)
mapview(Accident_27_spatial, zcol="hora")
En esta sección se realiza un análisis espacial de los accidentes ocurridos el día 27 utilizando las herramientas spatstat y terra. El objetivo es estudiar cómo se distribuyen geográficamente los accidentes y si hay patrones espaciales en su ocurrencia.
Este análisis es importante para identificar áreas donde los accidentes son más frecuentes y así planificar estrategias de mitigación, como mejorar la señalización o realizar cambios en la infraestructura para reducir la probabilidad de accidentes en esas zonas.
# Crear un patrón de puntos espaciales a partir de los eventos ACCIDENTE
patron_accidente = ppp(x = Accident_27$long, y = Accident_27$lat, window = zona)
# Gráfico combinado: Test de Cuadrantes y Patrón de Puntos
par(mfrow = c(1, 1)) # Asegurarse de que solo haya una gráfica
# Graficar el test de cuadrantes
plot(quadratcount(patron_accidente), main = "Patrón de Puntos y Test de Cuadrantes")
points(patron_accidente, col = "red" ) # Superponer los puntos sobre los cuadrantes
# Calcular la función K-estimación
plot(Kest(patron_accidente))
En esta sección, se genera un mapa de densidad basado en la distribución de los accidentes (ACCIDENTE) ocurridos el día 27. Este mapa resalta las áreas con mayor concentración de accidentes, lo que puede ayudar a identificar zonas de alto riesgo en la ciudad.
El uso de mapas de densidad en el análisis de accidentes es crucial para visualizar las áreas más afectadas y planificar intervenciones que mejoren la seguridad vial. Este tipo de visualización permite observar patrones espaciales que pueden no ser evidentes a través de simples tablas de datos.
###Mapa de densidad de accidentes
# Calcular la densidad espacial
im4 = density(patron_accidente)
# Convertir la densidad a un objeto raster usando terra
mapa_accidente = rast(im4)
# Convertir el raster a data.frame para leaflet
df_accidente = as.data.frame(mapa_accidente, xy = TRUE)
colnames(df_accidente) = c("long", "lat", "intensity")
# Normalizar los valores de intensidad entre 0 y 1
df_accidente$intensity = (df_accidente$intensity - min(df_accidente$intensity)) /
(max(df_accidente$intensity) - min(df_accidente$intensity))
# Crear un mapa interactivo usando leaflet
leaflet(df_accidente) %>%
addProviderTiles("OpenStreetMap") %>% # Añadir la capa base
addHeatmap(
lng = ~long, lat = ~lat, # Coordenadas de longitud y latitud
intensity = ~intensity, # Intensidad normalizada
blur = 15, # Nivel de desenfoque
max = 0.5, # Valor máximo de la intensidad normalizada
radius = 10 # Ajustar el radio de los puntos
) %>%
addLegend("bottomright", # Añadir la leyenda para interpretar el mapa de calor
title = "Mapa de Calor de Accidentes",
colors = c("blue", "green", "yellow", "red"),
labels = c("Bajo", "Moderado", "Alto", "Muy Alto"))
En esta última sección, se consolidan los mapas interactivos creados previamente para mostrar los eventos de peligros, accidentes, congestión y cierres de vías en una sola vista. Esta consolidación facilita la comparación de los diferentes tipos de eventos en una sola interfaz.
La sincronización de estos mapas permite a los usuarios visualizar todos los eventos importantes en un mismo espacio geográfico, lo que es útil para obtener una visión global de los problemas de tráfico y riesgos en la ciudad, y para la planificación de soluciones integrales que aborden múltiples tipos de eventos de manera coordinada.
#RESULTADOS FINALES
#Union de los mapas por evento
leafsync::sync(m_closed_27, m_Accident_27, m_hazard_27, m_jam_27)
De igual forma, se visualiza un comparativo de la variable Congestión [JAM] en relación al subtipo del evento registrado y la hora.
#Gráfico comparativo deslizante de la variable CONGESTIÓN JAM
m1=mapview(jam_27_spatial,zcol="subtype")
m2=mapview(jam_27_spatial,zcol="hora")
m1|m2
El análisis realizado sobre los datos proporcionados por Waze para el día 27 permite obtener una visión integral de los eventos que afectan la movilidad urbana, como peligros en las vías, congestión, accidentes y cierres de vías. A través de la utilización de herramientas de análisis espacial y la visualización en mapas interactivos, se han identificado patrones importantes en la distribución espacial y temporal de estos eventos. Además, ha revelado una imagen detallada de los desafíos que enfrenta la movilidad urbana en la ciudad. La identificación de zonas críticas, la comprensión de los patrones de congestión y la evaluación de los riesgos en las vías proporcionan una base sólida para la toma de decisiones informadas.
En conclusión, el análisis de los datos de Waze representa un primer paso hacia una gestión del tráfico más inteligente y eficiente. Al integrar estos datos con otras fuentes de información y al involucrar a todos los actores involucrados, podemos construir ciudades más seguras, más sostenibles y con una mejor calidad de vida para sus habitantes.