Limpieza del dataset de Mortalidad de INEGI

1. Introduccion

Indicadores que salen de este dataset:

ID DESCRIPCION
P0813 Homicidios Intencionales

In [1]:
descripciones = {
    'P0813' : 'Homicidios Intencionales',
}

In [58]:
# Librerías utilizadas
import pandas as pd
import sys
import urllib
import os
import csv
import zipfile
from simpledbf import Dbf5
import matplotlib.pyplot as plt
%matplotlib inline

In [3]:
# Configuracion del sistema
print('Python {} on {}'.format(sys.version, sys.platform))
print('Pandas version: {}'.format(pd.__version__))
import platform; print('Running on {} {}'.format(platform.system(), platform.release()))


Python 3.6.1 |Anaconda 4.4.0 (64-bit)| (default, May 11 2017, 13:25:24) [MSC v.1900 64 bit (AMD64)] on win32
Pandas version: 0.20.1
Running on Windows 8.1

In [4]:
# URL Fuente
remote_path = r'http://www.beta.inegi.org.mx/contenidos/proyectos/registros/vitales/mortalidad/microdatos/defunciones/2016/defunciones_base_datos_2016_dbf.zip'

# Carpeta destino Local
local_path = r'D:\PCCS\00_RawData\01_CSV\INEGI\Defunciones\defunciones_base_datos_2016_dbf.zip'

Descarga de datos

Todos los datos se encuentran en un solo archivo


In [5]:
# Descarga de archivo
if os.path.isfile(local_path):
    print('Ya existe el archivo: {}'.format(local_path))
else:
    print('Descargando {} ... ... ... ... ... '.format(local_path))
    urllib.request.urlretrieve(remote_path, local_path) #
    print('se descargó {}'.format(local_path))


Ya existe el archivo: D:\PCCS\00_RawData\01_CSV\INEGI\Defunciones\defunciones_base_datos_2016_dbf.zip

In [6]:
# Descompresión de archivo
target = r'D:\PCCS\00_RawData\01_CSV\INEGI\Defunciones'
descomprimir = zipfile.ZipFile(local_path, 'r')
print('Iniciando descompresión')
descomprimir.extractall(target)
descomprimir.close
print('Descompresión terminada en {}'.format(target))


Iniciando descompresión
Descompresión terminada en D:\PCCS\00_RawData\01_CSV\INEGI\Defunciones

In [7]:
# Listado de archivos
files = os.listdir(target)
x = 0
for file in files:
    print('{} - {}'.format(x, file))
    x += 1


0 - .ipynb_checkpoints
1 - CAPGPO.dbf
2 - CATEMLDE16.dbf
3 - CATMINDE.dbf
4 - CATMINDE.xlsx
5 - DEFUN16.dbf
6 - DEFUN16.dbf.xlsx
7 - defunciones_base_datos_2016_dbf.zip
8 - Descripcion BD_Defunciones 2016(LOC).pdf
9 - GPOLIMEX.dbf
10 - LISTA1.dbf
11 - LISTAMEX.dbf
12 - PARENTESCO.dbf

In [47]:
# Se utilizará el dataset contenido en el archivo DEFUN16.dbf (Posición 5)
path_to_dbf = r'{}\{}'.format(target,files[5])
dataset = Dbf5(path_to_dbf, codec='mbcs').to_dataframe()
dataset.head()


Out[47]:
ENT_REGIS MUN_REGIS ENT_RESID MUN_RESID TLOC_RESID LOC_RESID ENT_OCURR MUN_OCURR TLOC_OCURR LOC_OCURR ... ANIO_CERT MATERNAS LENGUA COND_ACT PAR_AGRE ENT_OCULES MUN_OCULES LOC_OCULES RAZON_M DIS_RE_OAX
0 01 003 01 001 15 0001 01 001 15 0001 ... 2016 NaN 9 2 88 88 888 8888 NaN 999
1 01 001 01 006 8 0001 01 001 15 0001 ... 2016 NaN 9 2 88 88 888 8888 NaN 999
2 01 001 01 010 1 7777 01 010 1 7777 ... 2016 NaN 9 2 88 88 888 8888 NaN 999
3 01 001 01 001 1 0444 01 001 1 7777 ... 2016 NaN 9 2 88 88 888 8888 NaN 999
4 01 006 01 006 8 0001 01 006 8 0001 ... 2015 NaN 2 2 88 88 888 8888 NaN 999

