Análisis de Datos de Waze para Planeación

El análisis de datos de tráfico es indispensable para mejorar la movilidad y seguridad en las ciudades. Plataformas colaborativas como Waze ofrecen información en tiempo real sobre congestiones, accidentes y cierres, lo que ayuda a autoridades y planificadores a tomar decisiones basadas en datos precisos. Además, el uso de análisis geoespacial y minería de datos, apoyado en herramientas como R y librerías especializadas, permite procesar y visualizar grandes volúmenes de información para detectar patrones y orientar estrategias de mejora en la gestión vial.

Introducción

El presente análisis se enfoca en el estudio de los eventos reportados por los usuarios a través de la aplicación Waze.La información recopilada es esencial para la planificación urbana y la gestión eficiente del tráfico, permitiendo a las autoridades tomar decisiones informadas para mejorar la movilidad y la seguridad vial.

Preparación Entorno de trabajo

A continuación se garantizaron los paquetes y librerías necesarias para el desarrollo del ejericicio, se organizaron las entradas y salidas de la información y se realizó con código de limpieza de los resultados y configuración global del documento.

library(readxl)            # readxl: Para la carga de datos desde archivos Excel.
library(dplyr)             # dplyr: Para la manipulación y transformación de datos.
library(lubridate)         # lubridate: Para el manejo y procesamiento de fechas y tiempos.
library(leaflet)           # leaflet: Para la creación de mapas interactivos.
library(sf)                # sf: Para trabajar con datos geoespaciales.
library(mapview)           # mapview: Para la visualización interactiva de mapas.
library(spatstat)          # spatstat: Para el análisis de patrones espaciales y análisis de densidad.
library(terra)             # terra: Para el manejo de datos raster y análisis espacial.
library(leaflet.extras)    # leaflet.extras: Para añadir funciones adicionales a los mapas de leaflet
library(ggplot2)           # ggplot2: Para la creación de gráficos y visualizaciones.
library(leafsync)          # leafsync: Para la sincronización de múltiples mapas interactivos.

Cargue de archivo

# Cargar los datos desde la ruta especificada
Trama_Waze <- read_excel("C:/DOCUMENTOS/CIENCIA DE DATOS/ANALISIS_ESPACIAL/Modulo_2_Unidad_2_Patrones_Puntuales/Trama Waze.xlsx")

# Convertir la columna de fecha a formato Date
Trama_Waze$fecha <- as.POSIXct(Trama_Waze$creation_Date, format = "%Y-%m-%d %H:%M:%S")

# Renombrar tipos de eventos a español
Trama_Waze <- Trama_Waze %>% 
  mutate(
    tipo_evento = recode(
      type,
      "ACCIDENT" = "ACCIDENTE",
      "HAZARD" = "PELIGRO",
      "JAM" = "CONGESTIÓN",
      "ROAD_CLOSED" = "VÍA CERRADA"
    )
  )

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.

# Cargar la librería lubridate
library(lubridate)

# Convertir la fecha y extraer la hora y el día
fecha_hora = ymd_hms(Trama_Waze$creation_Date)
hora = hour(fecha_hora)
dia = day(fecha_hora)

# Agregar la columna de hora a los datos
Trama_Waze$hora = hora

# Mostrar la tabla de frecuencia de tipos de eventos
table(Trama_Waze$tipo_evento)
## 
##   ACCIDENTE  CONGESTIÓN     PELIGRO VÍA CERRADA 
##         125        3205         719        1021

La mayor proporción de reportes corresponde a congestiones, lo cual sugiere un patrón de alta intensidad vehicular durante el día analizado. En contraste, los accidentes representan una fracción muy pequeña del total, aunque suelen ser eventos de mayor impacto. La presencia significativa de cierres viales y peligros indica que, además de congestión, hubo múltiples condiciones que afectaron la movilidad. Estos resultados justifican un análisis más profundo tanto temporal como espacial para identificar patrones de concentración y zonas críticas.

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

