1 Marco Teórico

El análisis espacial de eventos puntuales constituye una de las áreas fundamentales de la estadística espacial. Los eventos reportados por plataformas colaborativas como Waze permiten estudiar patrones de movilidad urbana asociados a congestiones, accidentes, peligros viales y cierres de vías.

La estadística espacial permite identificar patrones de agrupamiento, dispersión o aleatoriedad en la distribución de eventos geográficos. Entre las técnicas más utilizadas se encuentran la estimación de densidad Kernel, el Test de Cuadrantes y la Función K de Ripley.

La densidad Kernel permite transformar observaciones puntuales en una superficie continua de intensidad, facilitando la identificación de zonas críticas. Por su parte, la Función K de Ripley permite evaluar si los eventos presentan agrupamiento espacial respecto a un patrón aleatorio.

2 Introducción

La movilidad urbana representa un sistema dinámico influenciado por factores sociales, económicos y territoriales. Los reportes generados por los usuarios de Waze constituyen una fuente valiosa de información para comprender el comportamiento del tráfico y los incidentes viales.

El presente estudio analiza la distribución temporal y espacial de los eventos reportados durante el día 26, con el propósito de identificar patrones relevantes para la gestión y planificación de la movilidad urbana.

3 Objetivo

Caracterizar la estructura espacial y temporal de los eventos reportados por Waze mediante técnicas de análisis exploratorio y estadística espacial.

4 Metodología CRISP-DM

La metodología CRISP-DM (Cross-Industry Standard Process for Data Mining) es un estándar para la ejecución de proyectos de minería de datos. Esta metodología consta de seis fases que guían el proceso desde la comprensión del negocio hasta el despliegue de los resultados.

4.1 Comprensión del Negocio

  • Objetivo: Mejorar la movilidad y seguridad vial mediante el análisis de datos de Waze.
  • Necesidad: Identificar patrones de tráfico y áreas críticas para orientar acciones de gestión y planificación urbana.

4.2 Comprensión de los Datos

  • Recopilación de Datos: Se obtienen los datos de eventos reportados en Waze el día 26.
  • Exploración Inicial: Se analiza la estructura de los datos, tipos de eventos, distribución temporal y espacial.

4.3 Preparación de los Datos

  • Limpieza: Se manejan valores faltantes y se corrigen inconsistencias en los datos.
  • Transformación: Se convierten formatos de fecha y hora, y se ajustan las coordenadas geográficas.
  • Enriquecimiento: Se traducen las categorías de eventos al español para facilitar el análisis.

4.4 Modelado

  • Selección de Técnicas: Se utilizan métodos de análisis espacial y visualización geográfica.
  • Construcción del Modelo: Se crean mapas interactivos y mapas de calor para visualizar los eventos.
  • Evaluación del Modelo: Se verifica que las visualizaciones representen adecuadamente los datos y permitan identificar patrones.

4.5 Evaluación

  • Interpretación de Resultados: Se analizan los resultados obtenidos mediante gráficos, mapas interactivos y técnicas de análisis espacial para identificar patrones temporales y espaciales en los eventos reportados por Waze.

  • Validación de Resultados: Se verifica la coherencia de los patrones identificados comparando las diferentes visualizaciones y análisis realizados, considerando la información disponible del contexto de movilidad urbana.

  • Conclusiones y Recomendaciones: A partir de los patrones encontrados se generan conclusiones sobre las zonas y momentos con mayor concentración de eventos, proponiendo posibles acciones para la gestión y planificación de la movilidad.

4.6 Despliegue

  • Presentación de Resultados: Se documentan los hallazgos en un informe, incluyendo visualizaciones interactivas.
  • Implementación: Los resultados pueden ser utilizados por las autoridades para planificar intervenciones.
  • Monitoreo: Se sugiere un seguimiento continuo para actualizar el análisis con nuevos datos.

4.7 Diagrama CRISP-DM aplicado al análisis de eventos Waze

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

5 Comprensión de los Datos

5.1 Carga de datos

Trama_Waze <- read_excel("Trama Waze.xlsx") %>%
  mutate(
    creation_Date = ymd_hms(creation_Date),
    fecha = as.Date(creation_Date),
    hora = hour(creation_Date),
    dia = day(creation_Date),
    tipo_evento = recode(type,
      "ACCIDENT"="ACCIDENTE",
      "HAZARD"="PELIGRO",
      "JAM"="CONGESTIÓN",
      "ROAD_CLOSED"="VÍA CERRADA"
    )
  )

5.2 Calidad de datos

Esta sección tiene como propósito evaluar la estructura, completitud y consistencia de la información antes de realizar los análisis espaciales y temporales. Se inspeccionan las dimensiones del conjunto de datos, los tipos de variables y los principales estadísticos descriptivos para identificar posibles inconsistencias o valores faltantes.