5 rows × 59 columns


In [28]:
len(dataset)


Out[28]:
685766

In [48]:
# Seleccion de variables
x = 0
for i in dataset:
    print('{} - {}'.format(x, i))
    x += 1


0 - ENT_REGIS
1 - MUN_REGIS
2 - ENT_RESID
3 - MUN_RESID
4 - TLOC_RESID
5 - LOC_RESID
6 - ENT_OCURR
7 - MUN_OCURR
8 - TLOC_OCURR
9 - LOC_OCURR
10 - CAUSA_DEF
11 - LISTA_MEX
12 - SEXO
13 - EDAD
14 - DIA_OCURR
15 - MES_OCURR
16 - ANIO_OCUR
17 - DIA_REGIS
18 - MES_REGIS
19 - ANIO_REGIS
20 - DIA_NACIM
21 - MES_NACIM
22 - ANIO_NACIM
23 - OCUPACION
24 - ESCOLARIDA
25 - EDO_CIVIL
26 - PRESUNTO
27 - OCURR_TRAB
28 - LUGAR_OCUR
29 - NECROPSIA
30 - ASIST_MEDI
31 - SITIO_OCUR
32 - COND_CERT
33 - NACIONALID
34 - DERECHOHAB
35 - EMBARAZO
36 - REL_EMBA
37 - HORAS
38 - MINUTOS
39 - CAPITULO
40 - GRUPO
41 - LISTA1
42 - GR_LISMEX
43 - VIO_FAMI
44 - AREA_UR
45 - EDAD_AGRU
46 - COMPLICARO
47 - DIA_CERT
48 - MES_CERT
49 - ANIO_CERT
50 - MATERNAS
51 - LENGUA
52 - COND_ACT
53 - PAR_AGRE
54 - ENT_OCULES
55 - MUN_OCULES
56 - LOC_OCULES
57 - RAZON_M
58 - DIS_RE_OAX

In [49]:
# lista de variables seleccionadas
Variables = [0, 1, 6, 7, 10, 12, 16, 24, 26, 30, 43, 54, 55]
Variables = list(list(dataset)[i] for i in Variables)
Variables


Out[49]:
['ENT_REGIS',
 'MUN_REGIS',
 'ENT_OCURR',
 'MUN_OCURR',
 'CAUSA_DEF',
 'SEXO',
 'ANIO_OCUR',
 'ESCOLARIDA',
 'PRESUNTO',
 'ASIST_MEDI',
 'VIO_FAMI',
 'ENT_OCULES',
 'MUN_OCULES']

In [50]:
dataset = dataset[Variables]
dataset.head()


Out[50]:
ENT_REGIS MUN_REGIS ENT_OCURR MUN_OCURR CAUSA_DEF SEXO ANIO_OCUR ESCOLARIDA PRESUNTO ASIST_MEDI VIO_FAMI ENT_OCULES MUN_OCULES
0 01 003 01 001 C539 2 1993 1 8 1 8 88 888
1 01 001 01 001 I259 2 2010 3 8 1 8 88 888
2 01 001 01 010 K729 2 2010 3 8 1 8 88 888
3 01 001 01 001 E112 2 2007 1 8 1 8 88 888
4 01 006 01 006 X590 2 2015 9 1 1 8 88 888

In [33]:
# Tipos de datos en variables
dataset.dtypes


Out[33]:
ENT_REGIS     object
MUN_REGIS     object
ENT_OCURR     object
MUN_OCURR     object
CAUSA_DEF     object
SEXO           int64
ANIO_OCUR      int64
ESCOLARIDA     int64
PRESUNTO       int64
ASIST_MEDI     int64
VIO_FAMI       int64
ENT_OCULES    object
MUN_OCULES    object
dtype: object

