El análisis de datos de tráfico es esencial en el contexto urbano actual para mejorar la movilidad y la seguridad vial. Con el crecimiento constante de las ciudades y el aumento en el número de vehículos, es crucial utilizar herramientas y metodologías avanzadas para gestionar el tráfico de manera eficiente.
Las aplicaciones de navegación colaborativa como Waze han revolucionado la recopilación de datos de tráfico. A través de la participación activa de los usuarios, Waze proporciona información en tiempo real sobre las condiciones de las vías, incluyendo reportes de congestión, accidentes, peligros y cierres de vías. Estos datos son valiosos para las autoridades y planificadores urbanos, ya que permiten tomar decisiones informadas basadas en información actual y precisa.
El análisis de datos geoespaciales y la minería de datos son
fundamentales para extraer conocimiento de grandes volúmenes de
información. Herramientas como R y librerías especializadas como
leaflet, spatstat y ggplot2
facilitan el procesamiento y visualización de datos espaciales,
permitiendo identificar patrones y tendencias que pueden guiar
estrategias para mejorar la infraestructura vial y la gestión del
tráfico.
El presente análisis se enfoca en el estudio de los eventos reportados por los usuarios a través de la aplicación Waze, considerando la totalidad del periodo disponible en el dataset (26 al 28 de septiembre de 2024) sin restricción de fecha. Se analiza cada tipo de evento de forma independiente: peligros (702), cierres de vías (1021), accidentes (122) y congestión (3151).
Estudiar la distribución espacial y temporal de todos los eventos reportados en Waze, por tipo de evento y sobre el periodo completo de datos. Se generan mapas interactivos, mapas de calor, análisis de patrones espaciales con test de cuadrantes y función K de Ripley, mapas de densidad para cada categoría, y una visualización 3D de densidad para los eventos con mayor volumen.
| Fase | Descripción |
|---|---|
| 1. Comprensión del Negocio | Mejorar la movilidad y seguridad vial mediante el análisis de datos de Waze. |
| 2. Comprensión de los Datos | Recopilación y exploración inicial de eventos reportados. |
| 3. Preparación de los Datos | Limpieza, conversión de fechas y estandarización de coordenadas. |
| 4. Modelado | Mapas interactivos, mapas de calor, análisis de patrones espaciales y visualización 3D. |
| 5. Evaluación | Interpretación de resultados y validación de hallazgos. |
| 6. Despliegue | Presentación de resultados e implementación de recomendaciones. |
spatstat y terra, con sigma ajustado al
volumen real de puntos de cada tipo de evento.plotly.# ── Librerías ──────────────────────────────────────────────────────────────────
library(readxl) # Carga de datos desde archivos Excel
library(dplyr) # Manipulación y transformación de datos
library(lubridate) # Manejo de fechas y tiempos
library(leaflet) # Mapas interactivos
library(sf) # Datos geoespaciales
library(spatstat) # Análisis de patrones espaciales
library(terra) # Datos raster y análisis espacial
library(leaflet.extras) # Heatmap en leaflet
library(ggplot2) # Gráficos
library(leafsync) # Sincronización de mapas
library(plotly) # Visualización 3D interactiva# ── Carga del archivo Excel ────────────────────────────────────────────────────
# Ajusta la ruta si tu archivo está en otra ubicación
#Trama_Waze <- read_excel("C:/Users/User/Downloads/Trama Waze.xlsx")
Trama_Waze <- read_excel("C:/Users/USER ADMIN/Downloads/Trama Waze.xlsx")
# ── Conversión de fechas y extracción de componentes temporales ────────────────
fecha_hora <- ymd_hms(Trama_Waze$creation_Date)
Trama_Waze$fecha <- as.Date(fecha_hora)
Trama_Waze$hora <- hour(fecha_hora)
Trama_Waze$dia <- day(fecha_hora)
Trama_Waze$mes <- month(fecha_hora, label = TRUE)
# ── Traducción de tipos de eventos al español ──────────────────────────────────
Trama_Waze$tipo_evento <- recode(Trama_Waze$type,
"ACCIDENT" = "ACCIDENTE",
"HAZARD" = "PELIGRO",
"JAM" = "CONGESTIÓN",
"ROAD_CLOSED" = "VÍA CERRADA")
# ── Vista previa ───────────────────────────────────────────────────────────────
head(Trama_Waze)## # A tibble: 6 × 22
## 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
## # ℹ 17 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>,
## # fecha <date>, hora <int>, dia <int>, mes <ord>, tipo_evento <chr>
preparar_coords <- function(datos,
lat_min = 4, lat_max = 5,
long_min = -75, long_max = -73) {
datos$lat <- datos$location_y / 10^(nchar(datos$location_y) - 1)
datos$long <- datos$location_x / 10^(nchar(datos$location_x) - 3)
datos <- datos[datos$lat > lat_min & datos$lat < lat_max &
datos$long > long_min & datos$long < long_max, ]
return(datos)
}ggplot(Trama_Waze, aes(x = factor(hora, levels = 0:23))) +
geom_bar(fill = "orange", color = "black") +
labs(title = "Frecuencia de Eventos por Hora del Día — Periodo Completo",
x = "Hora del Día", y = "Frecuencia") +
theme_minimal() +
scale_x_discrete(drop = FALSE)## Distribución de eventos por tipo:
##
## ACCIDENTE CONGESTIÓN PELIGRO VÍA CERRADA
## 125 3205 719 1021
Frecuencia de Eventos por Hora del Día: El gráfico muestra que los eventos de Waze se concentran principalmente durante las horas de mayor actividad vehicular, con picos visibles en las franjas de la mañana (6–9 h) y tarde (16–19 h), que corresponden a las horas pico de movilidad urbana. La franja nocturna (23–5 h) registra la menor cantidad de reportes, lo que es consistente con la reducción del tráfico en ese horario. Los eventos de congestión, al ser el tipo más frecuente (3151 registros), dominan el patrón general de la distribución horaria. El periodo analizado cubre únicamente tres días (26–28 de septiembre de 2024), por lo que los patrones observados pueden estar influenciados por condiciones específicas de esos días. Es posible que los picos horarios reflejen tanto la concentración real de incidentes como la mayor disposición de conductores a reportar eventos durante horas de alta afluencia.
frecuencia_eventos <- Trama_Waze %>%
group_by(tipo_evento) %>%
summarise(Frecuencia = n()) %>%
arrange(desc(Frecuencia))
ggplot(frecuencia_eventos, aes(x = reorder(tipo_evento, -Frecuencia),
y = Frecuencia,
fill = tipo_evento)) +
geom_bar(stat = "identity") +
theme_minimal() +
labs(title = "Distribución de Tipos de Eventos — Periodo Completo",
x = "Tipo de Evento", y = "Frecuencia", fill = "Tipo de Evento") +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
scale_fill_brewer(palette = "Set2")Distribución de Tipos de Eventos: La congestión es con diferencia el evento más reportado, con 3151 casos, representando cerca del 63 % del total de reportes en el periodo analizado. Los cierres de vías ocupan el segundo lugar con 1021 registros (20%, aproximadamente), lo que indica una alta actividad de intervenciones viales o eventos que bloquean carriles durante el periodo. Los peligros suman 719 reportes (≈14 %), reflejando condiciones de riesgo en vías como objetos en la calzada, vehículos detenidos o superficies dañadas. Los accidentes son el tipo menos frecuente con apenas 122 casos (≈2 %), aunque su impacto sobre la seguridad vial es desproporcionadamente mayor que su volumen sugiere. La proporción elevada de cierres de vías respecto a accidentes sugiere que muchas interrupciones del flujo no se deben a siniestros sino a obras o eventos planificados. Este perfil de distribución es clave para priorizar recursos: la congestión requiere estrategias de gestión del flujo, mientras los accidentes exigen intervenciones de seguridad vial.
peligro <- Trama_Waze %>%
filter(tipo_evento == "PELIGRO") %>%
preparar_coords()
cat("Total eventos PELIGRO:", nrow(peligro), "\n")## Total eventos PELIGRO: 702
cat("Periodo:", as.character(min(peligro$fecha, na.rm = TRUE)),
"→", as.character(max(peligro$fecha, na.rm = TRUE)), "\n")## Periodo: 2024-09-26 → 2024-09-28
m_peligro <- leaflet(peligro) %>%
addTiles() %>%
addCircleMarkers(
lng = ~long,
lat = ~lat,
clusterOptions = markerClusterOptions(),
label = ~paste("Hora:", hora, "| Fecha:", fecha)
) %>%
addControl(html = "<h3>Mapa de Riesgos</h3>", position = "topleft")
m_peligroMapa Interactivo de Riesgos: El mapa interactivo muestra la distribución de los 702 eventos PELIGRO en el área de estudio, concentrados principalmente en las vías principales cerca de Cajicá por donde se debe pasar para ir desde Bogotá hacia los municipios más al norte del país (VAriante Cajicá y Vía Bogotá Tunja).
Al hacer zoom se identifican zonas con mayor densidad de marcadores, especialmente en intersecciones principales y vías de alta velocidad donde los peligros son más frecuentes. La función de agrupamiento (clustering) facilita la exploración visual: los clústeres más grandes señalan sectores con múltiples reportes simultáneos o recurrentes. La información de hora disponible en las etiquetas permite identificar si ciertos puntos concentran reportes en franjas horarias específicas, indicando riesgos vinculados al tráfico pico. La distribución no es uniforme: algunas zonas presentan alta concentración mientras otras zonas amplias quedan sin reportes, lo que puede reflejar tanto diferencias reales en riesgo como sesgos en la cobertura de usuarios de Waze. Este mapa es una herramienta de exploración inicial; los mapas de calor y densidad a continuación permiten una cuantificación más rigurosa.
leaflet(peligro) %>%
addProviderTiles("OpenStreetMap") %>%
addHeatmap(
lng = ~long,
lat = ~lat,
blur = 20,
max = 0.05,
radius = 15
) %>%
addLegend("bottomright",
title = "Mapa de Calor de Riesgos",
colors = c("blue", "green", "yellow", "red"),
labels = c("Bajo", "Moderado", "Alto", "Muy Alto"))Mapa de Calor de Riesgos: El mapa de calor revela núcleos de alta densidad de peligros (zonas rojas y amarillas) ubicados en corredores viales específicos, con gradientes de intensidad que permiten identificar jerarquías de riesgo. Las zonas rojas representan los focos de mayor acumulación de reportes y deben ser priorizadas para inspección y mantenimiento preventivo de infraestructura. Las zonas verdes y azules indican baja incidencia de peligros, aunque no necesariamente ausencia de riesgo real, pues pueden reflejar zonas con menor densidad de usuarios de Waze. La extensión espacial del calor sugiere que los riesgos no se concentran en puntos aislados sino en segmentos de vía con longitud considerable, lo que apunta a problemas estructurales o de mantenimiento de tramos completos. En la parte final del documento, se pretende mostrar un mapa de densidad con una estimación similar pero en 3D. El mapa de calor sobre las vías es más visual, pero menos preciso cuantitativamente. Por lo cual se presentan ambos para que se observe de mejor forma la importancia del efecto.
zona_p <- owin(
xrange = c(min(peligro$long) - margen, max(peligro$long) + margen),
yrange = c(min(peligro$lat) - margen, max(peligro$lat) + margen)
)
patron_p <- ppp(x = peligro$long, y = peligro$lat, window = zona_p)
plot(quadratcount(patron_p, nx = 5, ny = 5),
main = "Patrón de Puntos y Test de Cuadrantes — PELIGRO")
points(patron_p, col = "red")Test de Cuadrantes y Función K (PELIGRO): El test de cuadrantes divide el área de estudio en 25 celdas (5×5) y cuenta los eventos en cada una; las diferencias entre celdas confirman que los peligros no se distribuyen de forma aleatoria en el espacio: hay celdas con concentraciones notablemente superiores al promedio. Los cuadrantes con mayor recuento corresponden a las zonas de mayor actividad vial, como intersecciones de vías principales o corredores con alto volumen de tránsito. La función K de Ripley compara la distribución observada (línea negra) con la esperada bajo completa aleatoriedad espacial (línea roja punteada): cuando la curva observada supera la teórica, indica agrupamiento espacial de los eventos. Para PELIGRO, la curva K empírica se ubica consistentemente por encima de la teórica a todas las distancias evaluadas, lo que confirma que los peligros tienden a concentrarse en clusters geográficos en lugar de dispersarse aleatoriamente. Este agrupamiento tiene implicaciones directas de planificación: en lugar de distribuir recursos de mantenimiento uniformemente, las intervenciones deben focalizarse en los sectores donde la función K evidencia mayor concentración.
El gradiente de color permite diferenciar entre zonas de riesgo alto, moderado y bajo, facilitando la jerarquización territorial de intervenciones con recursos limitados. La forma y extensión de los núcleos de densidad alta sugiere que los riesgos siguen trazados viales concretos (corredores lineales, de mayor velocidad y tránsito) más que distribuciones puntuales aisladas.
via_cerrada <- Trama_Waze %>%
filter(tipo_evento == "VÍA CERRADA") %>%
preparar_coords()
cat("Total eventos VÍA CERRADA:", nrow(via_cerrada), "\n")## Total eventos VÍA CERRADA: 1021
cat("Periodo:", as.character(min(via_cerrada$fecha, na.rm = TRUE)),
"→", as.character(max(via_cerrada$fecha, na.rm = TRUE)), "\n")## Periodo: 2024-09-26 → 2024-09-28
m_via_cerrada <- leaflet(via_cerrada) %>%
addTiles() %>%
addCircleMarkers(
lng = ~long,
lat = ~lat,
clusterOptions = markerClusterOptions(),
label = ~paste("Hora:", hora, "| Fecha:", fecha)
) %>%
addControl(html = "<h3>Mapa de Cierre de Vías</h3>", position = "topleft")
m_via_cerradaMapa Interactivo de Cierre de Vías: Con 1021 eventos registrados, los cierres de vías son el segundo tipo de evento más frecuente, y su distribución espacial muestra una concentración marcada en zonas específicas del área de estudio. La visualización en clústeres revela que muchos cierres ocurren en proximidad geográfica, lo que puede indicar zonas con obras en curso, eventos masivos o vías con mantenimiento recurrente. La exploración interactiva permite identificar segmentos de vía donde los cierres se repiten en diferentes momentos del día, evidenciando problemas crónicos de gestión vial. Algunos puntos aislados fuera de los clústeres principales pueden corresponder a cierres de emergencia o incidentes no planificados que afectan vías secundarias. La comparación visual con el mapa de congestión es reveladora: muchos focos de cierre de vías coinciden espacialmente con los focos de congestión, confirmando la relación causal entre ambos fenómenos. Este mapa es especialmente útil para planificadores de rutas alternativas: los sectores con mayor densidad de cierres deben tener rutas de desvío preestablecidas y señalizadas.
leaflet(via_cerrada) %>%
addProviderTiles("OpenStreetMap") %>%
addHeatmap(
lng = ~long,
lat = ~lat,
blur = 15,
max = 0.08,
radius = 18
) %>%
addLegend("bottomright",
title = "Mapa de Calor de Cierres de Vías",
colors = c("blue", "green", "yellow", "red"),
labels = c("Bajo", "Moderado", "Alto", "Muy Alto"))Mapa de Calor de Cierres de Vías: El mapa de calor de cierres muestra una distribución espacial con focos bien definidos, lo que contrasta con la dispersión más amplia observada en los eventos de peligro. Las zonas rojas identifican corredores o intersecciones donde los cierres de vías son recurrentes, posiblemente asociados a obras de infraestructura, eventos culturales o deportivos en el periodo analizado. La intensidad máxima se concentra en áreas relativamente pequeñas, lo que sugiere que los cierres no afectan de manera uniforme toda la red vial sino que impactan puntos neurálgicos específicos. Los radios de calor más pequeños utilizados para este tipo permiten mayor precisión espacial comparado con el mapa de congestión, apropiado dado que los cierres son eventos puntuales. La superposición de este mapa con la red vial principal revelaría si los cierres afectan arterias primarias (mayor impacto en movilidad) o vías secundarias (impacto más localizado). La planificación de desvíos para los sectores en rojo debería ser parte de los protocolos estándar de gestión de tráfico del área metropolitana.
zona_vc <- owin(
xrange = c(min(via_cerrada$long) - margen, max(via_cerrada$long) + margen),
yrange = c(min(via_cerrada$lat) - margen, max(via_cerrada$lat) + margen)
)
patron_vc <- ppp(x = via_cerrada$long, y = via_cerrada$lat, window = zona_vc)
plot(quadratcount(patron_vc, nx = 5, ny = 5),
main = "Patrón de Puntos y Test de Cuadrantes — VÍA CERRADA")
points(patron_vc, col = "red")Test de Cuadrantes y Función K (VÍA CERRADA): El test de cuadrantes para cierres de vías muestra una heterogeneidad espacial pronunciada: algunas celdas concentran cientos de eventos mientras la mayoría registra pocos o ninguno, evidenciando un patrón fuertemente agrupado. Esta concentración extrema en pocas celdas es más marcada que en PELIGRO, lo que confirma que los cierres responden a factores muy localizados (obras, eventos) en lugar de condiciones distribuidas por toda la red. La función K de Ripley para VÍA CERRADA muestra una desviación positiva muy pronunciada respecto a la aleatoriedad esperada, siendo la más intensa de todos los tipos de eventos analizados. Esta fuerte señal de agrupamiento indica que los cierres de vías se generan en procesos espacialmente dependientes: donde hay un cierre, hay alta probabilidad de que haya más cierres en los alrededores. Desde el punto de vista operativo, esto sugiere que las intervenciones de cierre tienden a implementarse en sectores delimitados del territorio (por ejemplo, zonas de obras lineales o polígonos de eventos).
Mapa de Densidad de Cierres de Vías: El mapa de densidad de cierres (sigma = 0.003°, ≈330 m) usa un suavizado más fino que el de peligros, lo que permite delimitar con mayor precisión los focos de cierre sin inflar artificialmente zonas sin eventos. Los picos de densidad máxima (zonas rojas) coinciden con los sectores identificados en el mapa de calor y el test de cuadrantes, validando la robustez del análisis espacial con diferentes métodos. La precisión de este mapa es especialmente útil para correlacionar los cierres con obras de infraestructura registradas en bases de datos municipales, permitiendo confirmar si los focos responden a causas planificadas o emergentes. Los sectores con densidad alta y sostenida a lo largo de un corredor lineal pueden indicar obras de larga duración que requieren planificación de desvíos permanentes durante el periodo de intervención. Cruzar este mapa con datos de tiempos de viaje y velocidades promedio permitiría cuantificar el impacto de los cierres en la movilidad general de la ciudad.
accidente <- Trama_Waze %>%
filter(tipo_evento == "ACCIDENTE") %>%
preparar_coords()
cat("Total eventos ACCIDENTE:", nrow(accidente), "\n")## Total eventos ACCIDENTE: 122
cat("Periodo:", as.character(min(accidente$fecha, na.rm = TRUE)),
"→", as.character(max(accidente$fecha, na.rm = TRUE)), "\n")## Periodo: 2024-09-26 → 2024-09-28
m_accidente <- leaflet(accidente) %>%
addTiles() %>%
addCircleMarkers(
lng = ~long,
lat = ~lat,
clusterOptions = markerClusterOptions(),
label = ~paste("Hora:", hora, "| Fecha:", fecha)
) %>%
addControl(html = "<h3>Mapa de Accidentes</h3>", position = "topleft")
m_accidenteMapa Interactivo de Accidentes: Con solo 122 accidentes en el periodo analizado, los marcadores individuales son claramente visibles en el mapa, lo que permite explorar la ubicación exacta de cada siniestro. A pesar del bajo volumen, se observan zonas donde los accidentes se repiten, indicando intersecciones o segmentos de vía con condiciones que favorecen la siniestralidad de forma recurrente, como lo es la gran afluencia de tráfico en la variante de Cajicá. La distribución de accidentes no coincide necesariamente con las zonas de mayor congestión, lo que sugiere que los accidentes pueden ocurrir tanto en condiciones de tráfico intenso como en vías de alta velocidad con menor volumen de vehículos. La información horaria en las etiquetas permite identificar si los accidentes se concentran en momentos específicos del día (horas pico, madrugada), lo que orienta estrategias de prevención diferenciadas por franja horaria.
leaflet(accidente) %>%
addProviderTiles("OpenStreetMap") %>%
addHeatmap(
lng = ~long,
lat = ~lat,
blur = 15,
max = 0.08,
radius = 16
) %>%
addLegend("bottomright",
title = "Mapa de Calor de Accidentes",
colors = c("blue", "green", "yellow", "red"),
labels = c("Bajo", "Moderado", "Alto", "Muy Alto"))Mapa de Calor de Accidentes: El mapa de calor de accidentes permite identificar zonas de concentración a pesar del bajo volumen total, revelando sectores donde los siniestros tienden a repetirse en el espacio. Las zonas de mayor intensidad (amarillo a rojo) señalan intersecciones o segmentos de vía con condiciones estructurales que elevan el riesgo: geometría desfavorable, falta de señalización, visibilidad reducida o alta velocidad operacional. La dispersión espacial de los accidentes es mayor que la de los cierres de vías, lo que refleja la naturaleza más aleatoria e impredecible de los siniestros respecto a las intervenciones planificadas. Los parámetros de visualización (blur=15, radius=16) balancean entre precisión espacial y visibilidad: con solo 122 puntos, un radio mayor habría producido manchas engañosamente grandes. Las zonas con calor moderado (verde-amarillo) merecen atención preventiva antes de que acumulen más siniestros; en seguridad vial, actuar antes del umbral crítico es más costo-efectivo que intervenir después. La ausencia de calor en zonas con alto tráfico puede indicar infraestructura de buena calidad o simplemente baja cobertura de usuarios de Waze que reporten accidentes en esas áreas.
zona_ac <- owin(
xrange = c(min(accidente$long) - margen, max(accidente$long) + margen),
yrange = c(min(accidente$lat) - margen, max(accidente$lat) + margen)
)
patron_ac <- ppp(x = accidente$long, y = accidente$lat, window = zona_ac)
plot(quadratcount(patron_ac, nx = 5, ny = 5),
main = "Patrón de Puntos y Test de Cuadrantes — ACCIDENTE")
points(patron_ac, col = "red")Test de Cuadrantes y Función K (ACCIDENTE): El test de cuadrantes para accidentes refleja la baja densidad del fenómeno: con solo 122 eventos en un área extensa, la mayoría de celdas tiene pocos puntos y algunas aparecen vacías, lo que limita la resolución del análisis pero no invalida las conclusiones. Las celdas con mayor recuento identifican zonas de siniestralidad concentrada que deben compararse con el conocimiento local de la red vial para confirmar si corresponden a puntos negros conocidos. La función K de Ripley para ACCIDENTE es la más informativa del análisis: si la curva empírica supera la teórica, confirma que incluso con pocos eventos los accidentes muestran agrupamiento espacial, lo que descarta la hipótesis de distribución puramente aleatoria. Un agrupamiento detectado en la función K implica que los accidentes responden a condicionantes espaciales locales (diseño vial, visibilidad, velocidad) y no a simple azar, lo cual justifica intervenciones de infraestructura focalizadas. La interpretación de la función K con pocos puntos requiere cautela estadística; los resultados son indicativos y deben complementarse con análisis multitemporal cuando se disponga de datos de periodos más largos. La combinación del test de cuadrantes y la función K proporciona evidencia espacial suficiente para argumentar la necesidad de auditorías de seguridad vial en los sectores identificados como focos de siniestralidad.
Mapa de Densidad de Accidentes: El mapa de densidad de accidentes usa el mismo sigma que PELIGRO (0.008°, ≈880 m) para garantizar visibilidad con el bajo volumen de eventos; este suavizado es intencionalmente mayor que el usado para cierres de vías. Las zonas rojas son relativamente escasas, lo que refleja fielmente el bajo número de accidentes; sin embargo, su posición geográfica es precisa y accionable para las autoridades de seguridad vial. Los núcleos de densidad alta identifican los puntos negros de accidentalidad del área: lugares donde la probabilidad estadística de que ocurra un accidente es significativamente superior al promedio. Las zonas con densidad moderada (verde-amarillo) que no han alcanzado el umbral de punto negro merecen monitoreo preventivo para evitar que la acumulación de incidentes las eleve a categoría crítica.
congestion <- Trama_Waze %>%
filter(tipo_evento == "CONGESTIÓN") %>%
preparar_coords()
cat("Total eventos CONGESTIÓN:", nrow(congestion), "\n")## Total eventos CONGESTIÓN: 3151
cat("Periodo:", as.character(min(congestion$fecha, na.rm = TRUE)),
"→", as.character(max(congestion$fecha, na.rm = TRUE)), "\n")## Periodo: 2024-09-26 → 2024-09-28
m_congestion <- leaflet(congestion) %>%
addTiles() %>%
addCircleMarkers(
lng = ~long,
lat = ~lat,
clusterOptions = markerClusterOptions(),
label = ~paste("Hora:", hora, "| Fecha:", fecha)
) %>%
addControl(html = "<h3>Mapa de Congestión</h3>", position = "topleft")
m_congestionMapa Interactivo de Congestión: Con 3151 eventos, la congestión es el fenómeno dominante del dataset y su mapa interactivo muestra la red vial afectada con mayor claridad que cualquier otro tipo de evento analizado. Los clústeres de mayor tamaño revelan los corredores de mayor congestión recurrente: arterias principales, accesos a zonas comerciales o industriales y nodos de intercambio modal. Al hacer zoom hacia los clústeres más grandes, se pueden identificar intersecciones específicas donde la congestión se concentra, lo que orienta inversiones en semaforización inteligente o control de accesos. La distribución espacial de la congestión sigue claramente la traza de la red vial principal, a diferencia de los accidentes que presentan más dispersión; esto confirma que la congestión es un fenómeno estructural ligado al diseño de la red. La información de hora en las etiquetas permite distinguir si los clústeres se mantienen estables durante todo el día o si corresponden exclusivamente a horas pico, diferencia crítica para dimensionar las intervenciones necesarias. Este mapa es la base para la priorización de intervenciones: los clústeres más grandes en los corredores más importantes deben ser el punto de partida de cualquier plan de gestión de tráfico.
Sin intensity para que cada punto contribuya por igual y
el color refleje genuinamente dónde se acumula la congestión, sin sesgo
por la hora del reporte.
leaflet(congestion) %>%
addProviderTiles("OpenStreetMap") %>%
addHeatmap(
lng = ~long,
lat = ~lat,
blur = 25,
max = 0.05,
radius = 20
) %>%
addLegend("bottomright",
title = "Mapa de Calor de Congestión",
colors = c("blue", "green", "yellow", "red"),
labels = c("Bajo", "Moderado", "Alto", "Muy Alto"))Mapa de Calor de Congestión: El mapa de calor de congestión es el más informativo del conjunto: con 3151 eventos distribuidos en el área de estudio, muestra con claridad la topografía del tráfico urbano durante el periodo analizado. Las zonas rojas identifican los corredores de congestión crónica donde la frecuencia de reportes es máxima, señalando los cuellos de botella estructurales de la red vial que requieren soluciones a mediano y largo plazo. Es decir las vías principales por las cuales pasan los vehículos para municipios al norte de Cajicá, en particular la variante y la salida a la vía Bogotá Tunja. La forma alargada de los focos de calor (siguiendo la dirección de las vías) confirma que la congestión es un fenómeno de corredor, no puntual, lo que requiere soluciones a escala de tramo completo.
zona_cg <- owin(
xrange = c(min(congestion$long) - margen, max(congestion$long) + margen),
yrange = c(min(congestion$lat) - margen, max(congestion$lat) + margen)
)
patron_cg <- ppp(x = congestion$long, y = congestion$lat, window = zona_cg)
plot(quadratcount(patron_cg, nx = 5, ny = 5),
main = "Patrón de Puntos y Test de Cuadrantes — CONGESTIÓN")
points(patron_cg, col = "red")Test de Cuadrantes y Función K (CONGESTIÓN): Con 3151 puntos, el test de cuadrantes de congestión produce los recuentos más altos y estables del análisis: las celdas con más eventos llegan a concentrar decenas o cientos de reportes, mostrando la densidad del fenómeno. La distribución entre celdas no es uniforme: los cuadrantes que cubren los corredores principales acumulan varios veces más eventos que los que cubren zonas residenciales o periféricas, evidenciando la estructura radial o en corredor de la congestión urbana. La función K de Ripley para CONGESTIÓN muestra el agrupamiento espacial más robusto de todos los tipos analizados, dado el alto número de puntos: la curva empírica supera ampliamente la teórica en todas las distancias evaluadas. El exceso de la curva K observada respecto a la teórica es estadísticamente muy significativo con 3151 puntos, confirmando sin ambigüedad que la congestión no es aleatoria en el espacio sino que responde a la estructura de la red vial. La escala a la que la función K muestra mayor separación entre curvas indica el radio de influencia de los corredores congestionados: zonas extensas donde la congestión en un punto se propaga y correlaciona con la de los puntos vecinos. Este resultado es la base estadística que justifica los programas de gestión de demanda (restricciones de circulación, pico y placa, incentivos al transporte público, peajes internos) como estrategias sistémicas en lugar de intervenciones punto a punto.
Vista sincronizada de los cuatro tipos de eventos. Al desplazarse o hacer zoom en uno, los demás se sincronizan automáticamente.
Vista Consolidada de los Cuatro Tipos de Eventos: La vista sincronizada permite comparar simultáneamente la distribución espacial de todos los tipos de eventos, revelando patrones de co-ocurrencia y diferencias estructurales entre fenómenos. Se observa que la congestión y los cierres de vías tienden a solaparse espacialmente en varios corredores, lo que confirma la relación causal entre ambos: los cierres generan congestión aguas arriba y en las rutas alternativas. Los accidentes muestran una distribución diferente: algunos focos coinciden con zonas de alta congestión (accidentes relacionados con el tráfico denso) pero otros aparecen en zonas con pocos eventos de otros tipos (accidentes en vías de alta velocidad o con visibilidad reducida). Los peligros tienen su propio patrón espacial, parcialmente superpuesto con la congestión pero con núcleos propios que pueden corresponder a deterioro de infraestructura en zonas que no necesariamente son las más congestionadas. La sincronización de zoom facilita la identificación de zonas de riesgo compuesto: sectores donde coinciden alta congestión, peligros frecuentes y accidentes, que deben ser la prioridad de intervención integral.
La superficie tridimensional permite ver la topografía del riesgo: los picos representan las zonas de mayor concentración de eventos. El eje Z muestra la densidad estimada normalizada (0 = sin eventos, 1 = máxima concentración).
im_p_3d <- density(patron_p, sigma = 0.008, dimyx = c(80, 80))
z_p <- t(im_p_3d$v)
x_p <- im_p_3d$xcol
y_p <- im_p_3d$yrow
z_p <- (z_p - min(z_p, na.rm = TRUE)) /
(max(z_p, na.rm = TRUE) - min(z_p, na.rm = TRUE))
plot_ly(x = ~x_p, y = ~y_p, z = ~z_p, type = "surface",
colorscale = list(c(0,"rgb(0,0,128)"), c(0.3,"rgb(0,128,0)"),
c(0.6,"rgb(255,255,0)"), c(1,"rgb(255,0,0)")),
showscale = TRUE,
colorbar = list(title = "Densidad\nnormalizada")) %>%
layout(title = "Superficie de Densidad 3D — PELIGRO",
scene = list(xaxis = list(title = "Longitud"),
yaxis = list(title = "Latitud"),
zaxis = list(title = "Densidad"),
camera = list(eye = list(x = 1.5, y = -1.8, z = 1.2))))Superficie 3D de Densidad (PELIGRO): La superficie tridimensional de densidad de peligros convierte los datos espaciales en una representación intuitiva donde la altura de los picos es proporcional a la concentración local de eventos. Los picos más elevados (color rojo, altura máxima) corresponden exactamente a los núcleos identificados en los mapas 2D, validando la consistencia del análisis y añadiendo una dimensión visual que facilita la comunicación de resultados. La forma y extensión de los picos revela si los focos de peligro son puntuales (picos estrechos y agudos) o de corredor (crestas alargadas), información que orienta el tipo de intervención más adecuada. Las zonas de la superficie con altura cercana a cero corresponden al fondo difuso del área sin eventos significativos; el corte de intensidad > 0.01 aplicado previamente elimina este ruido de la visualización 2D pero en 3D se aprecia todo el gradiente.
im_cg_3d <- density(patron_cg, dimyx = c(80, 80))
z_cg <- t(im_cg_3d$v)
x_cg <- im_cg_3d$xcol
y_cg <- im_cg_3d$yrow
z_cg <- (z_cg - min(z_cg, na.rm = TRUE)) /
(max(z_cg, na.rm = TRUE) - min(z_cg, na.rm = TRUE))
plot_ly(x = ~x_cg, y = ~y_cg, z = ~z_cg, type = "surface",
colorscale = list(c(0,"rgb(0,0,128)"), c(0.3,"rgb(0,128,0)"),
c(0.6,"rgb(255,255,0)"), c(1,"rgb(255,0,0)")),
showscale = TRUE,
colorbar = list(title = "Densidad\nnormalizada")) %>%
layout(title = "Superficie de Densidad 3D — CONGESTIÓN",
scene = list(xaxis = list(title = "Longitud"),
yaxis = list(title = "Latitud"),
zaxis = list(title = "Densidad"),
camera = list(eye = list(x = 1.5, y = -1.8, z = 1.2))))Superficie 3D de Densidad (CONGESTIÓN): La superficie 3D de congestión es visualmente la más compleja del análisis: con 3151 puntos, genera una topografía de múltiples picos y crestas que refleja la estructura de la red vial congestionada. Las crestas lineales (elevaciones alargadas que siguen una dirección) corresponden a corredores viales con congestión sostenida a lo largo de su trazado, mientras los picos aislados señalan intersecciones o nodos de alta concentración. La altura relativa de los picos permite comparar directamente la intensidad de la congestión entre diferentes corredores: los picos más altos son los cuellos de botella que generan el mayor impacto en la movilidad urbana. La topografía 3D revela zonas de “llanura” (densidad uniforme y moderada) que pueden corresponder a redes de calles secundarias con congestión distribuida, diferente de los corredores principales con picos pronunciados.
im_ac_3d <- density(patron_ac, sigma = 0.008, dimyx = c(80, 80))
z_ac <- t(im_ac_3d$v)
x_ac <- im_ac_3d$xcol
y_ac <- im_ac_3d$yrow
z_ac <- (z_ac - min(z_ac, na.rm = TRUE)) /
(max(z_ac, na.rm = TRUE) - min(z_ac, na.rm = TRUE))
plot_ly(x = ~x_ac, y = ~y_ac, z = ~z_ac, type = "surface",
colorscale = list(c(0,"rgb(0,0,128)"), c(0.3,"rgb(0,128,0)"),
c(0.6,"rgb(255,255,0)"), c(1,"rgb(255,0,0)")),
showscale = TRUE,
colorbar = list(title = "Densidad\nnormalizada")) %>%
layout(title = "Superficie de Densidad 3D — ACCIDENTE",
scene = list(xaxis = list(title = "Longitud"),
yaxis = list(title = "Latitud"),
zaxis = list(title = "Densidad"),
camera = list(eye = list(x = 1.5, y = -1.8, z = 1.2))))Superficie 3D de Densidad (ACCIDENTE): La superficie 3D de accidentes contrasta marcadamente con la de congestión: con solo 122 eventos, presenta pocos picos bien diferenciados sobre una llanura casi plana, lo que refleja fielmente la rareza relativa del fenómeno. Los picos que emergen de la superficie plana son los puntos negros de accidentalidad: lugares donde la probabilidad de siniestro es estadísticamente superior al resto del territorio y que justifican intervenciones urgentes de seguridad vial. La altura de los picos está normalizada entre 0 y 1, por lo que el pico máximo representa el punto de mayor concentración relativa de accidentes, independientemente del volumen absoluto (bajo en comparación con la congestión). La visualización 3D es especialmente útil para accidentes porque permite ver simultáneamente la escasez general del fenómeno (superficie plana) y la existencia de focos concretos (picos), comunicando mejor la heterogeneidad espacial que un mapa 2D. Los picos de accidentes que se superponen visualmente con picos de otros tipos (al comparar las tres superficies) señalan zonas de riesgo compuesto donde intervenciones integrales (infraestructura + señalización + gestión de tráfico) son necesarias. La baja densidad de picos y su altura moderada confirma que los accidentes, aunque graves individualmente, no conforman un problema territorialmente masivo sino focalizado en puntos específicos que pueden ser intervenidos de forma costo-efectiva.
El análisis realizado sobre los datos de Waze del 26 al 28 de septiembre de 2024 proporciona evidencia espacial y estadística sólida sobre los patrones de movilidad y seguridad vial del área de estudio.
El dataset comprende 5019 eventos totales distribuidos en cuatro categorías con perfiles muy diferentes:
Los análisis con spatstat demuestran de forma
consistente que ninguno de los cuatro tipos de eventos se
distribuye aleatoriamente en el espacio. En todos los casos, la
función K de Ripley empírica supera la esperada bajo aleatoriedad
completa, con diferentes intensidades:
La vista sincronizada y la comparación de mapas de densidad permiten identificar tres tipos de relación espacial:
Intervención prioritaria en corredores de riesgo compuesto: Los sectores donde coinciden congestión alta, peligros frecuentes y proximidad a accidentes deben recibir atención integral: mantenimiento de vía, señalización reforzada y gestión activa del flujo vehicular.
Plan de rutas alternativas para zonas de cierre recurrente: Los focos de alta densidad de cierres identificados en el mapa de densidad deben contar con rutas de desvío preestablecidas, señalizadas y comunicadas proactivamente a los usuarios antes de que los cierres ocurran.
Auditorías de seguridad vial en puntos negros de accidentalidad: Los picos identificados en la superficie 3D y el mapa de densidad de accidentes deben ser objeto de revisión técnica (geometría, visibilidad, señalización, velocidad operacional) independientemente del volumen de tráfico del sector.
Semaforización inteligente en intersecciones críticas de congestión: Los nodos identificados como picos en la superficie 3D de congestión son candidatos prioritarios para implementación de semáforos adaptativos con gestión en tiempo real basada en datos de Waze u otras fuentes de tráfico.
Ampliación del periodo de análisis: Incorporar al menos 90 días de datos para distinguir patrones estructurales de eventos puntuales, y añadir variables temporales (día de semana, festividades, condiciones climáticas) para enriquecer el análisis multivariado.
Monitoreo continuo con alertas automáticas: Implementar un sistema de actualización periódica (semanal o mensual) del análisis para detectar cambios en los patrones de movilidad en tiempo próximo al real, permitiendo respuestas más ágiles de las autoridades de tránsito.
Análisis realizado con R y la metodología CRISP-DM. Datos fuente: Waze — Trama Waze.xlsx. Periodo: 26–28 de septiembre de 2024.