1 Marco Teórico

El análisis de datos de tráfico es algo bastante importante hoy en día, sobre todo en las ciudades que siguen creciendo y donde cada vez hay más vehículos circulando. Para poder gestionar bien el tráfico se necesitan herramientas y metodologías que permitan procesar grandes volúmenes de información de forma eficiente.

Aplicaciones de navegación colaborativa como Waze han cambiado mucho la forma en que se recopilan datos de tráfico. Gracias a que los mismos usuarios reportan lo que está pasando en las vías, Waze entrega información en tiempo real sobre congestiones, accidentes, peligros y cierres de vías. Estos datos son muy valiosos para las autoridades y para quienes se encargan de planificar la movilidad urbana.

Para trabajar con este tipo de información se utilizan herramientas de análisis geoespacial y minería de datos. En particular, R cuenta con librerías muy completas como leaflet, spatstat y ggplot2 que facilitan el procesamiento y la visualización de datos espaciales, lo que permite identificar patrones que de otra forma serían difíciles de detectar.

2 Introducción

En este informe se trabaja con los eventos reportados por usuarios de Waze, una plataforma de navegación colaborativa que recopila datos de tráfico en tiempo real. La información disponible incluye peligros, congestiones, accidentes y cierres de vías, y es útil tanto para la planificación urbana como para la gestión del tráfico, ya que permite entender qué está pasando en las vías y tomar decisiones basadas en datos reales.

3 Objetivo

El objetivo de este análisis es estudiar cómo se distribuyen espacial y temporalmente los eventos reportados en Waze, tomando como referencia el día 26. Se va a evaluar y visualizar cada tipo de evento en mapas interactivos, buscando identificar patrones tanto en el tiempo como en el espacio. Para esto se usan herramientas como leaflet para la visualización geoespacial y spatstat para el análisis de densidad y distribución de puntos, lo que permite generar mapas de calor que muestran dónde se concentran más los eventos.

4 Metodología CRISP-DM

La metodología CRISP-DM (Cross-Industry Standard Process for Data Mining) es un estándar bastante usado en proyectos de minería de datos. Consiste en seis fases que guían todo el proceso, desde entender el problema hasta presentar los resultados.

4.1 Fases de CRISP-DM aplicadas al análisis

4.1.1 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.1.2 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.1.3 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.1.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.1.5 5. Evaluación

  • Interpretación de Resultados: Se analizan los mapas y gráficos para identificar áreas y horarios críticos.
  • Validación: Se contrastan los hallazgos con conocimiento previo o datos históricos, si están disponibles.
  • Determinación de los Próximos Pasos: Se establecen recomendaciones basadas en los resultados obtenidos.

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

5 Metodología

Para este análisis se siguieron una serie de pasos metodológicos que buscan garantizar un estudio ordenado y reproducible de los eventos de Waze del día 26. A continuación se describen las etapas principales del proceso.

5.1 Obtención de Datos

Los datos utilizados provienen de Waze, una aplicación de navegación colaborativa que recoge información de tráfico en tiempo real. El conjunto de datos incluye eventos reportados por usuarios como peligros, congestiones, accidentes y cierres de vías, junto con las coordenadas geográficas (latitud y longitud) y la fecha y hora de cada evento.

5.2 Catálogo de Datos

Variable Descripción
pubMillis Marca de tiempo del reporte en milisegundos
creation_Date Fecha y hora de creación del evento
type Tipo de evento (HAZARD, JAM, ACCIDENT, ROAD_CLOSED)
subtype Subtipo específico del evento
location_x Coordenada de longitud del evento
location_y Coordenada de latitud del evento
street Nombre de la calle donde ocurrió el evento
city Ciudad donde ocurrió el evento
country País del evento
magvar Dirección del vehículo en grados
reliability Nivel de confiabilidad del reporte
reportRating Calificación del reporte

5.3 Carga y Preparación de los Datos

Los datos se cargan desde un archivo Excel y se hacen las transformaciones necesarias para ajustar el formato de las fechas y traducir las categorías de eventos al español.