Exploracion del Dataset


In [34]:
years = sorted(dataset['ANIO_OCUR'].unique())

In [35]:
yearsize = {}
for year in years:
    yearsize[year] = len(dataset[dataset['ANIO_OCUR'] == year])

In [36]:
len(dataset)


Out[36]:
685766

In [44]:
# El set1 tiene la suma de las defunciones registradas entre 1923 y 1990
set1 = 0
for year in years:
    # print(year)
    if year > 1990:
        break
    set1 += yearsize[year]
set1


Out[44]:
148

In [59]:
# El set 2 tiene la suma de las defunciones registradas entre 1991 y 2000
set2 = 0
for year in years:
    if year < 1991:
        continue
    if year > 2000:
        break
    # print(year)
    set2 += yearsize[year]
set2


Out[59]:
171

In [62]:
yearsize2 = {'1923-1990':set1,
            '1991-2000':set2}
for year in years:
    if year < 2001:
        continue
    # print(year)
    yearsize2[str(year)] = yearsize[year]

In [64]:
# Numero de defunciones registradas en cada periodo
for k,v in yearsize2.items():
    print('{} : {}'.format(k, v))


1923-1990 : 148
1991-2000 : 171
2001 : 31
2002 : 37
2003 : 35
2004 : 29
2005 : 59
2006 : 59
2007 : 66
2008 : 75
2009 : 114
2010 : 140
2011 : 145
2012 : 234
2013 : 333
2014 : 531
2015 : 11884
2016 : 671536
9999 : 139

Subconjunto de trabajo


In [65]:
#Subconjunto de años para el estudio
dataset = dataset.loc[dataset['ANIO_OCUR'].isin(range(2010, 2017))]

En el campo "PRESUNTO", la clave 2 identifica homicidios.


In [66]:
# Subconjunto de homicidios (El identificador 2 corresponde a homicidios) 
dataset = dataset.loc[dataset['PRESUNTO'] == 2]

In [67]:
dataset.head()


Out[67]:
ENT_REGIS MUN_REGIS ENT_OCURR MUN_OCURR CAUSA_DEF SEXO ANIO_OCUR ESCOLARIDA PRESUNTO ASIST_MEDI VIO_FAMI ENT_OCULES MUN_OCULES
796 01 001 01 001 X954 2 2016 6 2 2 9 88 888
797 01 001 01 001 X954 1 2016 8 2 1 9 88 888
798 01 001 01 001 X998 1 2016 6 2 2 9 88 888
810 01 001 01 001 X954 1 2016 6 2 2 9 88 888
1402 01 001 01 001 X979 1 2016 4 2 2 9 88 888

In [69]:
for year in sorted(list(dataset['ANIO_OCUR'].unique())):
    print('{} : {}'.format(year, len(dataset[dataset['ANIO_OCUR'] == year])))


2010 : 8
2011 : 14
2012 : 25
2013 : 22
2014 : 64
2015 : 318
2016 : 24029

Asignación de causas de defuncion

El dataset tiene identificadas 127 causas de defunción (Por homicidio, pues ya se identificaron únicamente los casos donde el PRESUNTO es homicidio)


In [32]:
len(dataset['CAUSA_DEF'].unique())


Out[32]:
127

In [33]:
dataset['CAUSA_DEF'].unique()


