Planteamiento del Problema

A partir de la base de datos “Trama Waze.xlsx”, obtenida de la aplicación “Waze”, que contiene información sobre los eventos de afectación del tráfico en la ciudad de Bogotá, Colombia, para el día 26 de septiembre de 2024, siguiendo los pasos:

  • Realizar un análisis descriptivo de los eventos categorizados en Waze.
  • Visualizar los eventos “Peligro”,“Cierre de Vias”, “Accidente” y “Congestión” en un mapa interactivo.
  • Mostrar la distribución del riesgo del evento “Peligro”, “Cierre de Vias”, “Accidente” y “Congestión” en un mapa interactivo de densidad.
  • Verificar patrones de puntos para los eventos “Peligro”, “Cierre de Vias”, “Accidente” y “Congestión”.
  • Agrupar las mapas obtenidos.
  • Conclusiones y Recomendaciones.

Desarrollo de la actividad

Análisis Exploratorio y Limpieza de datos

Antes de desarrollar los puntos, realizamos un análisis exploratorio para limpiar la base de datos de datos faltantes y posibles inconsistencias, observemos que tipo de variables disponemos.

# Importar base de datos solicitada
Planeacion_Excel <- "C:/Users/Christian/Desktop/Carpeta del Todo/Cursos Maestria en Ciencia de Datos/07 - Analisis de datos geograficos y espaciales/Unidad 2.2 - Exploracion de datos con patrones puntuales/Trama Waze.xlsx"
Planeacion= suppressMessages(suppressWarnings(read_excel(Planeacion_Excel)))

#Base de datos solicitada para este trabajo
str(Planeacion, vec.len = 2, give.attr = FALSE)
## tibble [5,070 × 17] (S3: tbl_df/tbl/data.frame)
##  $ id                      : num [1:5070] 16 17 18 20 21 ...
##  $ waze_json_trama_id      : num [1:5070] 14 14 14 15 15 ...
##  $ country                 : chr [1:5070] "CO" "CO" ...
##  $ reportRating            : num [1:5070] 2 3 0 2 3 ...
##  $ reportByMunicipalityUser: logi [1:5070] FALSE FALSE FALSE ...
##  $ confidence              : num [1:5070] 1 4 4 1 4 ...
##  $ reliability             : num [1:5070] 8 10 10 8 10 ...
##  $ type                    : chr [1:5070] "HAZARD" "HAZARD" ...
##  $ uuid                    : chr [1:5070] "74a153fa-6ccd-4d6b-a94b-db01a88b002d" "b91961a4-e32c-4770-b2a0-551d7add5669" ...
##  $ roadType                : num [1:5070] 3 3 3 3 3 ...
##  $ magvar                  : num [1:5070] 96 153 27 96 153 ...
##  $ subtype                 : chr [1:5070] "HAZARD_ON_SHOULDER_CAR_STOPPED" "HAZARD_ON_SHOULDER_CAR_STOPPED" ...
##  $ street                  : chr [1:5070] NA "Variante Cajicá / RD45A Ramal A >(S)" ...
##  $ location_x              : num [1:5070] -7.4e+07 -7.4e+07 ...
##  $ location_y              : num [1:5070] 4938376 2733202 ...
##  $ pubMillis               : num [1:5070] 1.73e+12 1.73e+12 ...
##  $ creation_Date           : chr [1:5070] "2024-09-26 01:53:49.600" "2024-09-26 01:53:49.600" ...

Podemos ver que la base de datos cuenta con 17 variables y 5070 registros, “id” y “uuid” probablemente cumplen con la misma función, por lo que se podría eliminar “uuid”.

A continuación, realizamos una revisión de los datos faltantes.

#Calculando datos faltantes
Datos_faltantes <- data.frame(colnames(Planeacion), sapply(Planeacion, function(x) sum(is.na(x))))

#Limpiando Dataframe
rownames(Datos_faltantes) <- NULL
colnames(Datos_faltantes) <- c("Variable", "Datos Faltantes")

#Presentando información en formato tabla
kable_classic(kbl(Datos_faltantes, caption = "<center><b>Tabla 1. Datos Faltantes por Variable</b></center>"), full_width = F)
Tabla 1. Datos Faltantes por Variable
Variable Datos Faltantes
id 0
waze_json_trama_id 0
country 0
reportRating 0
reportByMunicipalityUser 0
confidence 0
reliability 0
type 0
uuid 0
roadType 0
magvar 0
subtype 858
street 260
location_x 0
location_y 0
pubMillis 0
creation_Date 0

