library(readxl) # readxl: Para la carga de datos desde archivos Excel.
## Warning: package 'readxl' was built under R version 4.3.3
library(dplyr) # dplyr: Para la manipulación y transformación de datos.
## Warning: package 'dplyr' was built under R version 4.3.3
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(lubridate) # lubridate: Para el manejo y procesamiento de fechas y tiempos.
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
library(leaflet) # leaflet: Para la creación de mapas interactivos.
## Warning: package 'leaflet' was built under R version 4.3.3
library(sf) # sf: Para trabajar con datos geoespaciales.
## Warning: package 'sf' was built under R version 4.3.3
## Linking to GEOS 3.11.2, GDAL 3.8.2, PROJ 9.3.1; sf_use_s2() is TRUE
library(mapview) # mapview: Para la visualización interactiva de mapas.
## Warning: package 'mapview' was built under R version 4.3.3
library(spatstat) # spatstat: Para el análisis de patrones espaciales y análisis de densidad.
## Warning: package 'spatstat' was built under R version 4.3.3
## Loading required package: spatstat.data
## Warning: package 'spatstat.data' was built under R version 4.3.3
## Loading required package: spatstat.univar
## Warning: package 'spatstat.univar' was built under R version 4.3.3
## spatstat.univar 3.1-1
## Loading required package: spatstat.geom
## Warning: package 'spatstat.geom' was built under R version 4.3.3
## spatstat.geom 3.3-4
## Loading required package: spatstat.random
## Warning: package 'spatstat.random' was built under R version 4.3.3
## spatstat.random 3.3-2
## Loading required package: spatstat.explore
## Warning: package 'spatstat.explore' was built under R version 4.3.3
## Loading required package: nlme
##
## Attaching package: 'nlme'
## The following object is masked from 'package:dplyr':
##
## collapse
## spatstat.explore 3.3-3
## Loading required package: spatstat.model
## Warning: package 'spatstat.model' was built under R version 4.3.3
## Loading required package: rpart
## spatstat.model 3.3-3
## Loading required package: spatstat.linnet
## Warning: package 'spatstat.linnet' was built under R version 4.3.3
## spatstat.linnet 3.2-3
##
## spatstat 3.3-0
## For an introduction to spatstat, type 'beginner'
library(terra) # terra: Para el manejo de datos raster y análisis espacial.
## terra 1.7.71
##
## Attaching package: 'terra'
## The following objects are masked from 'package:spatstat.geom':
##
## area, delaunay, is.empty, rescale, rotate, shift, where.max,
## where.min
library(leaflet.extras) # leaflet.extras: Para añadir funciones adicionales a los mapas de leaflet
## Warning: package 'leaflet.extras' was built under R version 4.3.3
library(ggplot2) # ggplot2: Para la creación de gráficos y visualizaciones.
## Warning: package 'ggplot2' was built under R version 4.3.3
library(leafsync) # leafsync: Para la sincronización de múltiples mapas interactivos.
## Warning: package 'leafsync' was built under R version 4.3.3
Trama_Waze = read_excel("C:/Users/Daniel Restrepo/Desktop/TramaWaze.xlsx")
## Warning: Expecting numeric in O3 / R3C15: got a date
## Warning: Expecting numeric in O6 / R6C15: got a date
## Warning: Expecting numeric in O9 / R9C15: got a date
## Warning: Expecting numeric in O12 / R12C15: got a date
## Warning: Expecting numeric in O15 / R15C15: got a date
## Warning: Expecting numeric in O18 / R18C15: got a date
## Warning: Expecting numeric in O21 / R21C15: got a date
## Warning: Expecting numeric in O24 / R24C15: got a date
## Warning: Expecting numeric in O27 / R27C15: got a date
## Warning: Expecting numeric in O29 / R29C15: got a date
## Warning: Expecting numeric in O31 / R31C15: got a date
## Warning: Expecting numeric in O33 / R33C15: got a date
## Warning: Expecting numeric in O34 / R34C15: got a date
## Warning: Expecting numeric in O35 / R35C15: got a date
## Warning: Expecting numeric in O36 / R36C15: got a date
## Warning: Expecting numeric in O37 / R37C15: got a date
## Warning: Expecting numeric in O38 / R38C15: got a date
## Warning: Expecting numeric in O336 / R336C15: got a date
## Warning: Expecting numeric in O341 / R341C15: got a date
## Warning: Expecting numeric in O346 / R346C15: got a date
## Warning: Expecting numeric in O385 / R385C15: got a date
## Warning: Expecting numeric in O390 / R390C15: got a date
## Warning: Expecting numeric in O395 / R395C15: got a date
## Warning: Expecting numeric in O400 / R400C15: got a date
## Warning: Expecting numeric in O405 / R405C15: got a date
## Warning: Expecting numeric in O672 / R672C15: got a date
## Warning: Expecting numeric in O676 / R676C15: got a date
## Warning: Expecting numeric in O679 / R679C15: got a date
## Warning: Expecting numeric in O682 / R682C15: got a date
## Warning: Expecting numeric in O685 / R685C15: got a date
## Warning: Expecting numeric in O688 / R688C15: got a date
## Warning: Expecting numeric in O691 / R691C15: got a date
## Warning: Expecting numeric in O694 / R694C15: got a date
## Warning: Expecting numeric in O698 / R698C15: got a date
## Warning: Expecting numeric in O702 / R702C15: got a date
## Warning: Expecting numeric in O707 / R707C15: got a date
## Warning: Expecting numeric in O713 / R713C15: got a date
## Warning: Expecting numeric in O719 / R719C15: got a date
## Warning: Expecting numeric in O728 / R728C15: got a date
## Warning: Expecting numeric in O731 / R731C15: got a date
## Warning: Expecting numeric in O737 / R737C15: got a date
## Warning: Expecting numeric in O1271 / R1271C15: got a date
## Warning: Expecting numeric in O1278 / R1278C15: got a date
## Warning: Expecting numeric in O1285 / R1285C15: got a date
## Warning: Expecting numeric in O1292 / R1292C15: got a date
## Warning: Expecting numeric in O1298 / R1298C15: got a date
## Warning: Expecting numeric in O1304 / R1304C15: got a date
## Warning: Expecting numeric in O1309 / R1309C15: got a date
## Warning: Expecting numeric in O1314 / R1314C15: got a date
## Warning: Expecting numeric in O1319 / R1319C15: got a date
## Warning: Expecting numeric in O1324 / R1324C15: got a date
## Warning: Expecting numeric in O1330 / R1330C15: got a date
## Warning: Expecting numeric in O1336 / R1336C15: got a date
## Warning: Expecting numeric in O1342 / R1342C15: got a date
## Warning: Expecting numeric in O1348 / R1348C15: got a date
## Warning: Expecting numeric in O1354 / R1354C15: got a date
## Warning: Expecting numeric in O1361 / R1361C15: got a date
## Warning: Expecting numeric in O3268 / R3268C15: got a date
## Warning: Expecting numeric in O3281 / R3281C15: got a date
## Warning: Expecting numeric in O3296 / R3296C15: got a date
## Warning: Expecting numeric in O3309 / R3309C15: got a date
## Warning: Expecting numeric in O3323 / R3323C15: got a date
## Warning: Expecting numeric in O3337 / R3337C15: got a date
## Warning: Expecting numeric in O3350 / R3350C15: got a date
## Warning: Expecting numeric in O3364 / R3364C15: got a date
## Warning: Expecting numeric in O3374 / R3374C15: got a date
## Warning: Expecting numeric in O3384 / R3384C15: got a date
## Warning: Expecting numeric in O3396 / R3396C15: got a date
## Warning: Expecting numeric in O3409 / R3409C15: got a date
## Warning: Expecting numeric in O3426 / R3426C15: got a date
## Warning: Expecting numeric in O3433 / R3433C15: got a date
## Warning: Expecting numeric in O3444 / R3444C15: got a date
## Warning: Expecting numeric in O3455 / R3455C15: got a date
## Warning: Expecting numeric in O3466 / R3466C15: got a date
# Convertir la columna de fechas a formato adecuado
Trama_Waze$fecha = as.Date(Trama_Waze$creation_Date, format ="%Y-%m-%d %H:%M")
# Cambiar los nombres de los tipos de eventos a español
Trama_Waze$tipo_evento <- recode(Trama_Waze$type,
"ACCIDENT" = "ACCIDENTE",
"HAZARD" = "PELIGRO",
"JAM" = "CONGESTIÓN",
"ROAD_CLOSED" = "VÍA CERRADA")
# Cargar la librería lubridate
library(lubridate)
# Convertir la fecha y extraer la hora y el día
fecha_hora = ymd_hms(Trama_Waze$creation_Date)
hora = hour(fecha_hora)
dia = day(fecha_hora)
# Agregar la columna de hora a los datos
Trama_Waze$hora = hora
# Mostrar la tabla de frecuencia de tipos de eventos
table(Trama_Waze$tipo_evento)
##
## ACCIDENTE CONGESTIÓN PELIGRO VÍA CERRADA
## 125 3205 719 1021
# Calcular la frecuencia de cada tipo de evento en Trama_Waze
frecuencia_eventos <- Trama_Waze %>%
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 usando los datos de Trama_Waze
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 en Trama Waze",
x = "Tipo de Evento", y = "Frecuencia") +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) + # Rotar etiquetas para mejor visualización
scale_fill_brewer(palette = "Set2") # Utilizar una paleta de colores predefinida
# Identificar eventos PELIGRO del día 26
pos <- which(Trama_Waze$tipo_evento == "PELIGRO" & dia == 26)
peligro26 <- Trama_Waze[pos,]
# Cargar librerías necesarias para visualización
library(mapview)
library(leaflet)
# Ajustar las coordenadas de latitud y longitud
peligro26$lat <- peligro26$location_y / 10^(nchar(peligro26$location_y) - 1)
peligro26$long <- peligro26$location_x / 10^(nchar(peligro26$location_x) - 3)
# Filtrar eventos dentro del rango geográfico adecuado
peligro26 <- peligro26[peligro26$lat > 4 & peligro26$lat < 5,]
# Crear un mapa interactivo con leaflet
m26_peligro <- leaflet() %>%
addTiles() %>%
addCircleMarkers(lng = peligro26$long, lat = peligro26$lat,
clusterOptions = markerClusterOptions(),
label = peligro26$hora) %>%
addControl(html = "<h3>Mapa de Riesgos</h3>", position = "topleft")
# Mostrar el mapa
m26_peligro
library(leaflet.extras)
# Cargar las librerías necesarias
library(leaflet)
library(dplyr)
library(leaflet.extras)
# Filtrar datos relevantes de peligro26
peligro26 <- peligro26 %>%
filter(lat > 4 & lat < 5, long > -75 & long < -73) # Ajustar las coordenadas de interés
# Crear un mapa interactivo con leaflet y addHeatmap
leaflet(peligro26) %>%
addProviderTiles("OpenStreetMap") %>% # Añadir la capa base del mapa
addHeatmap(
lng = ~long, lat = ~lat, # Especificar las columnas de longitud y latitud
intensity = ~hora, # Intensidad opcional basada en la hora (o cualquier otra variable)
blur = 20, # Nivel de desenfoque del mapa de calor
max = 0.08, # Ajustar el valor máximo para la intensidad
radius = 15 # Radio de cada punto en el mapa de calor
) %>%
addLegend("bottomright", # Añadir leyenda
title = "Mapa de Calor de Riesgos",
colors = c("blue", "green", "yellow", "red"),
labels = c("Bajo", "Moderado", "Alto", "Muy Alto"))
# Filtrar eventos VÍA CERRADA del día 26
pos <- which(Trama_Waze$tipo_evento == "VÍA CERRADA" & dia == 26)
via_cerrada_26 <- Trama_Waze[pos,]
# Ajustar las coordenadas de latitud y longitud
via_cerrada_26$lat <- via_cerrada_26$location_y / 10^(nchar(via_cerrada_26$location_y) - 1)
via_cerrada_26$long <- via_cerrada_26$location_x / 10^(nchar(via_cerrada_26$location_x) - 3)
# Filtrar eventos dentro del rango geográfico adecuado
via_cerrada_26 <- via_cerrada_26[via_cerrada_26$lat > 4 & via_cerrada_26$lat < 5,]
# Cargar librería leaflet
require(leaflet)
# Crear el mapa interactivo
m26_via_cerrada = leaflet(via_cerrada_26) %>%
addTiles() %>%
addCircleMarkers(lng = ~long, lat = ~lat,
clusterOptions = markerClusterOptions(),
label = ~hora) %>%
addControl(html = "<h3>Mapa de Cierre de Vías<h3>", position = "topleft")
# Mostrar el mapa interactivo
m26_via_cerrada
install.packages("spatstat")
## Warning: package 'spatstat' is in use and will not be installed
library(spatstat)
library(leaflet.extras)
# Cargar las librerías necesarias
library(spatstat)
# 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 VÍA CERRADA
patron_via_cerrada <- ppp(x = via_cerrada_26$long, y = via_cerrada_26$lat, window = zona)
## Warning: data contain duplicated points
# Graficar el test de cuadrantes
plot(quadratcount(patron_via_cerrada), main = "Patrón de Puntos y Test de Cuadrantes")
# Superponer los puntos sobre los cuadrantes
points(patron_via_cerrada, col = "red")
# Gráfico independiente: Función K-Estimación
plot(Kest(patron_via_cerrada), main = "Función K-Estimación")
# Cargar las librerías necesarias
library(terra)
library(leaflet)
library(spatstat)
# Asegurarse de que el objeto patron_via_cerrada esté correctamente definido
# Crear un patrón de puntos espaciales utilizando los datos correctos (via_cerrada_26)
zona <- owin(xrange = c(-74.04331, -73.9929), yrange = c(4.885736, 4.948562))
patron_via_cerrada <- ppp(x = via_cerrada_26$long, y = via_cerrada_26$lat, window = zona)
## Warning: data contain duplicated points
# Calcular la densidad espacial
im1 <- density(patron_via_cerrada, sigma = 0.01) # Ajusta sigma según sea necesario
# Convertir la densidad a un objeto raster usando terra
mapa_via_cerrada <- rast(im1)
# Convertir el raster a data.frame para leaflet
df_via_cerrada <- as.data.frame(mapa_via_cerrada, xy = TRUE)
colnames(df_via_cerrada) <- c("long", "lat", "intensity")
# Normalizar los valores de intensidad entre 0 y 1
df_via_cerrada$intensity <- (df_via_cerrada$intensity - min(df_via_cerrada$intensity)) /
(max(df_via_cerrada$intensity) - min(df_via_cerrada$intensity))
# Crear un mapa interactivo usando leaflet
leaflet(df_via_cerrada) %>%
addProviderTiles("OpenStreetMap") %>% # Añadir la capa base
addHeatmap(
lng = ~long, lat = ~lat, # Coordenadas de longitud y latitud
intensity = ~intensity, # Intensidad normalizada
blur = 20, # Nivel de desenfoque
max = 1, # Valor máximo de la intensidad normalizada
radius = 15 # Radio para reflejar la densidad
) %>%
addLegend("bottomright", # Añadir la leyenda
title = "Mapa de Calor de Cierres de Vías",
colors = c("blue", "green", "yellow", "red"),
labels = c("Bajo", "Moderado", "Alto", "Muy Alto"))
# Filtrar eventos de accidentes del día 26
pos <- which(Trama_Waze$tipo_evento == "ACCIDENTE" & dia == 26)
accidente_26 <- Trama_Waze[pos,]
# Ajustar las coordenadas de latitud y longitud
accidente_26$lat <- accidente_26$location_y / 10^(nchar(accidente_26$location_y) - 1)
accidente_26$long <- accidente_26$location_x / 10^(nchar(accidente_26$location_x) - 3)
# Filtrar eventos dentro del rango geográfico adecuado
accidente_26 <- accidente_26[accidente_26$lat > 4 & accidente_26$lat < 5,]
# Cargar librerías necesarias
library(leaflet)
# Crear el mapa interactivo
m26_accidente <- leaflet(accidente_26) %>%
addTiles() %>%
addCircleMarkers(lng = ~long, lat = ~lat,
clusterOptions = markerClusterOptions(),
label = ~hora) %>%
addControl(html = "<h3>Mapa de Accidentes</h3>", position = "topleft")
# Mostrar el mapa interactivo
m26_accidente
# Cargar las librerías necesarias
require(spatstat)
# 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 ACCIDENTE
patron_accidente = ppp(x = accidente_26$long, y = accidente_26$lat, window = zona)
## Warning: data contain duplicated points
# 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")
# Superponer los puntos sobre los cuadrantes
points(patron_accidente, col = "red" )
# Calcular la función K-estimación
plot(Kest(patron_accidente))
# Cargar las librerías necesarias
library(terra)
library(leaflet)
library(spatstat)
# Asegurarse de que el objeto patron_accidente esté correctamente definido
# Usar las coordenadas correctas de los accidentes
zona <- owin(xrange = c(-74.04331, -73.9929), yrange = c(4.885736, 4.948562))
patron_accidente <- ppp(x = accidente_26$long, y = accidente_26$lat, window = zona)
## Warning: data contain duplicated points
# Calcular la densidad espacial
im1 <- density(patron_accidente)
# Convertir la densidad a un objeto raster usando terra
mapa_accidente <- rast(im1)
# 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"))
# Filtrar eventos de congestión del día 26
pos <- which(Trama_Waze$tipo_evento == "CONGESTIÓN" & dia == 26)
congestion_26 <- Trama_Waze[pos,]
# Ajustar las coordenadas de latitud y longitud
congestion_26$lat <- congestion_26$location_y / 10^(nchar(congestion_26$location_y) - 1)
congestion_26$long <- congestion_26$location_x / 10^(nchar(congestion_26$location_x) - 3)
# Filtrar eventos dentro del rango geográfico adecuado
congestion_26 <- congestion_26[congestion_26$lat > 4 & congestion_26$lat < 5,]
# Cargar las librerías necesarias
library(leaflet)
# Crear el mapa interactivo
m26_congestion <- leaflet(congestion_26) %>%
addTiles() %>%
addCircleMarkers(lng = ~long, lat = ~lat,
clusterOptions = markerClusterOptions(),
label = ~hora) %>%
addControl(html = "<h3>Mapa de Congestión</h3>", position = "topleft")
# Mostrar el mapa interactivo
m26_congestion
# Cargar las librerías necesarias
library(spatstat)
# 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 = congestion_26$long, y = congestion_26$lat, window = zona)
## Warning: data contain duplicated points
# 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")
# Calcular la función K-estimación
plot(Kest(patron_congestion))
# Cargar las librerías necesarias
library(leaflet)
library(terra)
# Definir el patrón de puntos
zona <- owin(xrange = c(-74.04331, -73.9929), yrange = c(4.885736, 4.948562))
patron_congestion <- ppp(x = congestion_26$long, y = congestion_26$lat, window = zona)
## Warning: data contain duplicated points
# 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"))
install.packages("leafsync")
## Warning: package 'leafsync' is in use and will not be installed
library(leafsync)
# Sincronizar los mapas interactivos de distintos tipos de eventos
leafsync::sync(m26_peligro, m26_accidente, m26_congestion, m26_via_cerrada)
Congestión : Representa la mayor cantidad de eventos reportados (3205), lo que sugiere que los problemas de tráfico son predominantes en el área analizada. Vías Cerradas : Con 1021 reportes, también son un factor significativo, posiblemente debido a obras, bloqueos o condiciones climáticas adversas. Peligro : Con 719 casos, destaca la necesidad de analizar puntos críticos de riesgo. Accidentes : Aunque menos frecuentes (125), estos eventos suelen tener mayor impacto en la movilidad. 2. Patrón de Puntos y Prueba de Cuadrantes El patrón espacial sugiere mediciones significativas de eventos en ciertas áreas, destacadas en el análisis de cuadrantes:
Mapa 1 : Muestra una gran concentración en un cuadrante, indicando agrupamiento en esa región específica. Mapa 2 : Los patrones de puntos están menos dispersos y más localizados en áreas particulares. Mapa 3 : La concentración parece más dispersa, con varios puntos distribuidos en una línea específica. Estos patrones refuerzan la idea de agrupamientos no aleatorios, posiblemente asociados a factores como infraestructura vial, condiciones climáticas o zonas con alta densidad de vehículos.
Congestión y Peligro : Mostrarán un aumento progresivo, indicando una distribución más homogénea en distancias mayores. Accidentes : Tiene una pendiente más pronunciada, lo que podría sugerir agrupamientos más definidos en áreas específicas. Vías Cerradas : Similar a la congestión, presenta un patrón disperso pero significativo en ciertos rangos de distancia. 4. Conclusiones y Recomendaciones Congestión : Es necesario implementar estrategias de gestión del tráfico en las áreas más afectadas. Medidas como semaforización inteligente o redirección de flujo vehicular podrían ser efectivas. Peligro y Accidentes : Identificar las zonas críticas para instalar señalización adecuada y preventivas. Vías Cerradas : Mejorar la comunicación a los usuarios sobre cierres y desvíos podría reducir el impacto en la movilidad.