5.4 Análisis Descriptivo y Exploratorio

Se realizan análisis descriptivos para conocer la distribución temporal y por tipo de evento, apoyándose en gráficos de barras para visualizar las frecuencias.

5.5 Filtrado y Análisis Temporal

Los datos se filtran para el día 26 y se separan según el tipo de evento (PELIGRO, VÍA CERRADA, ACCIDENTE, CONGESTIÓN) para analizarlos de forma individual.

5.6 Análisis Geoespacial y Visualización

Se construyen mapas interactivos con leaflet, usando marcadores agrupados para cada tipo de evento, lo que permite explorar visualmente cómo se distribuyen los incidentes en el espacio.

5.7 Mapas de Calor y Densidad

Se aplican técnicas de análisis de patrones de puntos con spatstat (test de cuadrantes, función K de Ripley) y se generan mapas de calor con leaflet.extras para identificar las zonas con mayor concentración de eventos.

5.8 Consolidación de Resultados

Los cuatro mapas interactivos (PELIGRO, ACCIDENTE, CONGESTIÓN y VÍA CERRADA) se sincronizan usando leafsync para poder compararlos visualmente al mismo tiempo.

5.9 Interpretación y Conclusiones

Los resultados se interpretan para identificar los patrones más críticos y formular recomendaciones orientadas a la gestión del tráfico y la planificación urbana.

6 Carga de Datos y de Librerías Necesarias

En esta sección se carga y prepara la información obtenida desde Waze, junto con las librerías que se van a usar a lo largo del documento. Los datos están 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 correcto para el análisis temporal.

El archivo Excel contiene información clave como el tipo de evento, las coordenadas geográficas y la fecha de creación. Para el análisis es necesario convertir las fechas al formato YYYY-MM-DD HH:MM, ya que esto permite trabajar de forma precisa con la dimensión temporal de los datos.

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.
# Cargar los datos de Waze
Trama_Waze = read_excel("Trama Waze.xlsx")

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

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

7 Análisis Temporal de los Eventos

El análisis temporal es una de las primeras aproximaciones que se hace sobre los datos, ya que permite identificar si hay patrones en la distribución de eventos a lo largo del día. Para esto se extraen las horas y los días a partir de la columna de fechas usando la librería lubridate, lo que facilita el filtrado por fechas y horas específicas.

Lo que se busca aquí es ver si hay franjas horarias donde se concentran más eventos y cómo se distribuyen a lo largo del día 26 en particular, lo cual podría indicar horas pico de congestión o momentos del día con mayor cantidad de accidentes u otros incidentes.

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

hora_factorizado <- factor(hora, levels = 0:23)

g_hora=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)

g_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

8 Distribución de Eventos

En esta sección se hace un análisis descriptivo de los tipos de eventos registrados en los datos de Waze. Se genera un gráfico de barras que muestra con qué frecuencia aparece cada categoría de evento, como trancones, peligros, accidentes y cierres de vías.

Este análisis es importante para saber qué tipo de eventos son más comunes y cuáles podrían requerir mayor atención. Además, da una idea general de las categorías que los usuarios reportan con más frecuencia, lo cual puede influir en cómo se priorizan los 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

9 Filtrado de Eventos PELIGRO del Día 26

Acá se filtran los eventos de tipo PELIGRO que ocurrieron específicamente el día 26. La idea es reducir el volumen de datos y enfocarse en los eventos de riesgo para poder analizarlos con mayor profundidad.

Este filtrado es necesario para poder concentrar el análisis en los eventos que representan peligros potenciales en las vías, lo que facilita identificar cuáles son las áreas más críticas desde ese punto de vista.

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

10 Visualización de Eventos PELIGRO

Con los eventos PELIGRO ya filtrados, se procede a visualizarlos en un mapa interactivo construido con la librería leaflet. Este mapa permite ver las ubicaciones exactas de los peligros reportados sobre un mapa geográfico, agrupando los eventos en clusters para que la visualización sea más legible.