Out[33]:
array(['X954', 'X998', 'X979', 'X950', 'Y004', 'Y009', 'Y007', 'X994',
       'Y099', 'Y094', 'X990', 'X959', 'X999', 'X997', 'Y090', 'X955',
       'X957', 'X910', 'X949', 'X934', 'X919', 'Y095', 'X939', 'X914',
       'X935', 'X970', 'X930', 'X958', 'Y097', 'Y098', 'Y079', 'X992',
       'X918', 'X938', 'X956', 'X940', 'X978', 'Y000', 'X909', 'X995',
       'X936', 'X915', 'X900', 'X944', 'Y038', 'X899', 'Y071', 'X928',
       'X937', 'X945', 'Y046', 'Y008', 'X996', 'Y044', 'Y089', 'X993',
       'Y040', 'X974', 'X920', 'Y096', 'X977', 'X952', 'X912', 'X951',
       'X916', 'X917', 'Y091', 'X947', 'Y068', 'Y048', 'Y088', 'Y002',
       'Y070', 'Y069', 'Y054', 'Y034', 'X948', 'Y093', 'X953', 'X991',
       'Y092', 'X924', 'X913', 'Y039', 'Y084', 'Y049', 'X889', 'X911',
       'Y047', 'Y020', 'X929', 'X976', 'Y018', 'Y080', 'Y005', 'X890',
       'Y014', 'Y041', 'X926', 'Y006', 'Y043', 'Y042', 'X859', 'Y001',
       'X907', 'Y010', 'X927', 'X850', 'Y078', 'Y016', 'X960', 'Y087',
       'X870', 'Y019', 'Y871', 'X975', 'X885', 'X905', 'X964', 'Y003',
       'Y058', 'Y029', 'X923', 'Y045', 'Y028', 'Y030', 'X879'], dtype=object)

In [18]:
# Se utilizará el dataset contenido en el archivo CATMINDE.dbf (Posición 3)
path_to_desc = r'{}\{}'.format(target,files[3])
descripciones = Dbf5(path_to_desc, codec='mbcs').to_dataframe()
descripciones.head()


Out[18]:
CLAVE NOMBRE
0 A000 C¢lera debido a Vibrio cholerae 01, biotipo ch...
1 A001 C¢lera debido a Vibrio cholerae 01, biotipo el...
2 A009 C¢lera, no especificado
3 A010 Fiebre tifoidea
4 A011 Fiebre paratifoidea A

In [39]:
#Asignacion de columna con descripciones de causa de defunción
dataframe = dataset.merge(descripciones, left_on='CAUSA_DEF', right_on = 'CLAVE')
dataframe.head()


Out[39]:
ENT_REGIS MUN_REGIS ENT_OCURR MUN_OCURR CAUSA_DEF SEXO ANIO_OCUR ESCOLARIDA PRESUNTO ASIST_MEDI VIO_FAMI ENT_OCULES MUN_OCULES CLAVE NOMBRE
0 01 001 01 001 X954 2 2016 6 2 2 9 88 888 X954 Agresi¢n con disparo de otras armas de fuego, ...
1 01 001 01 001 X954 1 2016 8 2 1 9 88 888 X954 Agresi¢n con disparo de otras armas de fuego, ...
2 01 001 01 001 X954 1 2016 6 2 2 9 88 888 X954 Agresi¢n con disparo de otras armas de fuego, ...
3 01 001 01 001 X954 1 2016 6 2 2 9 88 888 X954 Agresi¢n con disparo de otras armas de fuego, ...
4 01 001 01 001 X954 1 2016 7 2 1 9 88 888 X954 Agresi¢n con disparo de otras armas de fuego, ...

Creación del dataset estándar y exportación a Excel


In [40]:
# Concatenar claves estatales y municipales para obtener CVE_MUN
# Municipio donde se registró el deceso
dataframe['CVE_MUN_REGIS'] = dataframe.ENT_REGIS.map(str)+dataframe.MUN_REGIS
# Municipio donde ocurrió el deceso
dataframe['CVE_MUN_OCURR'] = dataframe.ENT_OCURR.map(str)+dataframe.MUN_OCURR
# Municipio donde ocurrió la lesión que provocó el deceso
dataframe['CVE_MUN_OCULES'] = dataframe.ENT_OCULES.map(str)+dataframe.MUN_OCULES

dataframe.head()