dim(Trama_Waze)
## [1] 5070   21
str(Trama_Waze)
## tibble [5,070 × 21] (S3: tbl_df/tbl/data.frame)
##  $ id                      : num [1:5070] 16 17 18 20 21 22 24 25 26 28 ...
##  $ waze_json_trama_id      : num [1:5070] 14 14 14 15 15 15 16 16 16 17 ...
##  $ country                 : chr [1:5070] "CO" "CO" "CO" "CO" ...
##  $ reportRating            : num [1:5070] 2 3 0 2 3 0 2 3 0 2 ...
##  $ reportByMunicipalityUser: logi [1:5070] FALSE FALSE FALSE FALSE FALSE FALSE ...
##  $ confidence              : num [1:5070] 1 4 4 1 4 5 1 4 5 1 ...
##  $ reliability             : num [1:5070] 8 10 10 8 10 10 8 10 10 8 ...
##  $ type                    : chr [1:5070] "HAZARD" "HAZARD" "HAZARD" "HAZARD" ...
##  $ uuid                    : chr [1:5070] "74a153fa-6ccd-4d6b-a94b-db01a88b002d" "b91961a4-e32c-4770-b2a0-551d7add5669" "b9262a77-b38b-46bd-b0b2-cda1b855a549" "74a153fa-6ccd-4d6b-a94b-db01a88b002d" ...
##  $ roadType                : num [1:5070] 3 3 3 3 3 3 3 3 3 3 ...
##  $ magvar                  : num [1:5070] 96 153 27 96 153 27 96 153 27 96 ...
##  $ subtype                 : chr [1:5070] "HAZARD_ON_SHOULDER_CAR_STOPPED" "HAZARD_ON_SHOULDER_CAR_STOPPED" "HAZARD_ON_SHOULDER_CAR_STOPPED" "HAZARD_ON_SHOULDER_CAR_STOPPED" ...
##  $ street                  : chr [1:5070] NA "Variante Cajicá / RD45A Ramal A >(S)" "Bogotá-Tocancipá / RN55-01 >(N)" NA ...
##  $ location_x              : num [1:5070] -7.4e+07 -7.4e+07 -7.4e+07 -7.4e+07 -7.4e+07 ...
##  $ location_y              : num [1:5070] 4938376 2733202 4925537 4938376 2733202 ...
##  $ pubMillis               : num [1:5070] 1.73e+12 1.73e+12 1.73e+12 1.73e+12 1.73e+12 ...
##  $ creation_Date           : POSIXct[1:5070], format: "2024-09-26 01:53:49" "2024-09-26 01:53:49" ...
##  $ fecha                   : Date[1:5070], format: "2024-09-26" "2024-09-26" ...
##  $ hora                    : int [1:5070] 1 1 1 1 1 1 1 1 1 1 ...
##  $ dia                     : int [1:5070] 26 26 26 26 26 26 26 26 26 26 ...
##  $ tipo_evento             : chr [1:5070] "PELIGRO" "PELIGRO" "PELIGRO" "PELIGRO" ...
summary(Trama_Waze)
##        id       waze_json_trama_id   country           reportRating  
##  Min.   :  16   Min.   :  14       Length:5070        Min.   :0.000  
##  1st Qu.:1617   1st Qu.: 603       Class :character   1st Qu.:1.000  
##  Median :2884   Median :1088       Mode  :character   Median :2.000  
##  Mean   :2880   Mean   :1041                          Mean   :2.248  
##  3rd Qu.:4152   3rd Qu.:1350                          3rd Qu.:3.000  
##  Max.   :5419   Max.   :1965                          Max.   :5.000  
##  reportByMunicipalityUser   confidence      reliability         type          
##  Mode :logical            Min.   :0.0000   Min.   : 5.000   Length:5070       
##  FALSE:5070               1st Qu.:0.0000   1st Qu.: 5.000   Class :character  
##                           Median :0.0000   Median : 5.000   Mode  :character  
##                           Mean   :0.3278   Mean   : 5.972                     
##                           3rd Qu.:0.0000   3rd Qu.: 7.000                     
##                           Max.   :5.0000   Max.   :10.000                     
##      uuid              roadType          magvar      subtype         
##  Length:5070        Min.   : 1.000   Min.   :  3   Length:5070       
##  Class :character   1st Qu.: 1.000   1st Qu.:104   Class :character  
##  Mode  :character   Median : 3.000   Median :190   Mode  :character  
##                     Mean   : 3.868   Mean   :168                     
##                     3rd Qu.: 7.000   3rd Qu.:269                     
##                     Max.   :20.000   Max.   :359                     
##     street            location_x          location_y        pubMillis        
##  Length:5070        Min.   :-74043306   Min.   :   4907   Min.   :1.726e+12  
##  Class :character   1st Qu.:-74034431   1st Qu.:4898322   1st Qu.:1.727e+12  
##  Mode  :character   Median :-74027812   Median :4912869   Median :1.727e+12  
##                     Mean   :-68005820   Mean   :4216920   Mean   :1.727e+12  
##                     3rd Qu.:-74015457   3rd Qu.:4921901   3rd Qu.:1.727e+12  
##                     Max.   :  -740251   Max.   :4948562   Max.   :1.728e+12  
##  creation_Date                     fecha                 hora      
##  Min.   :2024-09-26 01:53:49   Min.   :2024-09-26   Min.   : 0.00  
##  1st Qu.:2024-09-26 21:14:02   1st Qu.:2024-09-26   1st Qu.:12.00  
##  Median :2024-09-27 13:24:02   Median :2024-09-27   Median :17.00  
##  Mean   :2024-09-27 11:51:10   Mean   :2024-09-26   Mean   :15.34  
##  3rd Qu.:2024-09-27 22:08:02   3rd Qu.:2024-09-27   3rd Qu.:20.00  
##  Max.   :2024-09-28 18:38:02   Max.   :2024-09-28   Max.   :23.00  
##       dia        tipo_evento       
##  Min.   :26.00   Length:5070       
##  1st Qu.:26.00   Class :character  
##  Median :27.00   Mode  :character  
##  Mean   :26.83                     
##  3rd Qu.:27.00                     
##  Max.   :28.00

