ANÁLISIS EXPLORATORIO - SIGISVI- PERSONAS¶
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”.
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
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import random
import geopandas as gpd
import os
import plotly.express as px
import geopandas as gpd
import warnings
from matplotlib.colors import Normalize
from collections import Counter
# Cargar el archivo CSV con low_memory=False
data_sigisvi_persona = pd.read_csv(r"data_sigisvi_persona_preprocesado.csv", low_memory=False)
# Configurar pandas para mostrar todas las columnas
pd.set_option('display.max_columns', None)
# Mostrar la forma del DataFrame y las columnas
print(f'Forma: {data_sigisvi_persona.shape}')
print(f'Columnas: {data_sigisvi_persona.columns.tolist()}') # Listar todas las columnas
Forma: (27978, 72) Columnas: ['numero_formulario', 'despiste_previo', 'senalizacion_carteleria', 'senalizacion_horizontal', 'senalizacion_transitoria', 'semaforo', 'luminosidad', 'numero_ocupantes', 'uso_vehiculo', 'tipo_servicio_vehiculo', 'asegurado_vehiculo', 'rol_persona_involucrada', 'fuga', 'genero', 'edad', 'vigencia_licencia', 'cinturon_seguridad', 'sri', 'casco', 'prueba_alcohol', 'Lateral', 'Alcance', 'Angulo', 'Frontal', 'Rozamiento', 'colision_otro', 'En calzada', 'Multiple', 'Inmueble', 'En banquina', 'Columna', 'Arbol', 'Alcantarilla', 'ahuellamiento', 'apto', 'baches', 'en_reparación', 'con_charcos_o_inundada', 'con_hielo', 'con_material_suelto', 'con_nieve', 'despejada', 'mojada', 'seca', 'barrera_de_alto_impacto', 'barrera_de_hormigón', 'barreras_de_seguridad', 'cantero_central', 'cordón_divisorio', 'guardarraíl', 'ninguna_division', 'otra_division', 'vegetación', 'buena', 'humo', 'lluvia', 'niebla/neblina', 'polvo', 'Despejado', 'Granizo', 'Lluvia', 'Niebla / Neblina', 'Nieve', 'Nublado', 'Polvo', 'Viento', 'Conductor', 'Delantero', 'otro_ubicacionauto', 'Trasero Centro', 'Trasero Derecho', 'Trasero Izquierdo']
Visualización de Datos y Principales Tendencias¶
# Tratando los valores de edad: considerar 0 como NA
data_sigisvi_persona['edad'] = data_sigisvi_persona['edad'].replace(0, pd.NA)
# Eliminando valores NA
data_sigisvi_persona = data_sigisvi_persona.dropna(subset=['edad'])
# Asegurando que la columna 'edad' sea de tipo entero
data_sigisvi_persona['edad'] = data_sigisvi_persona['edad'].astype(int)
# Configuración del gráfico
plt.figure(figsize=(15, 10))
n, bins, patches = plt.hist(
data_sigisvi_persona['edad'],
bins=range(0, 101, 5),
edgecolor='black',
color='lightblue', # Cambiar el color de las barras a light blue
alpha=0.7
)
# Etiquetas en las barras con mayor espacio vertical
for i in range(len(n)):
if n[i] > 0: # Mostrar etiquetas solo en barras con datos
plt.text(bins[i] + 2.5, n[i] + 8, str(int(n[i])), ha='center', fontsize=10) # Ajustar el espacio vertical
# Títulos y etiquetas
plt.title('Edad de las Personas involucradas en siniestros viales', fontsize=16, weight='bold')
plt.xlabel('Edad (en años)', fontsize=14)
plt.ylabel('Cantidad de Personas', fontsize=14)
# Ajustes estéticos
plt.xticks(range(0, 101, 5), fontsize=12, rotation=45) # Mostrar todos los valores en el eje X
plt.yticks(fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout(pad=3.0) # Espacio adicional para evitar solapamiento
plt.margins(x=0.01, y=0.2) # Agregar espacio entre las columnas y los bordes
# Mostrar el gráfico
plt.show()
# Eliminando valores NA de la columna 'cinturon_seguridad'
data_sigisvi_persona = data_sigisvi_persona.dropna(subset=['cinturon_seguridad'])
# Calculando los porcentajes
cinturon_counts = data_sigisvi_persona['cinturon_seguridad'].value_counts()
total_cinturon = cinturon_counts.sum()
cinturon_percentages = (cinturon_counts / total_cinturon) * 100
# Configuración del gráfico
plt.figure(figsize=(15, 10))
# Creando el gráfico de barras
bars = plt.bar(
cinturon_percentages.index,
cinturon_percentages.values,
color='lightblue',
edgecolor='black',
alpha=0.7
)
# Etiquetas en las barras con mayor espacio vertical
for bar in bars:
height = bar.get_height()
plt.text(bar.get_x() + bar.get_width() / 2, height + 0.5, f'{height:.1f}%', ha='center', fontsize=10)
# Títulos y etiquetas
plt.title('Uso de Cinturón de Seguridad por las Personas involucradas en siniestros viales (en %)', fontsize=16, weight='bold')
plt.xlabel('Uso de Cinturón de Seguridad', fontsize=14)
plt.ylabel('Porcentaje (%)', fontsize=14)
# Ajustes estéticos
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout(pad=2.0) # Espacio adicional para evitar solapamiento
plt.margins(x=0.05, y=0.2) # Agregar espacio entre las barras y los bordes
# Mostrar el gráfico
plt.show()
# Ignorar FutureWarnings específicos
warnings.filterwarnings("ignore", category=FutureWarning)
# Asegurar que los valores en la columna 'cinturon_seguridad' sean consistentes
data_sigisvi_persona['cinturon_seguridad'] = data_sigisvi_persona['cinturon_seguridad'].str.strip().str.upper()
data_sigisvi_persona['cinturon_seguridad'] = data_sigisvi_persona['cinturon_seguridad'].replace({'SI': 'Sí', 'NO': 'No'})
# Eliminando valores NA de las columnas 'cinturon_seguridad' y 'edad'
data_sigisvi_persona = data_sigisvi_persona.dropna(subset=['cinturon_seguridad', 'edad'])
# Asegurando que 'edad' sea de tipo entero
data_sigisvi_persona['edad'] = data_sigisvi_persona['edad'].astype(int)
# Definir rangos de edad
bins = range(0, 90, 5) # Grupos de edades de 5 en 5 años
labels = [f'{i}-{i + 4}' for i in bins[:-1]]
# Crear una nueva columna con los rangos de edad
data_sigisvi_persona['grupo_edad'] = pd.cut(data_sigisvi_persona['edad'], bins=bins, labels=labels, right=False)
# Agrupar por grupo de edad y uso del cinturón
grouped_data = data_sigisvi_persona.groupby(['grupo_edad', 'cinturon_seguridad']).size().unstack(fill_value=0)
# Calcular el porcentaje para cada grupo de edad
percentages = grouped_data.div(grouped_data.sum(axis=1), axis=0) * 100
# Configuración del gráfico
plt.figure(figsize=(15, 10))
# Crear el gráfico de barras apiladas
bar1 = plt.bar(percentages.index, percentages['Sí'], color='lightblue', edgecolor='black', label='Usa Cinturón', alpha=0.85)
bar2 = plt.bar(percentages.index, percentages['No'], bottom=percentages['Sí'], color='red', edgecolor='black', label='No Usa Cinturón', alpha=0.85)
# Etiquetas para los porcentajes dentro de las barras
for i, rect in enumerate(bar1):
height = rect.get_height()
if height > 0: # Mostrar etiquetas solo si hay datos
plt.text(rect.get_x() + rect.get_width() / 2, height / 2, f"{height:.1f}%", ha='center', va='center', fontsize=10, color='black')
for i, rect in enumerate(bar2):
height = rect.get_height()
if height > 0: # Mostrar etiquetas solo si hay datos
plt.text(rect.get_x() + rect.get_width() / 2, percentages['Sí'][i] + height / 2, f"{height:.1f}%", ha='center', va='center', fontsize=10, color='black')
# Títulos y etiquetas
plt.title('Uso de Cinturón de Seguridad por Grupos de Edad', fontsize=16, weight='bold')
plt.xlabel('Grupo de Edad', fontsize=14)
plt.ylabel('Porcentaje', fontsize=14)
# Ajustes estéticos
plt.xticks(rotation=45, fontsize=12)
plt.yticks(fontsize=12)
plt.legend(fontsize=12, loc='lower right') # Leyenda movida hacia abajo a la derecha
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout(pad=2.0)
# Mostrar el gráfico
plt.show()
# Eliminando valores NA de la columna 'casco'
data_sigisvi_persona = data_sigisvi_persona.dropna(subset=['casco'])
# Contar los valores y calcular los porcentajes
casco_counts = data_sigisvi_persona['casco'].value_counts()
casco_percentages = (casco_counts / casco_counts.sum()) * 100
# Configuración del gráfico
plt.figure(figsize=(15, 10))
# Creando el gráfico de barras
bars = plt.bar(
casco_percentages.index,
casco_percentages.values,
color='lightblue',
edgecolor='black',
alpha=0.7
)
# Etiquetas en las barras con porcentajes
for bar in bars:
height = bar.get_height()
plt.text(bar.get_x() + bar.get_width() / 2, height + 1, f"{height:.1f}%", ha='center', fontsize=10)
# Títulos y etiquetas
plt.title('Uso de Casco por las Personas involucradas en siniestros viales', fontsize=16, weight='bold')
plt.xlabel('Uso de Casco', fontsize=14)
plt.ylabel('Porcentaje (%)', fontsize=14)
# Ajustes estéticos
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout(pad=2.0) # Espacio adicional para evitar solapamiento
plt.margins(x=0.05, y=0.2) # Agregar espacio entre las barras y los bordes
# Mostrar el gráfico
plt.show()
# Eliminando valores NA de la columna 'genero'
data_sigisvi_persona = data_sigisvi_persona.dropna(subset=['genero'])
# Contar los valores y calcular los porcentajes
genero_counts = data_sigisvi_persona['genero'].value_counts()
genero_percentages = (genero_counts / genero_counts.sum()) * 100
# Configuración del gráfico
plt.figure(figsize=(15, 10))
# Creando el gráfico de barras
bars = plt.bar(
genero_percentages.index,
genero_percentages.values,
color='lightblue',
edgecolor='black',
alpha=0.7
)
# Etiquetas en las barras con porcentajes
for bar in bars:
height = bar.get_height()
plt.text(bar.get_x() + bar.get_width() / 2, height + 1, f"{height:.1f}%", ha='center', fontsize=10)
# Títulos y etiquetas
plt.title('Distribución por Género de las Personas involucradas en siniestros viales', fontsize=16, weight='bold')
plt.xlabel('Género', fontsize=14)
plt.ylabel('Porcentaje (%)', fontsize=14)
# Ajustes estéticos
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout(pad=2.0) # Espacio adicional para evitar solapamiento
plt.margins(x=0.05, y=0.2) # Agregar espacio entre las barras y los bordes
# Mostrar el gráfico
plt.show()
# Eliminando valores NA de la columna 'numero_ocupantes' y excluyendo 0
data_sigisvi_persona = data_sigisvi_persona.dropna(subset=['numero_ocupantes'])
data_sigisvi_persona = data_sigisvi_persona[data_sigisvi_persona['numero_ocupantes'] != 0]
# Agrupar valores iguales o mayores a 6 en una categoría '6 o más'
data_sigisvi_persona['ocupantes_grupo'] = data_sigisvi_persona['numero_ocupantes'].apply(lambda x: '6 o más' if x >= 6 else str(int(x)))
# Contar los valores y calcular los porcentajes
ocupantes_counts = data_sigisvi_persona['ocupantes_grupo'].value_counts().sort_index()
ocupantes_percentages = (ocupantes_counts / ocupantes_counts.sum()) * 100
# Configuración del gráfico
plt.figure(figsize=(15, 10))
# Creando el gráfico de barras
bars = plt.bar(
ocupantes_percentages.index,
ocupantes_percentages.values,
color='lightblue',
edgecolor='black',
alpha=0.7
)
# Etiquetas en las barras con porcentajes
for bar in bars:
height = bar.get_height()
plt.text(bar.get_x() + bar.get_width() / 2, height + 1, f"{height:.1f}%", ha='center', fontsize=10)
# Títulos y etiquetas
plt.title('Distribución del Número de Ocupantes por Vehículo en Siniestros Viales', fontsize=16, weight='bold')
plt.xlabel('Número de Ocupantes', fontsize=14)
plt.ylabel('Porcentaje (%)', fontsize=14)
# Ajustes estéticos
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout(pad=2.0) # Espacio adicional para evitar solapamiento
plt.margins(x=0.05, y=0.2) # Agregar espacio entre las barras y los bordes
# Mostrar el gráfico
plt.show()