Preliminarmente, se puede obseervar gráficamente lo del numeral anterior,donde se observa que, la distribución de eventos evidencia que la movilidad del día analizado está dominada por altos niveles de congestión, acompañados de una cantidad considerable de cierres viales y peligros en la vía, mientras que los accidentes representan una proporción menor del total. Esta tendencia sugiere que la congestión no siempre está asociada a accidentes, sino que también puede ser consecuencia de la dinámica normal del tráfico y de restricciones temporales en la infraestructura. La alta frecuencia de estos eventos justifica el análisis espacial posterior para identificar los sectores con mayor recurrencia y evaluar posibles patrones espaciales.

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.

# Identificar eventos PELIGRO del día 26
pos <- which(Trama_Waze$tipo_evento == "PELIGRO" & dia == 26)
peligro26 <- Trama_Waze[pos,]

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.

# Cargar librerías necesarias para visualización
library(mapview)
library(leaflet)

# 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

El mapa interactivo permite visualizar de manera precisa la localización de los eventos clasificados como PELIGRO reportados en Waze. Cada punto representa un incidente georreferenciado, y el uso de clusters permite agrupar eventos cercanos, facilitando su análisis sin saturar la visualización.Revela una distribución heterogénea, con puntos críticos principalmente en las vías de mayor circulación y con agrupamientos significativos de eventos.

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.

# Cargar las librerías necesarias
library(leaflet)
library(dplyr)
library(leaflet.extras)

# 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"))

El mapa de calor generado permite identificar la intensidad espacial de los eventos clasificados como PELIGRO, resaltando las zonas donde se registraron más reportes y, por lo tanto, donde el riesgo potencial para la movilidad es mayor.

Los colores más cálidos (amarillo, naranja y rojo) indican zonas donde se concentran la mayor cantidad de los eventos de peligro.

Mapa de Densidad de Cierres de Vías

En esta sección se genera un mapa de densidad basado en la distribución espacial de los eventos de cierre de vías (VIA CERRADA) reportados el día 26. El objetivo de este análisis es identificar las zonas más afectadas por los cierres de vías, lo que puede ayudar en la planificación de desvíos y la optimización de la movilidad urbana.

El mapa de densidad resalta las áreas con mayor número de cierres de vías, proporcionando una visualización clara de las zonas de mayor impacto. Esta información es crucial para que las autoridades tomen decisiones informadas sobre cómo gestionar el tráfico en estas áreas.

# Filtrar eventos VÍA CERRADA del día 26
pos <- which(Trama_Waze$tipo_evento == "VÍA CERRADA" & dia == 26)
via_cerrada_26 <- Trama_Waze[pos,]

# Ajustar las coordenadas de latitud y longitud
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 eventos dentro del rango geográfico adecuado
via_cerrada_26 <- via_cerrada_26[via_cerrada_26$lat > 4 & via_cerrada_26$lat < 5,]

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.

# Cargar librería leaflet
require(leaflet)

# 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

El mapa interactivo permite visualizar la ubicación exacta de los eventos clasificados como VÍA CERRADA, registrados durante el día 26. Cada marcador representa un cierre reportado por los usuarios de Waze, y el uso de clusterización facilita la exploración del territorio sin saturar el mapa cuando varios eventos ocurren en áreas cercanas.La visualización refuerza la importancia de monitorear estos puntos críticos y complementa el análisis de riesgos viales, permitiendo identificar sectores donde la movilidad se ve recurrentemente interrumpida.

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.

# Cargar las librerías necesarias
library(spatstat)

# 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")

El patrón de puntos correspondiente a los eventos de VÍA CERRADA muestra una distribución marcada por una fuerte concentración espacial en algunos cuadrantes específicos, mientras que la mayoría de las celdas permanecen vacías. En particular, se observa que un cuadrante contiene 636 eventos y otro presenta 21, mientras que los demás cuadrantes registran valores cercanos a cero.

Este comportamiento indica que los cierres de vías no se distribuyen de manera uniforme en el territorio, sino que tienden a agrupase en zonas puntuales, lo cual sugiere la presencia de clústeres espaciales.

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

En el gráfico obtenido se muestran varias estimaciones de la función K (isotrópica, de bordes, trans, etc.) comparadas con la línea esperada bajo un proceso espacial completamente aleatorio (K_pois, en azul).Estos resultados refuerzan los hallazgos previos del Test de Cuadrantes y sugieren la existencia de zonas críticas donde los cierres de vía se acumulan, posiblemente debido a características operativas, estructurales o del entorno urbano.

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.