5.3 Estructura del conjunto de datos

El conjunto de datos utilizado corresponde a registros de eventos reportados mediante la plataforma Waze. Cada observación representa un evento georreferenciado asociado a condiciones de movilidad urbana, incluyendo información temporal, espacial y categórica.

knitr::kable(
  data.frame(
    Variable = c("creation_Date","type","location_x","location_y","usuario"),
    Tipo = c("Fecha-hora","Categórica","Numérica","Numérica","Categórica"),
    Descripción = c(
      "Fecha y hora del reporte.",
      "Tipo de evento reportado.",
      "Coordenada longitudinal codificada.",
      "Coordenada latitudinal codificada.",
      "Fuente asociada al reporte."
    )
  ),
  caption = "Estructura del conjunto de datos Waze"
)
Estructura del conjunto de datos Waze
Variable Tipo Descripción
creation_Date Fecha-hora Fecha y hora del reporte.
type Categórica Tipo de evento reportado.
location_x Numérica Coordenada longitudinal codificada.
location_y Numérica Coordenada latitudinal codificada.
usuario Categórica Fuente asociada al reporte.

6 Análisis Temporal de los Eventos

El análisis temporal es una de las primeras aproximaciones que se realiza en los datos, permitiendo identificar patrones en la distribución de eventos a lo largo del día. En esta sección, se extraen las horas y los días a partir de los datos originales utilizando la librería lubridate. Esto facilita el filtrado de eventos en fechas y horas específicas.

El objetivo es analizar si existen concentraciones de eventos en ciertas franjas horarias y cómo estos se distribuyen a lo largo del día 26, lo que podría revelar horas pico de congestión o momentos críticos con mayor cantidad de accidentes.

# Factor horario (0–23)
Trama_Waze$hora_factorizado <- factor(
  Trama_Waze$hora,
  levels = 0:23
)

# Gráfico
g_hora <- ggplot(
  Trama_Waze,
  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"
  ) +
  theme_minimal() +
  scale_x_discrete(drop = FALSE)

g_hora

7 Distribución de Eventos

En esta sección se presenta un análisis descriptivo de los tipos de eventos registrados en los datos de Waze. Se genera una visualización en forma de gráfico de barras que muestra la frecuencia de los diferentes tipos de eventos, como trancones, peligros, accidentes, y cierres de vías.

Este análisis es clave para identificar qué eventos son más frecuentes y cuáles requieren mayor atención. Además, proporciona una visión general de las categorías más comunes de eventos reportados por los usuarios y puede influir en la priorización de recursos para la gestión del tráfico.

# Calcular la frecuencia de cada tipo de evento en Trama_Waze
frecuencia_eventos <- Trama_Waze %>%
  group_by(tipo_evento) %>%                 # Agrupar por tipo de evento
  summarise(Frecuencia = n()) %>%     # Contar la frecuencia de cada tipo
  arrange(desc(Frecuencia))           # Ordenar por frecuencia descendente

# Crear un gráfico de barras con ggplot2 usando los datos de Trama_Waze
ggplot(frecuencia_eventos, aes(x = tipo_evento, y = Frecuencia, fill = tipo_evento)) +
  geom_bar(stat = "identity") +
  theme_minimal() +
  labs(title = "Distribución de Tipos de Eventos en Trama Waze", 
       x = "Tipo de Evento", y = "Frecuencia") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +  # Rotar etiquetas para mejor visualización
  scale_fill_brewer(palette = "Set2")  # Utilizar una paleta de colores predefinida