Las variables que presentaron datos ausentes fueron “subtype” y “street”, en el primer caso, dado que nuestra variable de observación principal es “type” no es tan relevante que “subtype” tenga datos faltantes; en el segundo caso, nuestras variables de referencia geográfica principales son “location_x” y “location_y”, y a través de los mapas podemos comentar las ubicaciones correspondientes a los puntos señalados, sin embargo, a futuro podría georefenciarse las calles de forma correcta para una identificación rápida.

Con esta situación se define no intervenir en la base de datos y continuar con los datos actuales. Por conveniencia, se elimina la columna “uuid”.

#Eliminar variable uuid
Planeacion1 <- Planeacion[-c(9)]

#Base de datos solicitada para este trabajo
str(Planeacion1, vec.len = 2, give.attr = FALSE)
## tibble [5,070 × 16] (S3: tbl_df/tbl/data.frame)
##  $ id                      : num [1:5070] 16 17 18 20 21 ...
##  $ waze_json_trama_id      : num [1:5070] 14 14 14 15 15 ...
##  $ country                 : chr [1:5070] "CO" "CO" ...
##  $ reportRating            : num [1:5070] 2 3 0 2 3 ...
##  $ reportByMunicipalityUser: logi [1:5070] FALSE FALSE FALSE ...
##  $ confidence              : num [1:5070] 1 4 4 1 4 ...
##  $ reliability             : num [1:5070] 8 10 10 8 10 ...
##  $ type                    : chr [1:5070] "HAZARD" "HAZARD" ...
##  $ roadType                : num [1:5070] 3 3 3 3 3 ...
##  $ magvar                  : num [1:5070] 96 153 27 96 153 ...
##  $ subtype                 : chr [1:5070] "HAZARD_ON_SHOULDER_CAR_STOPPED" "HAZARD_ON_SHOULDER_CAR_STOPPED" ...
##  $ street                  : chr [1:5070] NA "Variante Cajicá / RD45A Ramal A >(S)" ...
##  $ location_x              : num [1:5070] -7.4e+07 -7.4e+07 ...
##  $ location_y              : num [1:5070] 4938376 2733202 ...
##  $ pubMillis               : num [1:5070] 1.73e+12 1.73e+12 ...
##  $ creation_Date           : chr [1:5070] "2024-09-26 01:53:49.600" "2024-09-26 01:53:49.600" ...

Preparación de los datos

Filtramos la base de datos únicamente para el periodo solicitado que es el día 26 de septiembre de 2024.

# Convertir a formato de fecha y hora
Planeacion1$creation_Date <- as.POSIXct(Planeacion1$creation_Date)

# Filtrar por el dia 26 de Septiembre de 2024
Planeacion_dia <- Planeacion1[Planeacion1$creation_Date >= as.POSIXct("2024-09-26 00:00:00")
                              & Planeacion1$creation_Date <= as.POSIXct("2024-09-26 23:59:59"), ]

# Ver Base de datos solicitada para este trabajo
str(Planeacion_dia, vec.len = 2, give.attr = FALSE)
## tibble [1,804 × 16] (S3: tbl_df/tbl/data.frame)
##  $ id                      : num [1:1804] 16 17 18 20 21 ...
##  $ waze_json_trama_id      : num [1:1804] 14 14 14 15 15 ...
##  $ country                 : chr [1:1804] "CO" "CO" ...
##  $ reportRating            : num [1:1804] 2 3 0 2 3 ...
##  $ reportByMunicipalityUser: logi [1:1804] FALSE FALSE FALSE ...
##  $ confidence              : num [1:1804] 1 4 4 1 4 ...
##  $ reliability             : num [1:1804] 8 10 10 8 10 ...
##  $ type                    : chr [1:1804] "HAZARD" "HAZARD" ...
##  $ roadType                : num [1:1804] 3 3 3 3 3 ...
##  $ magvar                  : num [1:1804] 96 153 27 96 153 ...
##  $ subtype                 : chr [1:1804] "HAZARD_ON_SHOULDER_CAR_STOPPED" "HAZARD_ON_SHOULDER_CAR_STOPPED" ...
##  $ street                  : chr [1:1804] NA "Variante Cajicá / RD45A Ramal A >(S)" ...
##  $ location_x              : num [1:1804] -7.4e+07 -7.4e+07 ...
##  $ location_y              : num [1:1804] 4938376 2733202 ...
##  $ pubMillis               : num [1:1804] 1.73e+12 1.73e+12 ...
##  $ creation_Date           : POSIXct[1:1804], format: "2024-09-26 01:53:49" "2024-09-26 01:53:49" ...

