Obtención de los datos

Los datsos utilizados en este estudio fueron obtenidos a partir de la plataforma Waze, que permite la recopilación de eventos reportados a tiempo real por los usuarios.

Estos eventos invluyen peligros ne las vías, congestión, accidentes y cierres viales. Los datos fueron proporcionados en formato Excel, contando con información clave como la fecha de creación y tipo de evento y coordenadas geográficas

Descrpición de los datos

El conjunto de datos proporcionado por Waze incluye las siguientes variables:

Análisis exploratorio

Una vez los datos estuvieron cargados y preparados, se realizó un análisis descriptivo inicial para entender las características básicas de los eventos. Se calculó la frecuencia de los diferentes tipos de eventos reportados, permitiendo identificar qué eventos eran más comunes.

Se generaron gráficos de barras utilizando ggplot2 para visualizar la distribución de los eventos y su prevalencia en la muestra de datos. Esta etapa ayudó a identificar patrones generales antes de pasar al análisis geoespacial.

# 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

Distribución de eventos

# 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

Filtrado de eventos PELIGRO del día 26

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

# 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

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.

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

Mapa de densidad de cierres de vías

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

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)
## Warning: data contain duplicated points
# 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")

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)
## Warning: data contain duplicated points
# 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"))

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

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.

# 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)
## Warning: data contain duplicated points
# 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))

# 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)
## Warning: data contain duplicated points
# 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"))
# 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)
## Warning: data contain duplicated points
# 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"))

Análisis de congestión del 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,]
# 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
# 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)
## Warning: data contain duplicated points
# 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))

# 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)
## Warning: data contain duplicated points
# 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"))

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)

Conclusión

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.

Puntos Clave:

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

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

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

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

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.

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.