Usando R para jugar con los microdatos del INEGI

Claudio Daniel Pacheco Castro
tacosdedatos
Published in
6 min readJul 15, 2021

Trabajar con los datos del Instituto Nacional de Estadística y Geografía (INEGI) de México puede ser el pan de cada día de muchos de nosotros. Si estudiaste economía o alguna ciencia afín (y no tan afín también), seguramente has explorado muchas secciones y construido diferentes análisis y visualizaciones de datos con la información que publica el INEGI. Dentro de todo este mundo de información están los famosos levantamientos que el Instituto realiza: la ENIGH, la ENOE, la Intercensal, el Censo, la ENADID, etc., etc. Todos estos productos de información tienen sus bonitos cuadritos de resultados (tabulados) que con mucho esfuerzo hace la gente que trabaja en el Instituto.

Tabulados de la Encuesta Nacional de Ingresos y Gastos de los Hogares

Y hasta aquí, todo es amor con los datos del INEGI pero… ¿qué pasa cuando lo que estás buscando no se encuentra en estos tabulados? Pues te tienes que ir a la sección de microdatos. ¿Qué son estas cosas? Para esto, rescato esta definición del Instituto Nacional de Estadística (INE) de España:

Los ficheros de microdatos contienen los datos individuales de una estadística, convenientemente anonimizados, con el fin de preservar la confidencialidad de la información. Se trata de ficheros ASCII con estructura de campos que recogen para cada registro individual de la encuesta los valores que toma cada variable. Los datos aparecen sin agregar, por lo que para el estudio de los mismos se necesitan programas adecuados para el tratamiento de datos estadísticos.

Para algunos, trabajar con los microdatos se vuelve una gran oportunidad de explotar más la información y diseñar indicadores propios pero, para otros, puede resultar un verdadero dolor de cabeza. Y esto se debe a que, básicamente, para poder jugar con los microdatos, debes hacer uso de los factores de expansión (o ponderador si le quieren llamar así) para obtener un resultado denominado estimación.

Y bueno, ya que le agarras la onda al tema de los factores de expansión, viene la parte de reflexión: ¿estas estimaciones que estoy sacando realmente predicen lo que en general está pasando? No me meteré en el tema teórico porque sino me llevará la vida explicarlo y creo que hay mucha bibliografía al respecto. Solo diré (y justo es el ejercicio práctico de esta publicación) que, para poder contestar si la estimación es válida (o estadísticamente significativa) debes determinar el diseño muestral de la encuesta. Para esto, necesitas de tres cosas que vienen en tus microdatos:

  1. Las unidades primarias de muestreo (UPM)
  2. El estrato de diseño
  3. El factor de expansión

Si vienes del mundo de STATA sabrás que con estos 3 elementos y usando el comando svyset ya lo tenías y podías corroborar la precisión de tus estimaciones😚:

Ejemplo del svyset en STATA

Y está muy bien pero, ¿Esto mismo no lo podemos hacer en R? La respuesta es sí😃.

En R, contamos con dos librerías (claro, las que yo conozco) para revisar la precisión de las estimaciones: survey y srvyr. Me centraré en la segunda ya que, a diferencia de la primera, ésta permite usar el operador de pipes %>% y como aquí somos fans de eso, seguiremos esa línea.

Para demostrar cómo revisar la precisión de las estimaciones en una encuesta, usaremos la Encuesta Nacional de Ingresos y Gastos de los Hogares 2018. Las librerías que ocuparemos serán las siguientes:

# Librerías ====
if(!require('pacman')) install.packages('pacman')
pacman::p_load(tidyverse, srvyr,
kableExtra)

Una vez definidas las librerías, descargaremos los datos de la página del INEGI en un directorio temporal:

#Descarga de archivos
url<-"https://www.inegi.org.mx/contenidos/programas/enigh/nc/2018/microdatos/enigh2018_ns_viviendas_csv.zip"
##Creación de directorio temporaltd<- tempdir()# Descarga del archivo temporaltf = tempfile(tmpdir=td, fileext=".zip")
download.file(url, tf)
# unzipunzip(tf, files="viviendas.csv", exdir=td,
overwrite=TRUE)
fpath=file.path(td,"viviendas.csv")
unlink(td)

Ahora sí, leemos el archivo (en este caso, el de viviendas de la ENIGH):

#Leer el archivoenigh<-read.csv(fpath)%>%
#Renombrar folioviv
rename(folioviv=1)

Una vez hecho esto, obtenemos la clave de la entidad federativa extrayéndolo de la variable folioviv y creamos (con hardcode, jeje) una variable con el nombre de las entidades federativas:

enigh<-enigh%>%
#Obtener la clave de entidad de la variable folioviv
mutate(cve_ent=
case_when(nchar(folioviv)==9 ~ substr(folioviv,1,1),
TRUE ~substr(folioviv,1,2)),
#Creamos nombre de entidad
nom_ent= case_when(cve_ent==1 ~ "Aguascalientes",
cve_ent==2 ~ "Baja California",
cve_ent==3 ~ "Baja California Sur",
cve_ent==4 ~ "Campeche",
cve_ent==5 ~ "Coahuila de Zaragoza",
cve_ent==6 ~ "Colima",
cve_ent==7 ~ "Chiapas",
cve_ent==8 ~ "Chihuahua",
cve_ent==9 ~ "Ciudad de México",
cve_ent==10 ~ "Durango",
cve_ent==11 ~ "Guanajuato",
cve_ent==12 ~ "Guerrero",
cve_ent==13 ~ "Hidalgo",
cve_ent==14 ~ "Jalisco",
cve_ent==15 ~ "México",
cve_ent==16 ~ "Michoacán de Ocampo",
cve_ent==17 ~ "Morelos",
cve_ent==18 ~ "Nayarit",
cve_ent==19 ~ "Nuevo León",
cve_ent==20 ~ "Oaxaca",
cve_ent==21 ~ "Puebla",
cve_ent==22 ~ "Querétaro",
cve_ent==23 ~ "Quintana Roo",
cve_ent==24 ~ "San Luis Potosí",
cve_ent==25 ~ "Sinaloa",
cve_ent==26 ~ "Sonora",
cve_ent==27 ~ "Tabasco",
cve_ent==28 ~ "Tamaulipas",
cve_ent==29 ~ "Tlaxcala",
cve_ent==30 ~ "Veracruz de Ignacio de la Llave",
cve_ent==31 ~ "Yucatán",
cve_ent==32 ~ "Zacatecas"))