Vemos que con el filtro por fecha realizado pasamos de tener 5070 registros a solo 1804 registros.

Otra dificultad que tiene la base de datos es que los datos de ubicación geográfica “location_x” y “location_y” no tienen la coma para definir los decimales adecuadamente, pero sabemos que por la ubicación de Colombia, en longitud debe ser -7X,xx y en latitud debe ser X,xx, por lo que debemos asignar esos separadores decimales adecuadamente.

# Crear función para siempre tener dos valores enteros + decimales
formato_dec <- function(x, y) {
  x_char <- as.character(x) # Convertir a carácter
  longitud <- nchar(x_char) # Obtener la longitud del número
  if (y > longitud) {
    ceros_a_agregar <- y - longitud
    x_char <- paste0(strrep("0", ceros_a_agregar), x_char) # Si y es mayor que la longitud, agregar ceros a la izquierda
    longitud <- nchar(x_char)  # Actualizar la longitud
  }
  parte_entera <- substr(x_char, 1, y) # Extraer las dos primeras cifras
  parte_decimal <- substr(x_char, y + 1, longitud) # Extraer el resto de las cifras
  resultado <- paste0(parte_entera, ".", parte_decimal) # Combinar las partes con un separador decimal
  return(resultado)
}

# Dar el formato corrrecto a la longitud
Planeacion_coord <- Planeacion_dia
y <- 3
Planeacion_coord$location_x <- sapply(Planeacion_dia$location_x, formato_dec, y)

# Dar el formato corrrecto a la latitud
y <- 1
Planeacion_coord$location_y <- sapply(Planeacion_dia$location_y, formato_dec, y)

# Convertir a número
Planeacion_coord$location_x <- as.numeric(Planeacion_coord$location_x)
Planeacion_coord$location_y <- as.numeric(Planeacion_coord$location_y)

# Ver Base de datos solicitada para este trabajo
str(Planeacion_coord, vec.len = 2, give.attr = FALSE)
## tibble [1,804 × 16] (S3: tbl_df/tbl/data.frame)
##  $ id                      : num [1:1804] 16 17 18 20 21 ...
##  $ waze_json_trama_id      : num [1:1804] 14 14 14 15 15 ...
##  $ country                 : chr [1:1804] "CO" "CO" ...
##  $ reportRating            : num [1:1804] 2 3 0 2 3 ...
##  $ reportByMunicipalityUser: logi [1:1804] FALSE FALSE FALSE ...
##  $ confidence              : num [1:1804] 1 4 4 1 4 ...
##  $ reliability             : num [1:1804] 8 10 10 8 10 ...
##  $ type                    : chr [1:1804] "HAZARD" "HAZARD" ...
##  $ roadType                : num [1:1804] 3 3 3 3 3 ...
##  $ magvar                  : num [1:1804] 96 153 27 96 153 ...
##  $ subtype                 : chr [1:1804] "HAZARD_ON_SHOULDER_CAR_STOPPED" "HAZARD_ON_SHOULDER_CAR_STOPPED" ...
##  $ street                  : chr [1:1804] NA "Variante Cajicá / RD45A Ramal A >(S)" ...
##  $ location_x              : num [1:1804] -74 -74 ...
##  $ location_y              : num [1:1804] 4.94 2.73 ...
##  $ pubMillis               : num [1:1804] 1.73e+12 1.73e+12 ...
##  $ creation_Date           : POSIXct[1:1804], format: "2024-09-26 01:53:49" "2024-09-26 01:53:49" ...
print(head(Planeacion_coord$location_x))
## [1] -74.01693 -74.01699 -73.99625 -74.01693 -74.01699 -73.99625
print(head(Planeacion_coord$location_y))
## [1] 4.938376 2.733202 4.925537 4.938376 2.733202 4.925537

