Procesando los microdatos de la Encuesta Permanente de Hogares
09 Jan 2017Cada vez que el INDEC publica datos de la Encuesta Permanente de Hogares (EPH), hay repercusiones mediáticas de algunas de las variables que mide esa encuesta. El ingreso suele ser de particular interés para la cobertura periodística, por ejemplo en esta nota de La Nación.
Esos artículos, en general, usan como fuente a los “cuadros” que publica el INDEC. Esos cuadros contienen estadísticas calculadas a partir de los registros individuales de la EPH. Es decir, las repuestas de cada individuo que fue encuestado. A esas tablas, en la jerga, se las llama microdatos.
Inspirado por el post de Pablo Fernández en el que analizó los cuadros de población según escala de ingreso individual para el tercer trimestre de 2016, voy a intentar reproducirlos a partir de los microdatos de la EPH. Vamos a usar el lenguaje de programación Python, y la librería de análisis y manipulación de datos pandas.
import pandas as pd
A diferencia de otros organismos de estadística pública, como las APIs del Census Bureau de Estados Unidos, el INDEC no ofrece demasiada sistematización para obtener las bases de datos. El sistema de distribución de esa información es un rudimentario download de un archivo ZIP, que contiene las tablas en formato TXT o Excel. Vamos a trabajar con el último dataset disponible a la fecha, que corresponde al segundo trimestre de 2016.
Una vez abierto el archivo ZIP, leemos la tabla de respuestas de individuos.
eph = pd.read_excel('usu_individual_T216.xls')
Queremos reproducir un cuadro de población total según escala de ingreso individual. Consultamos el documento de Diseño de Registro y Estructura para las bases preliminares Hogar y Personas y vemos que la variable que contiene el monto de ingreso total individual se llama P47T
. Filtramos la tabla y obtenemos los registros que declaran algún ingreso. Esto es, aquellos en los que P47T > 0
.
with_income = eph[eph['P47T'] > 0]
Dado que las encuestas como la EPH contienen una muestra de la población, las variables suelen estar ponderadas (weighted) por un factor de ajuste que debemos usar para el cálculo de estadísticas. Para tratar el ingreso total individual, la EPH provee la variable PONDII
, documentada en el Anexo I del documento de diseño.
El decil o grupo decílico para el ingreso total individual, ya está provisto por la EPH en la variable DECINDR
, pero no contiene los límites de cada uno. Los calculamos con la ayuda de la librería weightedcalcs
.
import weightedcalcs
upper = []
lower = []
wc = weightedcalcs.Calculator('PONDII')
lowerb = with_income['P47T'].min()
for q in range(1,11):
upperb = wc.quantile(with_income, 'P47T', q/10.0)
lower.append(lowerb)
upper.append(upperb)
lowerb = upperb
deciles = pd.DataFrame({'lbound': lower, 'ubound': upper}).reset_index().rename(columns={'index': 'decile'})
deciles['decile'] = deciles['decile'] + 1
Verificamos que las cotas de los deciles son iguales a los del cuadro que estamos replicando:
decile | lbound | ubound | |
---|---|---|---|
0 | 1 | 22.0 | 2470.0 |
1 | 2 | 2470.0 | 4000.0 |
2 | 3 | 4000.0 | 4800.0 |
3 | 4 | 4800.0 | 6000.0 |
4 | 5 | 6000.0 | 7200.0 |
5 | 6 | 7200.0 | 9000.0 |
6 | 7 | 9000.0 | 10500.0 |
7 | 8 | 10500.0 | 14000.0 |
8 | 9 | 14000.0 | 20000.0 |
9 | 10 | 20000.0 | 715000.0 |
Usamos el grupo decílico provisto en la tabla para agregarle los intervalos de cada uno que acabamos de calcular.
with_income = with_income.merge(deciles, left_on='DECINDR', right_on='decile')
Sumando el ponderador (PONDII
) para cada grupo decílico, obtenemos la población de cada uno. Creamos un nuevo DataFrame
en el que almacenaremos las variables del cuadro que estamos replicando.
cuadro = pd.DataFrame(with_income.groupby('DECINDR')['PONDII'].sum()).rename(columns={'PONDII': 'decile_population'})
Agregamos una variable con el ingreso total de cada decil.
with_income.loc[:, 'weighted_income'] = with_income['P47T'] * with_income['PONDII']
cuadro['decile_total_income'] = pd.DataFrame(with_income.groupby('DECINDR')['weighted_income'].sum() / 1000)
Agregamos otra con el porcentaje del ingreso de cada decil sobre el ingreso total
cuadro['decile_percentage_income'] = (cuadro['decile_total_income'] / cuadro['decile_total_income'].sum()) * 100
Calculamos el ingreso medio por decil
cuadro['decile_mean_income'] = cuadro['decile_total_income'] / cuadro['decile_population']
Finalmente, agregamos las cotas de cada decil
cuadro = cuadro.reset_index().merge(deciles, left_on='DECINDR', right_on='decile').rename(columns={'lbound': 'decile_lower_bound', 'ubound': 'decile_upper_bound'})
del cuadro['decile']
Como decía la revista Anteojito, acá el modelo terminado:
DECINDR | decile_population | decile_total_income | decile_percentage_income | decile_mean_income | decile_lower_bound | decile_upper_bound | |
---|---|---|---|---|---|---|---|
0 | 1 | 1618265 | 2.121558e+06 | 1.350246 | 1.311008 | 22.0 | 2470.0 |
1 | 2 | 1616771 | 5.337631e+06 | 3.397086 | 3.301414 | 2470.0 | 4000.0 |
2 | 3 | 1617945 | 7.243509e+06 | 4.610064 | 4.476981 | 4000.0 | 4800.0 |
3 | 4 | 1615707 | 8.257147e+06 | 5.255185 | 5.110547 | 4800.0 | 6000.0 |
4 | 5 | 1617192 | 1.046035e+07 | 6.657395 | 6.468220 | 6000.0 | 7200.0 |
5 | 6 | 1617391 | 1.318178e+07 | 8.389421 | 8.150026 | 7200.0 | 9000.0 |
6 | 7 | 1617847 | 1.577172e+07 | 10.037767 | 9.748588 | 9000.0 | 10500.0 |
7 | 8 | 1616376 | 1.957398e+07 | 12.457680 | 12.109795 | 10500.0 | 14000.0 |
8 | 9 | 1617180 | 2.605983e+07 | 16.585536 | 16.114364 | 14000.0 | 20000.0 |
9 | 10 | 1617037 | 4.911631e+07 | 31.259620 | 30.374264 | 20000.0 | 715000.0 |
Por supuesto, este ejercicio es apenas un ejemplo de lo que se puede hacer con los microdatos de la Encuesta Permanente de Hogares. El procesamiento de otras variables queda como actividad para el lector entusiasta.
El notebook completo está disponible acá: https://gist.github.com/jazzido/d067c834d0990fe3cf932cf6e7ec1881