El análisi de datos en el contexto de trafico vehicular ha sido indispensable para mejorar el desempeño, la movilidad y seguridad vial. El uso de aplicaciones como Waze recopilan datos de manera eficiente en tiempo real sobr el estado de las vías, reportandolas condiciones actuales de la vía como son: reportes de congestión, accidentes, peligros y cierres de vía, estos datos permiten tomar decisiones informadas de manera actual y precisa.
En base a datos optenidos de la aplicación Waze nos centramos en un día especificico, el 26 de septiembre del año 2023, se evaluarán y se visualizarán eventos analizando patrones temporales y espaciales, se realizarán mapas de calor que resalten áreas de mayor influencia de eventos
A partir de la base de datos se cargan las librerías necesarias, los datos se carga a través de excel.
library(readxl) # readxl: Para la carga de datos desde archivos Excel.
library(dplyr) # dplyr: Para la manipulación y transformación de datos.
library(lubridate) # lubridate: Para el manejo y procesamiento de fechas y tiempos.
library(leaflet) # leaflet: Para la creación de mapas interactivos.
library(sf) # sf: Para trabajar con datos geoespaciales.
library(mapview) # mapview: Para la visualización interactiva de mapas.
library(spatstat) # spatstat: Para el análisis de patrones espaciales y análisis de densidad.
library(terra) # terra: Para el manejo de datos raster y análisis espacial.
library(leaflet.extras) # leaflet.extras: Para añadir funciones adicionales a los mapas de leaflet
library(ggplot2) # ggplot2: Para la creación de gráficos y visualizaciones.
library(leafsync) # leafsync: Para la sincronización de múltiples mapas interactivos.
Cargamos la base de datos filtrando los datos necesarios.
# Cargar los datos de Waze
datos = read_excel("C:/Users/ORAM/OneDrive/Documents/Geoespacial/Analisis_Movilidad/Trama Waze - Copy.xlsx")
head(datos)
# A tibble: 6 × 17
id waze_json_trama_id country reportRating reportByMunicipalityUser
<dbl> <dbl> <chr> <dbl> <lgl>
1 16 14 CO 2 FALSE
2 17 14 CO 3 FALSE
3 18 14 CO 0 FALSE
4 20 15 CO 2 FALSE
5 21 15 CO 3 FALSE
6 22 15 CO 0 FALSE
# ℹ 12 more variables: confidence <dbl>, reliability <dbl>, type <chr>,
# uuid <chr>, roadType <dbl>, magvar <dbl>, subtype <chr>, street <chr>,
# location_x <dbl>, location_y <dbl>, pubMillis <dbl>, creation_Date <chr>
Procedemos a estandarizar las fechas en el formato adecuado, procedemos luego a traducir los nombres del idiona ingles al español.
# Convertir la columna de fechas a formato adecuado
datos$fecha = as.Date(datos$creation_Date, format ="%Y-%m-%d %H:%M")
# Cambiar los nombres de los tipos de eventos a español
datos$type<- recode(datos$type,
"ACCIDENT" = "ACCIDENTE",
"HAZARD" = "PELIGRO",
"JAM" = "CONGESTIÓN",
"ROAD_CLOSED" = "VÍA CERRADA")
# Convertir la fecha y extraer la hora y el día
fecha_hora = ymd_hms(datos$creation_Date)
hora = hour(fecha_hora)
dia = day(fecha_hora)
# Agregar la columna de hora a los datos
datos$hora = hora
Verificamos la frecuencia de los eventos:
# Mostrar la tabla de frecuencia de tipos de eventos
table(datos$type)
ACCIDENTE CONGESTIÓN PELIGRO VÍA CERRADA
125 3205 719 1021
# Calcular la frecuencia de cada tipo de evento en Trama_Waze
frecuencia_eventos <- datos %>%
group_by(type) %>% # Agrupar por tipo de evento
summarise(Frecuencia = n()) %>% # Contar la frecuencia de cada tipo
arrange(desc(Frecuencia)) # Ordenar por frecuencia descendente
Procedemos a graficar lo eventos:
# Crear un gráfico de barras con ggplot2 usando los datos de Trama_Waze
ggplot(frecuencia_eventos, aes(x = type, y = Frecuencia, fill = type)) +
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 = 90, 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 seleccionado
pos <- which(datos$type == "PELIGRO" & dia == 26)
peligroDia <- datos[pos,]
Realizamos ajuste a las coordenadas de latitud y longitud:
# Ajustar las coordenadas de latitud y longitud
peligroDia$lat <- peligroDia$location_y / 10^(nchar(peligroDia$location_y) - 1)
peligroDia$long <- peligroDia$location_x / 10^(nchar(peligroDia$location_x) - 3)
Filtramos los eventos en el rango adecuado de latitud y longitud:
# Filtrar eventos dentro del rango geográfico adecuado
peligroDia <- peligroDia[peligroDia$lat > 4 & peligroDia$lat < 5,]
# Crear un mapa interactivo con leaflet
mDia_peligro <- leaflet() %>%
addTiles() %>%
addCircleMarkers(lng = peligroDia$long, lat = peligroDia$lat,
clusterOptions = markerClusterOptions(),
label = peligroDia$hora) %>%
addControl(html = "<h3>Mapa de Riesgos</h3>", position = "topleft")
# Mostrar el mapa
mDia_peligro
# Filtrar datos relevantes de peligroDia
peligroDia <- peligroDia %>%
filter(lat > 4 & lat < 5, long > -75 & long < -73) # Ajustar las coordenadas de interés
# Crear un mapa interactivo con leaflet y addHeatmap
leaflet(peligroDia) %>%
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(datos$type == "VÍA CERRADA" & dia == 26)
via_cerradaDia <- datos[pos,]
# Ajustar las coordenadas de latitud y longitud
via_cerradaDia$lat <- via_cerradaDia$location_y / 10^(nchar(via_cerradaDia$location_y) - 1)
via_cerradaDia$long <- via_cerradaDia$location_x / 10^(nchar(via_cerradaDia$location_x) - 3)
# Filtrar eventos dentro del rango geográfico adecuado
via_cerradaDia <- via_cerradaDia[via_cerradaDia$lat > 4 & via_cerradaDia$lat < 5,]
# Crear el mapa interactivo
mDia_via_cerrada = leaflet(via_cerradaDia) %>%
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
mDia_via_cerrada
Creamos patron de puntos Test de Cuadrantes:
# 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_cerradaDia$long, y = via_cerradaDia$lat, window = zona)
# 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")
Se realiza un mapa de densidad basado en los eventos de cierre, permitiendo identificar las zonas con mayor frecuencia.
# Asegurarse de que el objeto patron_via_cerrada esté correctamente definido
# Crear un patrón de puntos espaciales utilizando los datos correctos (via_cerradaDia)
zona <- owin(xrange = c(-74.04331, -73.9929), yrange = c(4.885736, 4.948562))
patron_via_cerrada <- ppp(x = via_cerradaDia$long, y = via_cerradaDia$lat, window = zona)
# 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"))
Se filtran los eventos reportados en la fecha, con el enfoque de comprender su distribución espacial y su impacto en la movilidad.
Permite identificar áreas peligrosas y planificar como mitigarlas bien sea mediante señalización o implementación de medidas de seguridad.
# Filtrar eventos de accidentes del día 26
pos <- which(datos$type == "ACCIDENTE" & dia == 26)
accidenteDia <- datos[pos,]
# Ajustar las coordenadas de latitud y longitud
accidenteDia$lat <- accidenteDia$location_y / 10^(nchar(accidenteDia$location_y) - 1)
accidenteDia$long <- accidenteDia$location_x / 10^(nchar(accidenteDia$location_x) - 3)
# Filtrar eventos dentro del rango geográfico adecuado
accidenteDia <- accidenteDia[accidenteDia$lat > 4 & accidenteDia$lat < 5,]
Facilita la comprensión de la distriución espacial de los accidentes, identificando las zonas de concentración y su distribución con el fin de implementar mejoras de seguridad viasl.
# Crear el mapa interactivo
mDia_accidente <- leaflet(accidenteDia) %>%
addTiles() %>%
addCircleMarkers(lng = ~long, lat = ~lat,
clusterOptions = markerClusterOptions(),
label = ~hora) %>%
addControl(html = "<h3>Mapa de Accidentes</h3>", position = "topleft")
# Mostrar el mapa interactivo
mDia_accidente
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
# 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 = accidenteDia$long, y = accidenteDia$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")
# Superponer los puntos sobre los cuadrantes
points(patron_accidente, col = "red" )
# Calcular la función K-estimación
plot(Kest(patron_accidente))
Se genera un mapa de densidad basado en la distribución de accidentes, se resalta las áreas con mayor concentración de accidentes.
# 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 = accidenteDia$long, y = accidenteDia$lat, window = zona)
# 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"))
Para este análisis se filtra el evento Congestión para el día de estudio
# Filtrar eventos de congestión del día 26
pos <- which(datos$type == "CONGESTIÓN" & dia == 26)
congestionDia <- datos[pos,]
# Ajustar las coordenadas de latitud y longitud
congestionDia$lat <- congestionDia$location_y / 10^(nchar(congestionDia$location_y) - 1)
congestionDia$long <- congestionDia$location_x / 10^(nchar(congestionDia$location_x) - 3)
# Filtrar eventos dentro del rango geográfico adecuado
congestionDia <- congestionDia[congestionDia$lat > 4 & congestionDia$lat < 5,]
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.
# Crear el mapa interactivo
mDia_congestion <- leaflet(congestionDia) %>%
addTiles() %>%
addCircleMarkers(lng = ~long, lat = ~lat,
clusterOptions = markerClusterOptions(),
label = ~hora) %>%
addControl(html = "<h3>Mapa de Congestión</h3>", position = "topleft")
# Mostrar el mapa interactivo
mDia_congestion
El enfoque en esta sección es evento Congestió, el objetivo es estudiar la distribución geografica de estos eventos y verificar si estos se repiten.
Permite identificar las zonas más congestionadas y ayudar a la toma de decisiones.
# 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 = congestionDia$long, y = congestionDia$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")
# Calcular la función K-estimación
plot(Kest(patron_congestion))
### Mapa de densidad de congestión
Permite visualizar lás áreas más problemáticas y evaluar posibles soluciones para mejorar la fluidez del tránsito.
# Definir el patrón de puntos
zona <- owin(xrange = c(-74.04331, -73.9929), yrange = c(4.885736, 4.948562))
patron_congestion <- ppp(x = congestionDia$long, y = congestionDia$lat, window = zona)
# 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 última sección, se consolidan los mapas interactivos creados previamente para mostrar los eventos de peligros (PELIGRO), accidentes (ACCIDENTE), congestión (CONGESTIÓN) y cierres de vías (VÍA CERRADA) en una sola vista. Esta consolidación facilita la comparación de los diferentes tipos de eventos en una sola interfaz.
# Sincronizar los mapas interactivos de distintos tipos de eventos
leafsync::sync(mDia_peligro, mDia_accidente, mDia_congestion, mDia_via_cerrada)
Mediante la captura de datos de la pliacación Waze se logran capturar datos los cuales podemos analizar de manera importante y nos permite tener una visión integral de los eventos que pueden llegar a afectar la movilidad en determinado dí y en determinada ubicación, atraves de herramientas de análisis espacial y visualización de mapas interactivos se identifican patrones importantes entre los cuales pordemos nombrar: Distribución de eventos, Zonas críticas, Zonas de Congestión, Zonas de Riesgos, esta información es valiosa con el fin de facilitar la toma de decisiones los cuales permitan planificar rutas alternativas, optimizar la infraestructura vial, monitorear los eventos de ocurrencia diarios.