Con ello hemos corregido los valores de longitud y latitud, ahora procedemos a delimitar los datos a la ciudad de Bogotá y sus alrededores, para ello tomamos una aproximación relativamente confiable de tomar los datos entre la latitud 4 y la 5.

# Filtrar solo las longitudes cercanas al territorio de Bogotá
Planeacion_coord <- Planeacion_coord[Planeacion_coord$location_y > 4 &
                                       Planeacion_coord$location_y < 5, ]

# Ver Base de datos solicitada para este trabajo
str(Planeacion_coord, vec.len = 2, give.attr = FALSE)
## tibble [1,747 × 16] (S3: tbl_df/tbl/data.frame)
##  $ id                      : num [1:1747] 16 18 20 22 24 ...
##  $ waze_json_trama_id      : num [1:1747] 14 14 15 15 16 ...
##  $ country                 : chr [1:1747] "CO" "CO" ...
##  $ reportRating            : num [1:1747] 2 0 2 0 2 ...
##  $ reportByMunicipalityUser: logi [1:1747] FALSE FALSE FALSE ...
##  $ confidence              : num [1:1747] 1 4 1 5 1 ...
##  $ reliability             : num [1:1747] 8 10 8 10 8 ...
##  $ type                    : chr [1:1747] "HAZARD" "HAZARD" ...
##  $ roadType                : num [1:1747] 3 3 3 3 3 ...
##  $ magvar                  : num [1:1747] 96 27 96 27 96 ...
##  $ subtype                 : chr [1:1747] "HAZARD_ON_SHOULDER_CAR_STOPPED" "HAZARD_ON_SHOULDER_CAR_STOPPED" ...
##  $ street                  : chr [1:1747] NA "Bogotá-Tocancipá / RN55-01 >(N)" ...
##  $ location_x              : num [1:1747] -74 -74 ...
##  $ location_y              : num [1:1747] 4.94 4.93 ...
##  $ pubMillis               : num [1:1747] 1.73e+12 1.73e+12 ...
##  $ creation_Date           : POSIXct[1:1747], format: "2024-09-26 01:53:49" "2024-09-26 01:53:49" ...

Con ello observamos que la cantidad de registros bajo de 1804 a 1747, y ya con ello tendríamos los registros que necesitamos para nuestro trabajo. Finalmente verificamos las categorías de la variable “type”.

#Ver frecuencia de categorías en la variable "type"
kbl(addmargins(table(Planeacion_coord$"type", useNA = "ifany")), caption = "<center><b>Tabla 2. Frecuencia de la variable 'type'</b></center>", col.names=c("Tipo","Frecuencia"))%>%
  kable_classic(full_width = F)
Tabla 2. Frecuencia de la variable ‘type’
Tipo Frecuencia
ACCIDENT 36
HAZARD 131
JAM 923
ROAD_CLOSED 657
Sum 1747

Para una fácil visualización cambiamos los nombres de las categorías al español.

# Renombrar categorías
Planeacion_coord$type[Planeacion_coord$type == "ACCIDENT"] <- "Accidente"
Planeacion_coord$type[Planeacion_coord$type == "HAZARD"] <- "Peligro"
Planeacion_coord$type[Planeacion_coord$type == "JAM"] <- "Congestión"
Planeacion_coord$type[Planeacion_coord$type == "ROAD_CLOSED"] <- "Cierre de Vias"

#Ver frecuencia de categorías en la variable "type" tras renombrar
kbl(addmargins(table(Planeacion_coord$"type", useNA = "ifany")), caption = "<center><b>Tabla 3. Frecuencia de la variable 'type' tras renombrar</b></center>", col.names=c("Tipo","Frecuencia"))%>%
  kable_classic(full_width = F)
Tabla 3. Frecuencia de la variable ‘type’ tras renombrar
Tipo Frecuencia
Accidente 36
Cierre de Vias 657
Congestión 923
Peligro 131
Sum 1747

Con ello hemos terminado la preparación de los datos y podemos avanzar en la visualización.

Análisis descriptivo de Categorías

Realizamos una exploración inicial para ver que eventos ocurren con más frecuencia, esto puede ser útil a la hora de destinar recursos para la mitigación de las problemáticas de tráfico de la ciudad.

