Indice delictivo en Hermosillo 2018–2025 : Análisis exploratorio de datos (EDA)
Mapeando el Crimen: Una Radiografía de Datos de Hermosillo
Indice delictivo en Hermosillo 2018–2025 : Análisis exploratorio de datos (EDA)

Mapeando el Crimen: Una Radiografía de Datos de Hermosillo
En este análisis exploratorio, desentrañamos 2.3 millones de reportes al 911 para revelar los patrones delictivos de Hermosillo (2018–2025). Descubrirás dónde, cuándo y cómo ocurren los delitos, apoyado en datos geoespaciales y análisis rigurosos que transforma números en decisiones.
¿Qué nos dicen realmente 2.3 millones de reportes al 911?
Contexto del Problema: Hermosillo es la capital de Sonora, México, con aproximadamente 1 millón de habitantes. La ciudad enfrenta desafíos de seguridad pública complejos. Nuestro objetivo es usar datos para entender patrones delictivos y apoyar decisiones operacionales
La construcción del Dataset
Para lograrlo, no bastaba con una sola fuente. Construimos un dataset robusto cruzando tres pilares de información:
- Incidentes delictivos (2018–2025): Datos oficiales obtenidos vía Transparencia, que incluyen tipo de incidente, fecha, hora y colonia.
- Contexto Demográfico: Información del INEGI para entender quién vive en esas zonas (población, vivienda, educación).
- Geolocalización: Uso de la API de Google Maps para trazar polígonos y coordenadas precisas de cada una de las más de 2,000 colonias de la ciudad.
Sin embargo, tener los datos es solo el principio. El enfoque principal de este articulo fueron los hallazgos realizados en el análisis exploratorio de datos después de ordenar y procesar la información
- Cargar los datos:
project_root = Path.cwd().parent
data_path = project_root / 'data' / 'processed' / 'unificado' / 'poligonos_unificados_completo.csv'pp
df = pd.read_csv(data_path)
✓ Resultado: Dataset de 220 colonias , 45 variables, cubriendo 7 años de incidentes delictivos. Tamaño manejable en memoria (50–100 MB).
1. Ingeniería de Características: Del Caos al Orden
En nuestro dataset, la información esta desagregada en formato de diccionarios. Es decir, en lugar de tener siete columnas separadas — una por cada día de la semana — existía una sola columna que contenía estructuras como:
{'Lunes': 150, 'Martes': 200, ...}
El propósito de este formato se genero para que fuera mas compacto y ahorra espacio, pero complica el análisis, ya que los valores no están listos para ser procesados directamente. Nuestra tarea consistió en “explotar” estos diccionarios y convertirlos en columnas individuales para cada día de la semana.
Una vez realizada esta transformación, logramos convertir el caos en métricas claras. Gracias a ello descubrimos, por ejemplo, que el domingo es el día con mayor incidencia delictiva, con más de 413 000 reportes, en contraste con los martes, que presentan una actividad significativamente menor.
def explotar_columna_dict(df_original, nombre_columna, prefijo_col_nueva):
return df_final
columnas_a_explotar = {
'dias_semana_dict': 'dia_', # Crea: dia_Lunes, dia_Martes, ...
'partes_dia_dict': 'partedia_', # Crea: partedia_Mañana, partedia_Noche, ...
'categorias_dict': 'cat_' # Crea: cat_VIOLENCIA, cat_ROBO, ...
}
df_limpio = df.copy()
for columna, prefijo in columnas_a_explotar.items():
if columna in df_limpio.columns:
df_limpio = explotar_columna_dict(df_limpio, columna, prefijo)
print(f"✓ Columna '{columna}' explotada con prefijo '{prefijo}'")
Hallazgo Importante: Algunas colonias no aparecen en los reportes 911 (sin fecha_inicio) ni en los datos demográficos (sin población). Esto ocurre por:
-Colonias muy pequeñas o de formación reciente (posterior al censo 2020)
-Variaciones en los nombres de colonias entre fuentes (ej. “Villa X” vs “Residencial X”)
Decisión del análisis: Se mantienen estos registros, pero se documentan como “incompletos” para contexto posterior. En un análisis predictivo, podríamos imputar valores o excluirlos según el modelo.

