Secretaría de Emergencias y Gestión de Riesgos - Gobierno de la provincia de Neuquén
El Observatorio Provincial de Gestión de Riesgos tiene como objetivo contribuir al diseño, implementación y monitoreo de políticas públicas tendientes a optimizar la gestión integral del riesgo en la provincia del Neuquén, a través del desarrollo de un sistema de información que permita recopilar, analizar y consolidar datos relevantes para la toma de decisiones y la mejora continua de las estrategias de reducción de riesgo y abordaje de situaciones de emergencias. Sus funciones se enmarcan en la ley provincial 2713: “Enfoque de riesgo en políticas de planificación y desarrollo territorial de la Provincia del Neuquén” (Art 3 y 8).
FUENTES DE INFORMACIÓN:
CIAT – Centro de Información de Alerta Temprana
SIGISVI - Sistema Integral de Gestión de la Información de Seguridad Vial
Vialidad Provincial (Estado de las rutas)
RAPH (SIEN) Registro de Atención Pre Hospitalaria
Medios gráficos de comunicación
OpenWeatherMap
Servicio meteorológico Nacional
Policía de la provincia de Neuquén
Dirección Bomberos de la Policía
Sistema de Manejo del Fuego
ANÁLISIS EXPLORATORIO DE SINIESTROS VIALES CON DATOS DEL SIGISVI (Sistema Integral de Gestión de la Información de Seguridad Vial)
LIBRERIAS
library(dplyr)
library(tidyr)
library(ggplot2)
library(lubridate)
library(corrplot)
library(reshape2)
Selección inicial de campos para el análisis
data_sigisvi_siniestro <- read.csv("siniestros.csv")
campos_siniestro <- c("numero_formulario", "localidad", "siniestro_fecha", "siniestro_hora", "categoria_siniestro", "zona_ocurrencia", "via_publica", "nombre_via","altura_km", "latitud", "longitud", "tipo_siniestro_multiple", "tipo_siniestro_unico", "trazado_via", "configuracion_de_la_via", "material_de_la_calzada")
data_sigisvi_siniestro_filtrado <- data_sigisvi_siniestro %>%
select(all_of(campos_siniestro))
summary(data_sigisvi_siniestro_filtrado)
numero_formulario localidad siniestro_fecha siniestro_hora categoria_siniestro zona_ocurrencia via_publica
Min. :1.230e+02 Length:11591 Length:11591 Length:11591 Length:11591 Length:11591 Length:11591
1st Qu.:2.021e+09 Class :character Class :character Class :character Class :character Class :character Class :character
Median :2.022e+09 Mode :character Mode :character Mode :character Mode :character Mode :character Mode :character
Mean :1.973e+09
3rd Qu.:2.023e+09
Max. :2.024e+09
nombre_via altura_km latitud longitud tipo_siniestro_multiple tipo_siniestro_unico trazado_via
Length:11591 Length:11591 Min. :-41.05 Min. :-71.79 Length:11591 Length:11591 Length:11591
Class :character Class :character 1st Qu.:-38.97 1st Qu.:-70.11 Class :character Class :character Class :character
Mode :character Mode :character Median :-38.95 Median :-68.15 Mode :character Mode :character Mode :character
Mean :-39.06 Mean :-69.06
3rd Qu.:-38.90 3rd Qu.:-68.09
Max. : 0.00 Max. : 0.00
NA's :222 NA's :222
configuracion_de_la_via material_de_la_calzada
Length:11591 Length:11591
Class :character Class :character
Mode :character Mode :character
datos <- data_sigisvi_siniestro_filtrado;
# Convertir siniestro_fecha a formato de fecha si aún no lo está
datos$siniestro_fecha <- as.Date(datos$siniestro_fecha, format = "%Y-%m-%d")
# Extraer el año utilizando la función base de R
datos$ano <- format(datos$siniestro_fecha, "%Y")
# Gráfico de barras por año
ggplot(data = datos, aes(x = ano)) +
geom_bar() +
labs(x = "Año", y = "Número de Siniestros", title = "Número de Siniestros Viales por Año")
# Agrupar y contar accidentes por mes
accidentes_por_mes <- datos %>%
mutate(siniestro_fecha = as.Date(siniestro_fecha)) %>%
mutate(mes = format(siniestro_fecha, "%Y-%m")) %>%
group_by(mes) %>%
summarise(cantidad = n())
# Convertir la columna 'mes' a Date para asegurar un eje x continuo
accidentes_por_mes$mes <- as.Date(paste0(accidentes_por_mes$mes, "-01"))
# Crear el gráfico de accidentes por mes
ggplot(accidentes_por_mes, aes(x = mes, y = cantidad)) +
geom_line() +
geom_point() +
labs(title = "Cantidad de Accidentes Viales por Mes",
x = "Mes",
y = "Cantidad de Accidentes") +
theme_minimal() +
scale_x_date(date_labels = "%b - %y", date_breaks = "1 month") + # Usar abreviaturas de mes
theme(axis.text.x = element_text(angle = 90, hjust = 1, size = 8),
plot.margin = margin(10, 10, 60, 10))
# Agrupar y contar accidentes por mes
accidentes_por_mes <- datos %>%
mutate(siniestro_fecha = as.Date(siniestro_fecha)) %>%
mutate(mes = format(siniestro_fecha, "%B")) %>% # Formato con nombre completo del mes
group_by(mes) %>%
summarise(cantidad = n())
# Reordenar el factor 'mes' para que esté en orden cronológico
accidentes_por_mes$mes <- factor(accidentes_por_mes$mes, levels = c("enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"))
# Crear el gráfico de accidentes por mes
ggplot(accidentes_por_mes, aes(x = mes, y = cantidad)) +
geom_bar(stat = "identity", fill = "skyblue", color = "black") +
labs(title = "Cantidad de Accidentes Viales por Mes",
x = "Mes",
y = "Cantidad de Accidentes") +
theme_minimal()
# Crear una columna para el día de la semana en formato de etiqueta
datos <- datos %>%
mutate(dia_semana_etiqueta = format(siniestro_fecha, "%a") %>% tolower())
# Definir el orden deseado de los días de la semana
orden_dias <- c("lun.", "mar.", "mié.", "jue.", "vie.", "sáb.", "dom.")
# Contar los siniestros por día de la semana y asegurar el orden correcto
siniestros_por_dia_semana <- datos %>%
count(dia_semana_etiqueta) %>%
mutate(dia_semana_etiqueta = factor(dia_semana_etiqueta, levels = orden_dias))
# Crear el gráfico de barras por día de la semana
ggplot(siniestros_por_dia_semana, aes(x = dia_semana_etiqueta, y = n)) +
geom_bar(stat = "identity", fill = "skyblue") +
labs(title = "Cantidad de Siniestros Viales por Día de la Semana",
x = "Día de la Semana",
y = "Cantidad de Siniestros") +
scale_x_discrete(labels = c(lun = "Lun", mar = "Mar", mié = "Mié", jue = "Jue", vie = "Vie", sáb = "Sáb", dom = "Dom")) + # Etiquetas involucradoslizadas
theme_minimal()
# Crear columnas para el día de la semana en formato de etiqueta y para el mes
datos <- datos %>%
mutate(dia_semana_etiqueta = format(siniestro_fecha, "%a") %>% tolower(),
mes_etiqueta = format(siniestro_fecha, "%b") %>% tolower())
# Definir el orden deseado de los días de la semana y los meses
orden_dias <- c("lun.", "mar.", "mié.", "jue.", "vie.", "sáb.", "dom.")
orden_meses <- c("ene.", "feb.", "mar.", "abr.", "may.", "jun.", "jul.", "ago.", "sep.", "oct.", "nov.", "dic.")
# Contar los siniestros por día de la semana y mes, y asegurar el orden correcto
siniestros_por_dia_mes <- datos %>%
count(dia_semana_etiqueta, mes_etiqueta) %>%
mutate(dia_semana_etiqueta = factor(dia_semana_etiqueta, levels = orden_dias),
mes_etiqueta = factor(mes_etiqueta, levels = orden_meses))
# Crear la matriz de calor
ggplot(siniestros_por_dia_mes, aes(x = mes_etiqueta, y = dia_semana_etiqueta, fill = n)) +
geom_tile(color = "white") +
scale_fill_gradient(low = "skyblue", high = "red", name = "Cantidad de Siniestros") +
labs(title = "Cantidad de Siniestros Viales por Día de la Semana y Mes",
x = "Mes",
y = "Día de la Semana") +
scale_x_discrete(labels = c("ene" = "Ene", "feb" = "Feb", "mar" = "Mar", "abr" = "Abr", "may" = "May", "jun" = "Jun", "jul" = "Jul", "ago" = "Ago", "sep" = "Sep", "oct" = "Oct", "nov" = "Nov", "dic" = "Dic")) + # Etiquetas involucradoslizadas
scale_y_discrete(labels = c("lun." = "Lun", "mar." = "Mar", "mié." = "Mié", "jue." = "Jue", "vie." = "Vie", "sáb." = "Sáb", "dom." = "Dom")) + # Etiquetas involucradoslizadas
theme_minimal()
# Convertir siniestro_hora a formato de hora
datos$siniestro_hora <- hms::as_hms(datos$siniestro_hora)
# Extraer la hora como un número entero (0 a 23)
datos <- datos %>%
mutate(hora = hour(siniestro_hora))
# Gráfico de barras de siniestros por hora del día
ggplot(datos, aes(x = factor(hora))) +
geom_bar(fill = "skyblue") +
labs(title = "Cantidad de Siniestros Viales por Hora del Día",
x = "Hora del Día",
y = "Cantidad de Siniestros") +
theme_minimal()
# Contar los siniestros por mes y hora
siniestros_por_mes_hora <- datos %>%
count(mes_etiqueta, hora) %>%
mutate(mes_etiqueta = factor(mes_etiqueta, levels = orden_meses))
# Crear la matriz de calor
ggplot(siniestros_por_mes_hora, aes(x = mes_etiqueta, y = factor(hora), fill = n)) +
geom_tile(color = "white") +
scale_fill_gradient(low = "skyblue", high = "red", name = "Cantidad de Siniestros") +
labs(title = "Cantidad de Siniestros Viales por Mes y Hora del Día",
x = "Mes",
y = "Hora del Día") +
scale_x_discrete(labels = c("ene" = "Ene", "feb" = "Feb", "mar" = "Mar", "abr" = "Abr", "may" = "May", "jun" = "Jun", "jul" = "Jul", "ago" = "Ago", "sep" = "Sep", "oct" = "Oct", "nov" = "Nov", "dic" = "Dic")) + # Etiquetas involucradoslizadas
scale_y_discrete(labels = as.character(0:23)) +
theme_minimal()
# Heatmap de siniestros por hora del día y día de la semana
siniestros_por_hora_dia_semana <- datos %>%
count(dia_semana_etiqueta, hora) %>%
mutate(dia_semana_etiqueta = factor(dia_semana_etiqueta, levels = orden_dias))
ggplot(siniestros_por_hora_dia_semana, aes(x = factor(hora), y = dia_semana_etiqueta, fill = n)) +
geom_tile(color = "white") +
scale_fill_gradient(low = "skyblue", high = "red", name = "Cantidad de Siniestros") +
labs(title = "Cantidad de Siniestros Viales por Hora del Día y Día de la Semana",
x = "Hora del Día",
y = "Día de la Semana") +
scale_x_discrete(labels = as.character(0:23)) +
scale_y_discrete(labels = c("lun." = "Lun", "mar." = "Mar", "mié." = "Mié", "jue." = "Jue", "vie." = "Vie", "sáb." = "Sáb", "dom." = "Dom")) +
theme_minimal()
# Filtrar los datos para eliminar las filas con "S/D" en categoria_siniestro
datos_filtrados <- datos %>%
filter(categoria_siniestro != "S/D")
# Contar los siniestros por categoría
siniestros_por_categoria <- datos_filtrados %>%
count(categoria_siniestro)
# Crear el gráfico de barras por categoría
ggplot(siniestros_por_categoria, aes(x = categoria_siniestro, y = n, fill = categoria_siniestro)) +
geom_bar(stat = "identity") +
labs(title = "Cantidad de Siniestros Viales por Categoría",
x = "Categoría del Siniestro",
y = "Cantidad de Siniestros") +
scale_fill_manual(values = c("fatal" = "red", "no fatal" = "skyblue"), name = "Categoría") +
theme_minimal()
Aviso: No shared levels found between `names(values)` of the manual scale and the data's fill values.
Aviso: No shared levels found between `names(values)` of the manual scale and the data's fill values.
# Filtrar los datos para eliminar las filas con "S/D" en zona_ocurrencia (si es necesario)
datos_filtrados_zona <- datos %>%
filter(zona_ocurrencia != "S/D", zona_ocurrencia != "")
# Contar los siniestros por zona_ocurrencia
siniestros_por_zona <- datos_filtrados_zona %>%
count(zona_ocurrencia)
# Crear el gráfico de barras por zona_ocurrencia
ggplot(siniestros_por_zona, aes(x = zona_ocurrencia, y = n, fill = zona_ocurrencia)) +
geom_bar(stat = "identity") +
labs(title = "Cantidad de Siniestros Viales por Zona de Ocurrencia",
x = "Zona de Ocurrencia",
y = "Cantidad de Siniestros") +
scale_fill_discrete(name = "Zona de Ocurrencia") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
# Filtrar los datos para eliminar las filas con "S/D" en via_publica (si es necesario)
datos_filtrados_via <- datos %>%
filter(via_publica != "S/D", via_publica != "")
# Contar los siniestros por via_publica
siniestros_por_via <- datos_filtrados_via %>%
count(via_publica)
# Crear el gráfico de barras por via_publica
ggplot(siniestros_por_via, aes(x = via_publica, y = n, fill = via_publica)) +
geom_bar(stat = "identity") +
labs(title = "Cantidad de Siniestros Viales por Vía Pública",
x = "Vía Pública",
y = "Cantidad de Siniestros") +
scale_fill_discrete(name = "Vía Pública") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
# Filtrar los datos para eliminar las filas con "S/D" en tipo_siniestro_unico (si es necesario)
datos_filtrados_tipo <- datos %>%
filter(tipo_siniestro_unico != "S/D", tipo_siniestro_unico != "")
# Contar los siniestros por tipo_siniestro_unico
siniestros_por_tipo <- datos_filtrados_tipo %>%
count(tipo_siniestro_unico)
# Crear el gráfico de barras por tipo_siniestro_unico
ggplot(siniestros_por_tipo, aes(x = tipo_siniestro_unico, y = n, fill = tipo_siniestro_unico)) +
geom_bar(stat = "identity") +
labs(title = "Cantidad de Siniestros Viales por Tipo de Siniestro Único",
x = "Tipo de Siniestro Único",
y = "Cantidad de Siniestros") +
scale_fill_discrete(name = "Tipo de Siniestro Único") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
# Filtrar los datos para eliminar las filas con "S/D" en material_calzada (si es necesario)
datos_filtrados_material <- datos %>%
filter(material_de_la_calzada != "S/D", material_de_la_calzada != "")
# Contar los siniestros por material_calzada
siniestros_por_material <- datos_filtrados_material %>%
count(material_de_la_calzada)
# Crear el gráfico de barras por material_calzada
ggplot(siniestros_por_material, aes(x = material_de_la_calzada, y = n, fill = material_de_la_calzada)) +
geom_bar(stat = "identity") +
labs(title = "Cantidad de Siniestros Viales por Material de la Calzada",
x = "Material de la Calzada",
y = "Cantidad de Siniestros") +
scale_fill_discrete(name = "Material de la Calzada") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))