Ahora, construiremos un indicador: hacinamiento. Este se define como la relación entre el número de personas que habitan en una vivienda y el número de cuartos existentes en dicha casa. Se dice que, si esta relación es mayor a 2.5, entonces los habitantes de la vivienda se encuentran hacinados.

enigh<-enigh%>%
#Creamos indicador de hacinamiento
mutate(hac=case_when((tot_resid / num_cuarto) > 2.5 ~ 1,
TRUE ~ 0))

Ya que hemos construido nuestro indicador, procedemos a definir el diseño muestral y aquí es donde comenzaremos a ocupar las funciones de la librería srvyr:

#Definir diseño muestralmydesign <-enigh%>%
as_survey_design(ids=upm,
strata=est_dis,
weights=factor)

Como vemos, usamos las UPM (upm), el estrado de diseño (est_dis) y el factor de expansión (factor).

Ya que tenemos esto, hagamos una primera estimación y corroboremos qué tan precisa es. Usando el diseño muestral definido, filtramos nuestra información para todas aquellas viviendas con habitantes en condición de hacinamiento y usamos la función survey_total para obtener la estimación, el coeficiente de variación y los intervalos de confianza:

#Viviendas con habitantes en condición de hacinamiento nacional
hacnal<-mydesign %>%
filter(hac==1)%>%
summarise(hac=survey_total(
vartype = c("cv", "ci"),
level=0.95))%>%
mutate(hac_cv=
hac_cv*100,
#Formato de números
hac=format(hac,big.mark=","),
hac_cv=round(hac_cv,2),
hac_low=format(hac_low,big.mark=","),
hac_upp=format(hac_upp,big.mark=","),
)

Con estos resultados, hacemos una tablita usando KableExtra:

#Tabla Nacional
hacnal%>%
kable(caption=text_spec("México. Viviendas con habitantes en condición de hacinamiento, 2018",
bold=T, color="black",font_size = 30),
format="html",
align = "c",
col.names = c("Viviendas con habitantes en condición de\n
hacinamiento",
"Coeficiente de variación",
"Límite inferior",
"Límite superior"))%>%
kable_styling(full_width = F, font_size = 20,
html_font = "Montserrat Medium")%>%
row_spec(0, bold = F, color = "black", background = "#9ebcda")%>%
footnote(general = "@claudiodanielpc con información de INEGI. Encuesta Nacional de Ingresos y Gastos de los Hogares (ENIGH) 2018",
general_title = "
Fuente: ")%>%
#Salvar
as_image(file="hacnal.png")

Nuestra estimación se ve así:

Dado que no me meteré en el tema teórico, aconsejo que la lectora o lector de esto, revise algún manual de estadística. Pero bueno, básicamente vemos que nuestra estimación tiene un coeficiente de variación de 2.67%. Lo que generalmente se señala es que, cuando este coeficiente está entre 0 y 15%, la precisión de la estimación es buena y conforme se va alejando, las estimaciones se tienen que tomar con cautela o desecharse en definitiva.

Ahora bien, ¿qué pasa si este resultado lo desglosamos por entidad federativa? El código para esto es este:

#Viviendas con habitantes en condición de hacinamiento por entidad federativa
hacent<-mydesign %>%
filter(hac==1)%>%
group_by(nom_ent)%>%
summarise(hac=survey_total(
vartype = c("cv", "ci"),
level=0.95))%>%
#Multiplicar coeficiente de variación por 100
mutate(hac_cv=
hac_cv*100,
#Formato de números
hac=format(hac,big.mark=","),
hac_cv=round(hac_cv,2),
hac_low=format(hac_low,big.mark=","),
hac_upp=format(hac_upp,big.mark=","),
)
#Tabla por entidad federativa
hacent%>%
kable(caption=text_spec("Viviendas con habitantes en condición de hacinamiento por entidad federativa, 2018",
bold=T, color="black",font_size = 30),
format="html",
align = "c",
col.names = c("Entidad",
"Viviendas con habitantes
en condición de\n
hacinamiento",
"Coeficiente de variación",
"Límite inferior",
"Límite superior"))%>%
kable_styling(full_width = F, font_size = 20,
html_font = "Montserrat Medium")%>%
row_spec(0, bold = F, color = "black", background = "#9ebcda")%>%
footnote(general = "@claudiodanielpc con información de INEGI. Encuesta Nacional de Ingresos y Gastos de los Hogares (ENIGH) 2018",
general_title = "
Fuente: ")%>%
#Salvar
as_image(file="hacent.png")

El resultado es el siguiente:

Así, vemos que la gran mayoría de las estimaciones a nivel entidad federativa son significativas😎.

Así como el hacinamiento, podemos empezar a calcular muchos otros indicadores y revisar la precisión de la estimación🤓.

Si has llegado hasta aquí, espero que te sirva esta publicación para tus análisis con encuestas.😉

Happy coding!😊

--

--