# Gráfico de frecuencia de los eventos.
plot_ly(Planeacion_coord, x = ~type, type = 'histogram', 
        color = ~type,  # Asignar color automáticamente por tipo
        colors = "Set3")%>% # Elige una paleta de colores
  layout(title = "Gráfico 1. Frecuencias de Eventos", 
         xaxis = list(title = "Evento"), 
         yaxis = list(title = "Frecuencia" )) 

Distribución Geográfica de los Eventos

Empezamos entonces con la visualización de los eventos en el mapa, el orden en que se visualizará será de aquellos con mayor cantidad de eventos a los que menos eventos tienen, es decir, el primero será “Congestión”.

Visualización de Congestión

Creamos una visualización de los eventos de “Congestión” en la ciudad de Bogotá, agrupando los datos para observar rápidamente los puntos de atención críticos de este evento.

# Filtando el evento "Congestión"
Congestion_coord <- Planeacion_coord[Planeacion_coord$type == "Congestión",]

# Visualización de mapa de "Congestión"
Congestion_map <- leaflet()%>%
  addTiles()%>%
  addCircleMarkers(lng = Congestion_coord$location_x, # Indicar la variable de longitud
                   lat = Congestion_coord$location_y, # Indicar la variable de latitud
                   clusterOptions = markerClusterOptions() # Permitir agrupar datos
                   )%>%
  addControl(html = "<h5>Mapa de Congestión</h5>", position = "topleft")
Congestion_map

Podemos visualizar esta información también a través de un mapa de calor.

# Visualización de mapa de calor de "Congestión"
leaflet(Congestion_coord)%>%
  addTiles()%>%
  addHeatmap(
    lng = ~location_x, # Indicar la variable de longitud
    lat = ~location_y, # Indicar la variable de latitud
    blur = 20, # Nivel de desenfoque gráfico
    max = 0.08, # Valor máximo de intensidad
    radius = 15 # Radio de los puntos del mapa de calor
  )%>%
  addLegend("bottomright",
            title = "Mapa de Calor de Congestión",
            colors = c("blue", "green", "yellow", "red"),
            labels = c("Bajo", "Moderado", "Alto", "Muy Alto"))

Visualización de Cierre de Vias

Creamos una visualización de los eventos de “Cierre de Vias” en la ciudad de Bogotá, agrupando los datos para observar rápidamente los puntos de atención críticos de este evento.

# Filtando el evento "Cierre de Vias"
Cierre_coord <- Planeacion_coord[Planeacion_coord$type == "Cierre de Vias",]

# Visualización de mapa de "Cierre de Vias"
Cierre_map <- leaflet()%>%
  addTiles()%>%
  addCircleMarkers(lng = Cierre_coord$location_x, # Indicar la variable de longitud
                   lat = Cierre_coord$location_y, # Indicar la variable de latitud
                   clusterOptions = markerClusterOptions() # Permitir agrupar datos
  )%>%
  addControl(html = "<h5>Mapa de Cierre de Vias</h5>", position = "topleft")
Cierre_map

Podemos visualizar esta información también a través de un mapa de calor.

# Visualización de mapa de calor de "Cierre de Vias"
leaflet(Cierre_coord)%>%
  addTiles()%>%
  addHeatmap(
    lng = ~location_x, # Indicar la variable de longitud
    lat = ~location_y, # Indicar la variable de latitud
    blur = 20, # Nivel de desenfoque gráfico
    max = 0.08, # Valor máximo de intensidad
    radius = 15 # Radio de los puntos del mapa de calor
  )%>%
  addLegend("bottomright",
            title = "Mapa de Calor de Cierre de Vias",
            colors = c("blue", "green", "yellow", "red"),
            labels = c("Bajo", "Moderado", "Alto", "Muy Alto"))

Visualización de Peligro

Creamos una visualización de los eventos de “Peligro” en la ciudad de Bogotá, agrupando los datos para observar rápidamente los puntos de atención críticos de este evento.

# Filtando el evento "Peligro"
Peligro_coord <- Planeacion_coord[Planeacion_coord$type == "Peligro",]

# Visualización de mapa de "Peligro"
Peligro_map <- leaflet()%>%
  addTiles()%>%
  addCircleMarkers(lng = Peligro_coord$location_x, # Indicar la variable de longitud
                   lat = Peligro_coord$location_y, # Indicar la variable de latitud
                   clusterOptions = markerClusterOptions() # Permitir agrupar datos
  )%>%
  addControl(html = "<h5>Mapa de Peligro</h5>", position = "topleft")
