Nota: Documento académico para la Maestría en ciencia de datos de la Universidad Javeriana de Cali. Estos datos son proporcionados por el profesor y la mayoría de códigos también son proporcionados por él, el valor agregado es el análisis que se realiza

Introducción

Las instrucciones originales para realizar el trabajo se encuentran en el video de YouTube titulado “M2U2 - Caso: oferta de vivienda” en el siguiente enlace:

Ver video de YouTube aquí

Sin embargo, estas instrucciones han sido adaptadas utilizando el código proporcionado por el profesor, donde cambia las bases para realizar un “Análisis de Datos de Waze para Planeación”, este está disponible en el siguiente enlace:

Código del profesor aquí

En este análisis, nos enfocamos en las variables relacionadas con cierre de vías, accidentes y congestión para realizar un análisis de patrones siguiendo el enfoque de patrones puntuales. Las tareas a realizar son las siguientes:

  1. Realizar un análisis de patrones utilizando una prueba de chi-cuadrado adaptada para determinar si el patrón es aleatorio, agrupado o disperso.
  2. Calcular la función de intensidad para comprender la densidad de eventos en el espacio.
  3. Mapear las zonas donde ocurren los eventos identificados para visualizar las áreas más afectadas.

El archivo de datos utilizado para este análisis se encuentra disponible en el siguiente enlace:

Descargar archivo de datos aquí

1 Descripción del conjunto de datos

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

  • creation_Date: Fecha y hora en que se creó el reporte del evento.
  • type: Tipo de evento reportado, que puede ser uno de los siguientes:
    • PELIGRO: Reportes de peligros en la vía, como objetos en la carretera, vehículos detenidos, etc.
    • CONGESTIÓN: Reportes de congestión o trancones en el tráfico.
    • ACCIDENTE: Reportes de accidentes de tráfico.
    • VÍA CERRADA: Reportes de cierres de vías.
  • latitude: Latitud geográfica donde ocurrió el evento.
  • longitude: Longitud geográfica donde ocurrió el evento.
  • información_adicional: Información adicional proporcionada por el usuario sobre el evento (si está disponible).
  • otros_campos: Otras variables relevantes incluidas en el conjunto de datos, como el identificador del evento, estado del evento, etc.

2 cargue de librerías

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 del archivo

library(readxl)
Trama_Waze <- read_excel("Trama Waze.xlsx")
names(Trama_Waze)
##  [1] "id"                       "waze_json_trama_id"      
##  [3] "country"                  "reportRating"            
##  [5] "reportByMunicipalityUser" "confidence"              
##  [7] "reliability"              "type"                    
##  [9] "uuid"                     "roadType"                
## [11] "magvar"                   "subtype"                 
## [13] "street"                   "location_x"              
## [15] "location_y"               "pubMillis"               
## [17] "creation_Date"
# 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")

3 Distribución de eventos

En este análisis, hemos trabajado con datos de eventos reportados en Waze, categorizados en cuatro tipos principales: accidentes, congestiones, peligros y vías cerradas. La distribución de estos eventos fue analizada tanto cuantitativa como visualmente. Se identifican puntos en las vías nacionales al norte de Bogotá en la vía hacia Tunja y Chiquinquirá a la altura del municipio de Cajicá, Cundinamarca.

El gráfico de barras que se generó permite identicar que el tipo de evento más frecuente es la congestión, con 3,205 reportes, lo que representa una proporción significativa del total de incidentes registrados. Le siguen las vías cerradas con 1,021 reportes y los peligros con 719. Los accidentes, son la de menor frecuencia con 125 reportes. Los análisis a presentar se concentran en el día 26.

# 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

# 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

4 Análisis de peligros

Para la representación espacial, se generaron dos mapas, en el primero se muestra los eventos de “Peligro” del día 26 como puntos agrupados, permitiendo una exploración directa de los datos. El segundo mapa utiliza un enfoque de mapa de calor para visualizar la intensidad de riesgos en diferentes zonas, destacando áreas críticas según la densidad de eventos. También se hizo el análisis de patrón de puntos y cuadrícula que muestra que algunos cuadrantes tienen frecuencias muy altas (como 34 y 28), mientras que otros tienen valores nulos, lo que refuerza la evidencia de un patrón no uniforme. Esto sugiere que los eventos de peligro tienden a concentrarse en ciertas áreas específicas.Así mismo, el test de chi cuadrado confirma que el patrón de puntos no es aleatorio (Este resultado es estadísticamente significativo), además, con la función de k estimación se encuentra que las curvas observadas están consistentemente por encima de la curva de Poisson,lo que indica un patrón agrupado.

