Developing Frogtek

El blog del Departamento de Tecnología

Categoría: data mining

R, rPython y ggplot2. Un poco de trabajo en equipo

Me llamo Jesús Armand y desde hace unos meses formo parte del equipo de Frogtek como científico de datos. Desde mi llegada, la compañía ha comenzado a utilizar nuevas herramientas en su día a día. Es por ello que a partir de ahora intentaré escribir sobre trucos, pequeños tutoriales o problemas con los que nos encontremos.

Cuando se trabaja con datos, a veces nos encontramos con la necesidad de ejecutar distintos códigos o comandos en diferentes herramientas. Por ejemplo, podemos estar trabajando con una base de datos en MySQL para extraer cierta información que queremos filtrar con algún método implementado en Python y ese resultado representarlo en un gráfico utilizando el paquete ggplot2. Resulta engorroso el proceso de crear, guardar y volver a abrir un fichero en las distintas etapas del proceso.

Es por ello que R a veces nos ayuda a simplificar todas estas tareas y a hacerlas más sencillas. Por ejemplo, con el paquete RMySQL podemos conectarnos de forma rápida con nuestra base de datos y realizar las consultas directamente desde la consola de R y guardar los resultados para, posteriormente, trabajar con el paquete rPython, creado por Carlos Gil Bellosta. En él podremos llamar fácilmente a las funciones desarrolladas en código Python y, finalmente, con las variables almacenadas en nuestro workspace en R, representar gráficamente la información que deseábamos en un principio con ggplot2.

Hoy nos centraremos en un pequeño ejemplo para interactuar con estos dos últimos paquetes: rPython y ggplot2.

El ejemplo va a consistir en, dado un vector con 83 valores, utilizar el método MADe para la detección y eliminación de valores extremos implementado en Python y representar el resultado en un histograma con el paquete ggplot2. El fichero datos-ejemplo- tiene los datos que necesitaremos. Os animo a que implementéis vosotros el código en Python.

Si no tenemos instalados en R los paquetes que necesitamos, ejecutaremos:

install.packages("rPython") 
install.packages("ggplot2")

Los paquetes en R se cargan de la siguiente forma:

library("rPython")
library("ggplot2")

El primer paso será indicar a R con qué fichero .py vamos a trabajar. Para ello ejecutaremos el comando:

python.load("statistical_formulas.py" )

donde el atributo es el nombre del fichero que contiene nuestra función (o funciones).

La función que hemos definido necesita de una sola variable con datos en la llamada. En este caso será el vector X:

python.call("remove_outliers_MADe_method", X)

donde el primer argumento es el nombre la función/método que tenemos en nuestro código y el segundo atributo es nuestro vector.

El resultado de la ejecución de esta llamada lo almacenaremos en la variable resultado.

Finalmente, sólo nos quedará invocar la función gplot() en ggplot2 para representar gráficamente un histograma:

qplot(resultado, geom="histogram")

Como habéis visto, el procedimiento es muy sencillo. Ahora, os animo a que implementéis vosotros mismos el algoritmo MADe para comparar el resultado.

Prototipado con Google Spreadsheets y Fusion Tables

Confome avanzan nuestros proyectos, va aumentando el volumen y calidad de la información subida por los usuarios desde sus dispositivos Android. Toda esta información se va agregando en la nube y poquito a poco vamos entrando en una nueva etapa en la que el data mining va cobrando más importancia. De momento, tenemos claros ciertos tipos de informes y gráficas imprescindibles para nuestro negocio, pero las posibilidades de jugar con los datos son enormes y, por eso, necesitábamos un modelo que nos permitiera diseñar de forma ágil prototipos funcionales para ser mostrados y estudiados por nuestro equipo, clientes y colaboradores.

Es necesario explicar que, aunque ya tenemos varios agregados e informes mostrados en la propia nube, también  descargamos y desnormalizamos los datos sobre una MySQLinstalada en un servidor local, ya que, las posibilidades de “retorcer” los datos en una base de datos relacional son mucho mayores que en un sistema como Big Table . Por tanto, llegados a este punto, contamos con un servidor local, una base de datos MySQL y un equipo de ingenieros preparados para torturar a los datos con las más despiadadas queries.

Una vez obtenida la información que pensamos que interesa a nuestros usuarios, las posibilidades de representarla son muchas, existiendo innumerables librerías Javascript para mostrar tablas y gráficos, (o incluso empresas ofreciendo herramientas SaaS muy potentes).  El problema es que todas ellas requieren preparar los datos con un formato concreto y cierto trabajo de programación y maquetación para integrarlas en una web.  En nuestro caso, pensamos que es pronto para emplear tiempo en ese tipo de tareas, puesto que no estamos seguros de qué tipo de representaciones van a ser valiosas y cuáles no. Aquí es donde entra en juego una gran idea de nuestro CEO: tanto Google Spreadsheets como Fusion Tables permiten importar datos desde CSV y la generación de listados, figuras y gráficas es potente y muy sencilla.

Las ventajas son muchas:

  • Ambas herramientas permiten importar los datos desde CSV. Y cualquier cliente SQL permite exportar los resultados de una query en dicho formato, por lo que la tarea de formato de datos estaría resuelta.
  • Ambas permiten generar automáticamente un script para incrustar los datos en cualquier web.
  • Los datos generados en el prototipo, aunque estáticos, son reales. Y su actualización (manualmente o usando las APIs proporcionadas) sería muy sencilla. Tan fácil como ejecutar de nuevo la consulta y exportar el CSV.

¿Qué usamos entonces para tener listo un conjunto de listados y gráficos demo con información real?

  • Google App Engine con Django: La facilidad de despliegue de una nueva aplicación en el GAE unida a la rapidez de desarrollo en Django nos permitieron montar la estructura de navegación del nuevo portal en una sola mañana (reutilizando plantillas y  diseños que ya teníamos).
  • Listados y gráficas:  Una vez obtenida la consulta sql con los datos que nos interesaban, la exportamos a CSV y la importamos en una de las dos herramientas comentadas:
  • Google Spreadsheets: una vez importado el CSV y obtenida la URL, podemos hacer uso de los múltiples google gadgets disponibles para  incrustar en nuestras webs. Por ejemplo, tablas, gráficos de líneas o de tarta.
  • Fusion Tables: una vez importado el CSV y obtenida la URL, podemos probar los distintos tipos de visualizaiones a partir del menú Visualize. Las opciones son variadas y potentes. Alguna de ellas bastante espectacular (Motion, Timeline, Story Line…).

Normalmente utilizamos Balsamiq para proptotipar y hacer pruebas de usabilidad en la fase de diseño, pero en este caso necesitábamos algo más real. Con todo lo anterior, en muy poco tiempo, logramos desplegar un prototipo operativo que permite mostrar el potencial de los datos recogidos y experimentar con distintas formas de mostrar la información. ¿Qué ventajas e inconvenientes le veis? ¿Qué alternativas usáis vosotros para esta tarea?