Reseña de 'Haskell Data Analysis Cookbook'

El libro Haskell Data Analysis Cookbook, de Nishant Shukla, hace un recorrido por las principales técnicas y algoritmos de análisis de datos utilizando el potente lenguaje open source Haskell para proporcionar numerosos ejemplos o recetas para implementarlas. En este post explicaré qué enseñan las recetas que contiene cada capítulo de este completo libro de analítica de datos.

Haskell Data Analysis Cookbook

  • El libro arranca mostrando cómo comenzar a utilizar el lenguaje importando datos desde diferentes fuentes, como ficheros de texto planos, ficheros en formato CSV, JSON, XML, páginas web HTML, o bases de datos como SQLite o MongoDB. También se menciona cómo enfocar el tratamiento de errores, en este caso de entrada/salida con Haskell.
     
  • El capítulo Integrity and Inspection, ya cubre aspectos de limpieza y tratamiento de datos que ayudan a preparar los datos para obtener después mejores resultados en los procesos de analítica que se vayan a aplicar. Se muestra cómo eliminar espacios en blanco innecesarios, ignorar signos de puntuación y otros caracteres irrelevantes, tratar entradas vacías o con contenido no 'esperado', comparar registros con expresiones regulares, parsear direcciones de email, o deduplicar registros, explicando incluso cómo definir una estrategia para tratar casos conflictivos como dos registros a fusionar que contengan diferentes valores útiles en uno de sus campos.
     
  • Se explica también cómo utilizar librerías de Haskell para implementar una tabla de frecuencia para ayudar después en la detección de excepciones (outliers), cómo implementar algoritmos de distancia entre puntos, como el de Distancia de Manhattan o el de Distancia Euclidiana, y cómo comparar datos en función de su tendencia con el coeficiente de correlación de Pearson, o datos con una alta dispersión con comparaciones de similitud de cosenos.
     
  • El tercer capítulo, 'The Science of Words', se dedica al tratamiento de strings, proporcionando ejemplos de cómo hacer cambios de base para preparar strings para tratamientos numéricos, cómo hacer búsquedas de substrings con diversos algoritmos, cómo separarlos en palabras, líneas u otros tokens, o cómo obtener una versión fonética en código Soundex o Phoenix. Todas estas técnicas sirven para preparar los strings para, finalmente, poder realizar comparaciones de similitud como buscar la subsecuencia común de mayor longitud, calcular la distancia de Levenshtein, o la distancia de Jaro-Winkler entre strings. Para seleccionar los strings más parecidos de un conjunto, por ejemplo, se pueden agrupar todos los que entre ellos devuelven una distancia de Levenshtein, o edit distance de uno. La última receta del capítulo es un ejemplo práctico que combina algunas de las técnicas anteriores para implementar un sencillo corrector de errores tipográficos que detecta errores selecciona el mejor candidato para la corrección.
     
  • El cuarto capítulo está dedicado por completo a técnicas y funciones de Data Hashing, que se pueden aplicar en diversos algoritmos criptográficos, o para la optimización de búsquedas y ordenaciones. Se incluyen ejemplos de utilización de las funciones de CityHash de Google, e incluso de una librería de Geohash para coordenadas geográficas. El último ejemplo muestra cómo medir la similitud entre dos imágenes utilizando una combinación de algoritmos de Hash y de distancia entre datos.
     
  • El quinto capítulo, 'The Dance with Trees', trata sobre la creación y utilización de estructuras de árbol (trees), para el análisis, clusterización y clasificación de datos. Contiene ejemplos de creación de una gran variedad de trees, como árboles binarios, árboles multicamino, árboles de búsqueda en profundidad (DFS), de búsqueda en anchura (BFS), de búsqueda binaria, árboles autobalanceados y árboles Huffman.
     
  • El capítulo seis, 'Graph Fundamentals', continúa en la tónica del capítulo anterior, pero ahora aplicada a la construcción y utilización de grafos, estructuras más complejas, de las que la de árbol es un tipo concreto, y que permiten representar estructuras de redes, tan importantes en la actualidad. Contiene ejemplos para representar grafos a partir de una lista de aristas, y de una lista de adyacencia, para realizar búsquedas topológicas en un grafo, para recorrerlos también en anchura y en profundidad, para visualizarlos utilizando la librería Graphviz, para utilizarlos para representar redes de grid hexagonal o cuadrado, para buscar el número máximo de cliques en un grafo, o para comparar parecidos entre redes determinando si dos grafos son isomórficos.
     
  • El capítulo 7, 'Statistics and Analysis', entra de lleno en conceptos estadísticos proporcionando recetas para utilizar las librerías estadísticas de Haskell para tareas como el cálculo de medias y medianas móviles, regresiones lineales y cuadráticas, la obtención de matrices de covariancia de muestras, búsqueda de parejas únicas en una lista, utilización del coeficiente de correlación de Pearson, o evaluación de redes Bayesianas. Los últimos ejemplos son utilidades como la creación de una estructura de datos para jugar a cartas, la utilización de una cadena de Markov para generar nuevo texto a partir de una entrada de texto, la creación de ngramas de una lista, o de una red neuronal que implemente un perceptron.
     
  • El capítulo 8, 'Clustering and Classification', trata sobre eso, muestra ejemplos de implementación de técnicas de clusterización y clasificación, como la implementación del algoritmo k-means, de una clusterización jerárquica o búsqueda del número de clusters en un conjunto de datos. Incluye aplicaciones prácticas como la clusterización de palabras por lexemas, la clasificación de palabras como partes del discurso con la ayuda de la librería NLP (Natural Language Processing), la identificación de palabras clave dentro de un texto para etiquetarlas automáticamente. El capítulo finaliza con la implementación de un árbol de decisión ID3 para clasificación de datos, y de un algoritmo de k-Nearest Neighbors para clasificar las peticiones que se hacen a un sitio web en 'humanas' o 'de robot', y evitar así ataques DoS.
     
  • El capítulo 9, 'Parallel and Concurrent Design', cubre conceptos avanzados de procesamiento en paralelo y concurrencia, como procesamiento en background con la función forkIO de la librería de concurrencia, mapeos sobre listas en paralelo, implementación de MapReduce y comparativas de rendimiento.
     
  • En el capítulo 10, 'Real-time Data', uno de los más interesantes, queda patente la potencia de Haskell para poder analizar datos en tiempo real. La primera receta muestra cómo interactuar con la API de Twitter para analizar los tweets que respondan a una determinada consulta de búsqueda, para sacar conclusiones sobre si el sentimiento hacia el tema es positivo, neutral o negativo. La siguientes receta crea un bot IRC que se une a una room y 'escucha' las conversaciones, y otro bot se puede encargar de responder a determinados mensajes de un canal. Otra receta enseñan a lanzar un poll cada cierto tiempo hacia un servidor web como Reddit para ir obteniendo así las últimas novedades filtradas bajo un criterio. La siguiente sirve para detectar cambios en tiempo real en ficheros de un directorio. Otro ejemplo muestra cómo establecer una comunicación en tiempo real mediante sockets, para transmitir mensajes entre programas. En el siguiente, la librería OpenCV permite analizar los streams que genera una cámara para detectar al vuelo caras y ojos en las imágenes y dibujar un cuadrado que las rodee. La última receta analiza un stream de video en tiempo real para localizar los frames que contienen una imagen determinada, y rodearlos también con un círculo.
     
  • El capítulo 11, 'Visualizing Data', cubre diferentes técnicas de visualización que se pueden utilizar en Haskell para mostrar resultados gráficamente. Se utiliza la Google's Chart API para crear gráficos de líneas, de pastel y de barras. Con gnuplot se crean gráficos de lineas, un gráfico de dispersión de dos puntos 2D, y una gráfica en 3D sobre la que se puede hacer zoom, rotar o desplazar. Con JavaScript y D3.js se crean gráficas de barras y una gráfica dedispersión. También se muestra cómo crear con Graphviz gráficas que permitan visualizar redes de grafos. La última receta de este capítulo crea gráficamente un camino a partir de una lista de vectores, obtenida de direcciones de Google Maps.
     
  • Finalmente, el capítulo 12, 'Exporting and Presenting', enseña cómo almacenar los resultados en diferentes formatos para su posterior reutilización. Las recetas exportan datos a ficheros CSV, JSON, a bases de datos SQLite y MongoDB. También trata cómo presentarlos en diferentes formatos como HTML y tablas LaTeX.

Desde luego, en los diferentes capítulos de este libro queda patente que Haskell y sus librerías conforman una gran herramienta de analítica de datos, que abre un gran mundo de posibilidades limitada más bien a la imaginación y experiencia del programador-analista que a limitaciones del lenguaje. Me ha sorprendido la simplicidad en la programación de las recetas, que gracias al enfoque funcional del lenguaje permite utilizar algoritmos muy complejos con pocas líneas de código.

Me han parecido especialmente interesantes las recetas del capítulo de análisis de datos en tiempo real, que pueden dar pie a muchas ideas más, especialmente las aplicadas a las interacciones con API's que nos permiten obtener datos del entorno web y de las redes sociales que ya dominan nuestra actividad en Internet, y recogen nuestros datos, gustos y costumbres.

 

El libro también está disponible en Amazon: Haskell Data Analysis Cookbook

 

¿Se te ocurre cómo aplicar alguno/s de estos algoritmos para solucionar o mejorar algo en tu empresa? ¿Alguna propuesta de analítica de datos sobre redes sociales, web, open data u otras fuentes de datos que podría generar resultados interesantes?