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 [3]:
# Librerías utilizadas
import pandas as pd
import sys
import urllib
import os
import csv
import zipfile
from simpledbf import Dbf5

In [5]:
# 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 [13]:
# 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 [14]:
# 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 [16]:
# 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 [21]:
# 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 - DEFUN16.dbf
5 - DEFUN16.dbf.xlsx
6 - defunciones_base_datos_2016_dbf.zip
7 - Descripcion BD_Defunciones 2016(LOC).pdf
8 - GPOLIMEX.dbf
9 - LISTA1.dbf
10 - LISTAMEX.dbf
11 - Mortalidad.ipynb
12 - PARENTESCO.dbf

In [24]:
path_to_dbf = r'{}\{}'.format(target,files[4])
dataset = Dbf5(path_to_dbf, codec='mbcs').to_dataframe()
dataset.head()


Out[24]:
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 [26]:
# 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 [31]:
# 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[31]:
['ENT_REGIS',
 'MUN_REGIS',
 'ENT_OCURR',
 'MUN_OCURR',
 'CAUSA_DEF',
 'SEXO',
 'ANIO_OCUR',
 'ESCOLARIDA',
 'PRESUNTO',
 'ASIST_MEDI',
 'VIO_FAMI',
 'ENT_OCULES',
 'MUN_OCULES']

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


Out[37]:
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 [45]:
# Tipos de datos en variables
dataset.dtypes


Out[45]:
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

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

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

In [47]:
dataset.head()


Out[47]:
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 [48]:
dataset['CVE_MUN'] = dataset.ENT_REGIS.map(str)+dataset.MUN_REGIS
dataset.head()


C:\Users\carlos.arana\AppData\Local\Continuum\Anaconda3\lib\site-packages\ipykernel_launcher.py:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  """Entry point for launching an IPython kernel.
Out[48]:
ENT_REGIS MUN_REGIS ENT_OCURR MUN_OCURR CAUSA_DEF SEXO ANIO_OCUR ESCOLARIDA PRESUNTO ASIST_MEDI VIO_FAMI ENT_OCULES MUN_OCULES CVE_MUN
796 01 001 01 001 X954 2 2016 6 2 2 9 88 888 01001
797 01 001 01 001 X954 1 2016 8 2 1 9 88 888 01001
798 01 001 01 001 X998 1 2016 6 2 2 9 88 888 01001
810 01 001 01 001 X954 1 2016 6 2 2 9 88 888 01001
1402 01 001 01 001 X979 1 2016 4 2 2 9 88 888 01001

In [50]:
# Eliminar columnas redundantes
del(dataset['ENT_REGIS'])
del(dataset['MUN_REGIS'])

In [49]:
# 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,
}

In [1]:
variables = {
ENT_REGIS
MUN_REGIS
ENT_OCURR
MUN_OCURR
CAUSA_DEF
SEXO
ANIO_OCUR
ESCOLARIDA
PRESUNTO
ASIST_MEDI
VIO_FAMI
ENT_OCULES
MUN_OCULES
}


  File "<ipython-input-1-57c2bdb062c5>", line 3
    MUN_REGIS
            ^
SyntaxError: invalid syntax

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


Out[54]:
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 [53]:
for i in dataset['CAUSA_DEF'].unique():
    print(i)


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

In [56]:
dataset[dataset['CAUSA_DEF'] == 'Y069']


Out[56]:
ENT_OCURR MUN_OCURR CAUSA_DEF SEXO ANIO_OCUR ESCOLARIDA PRESUNTO ASIST_MEDI VIO_FAMI ENT_OCULES MUN_OCULES CVE_MUN
61136 07 064 Y069 2 2016 88 2 2 9 88 888 07078
195615 11 020 Y069 1 2016 3 2 1 9 88 888 11020
205909 11 030 Y069 1 2016 88 2 2 9 88 888 11003
212319 11 020 Y069 1 2016 1 2 1 9 88 888 11020
257304 14 053 Y069 2 2016 1 2 1 9 88 888 14053
331483 15 106 Y069 1 2016 88 2 2 9 88 888 15106
360169 15 014 Y069 2 2016 88 2 2 9 88 888 15106
401142 17 012 Y069 2 2015 1 2 1 9 88 888 17012
406953 17 012 Y069 1 2016 6 2 2 9 88 888 17012
459233 20 163 Y069 1 2016 1 2 2 9 88 888 20163
485419 21 043 Y069 1 2016 1 2 2 9 88 888 21043
504427 21 181 Y069 1 2016 88 2 2 9 88 888 21181
520483 23 004 Y069 1 2016 99 2 1 9 88 888 23004
520590 23 002 Y069 1 2016 1 2 1 9 88 888 23002
521933 23 005 Y069 1 2016 99 2 1 9 88 888 23005
532064 24 014 Y069 2 2016 3 2 1 9 88 888 24014
533031 24 037 Y069 1 2016 6 2 2 9 88 888 24037
553327 25 006 Y069 1 2016 1 2 1 9 88 888 25006
589728 28 034 Y069 1 2016 3 2 1 9 88 888 28034
604253 29 044 Y069 1 2016 4 2 2 9 88 888 29041
645566 30 010 Y069 1 2016 88 2 9 9 88 888 30010
670534 31 096 Y069 2 2016 1 2 9 9 88 888 31096

In [57]:
len(dataset[dataset['CAUSA_DEF'] == 'Y069'])


Out[57]:
22

In [58]:
dataset['ANIO_OCUR'].unique()


Out[58]:
array([2016, 2015, 2014, 2011, 2012, 2013, 2010], dtype=int64)