# Identificar eventos PELIGRO del día 26
pos <- which(Trama_Waze$tipo_evento == "PELIGRO" & dia == 26)
peligro26 <- Trama_Waze[pos,]
# 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
# Cargar la librería necesaria
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 PELIGRO
patron_peligro <- ppp(x = peligro26$long, y = peligro26$lat, window = zona)

# Realizar el Test de Cuadrantes con una cuadrícula 5x5
quadrat_res <- quadratcount(patron_peligro, nx = 5, ny = 5)

# Graficar el patrón de puntos con la cuadrícula
plot(patron_peligro, pch = 3, cex = 0.6, main = "Patrón de Puntos y Cuadrícula")
plot(quadrat_res, add = TRUE, textargs = list(col = 'red'))

# Realizar el Test de Chi-Cuadrado
chi2_test <- quadrat.test(patron_peligro, nx = 5, ny = 5)

# Mostrar el resultado del Test de Chi-Cuadrado
print(chi2_test)
## 
##  Chi-squared test of CSR using quadrat counts
## 
## data:  patron_peligro
## X2 = 459.27, df = 24, p-value < 2.2e-16
## alternative hypothesis: two.sided
## 
## Quadrats: 5 by 5 grid of tiles
# Cargar la librería necesaria
library(spatstat)

# Calcular la función K para el patrón de peligros
k_estimation <- Kest(patron_peligro)

# Graficar la Función K
plot(k_estimation, main = "Función K-Estimación para Peligros")

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

5 Cierres viales

# 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

Se rechaza la hipótesis nula de distribución completamente aleatoria (CSR).

Esto significa que el patrón de puntos no es aleatorio; en su lugar, los cierres viales presentan un patrón espacialmente agrupado o disperso, dependiendo de cómo se distribuyen las frecuencias en los cuadrantes.

# Cargar las librerías necesarias
library(spatstat)

# Definir la zona de interés (ya la tienes configurada)
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)

# Realizar el Test de Cuadrantes con 5x5 cuadrantes
quadrat_res <- quadratcount(patron_via_cerrada, nx = 5, ny = 5)

# Graficar el patrón de puntos con la cuadrícula
plot(patron_via_cerrada, pch = 3, cex = 0.6, main = "Patrón de Puntos y Cuadrícula")
plot(quadrat_res, add = TRUE, textargs = list(col = 'red'))

# Realizar el Test de Chi-Cuadrado
chi2_test <- quadrat.test(patron_via_cerrada, nx = 5, ny = 5)

# Mostrar el resultado del Test de Chi-Cuadrado
print(chi2_test)
## 
##  Chi-squared test of CSR using quadrat counts
## 
## data:  patron_via_cerrada
## X2 = 14752, df = 24, p-value < 2.2e-16
## alternative hypothesis: two.sided
## 
## Quadrats: 5 by 5 grid of tiles

Sobre la función de k estimación, el patrón de los cierres viales no es aleatorio. Las curvas indican un patrón agrupado, especialmente en escalas pequeñas (r cercano a 0). Esto significa que los cierres viales tienden a ocurrir en zonas específicas en lugar de distribuirse de manera uniforme o dispersa.

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

Además, el mapa de calor muestra una concentración de eventos en una zona específica, destacada por las áreas en amarillo y rojo. Esto indica que los cierres viales no están distribuidos de manera uniforme, sino que se agrupan en áreas críticas, particularmente en la región de Canelón y sus alrededores. Estos resultados confirman el análisis estadístico previo, que identificó un patrón espacial agrupado

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

6 Análisis de accidentes

El análisis de los eventos de tipo accidente muestra que el Test de Chi-Cuadrado rechaza la hipótesis de una distribución completamente aleatoria. Según lo anterior, los accidentes presentan un patrón espacial no aleatorio. La cuadrícula refuerza esta conclusión, ya que algunos cuadrantes tienen concentraciones de eventos significativas, como uno con 34 puntos. Además, en la función K, las curvas observadas están por encima de la línea de referencia de Poisson, lo que confirma un patrón espacial agrupado en los accidentes analizados.

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

