En esta actividad se replica el análisis de datos de movilidad de Waze para la identificación de patrones puntuales. El propósito es explorar la distribución temporal y espacial de eventos reportados por usuarios, diferenciando entre peligros, congestiones, accidentes y cierres viales.
El análisis incluye la carga y preparación de datos, el análisis temporal, la distribución de eventos, la generación de mapas interactivos, la construcción de patrones puntuales, la estimación de densidades espaciales y la comparación visual de los eventos mediante mapas sincronizados.
El desarrollo de la actividad sigue una estructura metodológica orientada a la exploración, preparación, análisis y visualización espacial de eventos de movilidad. Se trabaja con reportes georreferenciados de Waze, utilizando herramientas de análisis espacial en R.
Los datos utilizados corresponden a reportes de movilidad generados por usuarios de Waze. Estos registros contienen información sobre eventos ocurridos en la vía, incluyendo tipo de evento, subtipo, fecha de creación, vía asociada y coordenadas geográficas.
El conjunto de datos proporcionado por Waze contiene las siguientes variables principales:
creation_Date: fecha y hora en que se creó el reporte
del evento.type: tipo general de evento reportado.subtype: subtipo del evento, con mayor detalle sobre la
situación reportada.street: vía o calle asociada al reporte, cuando se
encuentra disponible.location_x: coordenada original asociada a la
longitud.location_y: coordenada original asociada a la
latitud.lat: latitud geográfica transformada a grados
decimales.long: longitud geográfica transformada a grados
decimales.fecha: fecha del reporte.hora: hora del día en que se generó el reporte.dia: día del mes en que se generó el reporte.tipo_evento: categoría del evento traducida al
español.En la variable type, los eventos se recodifican así:
HAZARD: PELIGROJAM: CONGESTIÓNACCIDENT: ACCIDENTEROAD_CLOSED: VÍA CERRADALa primera etapa técnica consistió en la carga y limpieza de los datos. Utilizamos 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.
Además, se transformaron las fechas al formato adecuado (YYYY-MM-DD HH:MM) para asegurar que las operaciones de filtrado temporal fueran precisas.
Una vez los datos estuvieron cargados y preparados, se realizó un análisis descriptivo inicial para entender las características básicas de los eventos. Se calculó la frecuencia de los diferentes tipos de eventos reportados, permitiendo identificar qué eventos eran más comunes.
Se generaron gráficos de barras utilizando ggplot2 para visualizar la distribución de los eventos y su prevalencia en la muestra de datos. Esta etapa ayudó a identificar patrones generales antes de pasar al análisis geoespacial.
Posteriormente, se filtraron los eventos según la fecha de interés (el día 26). El análisis temporal se enfocó en estudiar la concentración de eventos en distintas franjas horarias del día, permitiendo identificar momentos críticos, como las horas pico de congestión.
Utilizando lubridate, se extrajeron las horas y días de los eventos, lo que facilitó el análisis de patrones temporales y el filtrado de eventos en fechas específicas.
El análisis geoespacial se centró en la visualización de los eventos filtrados sobre un mapa utilizando la librería leaflet. Se generaron mapas interactivos para mostrar la distribución de los eventos reportados, tales como peligros, accidentes, cierres de vías y congestión.
Adicionalmente, se crearon mapas de densidad utilizando las herramientas spatstat y terra para estudiar las concentraciones geográficas de estos eventos, resaltando las áreas más afectadas en la ciudad.
Una de las etapas más importantes del análisis fue la creación de mapas de calor que permitieron identificar las zonas más críticas en términos de peligros, accidentes y congestión. Estos mapas fueron generados a partir de patrones de puntos espaciales utilizando funciones de estimación de densidad. Esto permitió resaltar visualmente las áreas con mayor incidencia de eventos, proporcionando una herramienta clave para la toma de decisiones.
Finalmente, se consolidaron los resultados de los análisis en un conjunto de mapas interactivos que integran los diferentes tipos de eventos. La consolidación de estos resultados facilita la comparación y análisis conjunto de los eventos, proporcionando una visión integral de los problemas de tráfico en la ciudad.
Tras la consolidación de los resultados, se interpretaron los hallazgos clave, identificando las zonas de mayor riesgo y los patrones críticos de congestión y accidentes. Esta información fue utilizada para formular recomendaciones prácticas que ayuden a mitigar los problemas detectados y mejorar la movilidad urbana.
La metodología empleada permitió llevar a cabo un análisis detallado y replicable, brindando una base sólida para futuras investigaciones en la gestión del tráfico y la seguridad vial.
En esta sección se realiza la carga y preparación inicial de la base
de datos de Waze. Primero, se importan las librerías necesarias para el
procesamiento de información tabular, el manejo de fechas, la
visualización gráfica y el análisis espacial. Posteriormente, se carga
el archivo en formato Excel desde la ruta local definida y se realiza
una revisión inicial de la estructura de la base mediante funciones como
head(), str(), names() y
glimpse().
Después de esta revisión, se transforman las variables temporales. La
variable creation_Date se convierte a formato de fecha y
hora, permitiendo extraer el día y la hora de cada reporte. Este paso es
fundamental para desarrollar posteriormente el análisis temporal de los
eventos.
También se realiza una recodificación de la variable
type, traduciendo las categorías originales de Waze al
español. De esta forma, los eventos quedan clasificados como
PELIGRO, CONGESTIÓN, ACCIDENTE y
VÍA CERRADA, lo cual facilita la lectura e interpretación
de los resultados.
Finalmente, se ajustan las coordenadas geográficas. Las variables
originales location_x y location_y se
transforman en longitud y latitud decimal mediante una regla
condicional, debido a que algunos registros se encontraban en escalas
numéricas diferentes. Una vez corregidas las coordenadas, se filtran los
registros con valores válidos y plausibles para Colombia.
library(readxl) # Para la carga de datos desde archivos Excel
library(dplyr) # Para la manipulación y transformación de datos
library(lubridate) # Para el manejo y procesamiento de fechas y tiempos
library(leaflet) # Para la creación de mapas interactivos
library(sf) # Para trabajar con datos geoespaciales
library(mapview) # Para la visualización interactiva de mapas
library(spatstat) # Para el análisis de patrones espaciales y densidad
library(terra) # Para el manejo de datos raster y análisis espacial
library(leaflet.extras) # Para funciones adicionales en leaflet, como mapas de calor
library(ggplot2) # Para gráficos y visualizaciones
library(leafsync) # Para sincronización de mapas interactivos
# Cargar los datos de Waze
ruta_waze <- "C:/Users/Erick Caicedo Ruiz/Desktop/Maestría Ciencia de Datos/Trama Waze.xlsx"
Trama_Waze <- read_excel(ruta_waze)
head(Trama_Waze)
str(Trama_Waze)
names(Trama_Waze)
glimpse(Trama_Waze)
# Convertir la columna de fechas a formato adecuado
Trama_Waze$fecha <- as.Date(Trama_Waze$creation_Date, format = "%Y-%m-%d %H:%M")
# Convertir fecha y extraer hora y día
fecha_hora <- ymd_hms(Trama_Waze$creation_Date)
hora <- hour(fecha_hora)
dia <- day(fecha_hora)
# Agregar hora y día a la base
Trama_Waze$hora <- hora
Trama_Waze$dia <- dia
# 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"
)
# Ajustar las coordenadas de latitud y longitud
# Se utiliza una transformación condicional para corregir registros que vienen en escalas distintas.
Trama_Waze <- Trama_Waze %>%
mutate(
long = case_when(
abs(location_x) >= 66000000 ~ location_x / 1000000,
abs(location_x) >= 6600000 ~ location_x / 100000,
TRUE ~ NA_real_
),
lat = case_when(
abs(location_y) >= 1000000 ~ location_y / 1000000,
abs(location_y) >= 100000 ~ location_y / 100000,
TRUE ~ NA_real_
)
)
glimpse(Trama_Waze)
# Revisión de valores faltantes y coordenadas
Trama_Waze %>%
summarise(
total_registros = n(),
sin_long = sum(is.na(long)),
sin_lat = sum(is.na(lat)),
sin_fecha = sum(is.na(fecha)),
sin_tipo_evento = sum(is.na(tipo_evento))
)
# Filtrar coordenadas válidas y plausibles para Colombia
Trama_Waze <- Trama_Waze %>%
filter(
!is.na(long),
!is.na(lat),
long >= -79,
long <= -66,
lat >= -5,
lat <= 13
)
nrow(Trama_Waze)
La visualización inicial de los puntos permite evaluar la coherencia espacial de los datos antes de continuar con el análisis geoespacial. En el gráfico se observa que la mayor parte de los reportes se concentra en una franja ubicada aproximadamente entre las latitudes 4.89 y 4.95, con longitudes cercanas a -74. Esta concentración corresponde a la zona principal de interés del análisis.
Sin embargo, también se identifican algunos puntos ubicados por debajo de la latitud 4, especialmente alrededor de latitudes entre 2.5 y 2.8. Estos registros aparecen espacialmente separados del conjunto principal, por lo que se consideran puntos fuera de la zona de análisis. En total, se identificaron 74 registros con esta condición.
Dado que el objetivo del ejercicio es analizar patrones puntuales en
la zona urbana de interés, se decide excluir estos puntos dispersos
mediante el filtro lat >= 4. Esta decisión metodológica
permite evitar distorsiones en los mapas, en la escala de visualización
y en los análisis posteriores de densidad espacial. Después de aplicar
este filtro, la base queda concentrada en el área principal, con un
rango de latitud entre 4.89 y 4.95, lo que confirma que los datos
utilizados para el análisis espacial corresponden a una zona geográfica
más coherente y delimitada.
# Revisión visual de la distribución inicial de puntos
ggplot(Trama_Waze, aes(x = long, y = lat)) +
geom_point(alpha = 0.5, size = 1) +
labs(
title = "Distribución inicial de puntos Waze",
x = "Longitud",
y = "Latitud"
) +
theme_minimal()
# Identificar puntos fuera de la zona principal
puntos_fuera_zona <- Trama_Waze %>%
filter(lat < 4)
puntos_fuera_zona %>%
select(id, tipo_evento, subtype, street, long, lat, creation_Date)
nrow(puntos_fuera_zona)
# Conservar la zona principal de análisis
Trama_Waze <- Trama_Waze %>%
filter(lat >= 4)
Trama_Waze %>%
summarise(
long_min = min(long, na.rm = TRUE),
long_max = max(long, na.rm = TRUE),
lat_min = min(lat, na.rm = TRUE),
lat_max = max(lat, na.rm = TRUE)
)
En el gráfico se observa que la actividad de reportes no es homogénea durante el día. La mayor concentración ocurre en la tarde y noche, especialmente entre las 17:00 y las 23:00 horas. El punto más alto se presenta a las 17:00, con cerca de 480 reportes, lo que sugiere un momento crítico de movilidad posiblemente asociado al retorno laboral y al aumento del flujo vehicular. También se mantienen niveles altos entre las 19:00 y 20:00, superando los 390 y 430 reportes respectivamente. En contraste, entre las 5:00 y 9:00 la frecuencia es muy baja o nula, lo que indica una menor generación de eventos en la madrugada y primeras horas de la mañana. Además, desde las 10:00 empieza un crecimiento sostenido que se intensifica al mediodía y alcanza su mayor presión hacia el final de la tarde.
hora_factorizado <- factor(Trama_Waze$hora, levels = 0:23)
g_hora <- ggplot(mapping = aes(x = hora_factorizado)) +
geom_bar(fill = "darkgreen", color = "black") +
labs(
title = "Frecuencia de Eventos por Hora del Día",
x = "Hora del Día",
y = "Frecuencia (Conteo)"
) +
theme_minimal() +
scale_x_discrete(drop = FALSE)
g_hora
# Mostrar la tabla de frecuencia de tipos de eventos
table(Trama_Waze$tipo_evento)
# Calcular la frecuencia de cada tipo de evento
frecuencia_eventos <- Trama_Waze %>%
group_by(tipo_evento) %>%
summarise(Frecuencia = n()) %>%
arrange(desc(Frecuencia))
frecuencia_eventos
En este gráfico se evidencia que la congestión es, por amplia diferencia, el evento más frecuente en la base analizada, con un poco más de 3.000 reportes. Esto indica que el principal problema registrado por Waze en la zona de estudio está asociado a trancones o reducción de la velocidad del flujo vehicular. En segundo lugar aparecen los eventos de vía cerrada, con alrededor de 1.000 registros, lo cual también representa una afectación importante porque puede generar desvíos, represamientos y cambios en los recorridos habituales. Los reportes de peligro se ubican en un nivel intermedio, con cerca de 700 registros, mientras que los accidentes tienen una frecuencia mucho menor, cercana a los 100 reportes. Esta distribución muestra que el análisis espacial debe prestar especial atención a la congestión y a los cierres viales, ya que concentran la mayor parte de los eventos reportados y probablemente explican buena parte de las dificultades de movilidad observadas en el área de estudio.
# Crear gráfico de barras de tipos de eventos
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)) +
scale_fill_brewer(palette = "Set2")
En esta sección se realizó un filtrado específico de los eventos clasificados como PELIGRO para el día 26. Primero, se identificaron dentro de la base Trama_Waze aquellos registros que cumplían dos condiciones al mismo tiempo: que el tipo de evento fuera PELIGRO y que el día del reporte correspondiera al día 26. Con esos registros se creó una nueva base llamada peligro26.
Posteriormente, se aplicó un segundo filtro espacial para conservar únicamente los eventos ubicados dentro del rango geográfico de interés, es decir, con latitudes entre 4 y 5 y longitudes entre -75 y -73. Esto permite excluir registros que, aunque correspondan al día y tipo de evento seleccionados, estén fuera del área principal de análisis.
Como resultado, se obtuvieron 131 eventos de peligro para el día 26 dentro de la zona geográfica definida. Esta base será utilizada en los siguientes pasos para construir mapas interactivos, mapas de calor y análisis de concentración espacial de riesgos en la vía.
# Identificar eventos PELIGRO del día 26
pos <- which(Trama_Waze$tipo_evento == "PELIGRO" & Trama_Waze$dia == 26)
peligro26 <- Trama_Waze[pos, ]
# Filtrar eventos dentro del rango geográfico adecuado
peligro26 <- peligro26 %>%
filter(lat > 4 & lat < 5, long > -75 & long < -73)
nrow(peligro26)
En esta sección se visualizaron los 131 eventos clasificados como PELIGRO para el día 26 dentro del área de análisis. Primero, se construyó un mapa interactivo con marcadores agrupados, lo que permitió ubicar los reportes sobre la red vial y observar que los puntos se concentran principalmente sobre corredores como la Variante Cajicá / vía Bogotá–Tunja, especialmente en sectores cercanos a Río Grande, Hatogrande, Yerbabuena Bajo y Calahorra. Posteriormente, se generó un mapa de calor para representar la intensidad espacial de estos reportes. En este mapa se observa que las mayores concentraciones aparecen en tonos cálidos, especialmente hacia el sector sur-occidental del mapa y sobre algunos tramos de la vía principal, lo que indica puntos donde los reportes de riesgo fueron más recurrentes. Esta visualización permite pasar de ver eventos individuales a identificar zonas críticas de peligro vial.
# 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")
m26_peligro
# Crear mapa de calor de eventos PELIGRO
leaflet(peligro26) %>%
addProviderTiles("OpenStreetMap") %>%
addHeatmap(
lng = ~long,
lat = ~lat,
intensity = ~hora,
blur = 20,
max = 0.08,
radius = 15
) %>%
addLegend(
"bottomright",
title = "Mapa de Calor de Riesgos",
colors = c("blue", "green", "yellow", "red"),
labels = c("Bajo", "Moderado", "Alto", "Muy Alto")
)
En esta parte se filtraron los eventos clasificados como VÍA CERRADA correspondientes al día 26. Para esto, primero se identificaron en la base Trama_Waze los registros que cumplían simultáneamente dos condiciones: que el tipo de evento fuera VÍA CERRADA y que el día del reporte fuera 26. Con esos registros se creó la base via_cerrada_26.
Después, se aplicó un filtro geográfico para conservar únicamente los eventos ubicados dentro del rango definido para la zona de análisis: latitudes entre 4 y 5 y longitudes entre -75 y -73. Como resultado, se obtuvieron 657 reportes de cierres de vías para el día 26 dentro del área de interés. Este subconjunto será la base para analizar la concentración espacial de los cierres viales y construir posteriormente el mapa interactivo, el patrón puntual y el mapa de densidad.
# Filtrar eventos VÍA CERRADA del día 26
pos <- which(Trama_Waze$tipo_evento == "VÍA CERRADA" & Trama_Waze$dia == 26)
via_cerrada_26 <- Trama_Waze[pos, ]
# Filtrar eventos dentro del rango geográfico adecuado
via_cerrada_26 <- via_cerrada_26 %>%
filter(lat > 4 & lat < 5, long > -75 & long < -73)
nrow(via_cerrada_26)
En esta sección se presenta un mapa interactivo que muestra los eventos de cierre de vías (VIA CERRADA) del día 26. Utilizando la herramienta leaflet, se visualizan las ubicaciones de estos eventos en un mapa, donde los usuarios pueden hacer clic en cada marcador para obtener más información sobre el evento, como la hora y las coordenadas exactas.
Este mapa interactivo permite explorar geográficamente las áreas afectadas por los cierres de vías, proporcionando una herramienta visual poderosa para la planificación y gestión del tráfico en la ciudad.
# Crear el mapa interactivo de cierres de vías
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")
m26_via_cerrada
En esta sección se realizó el análisis espacial de los cierres de vías reportados el día 26. A partir de los 657 registros filtrados previamente, se delimitó una ventana espacial de análisis y se construyó un patrón puntual con los eventos ubicados dentro de esa zona. Luego se aplicó un test de cuadrantes, que divide el área en celdas y cuenta cuántos cierres aparecen en cada una.
El resultado muestra una concentración muy marcada en pocos cuadrantes: uno de ellos acumula la mayor parte de los eventos, mientras que muchos otros no registran cierres. Esto indica que los cierres de vías no están distribuidos de manera uniforme en el territorio, sino que se agrupan en zonas específicas.
# Definir la zona de interés
zona <- owin(
xrange = c(-74.04331, -73.9929),
yrange = c(4.885736, 4.948562)
)
# Filtrar puntos dentro de la ventana espacial
via_cerrada_26_zona <- via_cerrada_26 %>%
filter(
long >= -74.04331,
long <= -73.9929,
lat >= 4.885736,
lat <= 4.948562
)
# Crear patrón de puntos espaciales para VÍA CERRADA
patron_via_cerrada <- ppp(
x = via_cerrada_26_zona$long,
y = via_cerrada_26_zona$lat,
window = zona
)
# Graficar test de cuadrantes
plot(quadratcount(patron_via_cerrada), main = "Patrón de Puntos y Test de Cuadrantes")
# Superponer puntos sobre los cuadrantes
points(patron_via_cerrada, col = "red")
Posteriormente, la función K permite evaluar si ese patrón presenta agregación espacial frente a un patrón aleatorio. En conjunto, los resultados sugieren que los cierres viales del día 26 se concentraron en puntos críticos concretos, por lo que no se trata de eventos dispersos al azar, sino de una afectación localizada en determinados corredores o sectores de la zona de estudio.
# Gráfico independiente: Función K-Estimación
plot(Kest(patron_via_cerrada), main = "Función K-Estimación")
Aquí se genera un segundo mapa de densidad basado en los eventos de cierre de vías (VÍA CERRADA), 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.
# Calcular la densidad espacial
im1 <- density(patron_via_cerrada, sigma = 0.01)
# 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, na.rm = TRUE)) /
(max(df_via_cerrada$intensity, na.rm = TRUE) - min(df_via_cerrada$intensity, na.rm = TRUE))
# Crear mapa interactivo de calor
leaflet(df_via_cerrada) %>%
addProviderTiles("OpenStreetMap") %>%
addHeatmap(
lng = ~long,
lat = ~lat,
intensity = ~intensity,
blur = 20,
max = 1,
radius = 15
) %>%
addLegend(
"bottomright",
title = "Mapa de Calor de Cierres de Vías",
colors = c("blue", "green", "yellow", "red"),
labels = c("Bajo", "Moderado", "Alto", "Muy Alto")
)
En esta sección se filtraron los eventos clasificados como ACCIDENTE correspondientes al día 26. Primero, se seleccionaron dentro de la base Trama_Waze los registros que cumplían dos condiciones: que el tipo de evento fuera ACCIDENTE y que el reporte hubiera ocurrido el día 26. Con esa selección se creó la base accidente_26.
Luego, se aplicó el mismo filtro geográfico utilizado en los análisis anteriores, conservando únicamente los registros ubicados entre las latitudes 4 y 5 y las longitudes -75 y -73. El resultado fue un subconjunto de 36 accidentes dentro del área de estudio. En comparación con los eventos de congestión, peligro o cierre vial, los accidentes tienen una frecuencia mucho menor, pero siguen siendo relevantes porque representan eventos de alto impacto en la movilidad y pueden explicar interrupciones puntuales o acumulaciones de tráfico en ciertos corredores.
# Filtrar eventos de accidentes del día 26
pos <- which(Trama_Waze$tipo_evento == "ACCIDENTE" & Trama_Waze$dia == 26)
accidente_26 <- Trama_Waze[pos, ]
# Filtrar eventos dentro del rango geográfico adecuado
accidente_26 <- accidente_26 %>%
filter(lat > 4 & lat < 5, long > -75 & long < -73)
nrow(accidente_26)
## [1] 36
quí se presenta un mapa interactivo que muestra los eventos de accidentes (ACCIDENTE) del día 26. 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.
# Crear mapa interactivo de accidentes
m26_accidente <- leaflet(accidente_26) %>%
addTiles() %>%
addCircleMarkers(
lng = ~long,
lat = ~lat,
clusterOptions = markerClusterOptions(),
label = ~hora
) %>%
addControl(html = "<h3>Mapa de Accidentes</h3>", position = "topleft")
m26_accidente
En esta sección se realizó el análisis espacial de los accidentes reportados el día 26. A partir de los 36 accidentes filtrados previamente, se construyó un patrón puntual dentro de la ventana espacial definida para la zona de estudio. El test de cuadrantes muestra que los accidentes no se distribuyen de forma homogénea: la mayoría se concentra en un solo sector del área analizada, con 34 eventos en un cuadrante, mientras que otro cuadrante registra apenas 2 eventos y el resto no presenta reportes. Esto evidencia una concentración espacial muy marcada de los accidentes, más que una dispersión general en toda la zona.
# Definir la zona de interés
zona <- owin(
xrange = c(-74.04331, -73.9929),
yrange = c(4.885736, 4.948562)
)
# Filtrar puntos dentro de la ventana espacial
accidente_26_zona <- accidente_26 %>%
filter(
long >= -74.04331,
long <= -73.9929,
lat >= 4.885736,
lat <= 4.948562
)
# Crear patrón de puntos espaciales para ACCIDENTE
patron_accidente <- ppp(
x = accidente_26_zona$long,
y = accidente_26_zona$lat,
window = zona
)
## Warning: data contain duplicated points
# Graficar test de cuadrantes
plot(quadratcount(patron_accidente), main = "Patrón de Puntos y Test de Cuadrantes")
# Superponer puntos sobre los cuadrantes
points(patron_accidente, col = "red")
La función K refuerza esta lectura, ya que permite comparar el patrón observado con un patrón esperado bajo aleatoriedad espacial. En este caso, la concentración observada sugiere que los accidentes tienden a agruparse en puntos específicos, posiblemente asociados a tramos viales con mayor flujo, intersecciones críticas o condiciones particulares de circulación. Aunque el número total de accidentes es menor frente a otros eventos como congestión o cierres viales, su localización concentrada permite identificar posibles puntos críticos que requieren mayor atención en términos de señalización, control del tráfico o gestión preventiva.
# Calcular la función K-estimación
plot(Kest(patron_accidente), main = "Función K-Estimación")
En esta sección, se genera un mapa de densidad basado en la distribución de los accidentes (ACCIDENTE) ocurridos el día 26. 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.
# 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, na.rm = TRUE)) /
(max(df_accidente$intensity, na.rm = TRUE) - min(df_accidente$intensity, na.rm = TRUE))
# Crear mapa interactivo de calor
leaflet(df_accidente) %>%
addProviderTiles("OpenStreetMap") %>%
addHeatmap(
lng = ~long,
lat = ~lat,
intensity = ~intensity,
blur = 15,
max = 0.5,
radius = 10
) %>%
addLegend(
"bottomright",
title = "Mapa de Calor de Accidentes",
colors = c("blue", "green", "yellow", "red"),
labels = c("Bajo", "Moderado", "Alto", "Muy Alto")
)
En esta sección se analiza la congestión reportada (CONGESTIÓN) el día 26. 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.
# Filtrar eventos de congestión del día 26
pos <- which(Trama_Waze$tipo_evento == "CONGESTIÓN" & Trama_Waze$dia == 26)
congestion_26 <- Trama_Waze[pos, ]
# Filtrar eventos dentro del rango geográfico adecuado
congestion_26 <- congestion_26 %>%
filter(lat > 4 & lat < 5, long > -75 & long < -73)
nrow(congestion_26)
## [1] 906
En esta sección se presenta un mapa interactivo de los eventos de congestión (CONGESTIÓN) reportados el día 26. 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.
# Crear mapa interactivo de congestión
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")
m26_congestion
En esta sección se realizó el análisis espacial de los eventos de congestión reportados el día 26. A diferencia de los accidentes, la congestión presenta un volumen mucho mayor de registros y una distribución más extendida dentro de la zona de estudio. El test de cuadrantes muestra que los reportes no se ubican de manera uniforme: hay varios cuadrantes con acumulaciones importantes, especialmente aquellos que concentran valores como 87, 64, 44, 33, 28 y 20 eventos, lo que indica la presencia de varios focos de congestión sobre distintos tramos viales. Esto sugiere que la congestión no depende de un único punto crítico, sino que se manifiesta en diferentes sectores de la red vial.
La función K también muestra un comportamiento compatible con agregación espacial, ya que el patrón observado se aleja del comportamiento esperado bajo aleatoriedad. En términos prácticos, esto significa que los reportes de congestión tienden a agruparse en corredores o zonas específicas, posiblemente asociados a vías principales, intersecciones con alto flujo vehicular o puntos donde se generan represamientos. Este resultado es relevante porque permite identificar áreas donde la congestión es recurrente y donde podrían priorizarse acciones de gestión del tráfico, cambios operativos o intervenciones para mejorar la movilidad.
# Definir la zona de interés
zona <- owin(
xrange = c(-74.04331, -73.9929),
yrange = c(4.885736, 4.948562)
)
# Filtrar puntos dentro de la ventana espacial
congestion_26_zona <- congestion_26 %>%
filter(
long >= -74.04331,
long <= -73.9929,
lat >= 4.885736,
lat <= 4.948562
)
# Crear patrón de puntos espaciales para CONGESTIÓN
patron_congestion <- ppp(
x = congestion_26_zona$long,
y = congestion_26_zona$lat,
window = zona
)
## Warning: data contain duplicated points
# Graficar test de cuadrantes
plot(quadratcount(patron_congestion), main = "Patrón de Puntos y Test de Cuadrantes")
# Superponer puntos sobre los cuadrantes
points(patron_congestion, col = "red")
# Calcular la función K-estimación
plot(Kest(patron_congestion), main = "Función K-Estimación")
Aquí se genera un mapa de densidad basado en los eventos de congestión (CONGESTIÓN) del día 26. 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, na.rm = TRUE)) /
(max(df_congestion$intensity, na.rm = TRUE) - min(df_congestion$intensity, na.rm = TRUE))
# Crear mapa interactivo de calor
leaflet(df_congestion) %>%
addProviderTiles("OpenStreetMap") %>%
addHeatmap(
lng = ~long,
lat = ~lat,
intensity = ~intensity,
blur = 35,
max = max(df_congestion$intensity, na.rm = TRUE) * 2,
radius = 25
) %>%
addLegend(
"bottomright",
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.
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.
# Sincronizar los mapas interactivos de distintos tipos de eventos
leafsync::sync(m26_peligro, m26_accidente, m26_congestion, m26_via_cerrada)
# Consolidación de Resultados
resumen_resultados <- tibble(
indicador = c(
"Registros utilizados después de limpieza",
"Eventos PELIGRO del día 26",
"Eventos VÍA CERRADA del día 26",
"Eventos ACCIDENTE del día 26",
"Eventos CONGESTIÓN del día 26",
"Puntos fuera de la zona principal"
),
valor = c(
nrow(Trama_Waze),
nrow(peligro26),
nrow(via_cerrada_26),
nrow(accidente_26),
nrow(congestion_26),
nrow(puntos_fuera_zona)
)
)
resumen_resultados
El análisis permitió replicar el flujo metodológico del ejercicio original de Waze, iniciando con la carga y preparación de datos, la recodificación de tipos de eventos, el análisis temporal de reportes y la construcción de mapas interactivos por categoría.
La identificación de eventos del día 26 permitió comparar la distribución espacial de peligros, accidentes, congestiones y cierres viales. A partir de estos subconjuntos se construyeron patrones puntuales, se aplicó el test de cuadrantes, se estimó la función K y se generaron mapas de densidad espacial.
Los resultados permiten observar zonas de concentración de eventos y comparar visualmente los distintos tipos de situaciones reportadas en la vía. Este tipo de análisis es útil como insumo para la planeación urbana, la gestión de movilidad y la identificación de puntos críticos en la red vial.
Distribución de Eventos: Se ha observado que los trancones y los peligros en las vías son los eventos más frecuentes, lo que resalta la necesidad de un enfoque coordinado en la gestión del tráfico y la implementación de medidas preventivas en áreas específicas.
Zonas Críticas: Los mapas de densidad muestran zonas de alta concentración de accidentes y cierres de vías, sugiriendo que estas áreas podrían beneficiarse de mejoras en la infraestructura vial, como la instalación de señalización adicional o la reestructuración de rutas.
Congestión: El análisis de la congestión revela que ciertas áreas presentan problemas de tráfico persistentes durante horas pico, lo que destaca la importancia de implementar soluciones como la optimización de los semáforos y la creación de rutas alternativas para aliviar el tráfico.
Riesgos en las Vías: La visualización de eventos PELIGRO permite identificar áreas con alta probabilidad de incidentes relacionados con peligros en las vías, lo que sugiere la necesidad de campañas de concientización para los conductores y posibles intervenciones en la infraestructura para mitigar riesgos.
Planificación de Rutas Alternativas: Dado el alto volumen de trancones y cierres de vías en ciertas zonas, se recomienda la creación de rutas alternativas y la mejora en la señalización para desviar el tráfico de las áreas más congestionadas.
Mejoras en la Infraestructura Vial: Las zonas identificadas con mayor concentración de accidentes y peligros deben ser priorizadas para intervenciones, como el mantenimiento de vías, instalación de cámaras de vigilancia o la reubicación de pasos peatonales.
Monitoreo Continuo: Se recomienda un monitoreo continuo de los datos de Waze en tiempo real para detectar eventos a medida que ocurren, lo que facilitaría una respuesta más rápida y eficaz ante situaciones de emergencia o congestión.
El uso de datos crowdsourcing, como los proporcionados por Waze, representa una herramienta valiosa para las autoridades encargadas de la gestión de tráfico. La capacidad de visualizar y analizar eventos en tiempo real permite no solo una respuesta rápida a incidentes, sino también una planificación a largo plazo para mejorar la infraestructura vial y la seguridad en las vías. Este tipo de análisis debería ser integrado en los sistemas de gestión de tráfico de las ciudades para promover una movilidad más segura, eficiente y sostenible.