INSTITUTO TECNOLÓGICO AUTÓNOMO DE MÉXICO
FUENTES DE INFORMACIÓN
“Delitos en la Ciudad de México”
Jueves 25 de junio 2020
Bernardo Altamirano García --- Clave: 167881
José Visoso Parás --- Clave: 171531
Índice
Índice 2
Introducción 3
Problema 3
Contexto de la organización 3
Fuentes de datos 3
Retos para la ingesta y análisis de los datos 3
Temas potenciales a analizar 4
Preguntas a responder 4
Arquitectura 5
Resultados obtenidos 6
Otros Mapas 12
Prueba de concepto 12
Conclusiones 13
Anexo 14
Introducción
El objetivo de este proyecto es hacer una prueba de concepto para entender la utilidad de nuevas tecnologías de procesamiento de datos en aumentar la seguridad en la CDMX. El proyecto se enfoca en Hadoop, ya que permite el análisis de grandes volúmenes de datos a altas velocidades.
Problema
La seguridad en México y sobretodo en la CDMX, siempre se ha considerada como uno de los factores de riesgo más grandes tanto para los turistas como para los ciudadanos. Las noticias y los periódicos cubren los casos más alarmantes o llamativos, sin embargo, hay una inmensidad de delitos de los cuales el público no se entera. El objetivo de este documento es buscar correlaciones entre la información que hay disponible sobre los delitos cometidos en los últimos años.
Contexto de la organización
La Procuraduría General de Justicia del Estado (PGJ) es una institución mexicana encargada de investigar los delitos ocurridos en México y de perseguir a los probables responsables de los mismos, encargándose del cumplimiento las leyes.
Debido a la población tan grande de México y por su alto nivel de delitos, la PGJ cuenta con una gran cantidad de casos reportados cada año. Con fines de encontrar relaciones entre los lugares donde ocurren delitos y otros datos demográficos de esos lugares, se utilizaron fuentes de datos públicas del gobierno como ingreso económico por
región, densidad de población, uso de suelo y más.
Fuentes de datos
Los datos utilizados en este proyecto fueron obtenidos de fuentes de datos públicas en México, dentro de ellas se encuentran las siguientes:
1. Carpeta de investigación PGJ:
https://datos.cdmx.gob.mx/explore/d ataset/carpetas-de-investigacion-pgj -de-la-ciudad-de-mexico/table/?disju nctive.ao_hechos&disjunctive.delito 2. Carpeta de víctimas PGJ
2019-2020:
https://datos.cdmx.gob.mx/explore/d ataset/victimas-en-carpetas-de-inves tigacion-pgj/table/
3. Uso de suelo:
https://datos.cdmx.gob.mx/explore/d ataset/uo-de-suelo/table/
4. Escuelas públicas:
https://datos.cdmx.gob.mx/explore/d ataset/escuelas-publicas/table/
5. Densidad poblacional cdmx
http://132.248.14.102/layers/CapaBa se:ii_4_1_densidad
Retos para la ingesta y análisis de los datos
La carpeta de investigación de la PGJ contiene 1,005,074 registros de delitos y 342,976 registros de víctimas;
consecuentemente, esta cantidad de datos no es fácil de interpretar con las herramientas tradicionales de análisis y visualización de datos. Este es un problema, sobre todo cuando se busca
utilizar otros factores y otras bases de datos para encontrar correlaciones entre estas.
Temas potenciales a analizar
Al observar las fuentes de datos obtenidas, se decidió la siguiente lista de temas por analizar para encontrar resultados interesantes sobre los delitos:
● Evolución del crimen en la ciudad:
○ Por zonas (colonias y alcaldías)
○ Por tipo de crimen
(clasificación del crimen y tipo de crimen)
○ Por hora del día (distribución de cada clasificación por hora)
○ Por sexo
○ Por edad de víctima
● Relaciones:
○ Densidad de población
○ Escuelas
○ Areas verdes
○ Bancos
○ Época del año
Preguntas a responder
1. ¿Cuáles son las 5 categorías de delitos más comunes?
2. ¿Cuáles son los 10 delitos con más ocurrencias registrados?
3. ¿Cuáles son las 5 alcaldías con más delitos?, ¿cuáles son los 5 delitos más comunes en las dos alcaldías que tienen más delincuencia?
4. ¿Cuáles son las 5 colonias con más delitos?, ¿cuáles son los 5 delitos más comunes en las dos colonias que tienen más delincuencia?
5. ¿Cómo se distribuyen las víctimas por sexo?
6. ¿Cuáles son los 6 delitos más recurrentes en mujeres?, ¿y en hombres?
7. ¿Cómo están los delitos graves distribuidos geográficamente?
8. ¿Cómo se distribuyen los crímenes por año?
9. ¿Cómo se distribuyen los delitos cometidos por hora del día?
10. ¿Cómo se distribuyen las víctimas del 2019 y 2020, por edad?
11. ¿Cuál es la relación entre homicidio y densidad de población?
12. ¿Cuáles son las 5 concentraciones de 1km con más delitos?, ¿qué delitos son?
Arquitectura
La arquitectura necesaria para su ingesta, procesamiento, almacenamiento y, de ser necesario, integración con los sistemas empresariales
Para poder analizar más de un millón de datos sobre las víctimas y delitos, fue necesario utilizar la arquitectura de Hadoop MapReduce. Para ello, utilizamos un Mapper correspondiente a cada archivo y dos Reducers, uno para agrupaciones simples y otro para agrupaciones con subagrupaciones. El código utilizado en estos scripts se encuentra en el Anexo, los scripts son los siguientes:
1. Mapper.py
Este es el script en donde se hace un mapeo del archivo delitos.tsv, este Mapper toma las 18 columnas del archivo y las señala con la llave y valor que se requieran para el análisis de los datos.
2. Mapper2.py
Similar al anterior, este el script en donde se hace un mapeo del archivo victimas.tsv, este Mapper toma las 23 columnas del archivo y las señala con la llave y valor que se requieran para el análisis de los datos.
3. Reducer.py
Este script es utilizado una vez que ya se hizo el mapeo. Este Reducer hace una agrupación de las llaves enviadas por el Mapper y cuenta el número de veces que se encuentra esta llave en los datos.
4. Reducer2.py
Nuevamente, este script es utilizado una vez que ya se hizo el mapeo.
Este Reducer hace una agrupación de las llaves enviadas por el Mapper y una sub agrupación con el valor enviado por el Mapper, por lo que resulta por darte un grupo más grande con la cuenta de ocurrencias de cada subgrupo dentro de él.
Afortunadamente, se pudo hacer el procesamiento de estos datos de manera local con una velocidad aceptable. Sin embargo, para probar las herramientas aprendidas en el curso, se utilizó Hadoop para hacer el MapReduce en la alta cantidad de datos obtenidos; como se esperaba, se obtuvo el mismo resultado con ambos métodos, pero la velocidad de procesamiento fue muy similar.
El programa en inicial se llevó a mano para probar el análisis de los datos preliminar.
Resultados obtenidos
1. ¿Cuáles son las 5 categorías de delitos más comunes?
2. ¿Cuáles son los 10 delitos con más ocurrencias registrados?
3. ¿Cuáles son las 5 alcaldías con más delitos?, ¿cuáles son los 5 delitos más comunes en las dos alcaldías que tienen más delincuencia?
4. ¿Cuáles son las 5 colonias con más delitos?, ¿cuáles son los 5 delitos más comunes en las dos colonias que tienen más delincuencia?
5. ¿Cómo se distribuyen las víctimas por sexo?
6. ¿Cuáles son los 6 delitos más recurrentes en mujeres?, ¿y en hombres?
7. ¿Cómo están los delitos graves distribuidos geográficamente?
Homicidio Doloso
Secuestro
Violación
Lesiones dolosas por disparo de
arma de fuego
8. Gráfica por tipo de crimen por año
9. Histograma de delitos cometidos por hora del día:
Al observar la distribución por hora del día de los delitos cometidos en la CDMX, se notó que la hora pico es a las 12 del día, lo cual fue en contra de la hipótesis planteada (que habrían más delitos en la noche y madrugada).
Para entender esto mejor, se realizó otra agrupación para ver los delitos por tipo de delito por hora, la gravedad del delito fue ilustrada con amarillo, naranja y rojo, siendo el último el más grave:
10. Histograma de víctimas del 2019 y 2020, por edad
Al analizar la distribución de las víctimas de delito en los últimos dos años, se notó que la gran mayoría se encuentran en el rango de 24 y 50 años, esto puede ser debido a que es el rango de edad con mayor actividad económica, por la que están más expuestos a todo tipo de crímenes. Un dato que llama la atención es que hay 1166 registros de víctimas de 0 años de edad. Al analizar estos datos, fue observado que son debido a un mal registro, ya que, corresponden a todo tipo de delitos que no son relacionados a infantes, rechazando la hipótesis de que fueran mujeres embarazadas o recién nacidos.
11. Comparación homicidio con densidad de población
Al observar el mapa es claro que las concentraciones de homicidios se encuentran en las áreas más densamente pobladas de la ciudad
12. ¿Cuáles son las 5
concentraciones de 1km con más delitos?, ¿qué delitos son?
(19.41,-99.16) ; 6562 (19.43,-99.13) ; 7813 (19.42,-99.16) ; 8850 (19.44,-99.15) ; 9482 (19.42,-99.14) ; 12509 (19.43,-99.14) ; 14041
Otros Mapas
Homicidio escuelas
Violacion areas verdes
Heat map crímenes
Prueba de concepto
Este proyecto se realizó con una máquina virtual en un servidor único, lo cual limitó la capacidad de procesamiento disponible para este proyecto, sin embargo esto nos permitió comprobar el diseño y la
arquitectura del mismo. Esta prueba permitió demostrar la viabilidad y posible uso del análisis que se puede obtener de los datos. Al contar con mayor eficiencia al incrementar el poder de procesamiento en la arquitectura propuesta se logra un
análisis casi en tiempo real, proporcionando datos útiles al instante.
En este proyecto se logró un análisis preliminar de los datos observado su posible utilidad al usar las nuevas tecnologías. Es evidente que existe una correlación entre varios factores como horario, ubicación y género, entre otros.
Analizar la correlación entre estos factores ayudaría a un mejor manejo y monitoreo del crimen en la CDMX.
Conclusiones
El primer obstáculo en este proyecto fue encontrar buenas fuentes de datos, una vez logrado eso, fue muy útil el conocimiento sobre Hadoop y MapReduce con el cual se pudo contestar las preguntas planteadas al principio del proyecto. Es importante identificar que correlación no implica causalidad, ya que esto puede ser una falacia al analizar los resultados obtenidos.
Sin embargo, los resultados nos sirven para identificar patrones y poder sugerir algunos puntos clave que la PGJ puede vigilar para tratar de reducir los crímenes en la ciudad de México.
Dada la limitación de tiempo y recursos con la que se cuenta, no se pudo implementar un sistema de aprendizaje de máquina que nutra este proyecto. Sin embargo, en un futuro se podría implementar un modelo que sirva para detectar relaciones estadísticas de dónde se podrían presentar crímenes y a qué hora siguiendo tendencias anteriores; de este modo, se podría anticipar la policía para poder brindar mayor seguridad a los ciudadanos. Además, con más tiempo, más datos y más capacidad de procesamiento, se podría realizar un análisis comparativo y de correlación con otros factores, que no se tomaron en cuenta, para determinar la relevancia estadística de estos y su impacto en los crímenes.
Anexo
Mapper.py
#!/usr/bin/python3
import sys
for Line in sys.stdin:
Data = Line.strip().split("\t") if len(Data) == 18:
ao_hechos, mes_hechos,
fecha_hechos, delito, categoria_delito, fiscalia, agencia, unidad_inve$
("{0}\t{1}".format(fecha_hechos[11:13],delito ))
Maper2.py
#!/usr/bin/python3
import sys
for Line in sys.stdin:
Data = Line.strip().split("\t") if len(Data) == 23:
idCarpeta, Año_inicio, Mes_inicio, FechaInicio, Delito, Categoria, Sexo, Edad, TipoPersona$
print ("{0}\t{1}".format(Edad,Delito))
Reducer.py import sys
#!/usr/bin/python3
Acumulados = 0 delitoAnt = None for line in sys.stdin:
DataIn = line.strip().split("\t") if len(DataIn) != 2:
# Hay algo raro, ignora esta linea continue
esteDelito, esteValor = DataIn
if delitoAnt and delitoAnt != esteDelito:
print (delitoAnt, "\t", Acumulados) delitoAnt = esteDelito;
Acumulados = 0 delitoAnt = esteDelito Acumulados += esteValor if delitoAnt != None:
print (delitoAnt, "\t", Acumulados)
Reducer2.py
#!/usr/bin/python3 import sys
Acumulados = {}
latAnt = None longAnt = None
for line in sys.stdin:
DataIn = line.strip().split("\t") if len(DataIn) != 2:
# Hay algo raro, ignora esta linea continue
longEste, latEste = DataIn latEste= latEste[0:5]
longEste = longEste[0:6]
if longEste and longEste != latAnt or latEste and latEste != latAnt:
for key in Acumulados:
if Acumulados[key] != 0:
print(key, "\t", Acumulados[key]) latAnt = latEste
longAnt = longEste Acumulados =
dict.fromkeys(Acumulados, 0)
latAnt = latEste longAnt = longEste
tupla = "(" + latEste + "," + longEste + ")"
if tupla in Acumulados:
Acumulados[tupla] += 1 else:
Acumulados[tupla] = 1
if latAnt is None:
for key in Acumulados:
if Acumulados[key] != 0:
print(key, "\t", Acumulados[key])