7.1 Interpretación

La distribución de frecuencias muestra que algunos tipos de eventos presentan una mayor ocurrencia dentro de la muestra analizada. Este comportamiento sugiere que ciertos fenómenos de movilidad urbana tienen una presencia más frecuente en la red vial. Aunque este análisis es descriptivo, constituye una primera aproximación para identificar eventos que posteriormente pueden presentar patrones espaciales de agrupamiento o concentración.

8 Filtrado de Eventos PELIGRO del Día 26

En este apartado, se filtran los eventos de tipo PELIGRO que ocurrieron específicamente el día 26. El propósito es reducir el volumen de datos y centrarse en los eventos de riesgo, lo que permite un análisis más profundo y detallado de estos incidentes.

Este filtrado es esencial para poder focalizar el análisis en los eventos que realmente presentan peligros potenciales en las vías, facilitando así la identificación de las áreas más críticas.

peligro26 <- Trama_Waze %>%
  filter(
    type == "HAZARD",
    day(creation_Date) == 26
  )

table(peligro26$type)
## 
## HAZARD 
##    148
nrow(peligro26)
## [1] 148

9 Visualización de Eventos PELIGRO

Una vez filtrados los eventos PELIGRO, se procede a visualizarlos en un mapa interactivo utilizando la librería leaflet. Este mapa permite explorar las ubicaciones exactas de los peligros reportados, representando los eventos sobre un mapa geográfico y agrupándolos en clusters para mejorar la legibilidad.

Los usuarios pueden interactuar con el mapa, lo que facilita la identificación visual de los puntos con mayor concentración de eventos y ayuda a identificar patrones espaciales en la distribución de peligros.

# Ajustar las coordenadas de latitud y longitud
peligro26$lat <- peligro26$location_y / 10^(nchar(peligro26$location_y) - 1)
peligro26$long <- peligro26$location_x / 10^(nchar(peligro26$location_x) - 3)

# Filtrar eventos dentro del rango geográfico adecuado
peligro26 <- peligro26[peligro26$lat > 4 & peligro26$lat < 5,]

# Crear un mapa interactivo con leaflet
m26_peligro <- leaflet() %>%
  addTiles() %>%
  addCircleMarkers(lng = peligro26$long, lat = peligro26$lat,
                   clusterOptions = markerClusterOptions(),
                   label = peligro26$hora) %>%
  addControl(html = "<h3>Mapa de Riesgos</h3>", position = "topleft")

# Mostrar el mapa
m26_peligro

10 Análisis Espacial de la Distribución de Riesgos

En esta sección, se realiza un análisis espacial de los eventos PELIGRO del día 26 utilizando herramientas avanzadas como spatstat y terra. El objetivo es estudiar la distribución geográfica de los eventos de riesgo y generar mapas de calor que destaquen las áreas más afectadas.

Este tipo de análisis espacial es crucial para identificar patrones de concentración de eventos y zonas de alto riesgo, lo que puede ser útil para la toma de decisiones en la gestión de tráfico y la planificación urbana.

# Filtrar datos relevantes de peligro26
peligro26 <- peligro26 %>%
  filter(lat > 4 & lat < 5, long > -75 & long < -73)  # Ajustar las coordenadas de interés

# Crear un mapa interactivo con leaflet y addHeatmap
leaflet(peligro26) %>%
  addProviderTiles("OpenStreetMap") %>%  # Añadir la capa base del mapa
  addHeatmap(
    lng = ~long, lat = ~lat,               # Especificar las columnas de longitud y latitud
    intensity = ~hora,                     # Intensidad opcional basada en la hora (o cualquier otra variable)
    blur = 20,                             # Nivel de desenfoque del mapa de calor
    max = 0.08,                            # Ajustar el valor máximo para la intensidad
    radius = 15                            # Radio de cada punto en el mapa de calor
  ) %>%
  addLegend("bottomright",                 # Añadir leyenda
            title = "Mapa de Calor de Riesgos",
            colors = c("blue", "green", "yellow", "red"),
            labels = c("Bajo", "Moderado", "Alto", "Muy Alto"))

11 Filtrado de Eventos VÍA CERRADA del Día 26

En esta sección se seleccionan los eventos de tipo VÍA CERRADA registrados durante el día 26. Posteriormente, se realiza el preprocesamiento de las coordenadas geográficas con el fin de obtener valores de latitud y longitud utilizables para los análisis espaciales posteriores.

Adicionalmente, se aplica un filtrado geográfico que permite restringir los registros al área de estudio, eliminando observaciones ubicadas fuera del rango espacial de interés. Este procedimiento garantiza la consistencia de las visualizaciones y de las técnicas de estadística espacial aplicadas en las siguientes etapas del análisis.

