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:
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)
| 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" ...
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)
| 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)
| 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.
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" ))
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”.
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"))
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"))
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"))
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"))
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”.
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.
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.
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.
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.
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)
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: