Más de dplyr y una librería nueva: sqldf

 En el Instituto es muy común los requerimientos especiales; cuando a veces la sección de consulta interactiva no nos puede dar algunas respuestas muy especificas a dichos requerimientos. Lo que sigue es descargar los datos abiertos y procesarlos con algún software estadístico o lenguaje de programación.

En los últimos años como se ha mencionado en los anteriores artículos se ha masificado y popularizado el uso del lenguaje de programación R por lo que al tener un enfoque fuertemente orientado a la estadística resulta fácil atender este tipo de requerimientos.

Vamos a ejemplificar con una consulta de la Encuesta Nacional sobre Uso del Tiempo (ENUT). La pregunta es la siguiente:

Número de personas de 15 a 24 años que abandonaron la escuela por razón de que se unió, casó o embarazó.

Para ello tenemos que descargar los microdatos de la página del Instituto e iniciar a escribir instrucciones  para dar respuesta a los requerimientos.

Otros documentos necesarios para realizar la consulta es el diccionario de datos y el cuestionario para identificar las columnas relacionadas con las preguntas así como el flujo de las mismas.

Cuestionario

https://www.inegi.org.mx/contenidos/programas/enut/2019/doc/enut_2019_cuestionario.pdf

Diccionario de datos (Descriptor de archivos):

https://www.inegi.org.mx/programas/enut/2019/#microdatos

Hemos identificado que las preguntas relacionados están en la sección que le hemos llamado como sociodemográfico.

Sección del cuestionario:


Sección del archivo del descriptor de archivo:


Debido a estos dos documentos nos damos cuenta que el nombre de las columnas son P3_9 para asistencia escolar y P3_10 para razón principal por la que no asiste a la escuela.

Si la variable P3_9 tiene un valor de 2 (no asiste a la escuela) y la variable P3_10 tiene valores 4 o 5 (razón por la cual no asiste a la escuela, se unió o se casó o se embarazó) estos son los casos que queremos contar o analizar. También es importante tomar en cuenta la columna EDAD.

Ahora en el Instituto se ha dejado de lado los formatos XBase (Dbf) y ahora lo que se publica en la página oficial son formatos de texto del tipo CSV (Valores separados por coma por sus siglas en inglés) para revisar el contenido de estos archivos que generalmente el sistema operativo los abre con MS Excel, podemos seleccionar el archivo y con el botón secundario del ratón elegimos abrirlo con un editor de texto (se puede con el NotePad o Bloc de Notas de Windows ya que no es archivo demasiado grande) aquí podemos observar el contenido completo del archivo que se ha descargado.


En posts pasados se ha publicado las equivalencias entre los consultas hechas con dplyr y código SQL (según la librería que se trate) ahora vamos a abordar ambos temas para resolver este requerimiento.

En una rápida investigación cuando un archivo de tipo CSV es asignado a un data frame debido a que como mencionamos al principio aplica ya que es un archivo de mediano tamaño, para el uso de SQL instalamos la librería sqldf y si es el caso se debe instalar también dplyr.

Así mismo en los pasados posts se habló de la librería DBI que se utiliza para trabajar con conexiones de base de datos o bien con Apache Spark

Para resolver el requerimiento y atender rápido se usó el software el Microsoft Visual FoxPro pero debido al uso generalizado que se da de la librería dplyr se busco resolver ya con toda la subdirección este mismo requerimiento.

Entonces vamos a explicar el código paso por paso.

library(dplyr)

library(sqldf)

Como se menciona tenemos que mandar llamar las 2 librerías, antes se tienen que instalar.

setwd("Unidad:/Ruta")

cdTsDem <- read.csv("TSDEM.csv")

Es muy recomendable fijar una ruta de trabajo y se realiza mediante la instrucción setwd, además se lee el archivo CSV y se pasa a un dataframe.

Esta primer consulta nos devuelve el número de personas que NO asisten a la escuela con edades entre 15 y 24 años.

PNAE <- cdTsDem %>% filter(P3_9=="2" & (as.numeric(EDAD)>=15 & as.numeric(EDAD)<=24)) %>%  summarise(tot = sum(FAC_HOG, na.rm = TRUE))

PNAE_SQL <- sqldf("select sum(FAC_HOG) from cdTsDem where P3_9='2' and (EDAD>=15 and EDAD<=24)")

Otro aspecto importante a resaltar es que como es un dato de una encuesta tenemos que sumar el ponderador (operación sum() de dplyr y SQL) que para esta encuesta es FAC_HOG.

En el entorno de R y específicamente en las librerías abordadas nos damos cuenta que si en una columna hay solo datos numéricos aunque vengan definidos como cadenas (string) se les da un trato de numéricos y no es necesario aplicar funciones de conversión de datos (por ejemplo as.numeric()) como se puede observar en el ejemplo de SQL.

Otra cuestión es que para el caso de dlpyr sino indicamos que los datos marcados con NA se ignoren, la consulta no se realiza, manda un NA, es por ello que a la función sum() hay que agregarle el parámetro na.rm = TRUE. 

Ahora necesitamos verificar la pregunta P3_10 para dar respuesta por completo a la petición del usuario.

PNAE_x_UnEmb <- cdTsDem %>%   filter(P3_9=="2" & (P3_10=='4' | P3_10=='5') & (as.numeric(EDAD)>=15 & as.numeric(EDAD)<=24)) %>%   summarise(tot = sum(FAC_HOG, na.rm = TRUE))

PNAE_x_UnEmb2 <- sqldf("select sum(FAC_HOG) from cdTsDem where P3_9='2' and (P3_10='4' or P3_10='5') and (EDAD>=15 and EDAD<=24)")

Con esto ya tenemos el número de personas de edad entre 15 y 24 años que NO asisten a la escuela y la razón principal es porque se unió o se embarazó. Aquí la ejecución de estas líneas de código:



Seguiremos compartiendo artículos en la medida de los posible, hasta el próximo post.

Atte.
Miguel Araujo.

Comentarios

Entradas populares de este blog

Spark (Parte 1)

La librería openxlsx