El análisis espacial de eventos puntuales constituye una de las áreas fundamentales de la estadística espacial. A diferencia de los datos convencionales, donde las observaciones se consideran independientes, los fenómenos geográficos suelen presentar dependencia espacial, es decir, la ocurrencia de un evento en una ubicación puede estar relacionada con la ocurrencia de otros eventos cercanos.
Desde la teoría de procesos puntuales, la estructura espacial puede modelarse mediante una función de intensidad λ(s), la cual describe la tasa esperada de ocurrencia de eventos en cada ubicación del espacio. Esta función permite evaluar si los eventos siguen un comportamiento aleatorio o si presentan dependencia espacial.
En particular, los patrones espaciales pueden clasificarse como:
En el contexto de la movilidad urbana, los reportes generados por plataformas colaborativas como Waze representan observaciones georreferenciadas que permiten estudiar patrones espaciales asociados a la congestión vehicular, accidentes, peligros viales y cierres de vías. El análisis de estos eventos facilita la identificación de zonas críticas, la evaluación de dinámicas territoriales y el apoyo a la toma de decisiones en materia de gestión del transporte.
Una de las técnicas más utilizadas para estudiar la distribución espacial de eventos es la estimación de densidad Kernel. Este método permite transformar observaciones puntuales en una superficie continua de intensidad, facilitando la identificación de áreas con alta concentración de eventos o puntos críticos dentro del territorio analizado.
Complementariamente, la función K de Ripley constituye una herramienta estadística para evaluar la estructura espacial de un conjunto de puntos a diferentes escalas de distancia. Esta función compara el patrón observado con un modelo teórico de aleatoriedad espacial completa (CSR), permitiendo determinar si existe evidencia de agrupamiento o dispersión espacial.
Otra herramienta ampliamente utilizada en el análisis de patrones puntuales es el Test de Cuadrantes (Quadrat Count Test), el cual divide el área de estudio en una malla regular y compara la frecuencia observada de eventos en cada cuadrante.
La combinación de análisis exploratorio espacial, estimación de densidad Kernel y función K de Ripley proporciona un marco metodológico robusto para comprender la organización espacial de los eventos reportados.
La movilidad urbana contemporánea representa un sistema complejo caracterizado por interacciones dinámicas entre infraestructura vial, demanda de transporte y comportamiento de los usuarios.
En este contexto, los eventos de tráfico reportados por plataformas colaborativas como Waze constituyen observaciones indirectas del estado del sistema vial urbano. Estos eventos —accidentes, congestión, peligros y cierres viales— permiten aproximar la dinámica del tráfico desde una perspectiva espacio-temporal.
El presente estudio se enfoca en el análisis de la distribución espacial de eventos reportados durante un día específico (día 26), con el objetivo de identificar estructuras de concentración, zonas críticas de riesgo y posibles patrones de autoorganización del sistema de movilidad urbana.
Caracterizar la estructura espacial y temporal de los eventos de movilidad urbana reportados por Waze en la ciudad de Bogotá durante el día 26, mediante técnicas de estadística espacial como densidad Kernel, función K de Ripley y test de cuadrantes, con el fin de identificar patrones de concentración y dependencia espacial.
El desarrollo de este estudio se estructuró siguiendo la metodología CRISP-DM (Cross Industry Standard Process for Data Mining), adaptada al análisis espacial de eventos reportados por la plataforma Waze en la ciudad de Bogotá.
El problema abordado corresponde a la identificación de patrones espaciales asociados a eventos de movilidad reportados por usuarios de Waze. El interés principal consiste en reconocer zonas donde se concentran accidentes, congestiones vehiculares y cierres de vías, con el propósito de generar información que pueda apoyar procesos de gestión del tránsito y planificación urbana.
Se utilizó una base de datos de reportes generados por usuarios de Waze, la cual contiene información temporal y espacial de los eventos registrados. Durante esta fase se realizó una exploración inicial para conocer la estructura de los datos, identificar las variables relevantes y verificar la calidad de los registros geográficos disponibles.
Los datos fueron sometidos a procesos de limpieza y transformación orientados al análisis espacial: conversión de fechas, extracción de variables temporales, clasificación de eventos, depuración de registros y ajuste de coordenadas geográficas.
La fase de modelado se centró en la aplicación de técnicas de análisis de patrones puntuales: mapas interactivos para exploración espacial, estimación de densidad Kernel, Test de Cuadrantes y Función K de Ripley.
Los resultados fueron interpretados para determinar el comportamiento espacial de los eventos analizados: presencia de agrupamientos, localización de puntos críticos y diferencias entre tipos de eventos.
Los resultados se presentaron mediante mapas interactivos, estimaciones de densidad Kernel y comparaciones entre tipos de eventos, convirtiendo el análisis espacial en información útil para la gestión del tránsito.
library(DiagrammeR)
grViz("
digraph CRISPDM_WAZE {
graph [layout = neato, overlap = false, splines = true]
node [shape = box, style = 'rounded,filled', fontname = Helvetica,
fontsize = 18, width = 2.8, height = 1.0, penwidth = 2]
A [label='Comprensión\\ndel negocio', pos='0,4!', fillcolor='#4E79A7', fontcolor='white']
B [label='Comprensión\\nde los datos', pos='4,4!', fillcolor='#59A14F', fontcolor='white']
C [label='Preparación\\nde los datos', pos='6,0!', fillcolor='#F28E2B', fontcolor='white']
D [label='Modelado', pos='4,-4!', fillcolor='#E15759', fontcolor='white']
E [label='Evaluación', pos='0,-4!', fillcolor='#B07AA1', fontcolor='white']
F [label='Despliegue', pos='-2,0!', fillcolor='#76B7B2', fontcolor='white']
CRISP [
label='ANÁLISIS ESPACIAL\nDE EVENTOS WAZE\n\n──────────\n\nKernel Density\nQuadrat Count\nRipley K',
shape=circle, pos='2,0!', width=2.8, height=2.8, fontsize=20,
fillcolor='#F2F2F2', style='filled', penwidth=2.5
]
edge [color='gray40', penwidth=2.5]
A -> B B -> C C -> D D -> E E -> F F -> A
CRISP -> A [style=dotted, arrowhead=none]
CRISP -> B [style=dotted, arrowhead=none]
CRISP -> C [style=dotted, arrowhead=none]
CRISP -> D [style=dotted, arrowhead=none]
CRISP -> E [style=dotted, arrowhead=none]
CRISP -> F [style=dotted, arrowhead=none]
}
")Diagrama CRISP-DM aplicado al análisis de eventos Waze
En esta sección se realiza la carga y preparación de los datos obtenidos desde Waze. Los datos se encuentran almacenados en un archivo Excel y se procesan las fechas de creación de cada evento para asegurarnos de que están en el formato adecuado para el análisis temporal.
Catálogo de variables principales:
| Variable | Descripción |
|---|---|
creation_Date |
Fecha y hora de creación del reporte |
type |
Tipo de evento: ACCIDENT, HAZARD, JAM, ROAD_CLOSED |
location_y |
Coordenada Y (latitud codificada) |
location_x |
Coordenada X (longitud codificada) |
library(readxl)
library(dplyr)
library(lubridate)
ruta <- "Trama Waze.xlsx"
waze <- read_excel(ruta, guess_max = 10000)
waze$creation_Date <- trimws(as.character(waze$creation_Date))
waze$type <- trimws(toupper(as.character(waze$type))) # 🔥 clave para evitar errores
waze$fecha <- parse_date_time(
waze$creation_Date,
orders = c("ymd HMS", "ymd HM", "ymd",
"dmy HMS", "dmy HM",
"Ymd HMS", "Ymd HM"),
tz = "America/Bogota"
)
waze$hora <- lubridate::hour(waze$fecha)
waze$dia <- lubridate::day(waze$fecha)
waze$tipo_evento <- dplyr::recode(
waze$type,
"ACCIDENT" = "ACCIDENTE",
"HAZARD" = "PELIGRO",
"JAM" = "CONGESTIÓN",
"ROAD_CLOSED" = "VÍA CERRADA",
.default = "OTRO"
)
table(waze$tipo_evento, useNA = "ifany")##
## ACCIDENTE CONGESTIÓN PELIGRO VÍA CERRADA
## 125 3205 719 1021
El análisis temporal permite identificar la variabilidad horaria de la ocurrencia de incidentes de movilidad urbana, evidenciando los momentos del día con mayor presión sobre la red vial.
library(ggplot2)
hora_factorizado <- factor(waze$hora, levels = 0:23)
ggplot(mapping = aes(x = hora_factorizado)) +
geom_bar(fill = "orange", 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)Frecuencia de eventos por hora del día
Los resultados evidencian que la congestión vehicular constituye el evento predominante dentro del sistema analizado, seguida por accidentes y condiciones de riesgo. Esta distribución no uniforme indica la posible existencia de áreas con alta centralidad funcional donde la acumulación de flujos vehiculares incrementa la probabilidad de incidentes.
frecuencia_eventos <- waze %>%
group_by(tipo_evento) %>%
summarise(Frecuencia = n()) %>%
arrange(desc(Frecuencia))
ggplot(frecuencia_eventos, aes(x = tipo_evento, y = Frecuencia, fill = tipo_evento)) +
geom_col() +
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") +
guides(fill = "none")Distribución de tipos de eventos en Trama Waze
La distribución de frecuencias muestra diferencias importantes entre categorías de eventos. La predominancia de determinados tipos de incidentes sugiere que la movilidad urbana presenta problemas recurrentes asociados a congestión y seguridad vial. Estas diferencias justifican la realización de análisis espaciales independientes para cada categoría.
En esta etapa se realiza la segmentación del conjunto de datos para seleccionar únicamente los eventos de tipo PELIGRO registrados durante el día 26.
peligro26 <- waze %>%
filter(tipo_evento == "PELIGRO", dia == 26)
table(peligro26$tipo_evento, useNA = "ifany")##
## PELIGRO
## 148
## Número de registros en peligro26: 148
El filtrado permite aislar los eventos clasificados como “PELIGRO” ocurridos durante el día 26, los cuales constituyen la base del análisis espacial posterior.
Una vez filtrados los eventos PELIGRO, se visualizan en un mapa interactivo. Los marcadores agrupados (clusters) permiten explorar las ubicaciones exactas y facilitan la identificación visual de concentraciones espaciales.
Se aplica estimación de densidad Kernel y análisis de patrones puntuales (test de cuadrantes y función K de Ripley) sobre los eventos PELIGRO del día 26.
library(spatstat.geom)
library(spatstat.explore)
# Ventana de análisis (área de Bogotá)
win <- owin(
xrange = c(-74.05, -73.98),
yrange = c(4.88, 4.95)
)
pp_peligro <- ppp(peligro26$long, peligro26$lat, window = win)
# Test de cuadrantes
plot(
quadratcount(pp_peligro),
main = "Patrón de Puntos y Test de Cuadrantes — Peligro"
)
points(pp_peligro, col = "red")Análisis espacial de eventos PELIGRO
Análisis espacial de eventos PELIGRO
Si algunos cuadrantes presentan una concentración significativamente mayor de eventos que otros, ello constituye evidencia inicial de agrupamiento espacial y sugiere que los reportes no se distribuyen de manera uniforme dentro del territorio analizado.
Cuando la curva observada se ubica por encima de la expectativa teórica de aleatoriedad espacial completa (CSR), se interpreta como evidencia de agrupamiento espacial. Valores inferiores sugieren patrones de dispersión o inhibición entre eventos.
La estimación de densidad Kernel transforma las ubicaciones individuales de los eventos en una superficie continua de intensidad, permitiendo visualizar las áreas de mayor concentración (hotspots).
library(terra)
library(leaflet.extras)
library(scales)
dens_peligro <- density(pp_peligro, sigma = 0.01)
r_peligro <- rast(dens_peligro)
df_peligro <- as.data.frame(r_peligro, xy = TRUE)
colnames(df_peligro) <- c("long", "lat", "intensity")
df_peligro$intensity <- rescale(df_peligro$intensity)
leaflet(df_peligro) %>%
addProviderTiles("OpenStreetMap") %>%
addHeatmap(
lng = ~long,
lat = ~lat,
intensity = ~intensity,
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")
)Los eventos de tipo VÍA CERRADA representan restricciones físicas o administrativas en la red vial, con impacto directo en la conectividad espacial y en la redistribución de flujos de movilidad.
via_cerrada_26 <- waze %>%
filter(tipo_evento == "VÍA CERRADA", dia == 26) %>%
mutate(
lat = as.numeric(location_y) / 1e6,
long = as.numeric(location_x) / 1e6
) %>%
filter(
!is.na(lat), !is.na(long),
lat > 4 & lat < 5,
long < -73 & long > -75
)
cat("Registros VÍA CERRADA día 26:", nrow(via_cerrada_26), "\n")## Registros VÍA CERRADA día 26: 318
## Mapa Interactivo de Cierres de Vías
m26_via_cerrada <- leaflet(via_cerrada_26) %>%
addTiles() %>%
setView(lng = -74.0721, lat = 4.7110, zoom = 11) %>% # Bogotá centrado
addCircleMarkers(
lng = ~long,
lat = ~lat,
clusterOptions = markerClusterOptions(),
label = ~hora
) %>%
addControl(html = "<h3>Mapa de Cierre de Vías</h3>", position = "topleft")
m26_via_cerradazona <- owin(
xrange = c(-74.04331, -73.9929),
yrange = c(4.885736, 4.948562)
)
pp_via <- ppp(via_cerrada_26$long, via_cerrada_26$lat, window = zona)
plot(quadratcount(pp_via), main = "Test de Cuadrantes — Vía Cerrada")
points(pp_via, col = "red")Análisis espacial VÍA CERRADA
Análisis espacial VÍA CERRADA
dens_via <- density(pp_via, sigma = 0.01)
mapa_via <- rast(dens_via)
df_via <- as.data.frame(mapa_via, xy = TRUE)
colnames(df_via) <- c("long", "lat", "intensity")
df_via$intensity <- rescale(df_via$intensity)
leaflet(df_via) %>%
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")
)Los accidentes constituyen eventos puntuales asociados a la seguridad vial. Su análisis espacial permite identificar posibles zonas de concentración y evaluar si la distribución responde a un patrón aleatorio o a procesos de agrupamiento espacial.
pp_acc <- ppp(accidente_26$long, accidente_26$lat, window = zona)
plot(quadratcount(pp_acc), main = "Test de Cuadrantes — Accidentes")
points(pp_acc, col = "red")Análisis espacial de Accidentes
Análisis espacial de Accidentes
dens_acc <- density(pp_acc)
mapa_acc <- rast(dens_acc)
df_acc <- as.data.frame(mapa_acc, xy = TRUE)
colnames(df_acc) <- c("long", "lat", "intensity")
df_acc$intensity <- rescale(df_acc$intensity)
leaflet(df_acc) %>%
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")
)La congestión vehicular representa una condición de saturación del sistema vial. Su análisis permite identificar corredores críticos y zonas donde la demanda de transporte supera la capacidad de la infraestructura vial.
pp_cong <- ppp(congestion_26$long, congestion_26$lat, window = zona)
plot(quadratcount(pp_cong), main = "Test de Cuadrantes — Congestión")
points(pp_cong, col = "red")Análisis espacial de Congestión
Análisis espacial de Congestión
dens_cong <- density(pp_cong)
mapa_cong <- rast(dens_cong)
df_cong <- as.data.frame(mapa_cong, xy = TRUE)
colnames(df_cong) <- c("long", "lat", "intensity")
df_cong$intensity <- rescale(df_cong$intensity)
leaflet(df_cong) %>%
addProviderTiles("OpenStreetMap") %>%
addHeatmap(
lng = ~long,
lat = ~lat,
intensity = ~intensity,
blur = 35,
max = max(df_cong$intensity) * 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")
)La sincronización de mapas permite comparar de manera simultánea la distribución espacial de los distintos tipos de eventos reportados por Waze, facilitando la identificación de zonas donde coexisten múltiples problemáticas de movilidad.
El análisis exploratorio de los datos de movilidad reportados por Waze permitió identificar patrones temporales y espaciales relevantes en la ocurrencia de incidentes viales durante el día 26.
La distribución horaria evidenció variaciones en la intensidad de los reportes, reflejando la influencia de la dinámica cotidiana de movilidad sobre el sistema vial urbano.
La caracterización de los tipos de eventos mostró una predominancia de congestión vehicular, seguida por accidentes y situaciones de riesgo, sugiriendo problemas relacionados con saturación de la infraestructura vial.
La estimación de densidad Kernel evidenció la presencia de zonas de alta concentración (hotspots) de movilidad: sectores críticos donde la ocurrencia de incidentes es más frecuente y donde podrían priorizarse intervenciones.
La aplicación de la función K de Ripley indicó que la distribución observada no corresponde a un patrón completamente aleatorio, sino que presenta tendencias de agrupamiento espacial, lo cual sugiere la existencia de procesos urbanos subyacentes que condicionan la localización de los incidentes.
El uso de datos colaborativos como los de Waze representa una herramienta valiosa para las autoridades encargadas de la gestión de tráfico, permitiendo 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.
Baddeley, A., Rubak, E., & Turner, R. (2015). Spatial Point Patterns: Methodology and Applications with R. Chapman & Hall/CRC.
Bivand, R., Pebesma, E., & Gómez-Rubio, V. (2013). Applied Spatial Data Analysis with R (2nd ed.). Springer.
Pebesma, E., & Bivand, R. (2023). Spatial Data Science with Applications in R. Chapman & Hall/CRC.
Ripley, B. D. (1981). Spatial Statistics. John Wiley & Sons.
Waze for Cities. (2025). Data Sharing Program. Waze.
Wickham, H., et al. (2019). Welcome to the Tidyverse. Journal of Open Source Software, 4(43), 1686.
Xie, Y., Allaire, J. J., & Grolemund, G. (2018). R Markdown: The Definitive Guide. Chapman & Hall/CRC.