Out[40]:
ENT_REGIS MUN_REGIS ENT_OCURR MUN_OCURR CAUSA_DEF SEXO ANIO_OCUR ESCOLARIDA PRESUNTO ASIST_MEDI VIO_FAMI ENT_OCULES MUN_OCULES CLAVE NOMBRE CVE_MUN_REGIS CVE_MUN_OCURR CVE_MUN_OCULES
0 01 001 01 001 X954 2 2016 6 2 2 9 88 888 X954 Agresi¢n con disparo de otras armas de fuego, ... 01001 01001 88888
1 01 001 01 001 X954 1 2016 8 2 1 9 88 888 X954 Agresi¢n con disparo de otras armas de fuego, ... 01001 01001 88888
2 01 001 01 001 X954 1 2016 6 2 2 9 88 888 X954 Agresi¢n con disparo de otras armas de fuego, ... 01001 01001 88888
3 01 001 01 001 X954 1 2016 6 2 2 9 88 888 X954 Agresi¢n con disparo de otras armas de fuego, ... 01001 01001 88888
4 01 001 01 001 X954 1 2016 7 2 1 9 88 888 X954 Agresi¢n con disparo de otras armas de fuego, ... 01001 01001 88888

In [41]:
# Eliminar columnas redundantes
del(dataframe['ENT_REGIS'])
del(dataframe['MUN_REGIS'])
del(dataframe['ENT_OCURR'])
del(dataframe['MUN_OCURR'])
del(dataframe['ENT_OCULES'])
del(dataframe['MUN_OCULES'])
del(dataframe['CLAVE'])

# Renombrar nombre de la causa de defuncion
dataframe.rename(columns={'NOMBRE' : 'NOMBRE_CAUSA_DEF'}, inplace = True)

# Se asigna el municipio de ocurrencia como indice de la tabla
dataframe.set_index('CVE_MUN_OCURR', inplace=True)
dataframe.head()


Out[41]:
CAUSA_DEF SEXO ANIO_OCUR ESCOLARIDA PRESUNTO ASIST_MEDI VIO_FAMI CLAVE NOMBRE_CAUSA_DEF CVE_MUN_REGIS CVE_MUN_OCULES
CVE_MUN_OCURR
01001 X954 2 2016 6 2 2 9 X954 Agresi¢n con disparo de otras armas de fuego, ... 01001 88888
01001 X954 1 2016 8 2 1 9 X954 Agresi¢n con disparo de otras armas de fuego, ... 01001 88888
01001 X954 1 2016 6 2 2 9 X954 Agresi¢n con disparo de otras armas de fuego, ... 01001 88888
01001 X954 1 2016 6 2 2 9 X954 Agresi¢n con disparo de otras armas de fuego, ... 01001 88888
01001 X954 1 2016 7 2 1 9 X954 Agresi¢n con disparo de otras armas de fuego, ... 01001 88888

In [42]:
#Reordenar Columnas
list(dataframe)


Out[42]:
['CAUSA_DEF',
 'SEXO',
 'ANIO_OCUR',
 'ESCOLARIDA',
 'PRESUNTO',
 'ASIST_MEDI',
 'VIO_FAMI',
 'CLAVE',
 'NOMBRE_CAUSA_DEF',
 'CVE_MUN_REGIS',
 'CVE_MUN_OCULES']

In [80]:
# Metadatos estándar
metadatos = {
    'Nombre del Dataset': 'INEGI - Registros administrativos de mortalidad al año 2016',
    'Descripcion del dataset': 'Originalmente, el formato de captación para las defunciones generales era una boleta colectiva, en la cual las fuentes informantes reportaban las defunciones que registraban durante el mes. A partir del año 1987, el formato principal es el certificado o acta de defunción y el cuaderno para defunciones accidentales y violentas del Ministerio Público.',
    'Disponibilidad Temporal': '1923 a 2016',
    'Periodo de actualizacion': 'Anual',
    'Nivel de Desagregacion': 'Caso',
    'Notas': None,
    'Fuente': 'INEGI',
    'URL_Fuente': 'http://www.beta.inegi.org.mx/proyectos/registros/vitales/mortalidad/',
    'Dataset base': None,
}

metadatos = pd.DataFrame.from_dict(metadatos, orient='index', dtype=None)
metadatos.columns = ['Descripcion']
metadatos = metadatos.rename_axis('Metadato')
metadatos


