Ir al contenido principal

Paquete dplyr de R, quizás el sql de los matemáticos

 En los primeros cursos de R, me llamaba la atención de como utilizar herramientas para las consultas a los datos, algún símil de lo que hace SQL, o lo que se hace usando los menús de SPSS, STATA o REDATAM.

En mi anterior área donde hay más informáticos que matemáticos lo que hacíamos era que el motor dejara los conjuntos de datos listos para que R procesara - en nuestro caso - los cálculos usando el paquete estadístico survey ya que estábamos en el ámbito de las encuestas.

En este caso donde la mayoría de mis compañeros son matemáticos, R es el estandarte y en estos días de aprendizaje no lo hace nada mal.

Una de las cosas por las que me fui en esta ocasión por R es tratar de ponerme al corriente con mis compañeros porque bien lo pude haber hecho en otro lenguaje o motor de base de datos pero es necesario ya conocer o hacer lo que puedo con otras herramientas, ahora con R.




También algo genial es la velocidad con la que se cargan los archivos para el caso de objetos de Spark, pero esto lo abordaré en otro post.

Lo que buscaba era hacer comparativo de puestos de trabajo que reporta el IMSS en su sitio de datos abiertos, el archivo que se descarga consta de más de 4 millones de registros.

Como bien saben para hacer este tipo de estudios es necesario conocer de menos el diccionario de datos o lo que gracias a nuestro lenguaje ancestral de programación COBOL, le llamamos FD (File Description) para saber como se obtienen las cifras ya que debido al país que es México, 4 millones de empleos hablando de períodos de referencia mensuales no son suficientes para satisfacer la demanda de la población económicamente activa.

Para este ejercicio usé los puestos de trabajo como referencia al 31 de agosto del 2017 archivo que se encuentra en la siguiente dirección y el diccionario de datos en este enlace.

Los archivos de datos son CSV y un archivo de MS Excel es el diccionario de datos. Para empezar tenemos que cargar los datos y debido a la extensión de los mismos, reitero que usar Spark es increible la velocidad conque se cargan los datos a su dataset, para los colegas de TICs es muy buena opción el instalar también el paquete DBI que permite hacer consultas estilo SQL.

Entonces primero cargamos las librerías y con ellas el archivo.

library("sparklyr")

library("dplyr")

library("DBI")

setwd("rutadetrabajo/")

sc <- spark_connect(master = "local")

imss201708 <- spark_read_csv(sc, name = "imss201708",

                             path = "rutatrabajo/asg-2017-08-31.csv",

                              delimiter = "|", header=TRUE, overwrite=TRUE)

Como se trata de un archivo CSV se usa spark_read_csv, el delimitador es un padline (|), los archivos tienen cabecero y en caso de que ya exista el objeto Spark, se sobreescriba.

Hice mi primer prueba de tiempo y los 4 millones de registros los cargo en 24 segundos!!

Y aquí surge nuestra primera inquietud. ¿Cuántos registros (tuplas) tiene este dataset?. Los informáticos decimos que un select count(*) from tabla

Para R o específicamente dplyr usamos estás 2 formas:

count(imss201708)

n <- imss201708 %>% summarise(n())

En SQL usando el paquete DBI (el cual se tiene que instalar previamente) la instrucción sería:

nsql <- dbGetQuery(sc, "select count(*) from imss201708")

Que nos da como resultado 4,592,365, o sea que no son 4 millones sino 4.5 millones para ser exactos.

Revisando la información del diccionario de datos ( y usando un poco de intuición) para calcular el número de puestos de trabajo asegurados al IMSS hay que sumar el contenido de una columna la cual es asegurados (como el factor  de expansión en una encuesta). 

Nuevamente usamos el verbo summarise de dplyr pero ponemos el nombre de la columna.

puestos_trab_total <- imss201708 %>%  summarise(ptos_trab_total=sum(asegurados, na.rm = TRUE)) 

En SQL sería:

puestos_trab_total_sql <- dbGetQuery(sc, "select sum(asegurados) from imss201708")

Que nos da como resultado 26,437,477 puestos de trabajo asegurados al IMSS.

Ahora la solicitud era que ahora esta información se desplegará por entidad federativa, para lo cual vamos a agregar dos verbos más que son group_by y arrange, este último lo agregué ya que la consulta salía desordenada.

puestos_trab_por_ent <- imss201708 %>% group_by(cve_entidad) %>% summarise(aseg=sum(asegurados, na.rm = TRUE)) %>% arrange(cve_entidad)

SQL

puestos_trab_por_ent_sql <- dbGetQuery(sc, "select sum(asegurados) from imss201708 group by cve_entidad")

Como se puede observar aquí no es necesario poner la clausula de order by para que el resultado salga ordenado.






Y bueno por ahora hasta aquí dejamos esta entrega del paquete dplyr que seguiremos abordando en próximos artículos, por ahora creo que esta forma ayuda a los que tenemos perfil de TICs a entender mejor este paquete de R, la verdad tanto con este paquete como con el DBI, las consultas las hace muy rápidas.

Seguimos en contacto.
Atte.
Miguel Araujo 










Comentarios

Entradas populares de este blog

Posit Cloud - como instalar librerías de Python en el entorno de R

 Ahora que estamos tomando una maestría buscando que siga "girando la ardilla" por unos años más en la materia de "Cómputo Estadístico" nos ha sugerido usar la versión gratuita de Posit en la nube. En su página definen este producto como "es una solución basada en la nube que permite acceder al poderoso conjunto de herramientas de ciencia de datos de Posit directamente en el navegador web  - sin requerir instalación o configuraciones complejas". Para los usuarios que han utilizado Posit RStudio en primera instancia verán el entorno muy similar a Posit Cloud con algunas pequeñas diferencias, para empezar necesitamos un usuario o contraseña aunque es posible autenticarse usando alguna cuenta existente como es el caso de Google. Con el tiempo y trabajando en desarrollo de software, vamos entendiendo que quizás el nombre queda muy grande a los pequeños ejemplos, pero es muy recomendable el uso de proyectos siempre. A continuación vemos el entorno Posit Clo...

REDATAM en Ubuntu (Linux)

 En un blog alterno, escribí sobre como migraba un "viejo" Intel i5 al sistema operativo Ubuntu en su versión más actual. Me comunique con mi gran colega Lenin de la CELADE en Chile, después de mucho tiempo, y le pedí me diera un pequeño resumen del "estado del arte" de REDATAM me dijo que todo marchaba bien, y pues ahora creo que tengo que actualizarme en contenedores pues el web server se encuentra ahí. Nos pusimos manos a la obra, el instalable desde la página no tiene ninguna extensión de archivo, asumí que era un ejecutable para Linux, no se si la página sufra ataques constantes ya que después quise volver a descargar sin éxito, la página estaba caida, sin embargo rescate el ejecutable anteriormente descargado. Últimamente primero hago y después documento, ya que con todo y mi compañero Deep,  no todo sale a la primera ni como lo dictan sus sugerencias, sobre todo en Linux y MacOS.  Por lo que, les muestro solo el resultado final de esta primera exploración, im...

El problema del gallo - otra vertiente de usar Python en RMarkdown con Posit RStudio

Cuando pensamos que ya se había cruzado el río, el buen gallo - mi amigo el Dany  Lara- no podía insertar código de Python  en un documento de RMarkdown  usando la versión de escritorio de Posit RStudio a pesar de las soluciones como instalar el Python y direccionarlo desde R con la biblioteca reticulate . Si bien se podía ejecutar código del interprete base, al querer correr usando módulos y con ello intentando instalar dichos módulos mandaba el siguiente mensaje: > py_install('matplotlib') Using virtual environment "D:/tu_usuario/Documents/.virtualenvs/r-reticulate" ... WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1006)'))': /simple/matplotlib/ WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) a...