# Filtrar eventos VÍA CERRADA del día 26
via_cerrada_26 <- Trama_Waze %>%
  filter(
    tipo_evento == "VÍA CERRADA",
    dia == 26
  )

# Ajustar coordenadas
via_cerrada_26$lat <- via_cerrada_26$location_y /
  10^(nchar(via_cerrada_26$location_y) - 1)

via_cerrada_26$long <- via_cerrada_26$location_x /
  10^(nchar(via_cerrada_26$location_x) - 3)

# Filtrar registros dentro del área de estudio
via_cerrada_26 <- via_cerrada_26 %>%
  filter(
    lat > 4,
    lat < 5
  )

12 Mapa Interactivo de Cierres de Vías

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
m26_via_cerrada = leaflet(via_cerrada_26) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~long, lat = ~lat,
                   clusterOptions = markerClusterOptions(),
                   label = ~hora) %>%
  addControl(html = "<h3>Mapa de Cierre de Vías<h3>", position = "topleft")

# Mostrar el mapa interactivo
m26_via_cerrada

13 Análisis Espacial de Cierres de Vías

Esta sección está dedicada al análisis espacial de los cierres de vías utilizando herramientas como spatstat y terra. El objetivo es estudiar cómo están distribuidos geográficamente los eventos de cierre de vías reportados el día 26 y analizar si existen patrones en la concentración de estos eventos.

Este tipo de análisis ayuda a entender la extensión geográfica de los cierres de vías, lo que puede ser útil para identificar áreas críticas que podrían necesitar intervenciones inmediatas o planificación a largo plazo.

# Definir la zona de interés
zona <- owin(xrange = c(-74.04331, -73.9929), yrange = c(4.885736, 4.948562))

# Crear un patrón de puntos espaciales a partir de los eventos VÍA CERRADA
patron_via_cerrada <- ppp(x = via_cerrada_26$long, y = via_cerrada_26$lat, window = zona)

# Graficar el test de cuadrantes
plot(quadratcount(patron_via_cerrada), main = "Patrón de Puntos y Test de Cuadrantes")

# Superponer los puntos sobre los cuadrantes
points(patron_via_cerrada, col = "red")

# Gráfico independiente: Función K-Estimación
plot(Kest(patron_via_cerrada), main = "Función K-Estimación")

Los cierres de vías pueden interpretarse como eventos puntuales cuya localización no es controlada por el analista. Por esta razón, constituyen un caso apropiado para aplicar técnicas de patrones puntuales. El análisis permite determinar si estos eventos presentan concentración espacial en determinados corredores viales o si se distribuyen aleatoriamente en el territorio.

14 Mapa de Densidad de Cierres de Vías

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.

# Asegurarse de que el objeto patron_via_cerrada esté correctamente definido
# Crear un patrón de puntos espaciales utilizando los datos correctos (via_cerrada_26)
zona <- owin(xrange = c(-74.04331, -73.9929), yrange = c(4.885736, 4.948562))
patron_via_cerrada <- ppp(x = via_cerrada_26$long, y = via_cerrada_26$lat, window = zona)

# Calcular la densidad espacial
im1 <- density(patron_via_cerrada, sigma = 0.01)  # Ajusta sigma según sea necesario

# Convertir la densidad a un objeto raster usando terra
mapa_via_cerrada <- rast(im1)

# Convertir el raster a data.frame para leaflet
df_via_cerrada <- as.data.frame(mapa_via_cerrada, xy = TRUE)
colnames(df_via_cerrada) <- c("long", "lat", "intensity")

# Normalizar los valores de intensidad entre 0 y 1
df_via_cerrada$intensity <- (df_via_cerrada$intensity - min(df_via_cerrada$intensity)) / 
                            (max(df_via_cerrada$intensity) - min(df_via_cerrada$intensity))

# Crear un mapa interactivo usando leaflet
leaflet(df_via_cerrada) %>%
  addProviderTiles("OpenStreetMap") %>%  # Añadir la capa base
  addHeatmap(
    lng = ~long, lat = ~lat,              # Coordenadas de longitud y latitud
    intensity = ~intensity,               # Intensidad normalizada
    blur = 20,                            # Nivel de desenfoque
    max = 1,                              # Valor máximo de la intensidad normalizada
    radius = 15                           # Radio para reflejar la densidad
  ) %>%
  addLegend("bottomright",                # Añadir la leyenda
            title = "Mapa de Calor de Cierres de Vías",
            colors = c("blue", "green", "yellow", "red"),
            labels = c("Bajo", "Moderado", "Alto", "Muy Alto"))

15 Análisis de Accidentes

En esta sección se realiza un análisis detallado de los eventos de accidentes (ACCIDENTE) ocurridos el día 26. Se filtran estos eventos para enfocarse exclusivamente en los accidentes reportados en esa fecha, con el objetivo de entender mejor su distribución espacial y su impacto en la movilidad.