2. Detección de Anomalías: Cuando el “Error” es la Noticia
Un paso clave en cualquier EDA es validar los outliers: ¿son errores de captura o eventos excepcionales? Para responderlo usamos el Z-Score, que mide cuántas desviaciones estándar se aleja un dato de la media.
El algoritmo de detección resaltó un caso extremo: la colonia Centro obtuvo un Z-Score de 17.7 en volumen de incidentes, una cifra estadísticamente descomunal. La revisión manual confirmó que no era un error, sino una realidad operativa: el Centro es realmente el núcleo de actividad — y de delincuencia — de la ciudad.
Por eso conservamos todos los registros. Eliminar estos valores habría significado borrar a los protagonistas de la historia.
Z-Score (intuición rápida): valores con |Z| > 3 suelen considerarse anomalías, pues solo el 0.3% de los datos de una distribución normal se comportan así.

# Cálculo de Z-Scores para detectar outliers
z_scores = np.abs(stats.zscore(df_numeric.fillna(df_numeric.mean())))
# Contar outliers (|z| > 3)
outliers_zscore = (z_scores > 3).sum(axis=0)
print("Outliers detectados con |Z-Score| > 3:")
outlier_cols = outliers_zscore[outliers_zscore > 0].sort_values(ascending=False)
if len(outlier_cols) > 0:
for col, count in outlier_cols.items():
pct = (count / len(df_limpio)) * 100
print(f" • {col}: {count} outliers ({pct:.2f}%)")
else:
print(" No se encontraron outliers")

Interpretación: El Centro de Hermosillo concentra la mayor cantidad de incidentes reportados, prácticamente triplicando al segundo lugar. Esto sugiere:
-Alta densidad poblacional y actividad comercial en la zona urbana central
-Mayor cobertura y presencia policial, lo que incrementa el número de reportes.
Un punto focal de actividad delictiva que requiere estrategias de intervención especializadas
El Espejismo de la Zona Industrial
Encontramos un caso fascinante al calcular la tasa de criminalidad por habitante:

La Zona Industrial mostró tasas astronómicas. ¿La razón? El “problema del denominador”. Con una población residente casi nula (< 100 personas) pero una población flotante masiva, las fórmulas estándar fallan. Esto nos enseñó a no comparar zonas residenciales con zonas comerciales.

3. Detección de Anomalías: Rango Intercuartil (IQR)
El Z-Score asume que los datos siguen una distribución normal. Pero en la práctica, muchos datos reales no son normales (especialmente datos de crimen, que suelen tener colas largas). El IQR es un método más robusto que no hace esta suposición.

# Cálculo de IQR
Q1 = df_numeric.quantile(0.25) # Percentil 25%
Q3 = df_numeric.quantile(0.75) # Percentil 75%
IQR = Q3 - Q1
# Calcular límites
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# Detectar outliers: valores fuera de los límites
outliers_iqr = ((df_numeric < lower_bound) | (df_numeric > upper_bound)).sum()
print("Outliers detectados por IQR:")
outlier_cols_iqr = outliers_iqr[outliers_iqr > 0].sort_values(ascending=False)
if len(outlier_cols_iqr) > 0:
for col, count in outlier_cols_iqr.head(10).items():
pct = (count / len(df_limpio)) * 100
print(f" • {col}: {count} outliers ({pct:.2f}%)")
else:
print(" No se encontraron outliers")