Peligro_map

Podemos visualizar esta información también a través de un mapa de calor.

# Visualización de mapa de calor de "Peligro"
leaflet(Peligro_coord)%>%
  addTiles()%>%
  addHeatmap(
    lng = ~location_x, # Indicar la variable de longitud
    lat = ~location_y, # Indicar la variable de latitud
    blur = 20, # Nivel de desenfoque gráfico
    max = 0.08, # Valor máximo de intensidad
    radius = 15 # Radio de los puntos del mapa de calor
  )%>%
  addLegend("bottomright",
            title = "Mapa de Calor de Peligro",
            colors = c("blue", "green", "yellow", "red"),
            labels = c("Bajo", "Moderado", "Alto", "Muy Alto"))

Visualización de Accidentes

Creamos una visualización de los eventos de “Accidente” en la ciudad de Bogotá, agrupando los datos para observar rápidamente los puntos de atención críticos de este evento.

# Filtando el evento "Accidente"
Accidente_coord <- Planeacion_coord[Planeacion_coord$type == "Accidente",]

# Visualización de mapa de "Accidente"
Accidente_map <- leaflet()%>%
  addTiles()%>%
  addCircleMarkers(lng = Accidente_coord$location_x, # Indicar la variable de longitud
                   lat = Accidente_coord$location_y, # Indicar la variable de latitud
                   clusterOptions = markerClusterOptions() # Permitir agrupar datos
  )%>%
  addControl(html = "<h5>Mapa de Accidentes</h5>", position = "topleft")
Accidente_map

Podemos visualizar esta información también a través de un mapa de calor.

# Visualización de mapa de calor de "Accidente"
leaflet(Accidente_coord)%>%
  addTiles()%>%
  addHeatmap(
    lng = ~location_x, # Indicar la variable de longitud
    lat = ~location_y, # Indicar la variable de latitud
    blur = 20, # Nivel de desenfoque gráfico
    max = 0.08, # Valor máximo de intensidad
    radius = 15 # Radio de los puntos del mapa de calor
  )%>%
  addLegend("bottomright",
            title = "Mapa de Calor de Accidentes",
            colors = c("blue", "green", "yellow", "red"),
            labels = c("Bajo", "Moderado", "Alto", "Muy Alto"))

Verificar Patrones de Puntos

Ahora realizamos la verificación de los patrones de puntos de los eventos, el orden en que se visualizará será de aquellos con mayor cantidad de eventos a los que menos eventos tienen, es decir, el primero será “Congestión”.

Patrones en Congestión

Verificamos el comportamiento de los eventos de “Congestión” en la ciudad de Bogotá, usando patrones de puntos y el test de cuadrantes.

# Definir rango espacial a usar, este será usado para todos los eventos
Rango <- owin(xrange = c(-74.04331, -73.9929), yrange = c(4.885736, 4.948562))

# Establecer patrones de puntos
Congestion_pp <- ppp(x = Congestion_coord$location_x,
                     y = Congestion_coord$location_y, 
                     window = Rango)
## Warning: data contain duplicated points
# Gráficar Patrones de puntos
plot(quadratcount(Congestion_pp), main = "Gráfico 2. Patrones de Puntos para 'Congestión'")
points(Congestion_pp, col = "red" )

Podemos ver que los puntos se concentran hacia la zona inferior izquierda, con un gran número en un cuadrante en la parte superior central. Observamos la función K para complementar el análisis.

# Graficar la función K
plot(Kest(Congestion_pp), main = "Gráfico 3. Función K para 'Congestión'")

Tres de los cuatro estadísticos están cerca de la línea central, lo que casi que nos da una distribución aleatoria de los puntos, mientras que la curva poisson indicaría una tendencia a la dispersión de los puntos.

Patrones en Cierre de Vias

Verificamos el comportamiento de los eventos de “Cierre de Vias” en la ciudad de Bogotá, usando patrones de puntos y el test de cuadrantes.

# Establecer patrones de puntos
Cierre_pp <- ppp(x = Cierre_coord$location_x,
                 y = Cierre_coord$location_y,
                 window = Rango)