El análisis de accidentes es crucial para identificar áreas peligrosas y planificar medidas de seguridad vial, como la instalación de señalización adicional o la mejora de la infraestructura vial en zonas críticas.

# Filtrar eventos de accidentes del día 26
accidente_26 <- Trama_Waze %>%
  filter(
    tipo_evento == "ACCIDENTE",
    dia == 26
  )

# Ajustar las coordenadas de latitud y longitud
accidente_26$lat <- accidente_26$location_y /
  10^(nchar(accidente_26$location_y) - 1)

accidente_26$long <- accidente_26$location_x /
  10^(nchar(accidente_26$location_x) - 3)

# Filtrar eventos dentro del rango geográfico adecuado
accidente_26 <- accidente_26 %>%
  filter(
    lat > 4,
    lat < 5
  )

16 Mapa Interactivo de Accidentes

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 el mapa interactivo
m26_accidente <- leaflet(accidente_26) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~long, lat = ~lat,
                   clusterOptions = markerClusterOptions(),
                   label = ~hora) %>%
  addControl(html = "<h3>Mapa de Accidentes</h3>", position = "topleft")

# Mostrar el mapa interactivo
m26_accidente

17 Análisis Espacial de Accidentes

En esta sección se realiza un análisis espacial de los accidentes ocurridos el día 26 utilizando las herramientas spatstat y terra. El objetivo es estudiar cómo se distribuyen geográficamente los accidentes y si hay patrones espaciales en su ocurrencia.

Este análisis es importante para identificar áreas donde los accidentes son más frecuentes y así planificar estrategias de mitigación, como mejorar la señalización o realizar cambios en la infraestructura para reducir la probabilidad de accidentes en esas zonas.

# Definir la zona de interés
zona = owin(xrange = c(-74.04331, -73.9929), yrange = c(4.885736, 4.948562))

# Crear un patrón de puntos espaciales a partir de los eventos ACCIDENTE
patron_accidente = ppp(x = accidente_26$long, y = accidente_26$lat, window = zona)

# Gráfico combinado: Test de Cuadrantes y Patrón de Puntos
par(mfrow = c(1, 1))  # Asegurarse de que solo haya una gráfica

# Graficar el test de cuadrantes
plot(quadratcount(patron_accidente), main = "Patrón de Puntos y Test de Cuadrantes")

# Superponer los puntos sobre los cuadrantes
points(patron_accidente, col = "red" )

Los accidentes representan eventos espaciales clásicos para el análisis mediante patrones puntuales debido a que su ubicación geográfica es resultado de múltiples factores de movilidad y no de un diseño experimental controlado. La aplicación del Test de Cuadrantes y la Función K de Ripley permite evaluar si existe agrupamiento espacial de accidentes, identificando potenciales zonas críticas de seguridad vial.

17.1 Interpretación del Test de Cuadrantes

El análisis mediante cuadrantes permite evaluar la distribución espacial de los accidentes dentro del área de estudio. Según la metodología de patrones puntuales, si los conteos observados difieren significativamente de los esperados bajo un proceso aleatorio, existe evidencia de dependencia espacial entre los eventos.

# Calcular la función K-estimación
plot(Kest(patron_accidente))

18 Interpretación de la Función K de Ripley

La Función K permite comparar la distribución observada con un proceso de Poisson completamente aleatorio. Si la curva observada se encuentra por encima de la curva teórica, existe evidencia de agrupamiento espacial; si se encuentra por debajo, el patrón tiende a ser regular; y si ambas curvas son similares, el patrón puede considerarse aleatorio.

19 Mapa de Densidad de Accidentes

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.

# Asegurarse de que el objeto patron_accidente esté correctamente definido
# Usar las coordenadas correctas de los accidentes
zona <- owin(xrange = c(-74.04331, -73.9929), yrange = c(4.885736, 4.948562))
patron_accidente <- ppp(x = accidente_26$long, y = accidente_26$lat, window = zona)

# Calcular la densidad espacial
im1 <- density(patron_accidente)

# Convertir la densidad a un objeto raster usando terra
mapa_accidente <- rast(im1)

# Convertir el raster a data.frame para leaflet
df_accidente <- as.data.frame(mapa_accidente, xy = TRUE)
colnames(df_accidente) <- c("long", "lat", "intensity")

# Normalizar los valores de intensidad entre 0 y 1
df_accidente$intensity <- (df_accidente$intensity - min(df_accidente$intensity)) / 
                          (max(df_accidente$intensity) - min(df_accidente$intensity))