Al ser interactivo, el mapa facilita identificar visualmente qué zonas tienen mayor concentración de eventos y ayuda a detectar posibles patrones espaciales en la distribución de los peligros reportados.

# 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

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

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

Este tipo de análisis espacial es bastante útil para identificar patrones de concentración y zonas de alto riesgo, información que puede ser valiosa para la toma de decisiones en la gestión del tráfico y en 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"))

12 Mapa de Densidad de Cierres de Vías

Aquí 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. Lo que se busca con este análisis es identificar las zonas más afectadas por los cierres de vías, información que puede servir para planificar desvíos y optimizar la movilidad urbana.

El mapa de densidad resalta las áreas donde se concentra el mayor número de cierres de vías, lo que proporciona una visualización clara de las zonas de mayor impacto. Esta información puede ser clave para que las autoridades tomen decisiones informadas sobre cómo gestionar el tráfico en esas zonas.

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

13 Mapa Interactivo de Cierres de Vías

En esta sección se presenta un mapa interactivo con los eventos de cierre de vías (VIA CERRADA) del día 26. Con leaflet se visualizan las ubicaciones de estos eventos sobre el mapa, y los usuarios pueden hacer clic en cada marcador para obtener más detalles, como la hora y las coordenadas exactas del evento.

Este mapa interactivo es una herramienta visual muy práctica para explorar geográficamente las áreas afectadas por cierres de vías y puede apoyar 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

14 Análisis Espacial de Cierres de Vías

Esta sección está dedicada al análisis espacial de los cierres de vías usando spatstat y terra. El objetivo es ver cómo se distribuyen geográficamente los eventos de cierre de vías del día 26 y si existe algún patrón en su concentración.

Este análisis ayuda a entender qué tan extendidos están los cierres de vías en el territorio, lo que puede ser útil para identificar áreas críticas que necesiten intervenciones inmediatas o que deban tenerse en cuenta en la 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")

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

15 Mapa de Densidad de Cierres de Vías

Aquí se genera un segundo mapa de densidad para los eventos de cierre de vías (VÍA CERRADA), con un enfoque más detallado en las áreas de mayor afectación. Este mapa permite identificar las zonas donde los cierres de vías son más frecuentes y entender mejor la severidad del problema en distintas partes de la ciudad.

Contar con esta visualización es clave para comprender cómo los cierres de vías pueden afectar la movilidad general y para priorizar las zonas que más atención requieren.

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

16 Análisis de Accidentes

En esta sección se hace un análisis de los eventos de accidentes (ACCIDENTE) ocurridos el día 26. Se filtran estos eventos para trabajar exclusivamente con los reportes de esa fecha, buscando entender mejor cómo se distribuyen en el espacio y qué impacto pueden tener sobre la movilidad.

Analizar los accidentes es importante para identificar las zonas más peligrosas y planificar medidas de seguridad vial, como mejorar la señalización o intervenir en la infraestructura de las áreas más 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,]

17 Mapa Interactivo de Accidentes

Aquí se presenta un mapa interactivo con los eventos de accidentes (ACCIDENTE) del día 26. Al igual que en los mapas anteriores, se usa leaflet para mostrar los puntos donde ocurrieron accidentes, y los usuarios pueden hacer clic en los marcadores para ver más detalles de cada incidente.

Este mapa es una herramienta visual muy útil para entender la distribución espacial de los accidentes e identificar las zonas donde se concentran más, lo que podría orientar futuras intervenciones para mejorar 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

18 Análisis Espacial de Accidentes

En esta sección se realiza un análisis espacial de los accidentes del día 26 usando spatstat y terra. El objetivo es estudiar cómo se distribuyen geográficamente estos eventos y si hay algún patrón espacial en su ocurrencia.

Este análisis es relevante para identificar las zonas donde los accidentes son más frecuentes y así poder planificar estrategias de mitigación, como mejorar la señalización o hacer cambios en la infraestructura que reduzcan la probabilidad de que ocurran accidentes en esas áreas.

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

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

19 Mapa de Densidad de Accidentes