¿Qué método es mejor? Depende del contexto:
- Z-Score: Mejor para datos normalmente distribuidos, más sensible a valores extremos
- IQR: Mejor para datos con distribuciones no-normales, más robusto
En nuestro análisis de crimen, usaremos ambos y compararemos. Si los dos métodos identifican los mismos outliers, estamos seguros. Si difieren, investigaremos por qué.
Conclusión: Los outliers detectados (colonias como Centro, Solidaridad, Altares) son legítimos, no errores de captura. Representan la realidad: zonas de alta incidencia y densidad.
4. El “Cuadrante de Riesgo”: Herramienta de Priorización
Para entender la seguridad más allá del volumen simple, creamos un Cuadrante de Riesgo cruzando dos variables: Frecuencia (cantidad de incidentes) vs. Severidad (gravedad de los mismos).
Aplicamos un modelo de Isolation Forest para detectar qué colonias se comportan de manera anómala en este plano.
from sklearn.ensemble import IsolationForest
# Configuración del modelo para detectar anomalías (contaminación 5%)
iso_forest = IsolationForest(contamination=0.05, random_state=42)
# Entrenamos con las columnas de tasas (frecuencia vs severidad)
features_riesgo = ['tasa_incidentes_per_1k', 'tasa_alta_severidad_per_1k']
df_modelo['anomaly'] = iso_forest.fit_predict(df_modelo[features_riesgo])
# -1 indica anomalía, 1 indica normal
anomalias = df_modelo[df_modelo['anomaly'] == -1]

🔵 1. La mayoría de las colonias no representan un riesgo significativo
Existe un grupo muy denso de puntos — las colonias ubicadas en el cuadrante de Prioridad Baja — que se mantienen por debajo de la mediana tanto en frecuencia de incidentes como en severidad. Este comportamiento puede interpretarse como el “patrón normal” dentro de la ciudad.
🔴 2. Hay colonias que funcionan como focos rojos claros
En el cuadrante superior derecho aparece un conjunto reducido (entre 5 y 7 colonias, según el Isolation Forest) que combina altas tasas de incidentes con alta severidad. Estas zonas representan el escenario más crítico: demandan más recursos, generan mayor impacto y deberían ser tratadas como prioridades absolutas en materia de seguridad.
🟣 3. Surgen focos rojos crónicos dentro del “riesgo normal alto”
wUn hallazgo interesante es la presencia de puntos azules dentro del cuadrante de focos rojos. Esto significa que algunas colonias, aunque peligrosas, no son detectadas como anomalías porque su nivel de riesgo es tan constante y recurrente que el propio modelo las considera parte de un “grupo normal de alto riesgo”. En otras palabras, son colonias que ya viven en un estado de riesgo crónico.
¿Qué Factores Impulsan el Crimen?
Realizamos un análisis de correlación de Pearson para identificar relaciones lineales entre variables:


- Educación y Densidad (r =0.6): Contrario a la creencia popular, ni la densidad de población (r=-0.06) ni el nivel educativo (r=0.03) mostraron correlación con la tasa de severidad. Vivir “apretados” o tener menor escolaridad no predice mayor riesgo de delitos graves.
- El Factor Geográfico (r = 0.63): La variable que sí mostró una fuerte correlación con la severidad fue el Área en km².
Interpretación: Las colonias físicamente extensas y dispersas son más vulnerables, probablemente debido a tiempos de respuesta policial más lentos y menor vigilancia natural entre vecinos. El riesgo es un problema de cobertura geográfica, no demográfica.
5. Los Insights Más Importantes
Tras analizar más de 680,000 reportes, quedó claro que el principal desafío para entender la seguridad en Hermosillo no es la falta de información, sino el exceso de ruido generado por incidentes de “Convivencia”. Sin separar estos eventos de bajo impacto, cualquier análisis queda distorsionado.
Aun así, los datos limpios muestran un panorama contundente y altamente accionable. Estos son los cinco insights más importantes
1. Problema Real ≠ Percepción Pública
Aunque la conversación pública suele centrarse en el robo a casa habitación o el crimen patrimonial, la realidad es distinta: los reportes de “Convivencia” y “Violencia” dominan ampliamente el registro. Esto implica que no basta con aumentar patrullajes; se requieren estrategias de mediación comunitaria, intervención temprana y programas de cohesión social.
2. La Geografía Importa Más que la Demografía
El hallazgo más fuerte del análisis es la correlación entre Área territorial y Severidad (r = 0.63), convirtiéndose en el mejor predictor de riesgo. En contraste, variables demográficas tradicionalmente asociadas al crimen muestran una influencia mínima:
- Densidad poblacional: r = -0.06
- Nivel educativo: r = -0.03
Las colonias más extensas son más difíciles de vigilar, tienen mayores tiempos de respuesta y presentan patrones delictivos distintos. El riesgo es geográfico, no demográfico.
3. El Tiempo del Delito No es Aleatorio: Tiene Patrones Claros
Los datos revelan ciclos temporales muy marcados:
- Domingo concentra 3 veces más incidentes que un día promedio.
- Las noches absorben el 45% de los reportes, especialmente aquellos de alto impacto.
Esto indica que la estrategia de seguridad debe ser dinámica y sensible al tiempo, no uniforme. Ajustar horarios de vigilancia podría mejorar significativamente la eficiencia.
4. Datos de Alta Calidad = Decisiones Confiables
Más del 95% de los datos están completos, y los outliers detectados no son errores, sino casos reales que requieren atención diferenciada. Esto brinda una base sólida para construir modelos predictivos, dashboards y sistemas de alerta temprana.
5. 39 Variables → 7 Componentes: El Delito es Compresible
El análisis de dimensionalidad mostró que 39 variables pueden reducirse a 7 componentes principales sin perder información crítica. Esto facilita la construcción de modelos más robustos y eficientes, además de abrir la puerta a técnicas avanzadas como clustering espacial o predicción de hotspots.
Mitos vs. Datos: Qué Realmente Impulsa el Crimen
La matriz de correlación derriba dos creencias muy extendidas:
Mito 1: “A menor educación, mayor crimen.” Realidad: Correlación casi nula. El nivel educativo no predice delitos graves.
Mito 2: “Las zonas densas son más peligrosas.” Realidad: Correlación insignificante. Vivir en espacios compactos no aumenta la severidad delictiva.
Entonces… qué sí importa? El espacio.
La variable más poderosa fue el Área de la colonia, mostrando una correlación alta (r = 0.63) con la severidad delictiva. Las zonas dispersas, extensas y difíciles de patrullar se convierten en puntos vulnerables:
- Más distancia por cubrir
- Menor presencia visible
- Mayor tiempo de respuesta
6. Conclusión
Este EDA no fue solo un paso técnico: fue el proceso que nos permitió despejar la neblina y ver con claridad dónde realmente se concentra el riesgo. Sin una limpieza rigurosa y sin convertir los valores absolutos en tasas relativas, habríamos caído en la falsa narrativa de que “las colonias más pobladas son las más peligrosas”, pasando por alto a los verdaderos focos rojos que combinan alta frecuencia y alta severidad.
Durante el análisis también descubrimos un obstáculo importante: el ruido generado por los incidentes de “convivencia”. Estos eventos menores — como discusiones vecinales o reportes por ruido — aparecen en cantidades tan grandes que pueden distorsionar los patrones delictivos más serios. Filtrar este ruido fue clave para revelar el mapa real del riesgo.
El aprendizaje central es simple pero poderoso: los datos no mienten; la intuición sí puede hacerlo. Cuando las decisiones públicas se basan en métricas sólidas y no en percepciones, se asignan mejor los recursos, se identifican prioridades reales y se fortalece la seguridad de manera estratégica y efectiva
Repositorio en GitHub
https://github.com/Equipo-seguridad-y-desarrollo/indice-delictivo-hermosillo/tree/main
메타데이터
- post_id
- 22efc4de0a70
- slug
- indice-delictivo-en-hermosillo-2018-2025-análisis-exploratorio-de-datos-eda-22efc4de0a70
- url
- https://medium.com/mcd-unison/indice-delictivo-en-hermosillo-2018-2025-an%C3%A1lisis-exploratorio-de-datos-eda-22efc4de0a70
- canonical_url
- https://medium.com/mcd-unison/indice-delictivo-en-hermosillo-2018-2025-an%C3%A1lisis-exploratorio-de-datos-eda-22efc4de0a70
- author_url
- https://medium.com/@joelperezd
- status
- ok
- fetched_at
- 2026-07-23 22:41:54