# Crear un mapa interactivo usando leaflet
leaflet(df_accidente) %>%
  addProviderTiles("OpenStreetMap") %>%  # Añadir la capa base
  addHeatmap(
    lng = ~long, lat = ~lat,              # Coordenadas de longitud y latitud
    intensity = ~intensity,               # Intensidad normalizada
    blur = 15,                            # Nivel de desenfoque
    max = 0.5,                              # Valor máximo de la intensidad normalizada
    radius = 10                           # Ajustar el radio de los puntos
  ) %>%
  addLegend("bottomright",                # Añadir la leyenda para interpretar el mapa de calor
            title = "Mapa de Calor de Accidentes",
            colors = c("blue", "green", "yellow", "red"),
            labels = c("Bajo", "Moderado", "Alto", "Muy Alto"))

20 Análisis de Congestión (CONGESTIÓN) el Día 26

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, ]

# Ajustar las coordenadas de latitud y longitud
congestion_26$lat <- congestion_26$location_y /
  10^(nchar(congestion_26$location_y) - 1)

congestion_26$long <- congestion_26$location_x /
  10^(nchar(congestion_26$location_x) - 3)

# Filtrar eventos dentro del rango geográfico adecuado
congestion_26 <- congestion_26[
  congestion_26$lat > 4 &
  congestion_26$lat < 5,
]

21 Mapa Interactivo de Congestión

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 el mapa interactivo
m26_congestion <- leaflet(congestion_26) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~long, lat = ~lat,
                   clusterOptions = markerClusterOptions(),
                   label = ~hora) %>%
  addControl(html = "<h3>Mapa de Congestión</h3>", position = "topleft")

# Mostrar el mapa interactivo
m26_congestion

22 Análisis Espacial de Congestión

Esta sección está dedicada al análisis espacial de los eventos de congestión (CONGESTIÓN) ocurridos el día 26, utilizando herramientas como spatstat y terra. El objetivo es estudiar la distribución geográfica de estos eventos y entender si hay patrones de congestión que se repiten en ciertas áreas.

Este tipo de análisis es importante para identificar las zonas más congestionadas de la ciudad, lo que puede ayudar a las autoridades a tomar decisiones sobre mejoras en la infraestructura o cambios en las rutas de tráfico para aliviar la congestión.

# Definir la zona de interés
zona <- owin(xrange = c(-74.04331, -73.9929), yrange = c(4.885736, 4.948562))

# Crear un patrón de puntos espaciales a partir de los eventos CONGESTIÓN
patron_congestion <- ppp(x = congestion_26$long, y = congestion_26$lat, window = zona)

# Visualizar el patrón de puntos
par(mfrow = c(1, 1))  # Asegurarse de que solo haya una gráfica

# Graficar el test de cuadrantes
plot(quadratcount(patron_congestion), main = "Patrón de Puntos y Test de Cuadrantes")

# Superponer los puntos sobre los cuadrantes
points(patron_congestion, col = "red")

# Calcular la función K-estimación
plot(Kest(patron_congestion))

La congestión vehicular puede analizarse como un patrón puntual derivado de eventos reportados por los usuarios. La identificación de agrupamientos espaciales permite reconocer corredores urbanos donde la demanda de movilidad supera de forma recurrente la capacidad de la infraestructura vial.

23 Mapa de Densidad de Congestió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.

# Definir el patrón de puntos
zona <- owin(xrange = c(-74.04331, -73.9929), yrange = c(4.885736, 4.948562))
patron_congestion <- ppp(x = congestion_26$long, y = congestion_26$lat, window = zona)

# Calcular la densidad espacial del patrón de puntos
im1 <- density(patron_congestion)

# Convertir la densidad en un raster utilizando terra
mapa_congestion <- rast(im1)

# Convertir el objeto raster a un data.frame para usarlo en leaflet
df_congestion <- as.data.frame(mapa_congestion, xy = TRUE)
colnames(df_congestion) <- c("long", "lat", "intensity")

# Normalizar los valores de intensidad entre 0 y 1
df_congestion$intensity <- (df_congestion$intensity - min(df_congestion$intensity)) / 
                           (max(df_congestion$intensity) - min(df_congestion$intensity))

# Crear un mapa interactivo usando leaflet
leaflet(df_congestion) %>%
  addProviderTiles("OpenStreetMap") %>%  # Añadir la capa base
  addHeatmap(
    lng = ~long, lat = ~lat,              # Coordenadas de longitud y latitud
    intensity = ~intensity,               # Intensidad normalizada
    blur = 35,                            # Incrementar el desenfoque para suavizar el mapa
    max = max(df_congestion$intensity) * 2,  # Ajustar el valor máximo de intensidad
    radius = 25                           # Aumentar el radio para que se vea más suave
  ) %>%
  addLegend("bottomright",                # Añadir la leyenda para interpretar el mapa de calor
            title = "Mapa de Calor de Congestión",
            colors = c("blue", "green", "yellow", "red"),
            labels = c("Bajo", "Moderado", "Alto", "Muy Alto"))