# Cargar las librerías necesarias
library(terra)
library(leaflet)
library(spatstat)

# 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"))

Este mapa de densidad representa la distribución espacial de los eventos VÍA CERRADA mediante un cálculo de intensidad utilizando un kernel de densidad. A diferencia del mapa interactivo anterior, que solo muestra puntos o clusters, este enfoque permite visualizar cómo varía la concentración de eventos en el espacio, generando una superficie continua que resalta las zonas con mayor carga de cierres de vías.Las áreas donde el color cambia hacia tonos amarillos o rojos representan sitios donde los cierres de vías se concentran con mayor frecuencia. Esto revela puntos críticos que pueden tener mayor impacto sobre la movilidad diaria.

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
pos <- which(Trama_Waze$tipo_evento == "ACCIDENTE" & dia == 26)
accidente_26 <- Trama_Waze[pos,]

# 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[accidente_26$lat > 4 & accidente_26$lat < 5,]

Mapa Interactivo de Accidentes

A continuación 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.

# Cargar librerías necesarias
library(leaflet)

# 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

Aunque los accidentes son menos numerosos que otros tipos de eventos, su localización puntual permite identificar puntos críticos de seguridad. Estos puntos merecen prioridad para inspección (señalización, iluminación, demarcación, diseño de la vía) y para el diseño de medidas de mitigación (reducción de velocidad, mejoras geométricas, control de intersecciones).

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.

# Cargar las librerías necesarias
require(spatstat)

# 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" )

La aparición de un solo cuadrante con una cantidad muy alta de accidentes indica que existe un hotspot. El cuadrante con 34 accidentes debe considerarse zona prioritaria para intervención. Este hallazgo es útil para:

orientar inspecciones de campo; evaluar señalización, semaforización o iluminación; implementar medidas de reducción de velocidad; planear rediseños viales o estrategias de control operativo, entre otros

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

Las curvas estimadas (líneas negra, roja y verde) se ubican por encima de la línea teórica, especialmente en los primeros valores de r. Esto indica que los accidentes tienden a ocurrir más juntos de lo que sería esperable por azar, lo que sugiere zonas críticas o puntos calientes de accidentes, confirmando el análisis anterior.

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.

# Cargar las librerías necesarias
library(terra)
library(leaflet)
library(spatstat)

# 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"))

El mapa de calor permite visualizar la concentración espacial de los accidentes ocurridos el día analizado, mostrando gradientes de intensidad desde zonas de baja ocurrencia (azules) hasta zonas de muy alta concentración (rojas). Esta representación ayuda a identificar puntos críticos donde la frecuencia de accidentes es significativamente mayor.La mayoría del área analizada presenta niveles bajos o moderados de densidad, asociados a zonas residenciales y menos transitadas. Estos resultados permiten identificar sectores prioritarios para la intervención, orientando estrategias de mitigación del riesgo y mejorando la gestión del tráfico.

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

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.

# Cargar las librerías necesarias
library(leaflet)

# 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

El mapa permite explorar de forma dinámica las zonas de la ciudad con mayor presencia de congestión vehicular. Esta herramienta resulta especialmente útil para identificar patrones espaciales de congestión, apoyar la toma de decisiones en gestión del tráfico y orientar acciones de planificación urbana.

El análisis del mapa de congestión revela que los mayores niveles de tráfico se concentran en los corredores viales principales que atraviesan Cajicá y conectan con municipios vecinos. Estas zonas presentan valores elevados de congestión, lo cual sugiere la presencia de cuellos de botella y limitaciones en la capacidad vial. El centro urbano también muestra congestión moderada asociada a actividades comerciales y tránsito local. En contraste, las áreas periféricas evidencian tráfico bajo y movilidad fluida.

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.

# Cargar las librerías necesarias
library(spatstat)

# 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))

El análisis espacial mediante la función K muestra que los eventos de congestión no se distribuyen de forma aleatoria, sino que presentan un patrón claramente agrupado. Las estimaciones empíricas de la función K se sitúan por encima del modelo de completa aleatoriedad, lo cual indica que la congestión tiende a concentrarse en zonas específicas del territorio. Este patrón de agrupamiento se mantiene a diferentes escalas espaciales, lo que sugiere que las congestiones se asocian principalmente a corredores viales y puntos de alto flujo vehicular.

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.