Aquí se genera un mapa de densidad basado en la distribución de los accidentes (ACCIDENTE) del día 26. Este mapa resalta las áreas donde se concentra la mayor cantidad de accidentes, lo que ayuda a identificar zonas de alto riesgo en la ciudad.

El uso de mapas de densidad en el análisis de accidentes es muy útil para visualizar los focos de mayor peligro y planificar intervenciones que mejoren la seguridad vial. Este tipo de visualización permite detectar patrones espaciales que no serían evidentes si solo se revisaran 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"))

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 ese día específico y se estudia cómo se distribuyen tanto en el espacio como en el tiempo.

Analizar la congestión es fundamental para la planificación del tráfico, ya que permite identificar las zonas donde el flujo vehicular es más denso y los momentos del día en que se presentan mayores problemas de movilidad. Esta información puede usarse para optimizar la programación de semáforos o para planificar rutas alternativas.

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

21 Mapa Interactivo de Congestión

Aquí se muestra un mapa interactivo con los eventos de congestión (CONGESTIÓN) reportados el día 26. Con leaflet se visualizan los puntos de congestión sobre el mapa geográfico, y los usuarios pueden interactuar con los marcadores para obtener más detalles sobre cada evento.

Este mapa es útil para explorar visualmente qué áreas de la ciudad presentan más problemas de tráfico, y puede ser una herramienta de apoyo valiosa para los planificadores urbanos y las autoridades encargadas de la gestión del tránsito.

# 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

22 Análisis Espacial de Congestión

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

Este análisis es importante para identificar las áreas más congestionadas de la ciudad, lo que puede ayudar a las autoridades a tomar decisiones sobre mejoras en la infraestructura o ajustes en las rutas de tráfico para aliviar los problemas de movilidad.

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

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, dando una visualización clara de los puntos críticos de congestión en la ciudad.

Este tipo de mapa es una herramienta muy útil para los planificadores urbanos y las autoridades de tránsito, ya que permite ver con claridad dónde se concentran los problemas de tráfico 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"))

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

En esta última sección se consolidan los mapas interactivos generados a lo largo del análisis para mostrar todos los tipos de eventos (peligros, accidentes, congestión y cierres de vías) en una sola vista. Esto facilita la comparación entre los distintos tipos de eventos en una misma interfaz.

La sincronización de estos mapas permite visualizar todos los eventos relevantes sobre el mismo espacio geográfico, lo cual es muy útil para tener una visión global de los problemas de tráfico y riesgo en la ciudad, y para pensar en soluciones 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 Conclusiones

El análisis realizado sobre los datos de Waze para el día 26 permite obtener una visión bastante completa 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). Gracias al uso de herramientas de análisis espacial y mapas interactivos, fue posible identificar patrones importantes tanto en la distribución espacial como temporal de estos eventos.

Se pudo observar que los trancones y los peligros en las vías son los eventos más frecuentes, lo que evidencia la necesidad de un enfoque coordinado en la gestión del tráfico y de medidas preventivas en las áreas más afectadas. Además, los mapas de densidad muestran zonas con alta concentración de accidentes y cierres de vías, lo que sugiere que estas áreas podrían beneficiarse de mejoras en la infraestructura vial, como mejor señalización o reestructuración de rutas.

El análisis de la congestión muestra que hay áreas con problemas de tráfico persistentes durante las horas pico, lo que resalta la importancia de implementar soluciones como la optimización de semáforos y la creación de rutas alternativas para aliviar el tráfico. Adicioalmente, la visualización de los eventos PELIGRO permite identificar zonas con alta probabilidad de incidentes, lo que sugiere la necesidad de campañas de concientización para conductores y posibles intervenciones en la infraestructura para reducir los riesgos.

Finalmente, el uso de datos crowdsourcing como los de Waze representa una herramienta muy valiosa para las autoridades encargadas de la gestión del tráfico. Poder visualizar y analizar eventos en tiempo real no solo permite responder rápidamente a los incidentes, sino también hacer 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 integrarse en los sistemas de gestión de tráfico de las ciudades para promover una movilidad más segura, eficiente y sostenible.