24 Consolidación de Mapas de Riesgo, Accidentes, Congestión y Cierres Viales

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)

25 Comparación Temporal por Tipo de Evento

Además de analizar la frecuencia total de eventos por hora, resulta relevante evaluar cómo se distribuyen temporalmente las diferentes categorías reportadas por Waze. Este análisis permite identificar si ciertos fenómenos de movilidad presentan comportamientos horarios diferenciados.

Por ejemplo, las congestiones suelen concentrarse durante las horas pico de desplazamiento, mientras que los accidentes o peligros pueden presentar distribuciones temporales distintas asociadas a factores operacionales o condiciones específicas de la red vial.

La comparación conjunta facilita la identificación de patrones temporales característicos para cada tipo de evento y aporta elementos adicionales para la planificación de estrategias de gestión de movilidad.

eventos_hora <- Trama_Waze %>%
  group_by(hora, tipo_evento) %>%
  summarise(
    Frecuencia = n(),
    .groups = "drop"
  )

ggplot(
  eventos_hora,
  aes(
    x = hora,
    y = Frecuencia,
    color = tipo_evento
  )
) +
  geom_line(linewidth = 1.2) +
  geom_point(size = 2) +
  scale_x_continuous(breaks = 0:23) +
  labs(
    title = "Distribución Horaria por Tipo de Evento",
    x = "Hora del día",
    y = "Número de eventos",
    color = "Evento"
  ) +
  theme_minimal()

25.1 Interpretación

Las diferencias observadas entre las curvas permiten identificar franjas horarias donde determinados eventos adquieren mayor relevancia relativa. Este comportamiento aporta evidencia sobre la dinámica temporal de la movilidad urbana y permite focalizar acciones de monitoreo en los períodos más críticos.

26 Matriz Resumen de Eventos Analizados

Con el propósito de consolidar la información utilizada durante el estudio, se presenta una síntesis estadística de las categorías de eventos evaluadas. Esta tabla permite comparar la magnitud relativa de cada fenómeno de movilidad y proporciona una visión general de la composición del conjunto de datos.

La consolidación facilita la interpretación de los análisis posteriores y mejora la trazabilidad de los resultados obtenidos mediante las técnicas espaciales aplicadas.

tabla_resumen <- Trama_Waze %>%
  group_by(tipo_evento) %>%
  summarise(
    Total_Eventos = n(),
    Hora_Minima = min(hora),
    Hora_Maxima = max(hora),
    .groups = "drop"
  ) %>%
  arrange(desc(Total_Eventos))

knitr::kable(
  tabla_resumen,
  caption = "Resumen estadístico por tipo de evento"
)
Resumen estadístico por tipo de evento
tipo_evento Total_Eventos Hora_Minima Hora_Maxima
CONGESTIÓN 3205 0 23
VÍA CERRADA 1021 0 23
PELIGRO 719 0 23
ACCIDENTE 125 0 23

26.1 Interpretación

La tabla evidencia las diferencias en la frecuencia de ocurrencia entre categorías de eventos y permite identificar cuáles fenómenos presentan mayor representatividad dentro del conjunto de datos analizado. Esta información resulta útil para contextualizar los resultados obtenidos en los análisis espaciales posteriores.

27 Limitaciones del Estudio

Los resultados obtenidos dependen de los reportes generados por los usuarios de Waze, por lo que pueden existir sesgos asociados a la participación desigual de usuarios en diferentes sectores de la ciudad.

Asimismo, los eventos analizados corresponden únicamente al día 26, por lo que los patrones identificados representan una instantánea temporal y no necesariamente reflejan comportamientos permanentes de la movilidad urbana.

Finalmente, los análisis espaciales realizados son de carácter exploratorio y permiten identificar patrones potenciales de agrupamiento, los cuales podrían complementarse en futuros estudios mediante modelos espacio-temporales más avanzados.

28 Conclusiones

El análisis realizado sobre los datos proporcionados por Waze para el día 26 permite obtener una visión integral de los eventos que afectan la movilidad urbana, como peligros en las vías PELIGRO, congestión CONGESTIÓN, accidentes ACCIDENTE y cierres de vías VÍA CERRADA. A través de la utilización de herramientas de análisis espacial y la visualización en mapas interactivos, se han identificado patrones importantes en la distribución espacial y temporal de estos eventos.

Desde la perspectiva de la estadística espacial, los eventos analizados pueden modelarse como patrones puntuales debido a que su localización geográfica no es controlada por el investigador. La aplicación de herramientas como el conteo por cuadrantes, la estimación de densidad y la Función K de Ripley permitió explorar la estructura espacial de los eventos reportados por Waze e identificar posibles patrones de agrupamiento en diferentes categorías de incidentes.

29 Puntos Clave:

  • 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.

30 Recomendaciones:

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.

31 Conclusión Final

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.

32 Referencias

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.