# Realizar el Test de Chi-Cuadrado
chi2_test_accidente <- quadrat.test(patron_accidente, nx = 5, ny = 5)

# Mostrar el resultado del Test de Chi-Cuadrado
print(chi2_test_accidente)
## 
##  Chi-squared test of CSR using quadrat counts
## 
## data:  patron_accidente
## X2 = 769.56, df = 24, p-value < 2.2e-16
## alternative hypothesis: two.sided
## 
## Quadrats: 5 by 5 grid of tiles
# Calcular la función K-estimación
plot(Kest(patron_accidente))

7 Análisis de congestión

El análisis de los eventos de congestión muestra que el Test de Chi-Cuadrado rechaza la hipótesis de una distribución completamente aleatoria, indicando un patrón espacial no uniforme. La cuadrícula refleja esta no uniformidad, con concentraciones significativas en ciertos cuadrantes. Además, la función K evidencia que las curvas observadas están consistentemente por encima de la línea de referencia de Poisson, lo que confirma un patrón agrupado en los eventos de congestión analizados.

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

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

# Realizar el Test de Chi-Cuadrado
chi2_test_congestion <- quadrat.test(patron_congestion, nx = 5, ny = 5)

# Mostrar el resultado del Test de Chi-Cuadrado
print(chi2_test_congestion)
## 
##  Chi-squared test of CSR using quadrat counts
## 
## data:  patron_congestion
## X2 = 2612.9, df = 24, p-value < 2.2e-16
## alternative hypothesis: two.sided
## 
## Quadrats: 5 by 5 grid of tiles
# 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"))

8 Análisis y conclusión de los cuatro tipos de eventos

# Sincronizar los mapas interactivos de distintos tipos de eventos
leafsync::sync(m26_peligro, m26_accidente, m26_congestion, m26_via_cerrada)

Se usaron tres enfoques para analizar los datos: el patrón de puntos con cuadrícula, el Test de Chi-Cuadrado y la función K-Estimación. Con el Test de Chi-Cuadrado se rechaza la hipótesis de una distribución completamente aleatoria. Además, en el análisis de la función K, las curvas observadas están consistentemente por encima de la línea de Poisson, indicando un patrón espacial agrupado en los eventos del día 26. Este ejercicio permite enfocar esfuerzos de gestión de tránisito en los puntos especificos identificados de estas vías.

A los aleatorios no tienen sentido.

# Cargar las librerías necesarias
library(spatstat)

# Filtrar todos los eventos para el día 26
todos_eventos_26 <- Trama_Waze[dia == 26, ]

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

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

# 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 con todos los eventos
patron_todos <- ppp(x = todos_eventos_26$long, y = todos_eventos_26$lat, window = zona)
## Warning: data contain duplicated points
# Graficar el patrón de puntos y cuadrícula
quadrat_res <- quadratcount(patron_todos, nx = 5, ny = 5)  # Dividir en una cuadrícula de 5x5
plot(patron_todos, pch = 3, cex = 0.6, main = "Patrón de Puntos y Cuadrícula para Todos los Eventos")
plot(quadrat_res, add = TRUE, textargs = list(col = 'red'))

# Realizar el Test de Chi-Cuadrado
chi2_test <- quadrat.test(patron_todos, nx = 5, ny = 5)
print(chi2_test)
## 
##  Chi-squared test of CSR using quadrat counts
## 
## data:  patron_todos
## X2 = 6552.5, df = 24, p-value < 2.2e-16
## alternative hypothesis: two.sided
## 
## Quadrats: 5 by 5 grid of tiles
# Calcular y graficar la Función K-Estimación
k_estimation <- Kest(patron_todos)
plot(k_estimation, main = "Función K-Estimación para Todos los Eventos")

El análisis de los datos de Waze para el día 26 revela patrones claros en la distribución de eventos relacionados con la movilidad urbana, como peligros, congestión, accidentes y cierres viales. A través de herramientas de análisis espacial y mapas interactivos, se identificaron concentraciones significativas de estos eventos, lo que permite una mejor comprensión de los problemas de tráfico en áreas específicas.

La congestión y los peligros son los eventos más frecuentes, y su análisis resalta la necesidad de estrategias focalizadas en zonas críticas. Estas incluyen la optimización de rutas, mejoras en la infraestructura vial y un monitoreo constante de los datos en tiempo real para implementar soluciones rápidas y eficaces ante emergencias y congestiones persistentes.

Fin del documento

dibujar