Out[80]:
Descripcion
Metadato
Nombre del Dataset INEGI - Registros administrativos de mortalida...
Descripcion del dataset Originalmente, el formato de captación para la...
Disponibilidad Temporal 1923 a 2016
Periodo de actualizacion Anual
Nivel de Desagregacion Caso
Notas None
Fuente INEGI
URL_Fuente http://www.beta.inegi.org.mx/proyectos/registr...
Dataset base None

In [79]:
variables = {
    'ENT_REGIS': 'Entidad de registro.',
    'MUN_REGIS': 'Municipio de registro.',
    'ENT_OCURR': 'Entidad de ocurrencia.',
    'MUN_OCURR': 'Municipio de ocurrencia.',
    'CAUSA_DEF': 'Causa de la defunción (clave).',
    'SEXO': 'Sexo del (la) fallecido (a).\n'
            '1: Hombre\n'
            '2: Mujer\n'
            '9: No especificado',
    'ANIO_OCUR': 'Año de ocurrencia.',
    'ESCOLARIDA': 'Nivel de escolaridad del (la) fallecido (a) (escolaridad).\n'
                    '1: Sin escolaridad\n'
                    '2: Preescolar\n'
                    '3: Primaria incompleta\n'
                    '4: Primaria completa\n'
                    '5: Secundaria incompleta\n'
                    '6: Secundaria completa\n'
                    '7: Bachillerato o preparatoria incompleto\n'
                    '8: Bachillerato o preparatoria completo\n'
                    '9: Profesional\n'
                    '10: Posgrado\n'
                    '88: No aplica a menores de 3 años\n'
                    '99: No especificado',
    'PRESUNTO': 'Tipo de defunción (presunto). 2: Homicidio',
    'ASIST_MEDI': 'Condición de atención médica.\n'
                '1: Con Asistencia Medica\n'
                '2: Sin Asistencia Medica\n'
                '9: No especificada',
    'VIO_FAMI': 'Condición de violencia familiar.\n'
            '1: Hubo violencia familiar\n'
            '2: No hubo violencia familiar\n'
            '2: No aplica cuando no es homicidio\n'
            '9: No especificado',
    'ENT_OCULES': 'Entidad de ocurrencia de la lesión.',
    'MUN_OCULES': 'Municipio de ocurrencia de la lesión.',
}


variables = pd.DataFrame.from_dict(variables, orient='index', dtype=None)
variables.columns = ['Descripcion']
variables = variables.rename_axis('Mnemonico')
variables


Out[79]:
Descripcion
Mnemonico
ENT_REGIS Entidad de registro.
MUN_REGIS Municipio de registro.
ENT_OCURR Entidad de ocurrencia.
MUN_OCURR Municipio de ocurrencia.
CAUSA_DEF Causa de la defunción (clave).
SEXO Sexo del (la) fallecido (a).\n1: Hombre\n2: Mu...
ANIO_OCUR Año de ocurrencia.
ESCOLARIDA Nivel de escolaridad del (la) fallecido (a) (e...
PRESUNTO Tipo de defunción (presunto). 2: Homicidio
ASIST_MEDI Condición de atención médica.\n1: Con Asistenc...
VIO_FAMI Condición de violencia familiar.\n1: Hubo viol...
ENT_OCULES Entidad de ocurrencia de la lesión.
MUN_OCULES Municipio de ocurrencia de la lesión.

In [58]:
variables['VIO_FAMI']


Out[58]:
'Condición de violencia familiar.\n1: Hubo violencia familiar\n2: No hubo violencia familiar\n2: No aplica cuando no es homicidio\n9: No especificado'

In [81]:
# Guardar el dataset
file = r'D:\PCCS\01_Dmine\Datasets\INEGI\Defunciones\defunciones.xlsx'
writer = pd.ExcelWriter(file)
dataframe.to_excel(writer, sheet_name = 'DATOS')
metadatos.to_excel(writer, sheet_name = 'METADATOS')
variables.to_excel(writer, sheet_name = 'VARIABLES')
writer.save()
print('---------------TERMINADO---------------')


---------------TERMINADO---------------