## Warning: data contain duplicated points
# Gráficar Patrones de puntos
plot(quadratcount(Cierre_pp), main = "Gráfico 4. Patrones de Puntos para 'Cierre de Vias'")
points(Cierre_pp, col = "red" )

Podemos ver que solo hay dos cuadrantes con puntos. Observamos la función K para complementar el análisis.

# Graficar la función K
plot(Kest(Cierre_pp), main = "Gráfico 5. Función K para 'Cierre de Vias'")

Dado que los puntos se agrupan solo en dos cuadrantes, las gráficas muestran una fuerte tendencia hacia la agrupación de puntos.

Patrones en Peligro

Verificamos el comportamiento de los eventos de “Peligro” en la ciudad de Bogotá, usando patrones de puntos y el test de cuadrantes.

# Establecer patrones de puntos
Peligro_pp <- ppp(x = Peligro_coord$location_x,
                  y = Peligro_coord$location_y,
                  window = Rango)
## Warning: data contain duplicated points
# Gráficar Patrones de puntos
plot(quadratcount(Peligro_pp), main = "Gráfico 6. Patrones de Puntos para 'Peligro'")
points(Peligro_pp, col = "red" )

Los puntos tienden a agruparse sobre los cuadrantes de la derecha. Observamos la función K para complementar el análisis.

# Graficar la función K
plot(Kest(Peligro_pp), main = "Gráfico 7. Función K para 'Peligro'")

Dos de las funciones (K-iso y K-trans) están solo un poco arriba de lo que podría considerarse una distribución aleatoria de puntos, K-bord a medida que se aleja el radio se vuelve más excluyente, en tanto que la poisson muestra dispersión.

Patrones en Accidentes

Verificamos el comportamiento de los eventos de “Accidente” en la ciudad de Bogotá, usando patrones de puntos y el test de cuadrantes.

# Establecer patrones de puntos
Accidente_pp <- ppp(x = Accidente_coord$location_x,
                    y = Accidente_coord$location_y,
                    window = Rango)
## Warning: data contain duplicated points
# Gráficar Patrones de puntos
plot(quadratcount(Accidente_pp), main = "Gráfico 8. Patrones de Puntos para 'Accidente'")
points(Accidente_pp, col = "red" )

Solo dos cuadrantes tienen puntos, aunque uno solo tiene 2, también es cierto que este evento tiene pocos puntos. Observamos la función K para complementar el análisis.

# Graficar la función K
plot(Kest(Accidente_pp), main = "Gráfico 9. Función K para 'Accidente'")

Dado que los puntos se agrupan solo en dos cuadrantes, las gráficas muestran una tendencia hacia la agrupación de puntos, se debe tener en cuenta que se dispone de pocos puntos para la evaluación.

Agrupar mapas

Ahora agrupamos los mapas, de manera que sea fácil y rápida la visualización de los eventos.

# Agrupar los mapas en una única visualización
leafsync::sync(Congestion_map, Cierre_map, Peligro_map, Accidente_map)

Conclusión

Los datos observados del dia 26 de Septiembre de 2024, que fueron obtenidos desde la aplicación Waze, da una primera aproximación de los eventos que registra dicha aplicación, y el cómo podrían estar afectando la movilidad en la ciudad de Bogotá, a través de mapas interactivos y algunos análisis espaciales. A partir de los resultados obtenidos podemos señalar las siguientes conclusiones y observaciones:

  • Los eventos de congestión vial y los cierres de vías son los más frecuentes, el primero requiere atención en la gestión del tráfico urbano, mientras que el segundo es una gestión que desde la parte de infraestructura y desarrollo urbano de la ciudad debe realizarse para mitigar los impactos negativos de las obras en la ciudad.idad de predecir adecuadamente los valores de temperatura en la zona.
  • Los puntos demarcados como de peligro y las zonas donde se registraron accidentes deben ser evaluados conjuntamente, a través campañas de concientización y en donde corresponda, apoyo en la infraestructura vial.
  • El diseño de rutas alternativas, y adecuada señalización vial puede contribuir a mejorar el problema de la congestión vial, que es el mayor problema de la categorización realizada por Waze.
  • La evaluación del tráfico a través del monitoreo de aplicaciones como Waze y otras similares puede contribuir a dar una respuesta rápida a los incidentes que afectan al tráfico de la ciudad y a situaciones críticas que puedan presentarse.