# Cargar las librerías necesarias
library(leaflet)
library(terra)

# 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"))

Esta representación convierte los puntos individuales de congestión en una superficie continua, destacando los sectores con mayor acumulación de eventos.

Identificación clara de puntos críticos: El mapa de calor muestra áreas donde la congestión es significativamente más intensa, representadas en colores cálidos (amarillo, naranja y rojo).La mayor parte del área analizada aparece en tonos fríos (azul y verde), indicando niveles bajos de congestión, situación que se ha evidenciado en gráficos anteriores.

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)

Al comparar los cuatro mapas al mismo tiempo, se pueden observar puntos donde coinciden congestión, accidentes o riesgos, lo que indica áreas especialmente vulnerables.Estas superposiciones pueden evidenciar: intersecciones peligrosas,corredores saturados,vías donde un cierre genera congestión en zonas cercanas,tramos donde la infraestructura es insuficiente.

CONCLUSIONES Y RECOMENDACIONES

El análisis realizado con los datos reportados por Waze para el día 26 permitió construir una visión amplia y detallada de los eventos que afectan la movilidad urbana, incluyendo peligros en las vías, congestión, accidentes y cierres viales. A través del uso de técnicas de análisis espacial aprendidas en esta unidad, como la visualización de patrones puntuales, la densidad de Kernel y el test de cuadrantes, fue posible identificar que estos eventos no se distribuyen de manera aleatoria, sino que presentan zonas de concentración y comportamientos espaciales recurrentes.

En términos generales, la congestión vehicular y los peligros en las vías fueron los eventos más numerosos, lo que evidencia la necesidad de fortalecer la gestión del tráfico en los corredores donde estos eventos se repiten. Los mapas de densidad revelaron hotspots claros, especialmente en puntos donde coinciden accidentes y cierres viales, lo que sugiere posibles falencias en la infraestructura, dificultades en la señalización o dinámicas de movilidad que incrementan el riesgo. En contraste, también se identificaron áreas donde la ocurrencia de accidentes es muy baja, lo que puede interpretarse como zonas con mejor flujo vehicular o con menos exposición a situaciones riesgosas.

Desde mi perspectiva este ejercicio representa una oportunidad valiosa para aplicar y comprender conceptos fundamentales sobre patrones puntuales. La superposición de eventos sobre la cartografía y su posterior transformación en objetos espaciales permitió analizar la intensidad espacial de los incidentes y evaluar visualmente si existe una tendencia al agrupamiento, al azar o a la dispersión. En este sentido, el uso de herramientas como el test de cuadrantes confirma la presencia de agrupamientos en varias categorías de eventos, lo que respalda la interpretación de que la ocurrencia de incidentes no es independiente del espacio.

Dado que ya se cuenta con un mapa de densidad espacial de los incidentes y con las horas exactas en que cada accidente o evento de congestión ocurrió, es posible enriquecer el análisis incorporando una dimensión temporal, específicamente para identificar el comportamiento en horas pico. Esto permite determinar no solo dónde ocurren los eventos con mayor frecuencia, sino también cuándo se concentran, lo cual es fundamental para comprender patrones operacionales y proponer medidas de gestión del tráfico. Se pueden definir franjas de análisis típicas como horas pico,con esta clasificación, se elaborarían mapas de densidad separados para cada franja, permitiendo visualizar si los patrones espaciales cambian durante las horas pico.Una vez generados los mapas de densidad por franja horaria, se pueden comparar áreas que permanecen críticas todo el día,zonas que solo se congestionan en horas pico (puntos calientes temporales),sectores que evidencian congestión atípica fuera de los picos.Al combinar el análisis espacial y temporal, es posible definir:Corredores críticos en hora pico de mañana,Corredores críticos en hora pico de tarde,Sectores que cambian su comportamiento a lo largo del día.Esto permite producir recomendaciones de gestión del tráfico más precisas y basadas en evidencia, optimizando recursos y priorizando intervenciones.