Análisis de sentimiento a través de Azure ML Studio para analizar la repercusión del COVID-19 en Twitter

Análisis de sentimiento a través de Azure ML Studio para analizar la repercusión del COVID-19 en Twitter

El Análisis de Sentimientos es “el proceso de identificar y categorizar computacionalmente las opiniones expresadas en texto, especialmente para determinar si la actitud del escritor hacia un tema, producto, etc… en particular es positiva, negativa o neutral”.

En el caso particular de las redes sociales, los usuarios tienen hoy en día todo tipo de facilidades para mostrar sus opiniones sobre cualquier tema que deseen. Tener constancia sobre las opiniones referentes a una marca, producto o situación y medir su impacto es actualmente de vital importancia para todas las empresas, pero el análisis de sentimientos no solo permite responder “qué opinan los internautas sobre algo”, sino que, facilita, mediante los medios adecuados, obtener ventajas competitivas en diferentes ámbitos.

Una vez visto lo que es el análisis de sentimiento y sus usos, la siguiente pregunta es: ¿Cómo podemos construir un analizador de sentimientos automatizado? Una respuesta es: utilizando Machine Learning.

Existen varias herramientas que nos permiten analizar sentimientos en textos de forma automática, pero si las que tenemos no nos cubren las necesidades, queremos personalizar el comportamiento o incluso por un tema de costes, podemos montarnos un analizador nosotros mismos de forma muy sencilla.

Con esta finalidad, uno de los mejores entornos donde empezar a crear modelos de Machine Learning es Microsoft Azure Machine Learning Studio. Esta herramienta nos permite crear sistemas automatizados de forma sencilla, sin necesidad de altos conocimientos en programación y, una vez entrenado el modelo, nos permite publicarlo en un servicio web para poder consumirlo.

En este artículo partiremos de una serie de tweets ya catalogados respecto al Coronavirus en España, aunque podría ser cualquier otro texto, como entradas a un foro. A partir de estos datos construiremos un modelo, lo publicaremos en un servicio web y lo consumiremos a través de Excel para realizar nuestras predicciones.

 

Construcción de un modelo predictivo en Azure ML Studio

 

Para desarrollar un modelo de análisis predictivo, normalmente se utilizan datos de una o varias fuentes, se transforman, analizan los datos a través de diversas funciones estadísticas y de manipulación de datos y se genera un conjunto de resultados. Microsoft Azure Machine Learning Studio nos permite hacer todo esto, pero en lugar de tener que hacerlo completamente a través de código, nos facilita una interfaz gráfica sencilla dónde conectaremos los conjuntos de datos y módulos para construir el modelo de análisis predictivo.

 

Carga de datos

 

Para poder entrenar nuestro analizador de sentimientos lo primero que necesitaremos, como para cualquier modelo de Machine Learning, son datos. En nuestro caso, nuestro objetivo es predecir el sentimiento en textos, por lo que para entrenar el modelo necesitaremos un conjunto de textos que ya tengan el sentimiento asignado. Lo primero que haremos será cargar estos datos.

 

 Azure ML Studio datasets

 

Ahora solo tendremos que arrastrar el módulo al espacio de trabajo y ya tendremos nuestro conjunto de datos listo para usar.

 

 

Nuestro conjunto de datos consta de dos columnas, una con los fragmentos de texto y otra con el sentimiento asociado; 4 para sentimientos positivos, 2 para sentimientos neutros y 0 para sentimientos negativos.

Ya hemos completado el primer paso para construir nuestro analizador de sentimientos.

 

Pre-procesado de los datos

 

Primero debemos asegurarnos de que nuestros datos se encuentran en el formato correcto, para ello incluiremos el módulo Edit Metadata, en el cual indicaremos el tipo de datos de cada columna. En nuestro caso tendremos una columna con valores de texto y otra con valores categóricos.

El siguiente paso será procesar estos datos. Los textos suelen estar desestructurados, con gran cantidad de caracteres especiales, enlaces a páginas web, hashtags y palabras muy comunes que aportan poco valor a la predicción (conocidas como stopwords). El rendimiento de nuestro modelo puede aumentar considerablemente al limpiar estos datos.

Este proceso de limpieza podría hacerse directamente con un script de Python o R, pero en este caso vamos a utilizar un módulo incluido en Azure ML Studio llamado Preprocess Text. Este módulo nos permite realizar varias transformaciones, además de las mencionadas anteriormente:

 Azure ML Studio sentiment analysis

El siguiente paso será tranformar las secuencias de texto obtenidas tras la transformación anterior en un conjunto de características representadas como enteros (conocido como Feature Hashing). La ventaja de utilizar Feature Hashing es que podemos representar textos de longitud variable como vectores de entidades numéricas de igual longitud y así lograr una reducción de la dimensionalidad; por el contrario, si tratamos de utilizar una columna de texto para entrenar sin convertir, se trataría como una columna categórica con muchos valores distintos, lo que empeoraría el rendimiento. Para realizar esta transformación utilizaremos el módulo Feature Hashing, incluido en Azure ML Studio.

Por último, utilizaremos el módulo Select Columns in Dataset para quitar la columna de texto original.

Con esto ya tendríamos nuestro conjunto de datos transformado, por lo que el siguiente paso será empezar a entrenar.

 Azure ML Studio analysis

 

Entrenamiento del modelo

 

Con nuestro conjunto de datos ya transformado, el siguiente paso será entrenar el modelo, para ello, lo primero será dividir los datos en un conjunto de entrenamiento y otro de testeo. El conjunto de entrenamiento lo utilizaremos para entrenar el modelo y el de testeo para evaluar el modelo.

Para dividir los datos utilizaremos el módulo Split Data. Debemos indicar la fracción por la que dividir, que en nuestro caso será 0.7 para entrenamiento y 0.3 para testeo, y definiremos el modo de división como estratificado.

 

 Azure ML Studio data

 

El siguiente paso será decidir el algoritmo de Machine Learning que vamos a utilizar. En nuestro caso nos encontramos frente a un problema de clasificación, ya que estamos buscando predecir una categoría, y esta categoría tiene tres posibles valores, por lo que deberemos escoger un algoritmo multiclase. Azure ML Studio nos facilita varios algoritmos, de los cuales, en este caso vamos a utilizar un Multiclass Decision Forest, pero se puede probar cualquier otro para comprobar cual se ajusta mejor a nuestros datos.

Una vez decidido el algoritmo, lo que nos queda es entrenar el modelo. Para ello, añadiremos el módulo Train Model y le conectaremos como entradas el algoritmo que vamos a utilizar y nuestro conjunto de entrenamiento. También deberemos escoger cuál es el valor que queremos predecir, en nuestro caso será el sentimiento.

 

 

Evaluar el modelo

 

Una vez entrenado el modelo, lo único que quedaría por hacer sería evaluarlo. Para ello utilizaremos los módulos Score Model y Evaluate Model. Con el módulo Evaluate Model obtenemos medidas del rendimiento del modelo que hemos creado, para con ellas decidir si nuestro modelo es lo suficientemente bueno o debemos realizar ajustes para mejorarlo.

 

 

Creación de un servicio web y consumo a través de Microsoft Excel

 

Además de crear y entrenar modelos, Azure ML Studio nos permite publicarlos como un servicio web para después consumirlo y realizar nuestras predicciones.

Para publicar un modelo de Azure ML Studio como servicio web lo primero que debemos hacer es, dentro de nuestro experimento, seleccionar la opción Set Up Web Service, en la barra inferior de la interfaz. Se nos abrirá una nueva pestaña en la parte superior del espacio de trabajo llamada Predictive Experiment y veremos como Azure ML Studio simplifica nuestro diagrama añadiendo una entrada Web Service Input y una salida Web Service Output. Estos nuevos módulos serán los datos de entrada y salida de nuestro servicio web.

 

 

Al entrenar el modelo, introducíamos un conjunto de datos con dos columnas, el texto y el sentimiento, pero en este caso no es eso lo que buscamos, sino que buscamos que la entrada sea únicamente un texto sin sentimiento asignado y que el modelo se encargue de asignarlo. Lo mismo sucede con la salida, ahora mismo nos está devolviendo todo el conjunto de datos con la predicción como una nueva columna añadida, pero nosotros solo queremos esa columna como salida.

Lo que haremos será añadir dos módulos Select Columns in Dataset, una al principio y otra al final, para definir así los datos que vamos a introducir y los datos que queremos que el modelo nos devuelva.

Ejecutamos de nuevo y si todo está correcto el modelo resultante debería quedar de la siguiente manera:

 

 

Una vez ha ejecutado todo correctamente, solo deberemos pulsar sobre Deploy Web Service y ya tendremos nuestro servicio web activo y listo para ser consumido.

 

 

Azure ML Studio nos permite probar directamente el modelo pulsando en Test, pero vamos a utilizarlo para predecir el sentimiento de un conjunto de tweets en un libro de Microsoft Excel. Para ello solo tenemos que descargar el archivo Excel que se muestra en el apartado Apps, en la fila de Request/Response.

Una vez estemos dentro del libro, veremos que se nos muestra en la parte derecha el add-in de Azure ML Studio. Ahora tendremos que introducir en el libro los datos cuyo sentimiento queremos predecir, seleccionar nuestro modelo en el menú de Azure, seleccionar los datos de entrada, la celda de salida y, con solo pulsar en Predict, tendremos una nueva columna con todas las predicciones. ¡Así de sencillo!

 

 

Visualización de los resultados

 

Con los pasos anteriores ya tendríamos nuestro conjunto de datos de resultados listo, pero resulta complicado sacar conclusiones teniendo únicamente el texto de los tweets y los sentimientos; por lo que vamos a visualizarlos para poder sacar nuestras conclusiones. Esto lo haremos a través de Python.

Lo primero que deberemos hacer es cargar las librerías que necesitamos para hacer funcionar nuestro código.

 

import pandas as pd
import numpy as np
import unicode
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator, STOPWORDS
from PIL import Image
import random
from collections import Counter
from palettable.colorbrewer.sequential import Reds_9
from palettable.cmocean.diverging import Balance_20
from palettable.tableau import BlueRed_12
from scipy.misc import imread
from nltk.corpus import stopwords
def color_func(word, font_size, position, orientation, random_state=None, **kwargs):
    return tuple(Balance_20.colors[random.randint(2,18)])

 

A continuación, cargaremos nuestro conjunto de resultados y sustituiremos los valores de sentimiento por su correspondiente significado:

 

df = pd.read_excel('predicciones.xlsx', encoding = 'utf8')

df['Scored Labels'] = df['Scored Labels'].replace(0, 'Negativo').replace(4, 'Positivo').replace(2, 'Neutro)

 

Una vez tenemos los datos cargados, vamos a realizar una serie de visualizaciones.

 

Distribución sentimientos

 

Lo primero que podemos visualizar es la distribución de los tweets categorizados como positivos contra los tweets categorizados como negativos.

 

labels = 'Positivo', 'Negativo'
sizes = [df[df['Scored Labels'] == 'Positivo'].shape[0], df[df['Scored Labels'] == 'Negativo'].shape[0]]
colors = ['green', 'red', ]
explode = (0.1,0)

plt.pie(sizes, explode = explode, labels = labels, colors = colors, autopct = '%1.1f%%', shadow = True, startangle = 140)
plt.axis('equal')
plt.show()

 

 Azure ML Studio graph

Wordcloud

 

Un wordcloud es una visualización que nos permite ver las palabras más frecuentes, es decir, las palabras que más se repiten a lo largo del texto. Para ello, wordcloud visualiza con un tamaño más grande las palabras más frecuentes y en tamaño más pequeño aquellas menos frecuentes.

Para realizar la visualización correctamente, como sucedía al entrenar el modelo, deberemos eliminar las palabras que no aportan significado (stopwords).

 

otras = stopwords.words('spanish')
sw = set(STOPWORDS)
for word in otras:
   sw.add(word)
sw.add('RT')
sw.add('http')
sw.add('https')

 

Vamos a crear dos wordclouds, uno para los tweets positivos y otro para los tweets negativos.

 

# Wordcloud tweets positivos

positivos = df[df['Scored Labels'] == 'Positivo']
textos_positivo = ' '.join(positivos.fillna('')['tweet_text'].tolist())

wc = WordCloud(
    background_color = 'rgba(255, 255, 255, 0)', mode = 'RGBA',
    width = 1800,
    height = 1400,
    stopwords = sw
).generate(textos_positivo)
wc.recolor(color_func=color_func, random_state=3)

%matplotlib notebook
plt.imshow(wc)
plt.axis('off')
plt.savefig('./wordcloud_positivo.png', dpi=600)
plt.show()

 

 Azure ML Studio word analysis

 

# Wordcloud tweets negativos

negativos = df[df['Scored Labels'] == 'Negativo'] 
textos_negativo = ' '.join(negativos.fillna('')['tweet_text'].tolist()) 
wc = WordCloud( 
    background_color = 'rgba(255, 255, 255, 0)', mode = 'RGBA', 
    width = 1800, 
    height = 1400, 
    stopwords = sw 
).generate(textos_negativo) 
wc.recolor(color_func=color_func, random_state=3) 

%matplotlib notebook 
plt.imshow(wc) 
plt.axis('off') 
plt.savefig('./wordcloud_negativo.png', dpi=600) 
plt.show()

 

 Azure ML Studio wordmap

 

Top palabras más frecuentes

 

Por último, también podemos visualizar, mediante un gráfico de barras, el top de palabras más frecuentes, tanto en tweets positivos como en tweets negativos.

 

# Positivas

textos_positivo = unicode.unidecode(textos_positivo)
word_tokens = word_tokenize(textos_positivo)
filtered_text = []
for w in word_tokens:
    if w not in sw:
        filtered_text.append(w)

counter_pos = Counter(filtered_text)
most_occur_pos = counter_pos.most_common(10)

df_pos = pd.DataFrame(most_occur_pos, columns=['palabra', 'count']).sort_values(by='count', ascending=True)
df_pos.plot.barh(x='palabra', y='count', rot=0, title='Palabras más frecuentes tweets positivos', color='royalblue')
plt.tight_layout()

 

 

# Negativas

textos_negativo = unicode.unidecode(textos_negativo) 
word_tokens = word_tokenize(textos_negativo) 
filtered_text = [] 
for w in word_tokens: 
    if w not in sw: 
        filtered_text.append(w) 

counter_neg = Counter(filtered_text) 
most_occur_neg = counter_neg.most_common(10) 
df_neg = pd.DataFrame(most_occur_neg, columns=['palabra', 'count']).sort_values(by='count', ascending=True) 
df_neg.plot.barh(x='palabra', y='count', rot=0, title='Palabras más frecuentes tweets negativos', color='royalblue') 
plt.tight_layout()

 

¿Quieres formarte en Machine Learning? En SolidQ venimos trabajando en proyectos de Machine Learning desde hace algunos años y esta experiencia nos ha servido para adaptar nuestro conocimiento y crear los contenidos formativos objeto de este Módulo de Machine Learning con el que adquirir nuevos conceptos y conocimientos relacionados con analítica avanzada, dar el salto para no quedarte en el BI Tradicional” y seguir creciendo como profesional. Aprovecha la oportunidad y no dejes escapar el descuento que tenemos para ti… ¡antes de que se agote!

¿Quieres poner en marcha tu proyecto de Machine Learning? Conseguir el éxito en proyectos de analítica avanzada y su monetización requiere de datos, un buen modelo… y su interpretación asociada al caso de negocio. Esta combinación es imprescindible para que el proyecto tenga sentido y sea rentable. Por esta razón, durante nuestro Ideation Workshop nos reunimos en una sesión con todas las partes implicadas de tu equipo, para poner en contexto el proyecto y asegurar tanto su viabilidad técnica como los hitos de negocio en términos de rentabilidad. ¡Infórmate! Mira: Machine Learning Ideation Workshop: ¿Cómo empiezo mi proyecto?

Empieza la cuenta atrás… SolidQ Summit 2020

Empieza la cuenta atrás… SolidQ Summit 2020

Y por fin llegó mayo. Y ya tenemos la agenda completa confirmada, además de confirmada la participación de muchos clientes, tanto como asistentes, como participando activamente en nuestras charlas. Sin duda alguna, un gesto muy de agradecer en la situación actual en que todos nos encontramos.

Muchos de vosotros, seguro que habéis echado un vistazo a la agenda, y aún tenéis dudas sobre si merecerá la pena asistir o no, si la experiencia on-line merecerá la pena. Para todos vosotros dudosos, y para los que ya os habéis decidido a asistir, quiero ampliar con un poco más de detalle la agenda y algunas de las charlas que no os debéis perder. No voy a desgranar el detalle de las 33 charlas que tenemos agendadas, para eso os invito que reviséis nuestro perfil de LinkedIn donde algunos de los ponentes ya han ido dando alguna pista. Voy a centrarme en las charlas que compartiremos con nuestros clientes, donde ellos mismos, y de primera mano, explicarán junto con mis compañeros, como han puesto en valor distintas soluciones técnicas para explotar, controlar y gestionar mejor su información.

¿Qué tenemos preparado?

El lunes 18 arrancaremos las sesiones junto a Vitaldent y de la mano de Miguel Egea, que nos contarán como están abordando los procesos de carga de datos en los sistemas analíticos de Vitaldent, recién alojados en Azure. Como siempre Miguel nos dará buenos trucos y consejos que además en este caso están puestos en marcha dentro del ecosistema analítico de Vitaldent.

El martes 19 seguiremos con Rafa Báguena que hará de maestro de ceremonias para presentarnos dos implementaciones de Power BI realizadas en CIE Automotive y en Securitas Direct. CIE Automotive ha puesto en marcha Power BI Embedded para que puedan acceder a los análisis a través de terceras aplicaciones que ya tenían desplegadas, reduciendo el ciclo de adopción de los informes y paneles. Mientras que Securitas ha puesto en manos de su red comercial sus datos de venta, para lo cual ha tenido que dotar de un riguroso sistema de seguridad que nos explicarán de primera mano.

El miércoles 20 Pau Sempere nos contará como mejorar el proceso de comercialización utilizando técnicas de Machine Learning. Esta charla está basada en hechos reales, pero por motivos de seguridad no mencionaremos el cliente, aunque si puedo adelantar, que los resultados son espectaculares.

El jueves 21 tendremos a dos grandes, Pablo Ahumada (Microsoft) y Victor Sánchez nos contarán sus experiencias para poner en marcha Power BI en un entorno empresarial, donde se está pilotando una de las instalaciones de Power BI más grande del mundo.

El viernes 22 será el día del gobierno del dato. ¿quién no tiene problemas para organizar un entorno de desarrollo lo más parecido a su entorno de producción? Antonio Llompart acompañará a la gente de Goldcar para que nos cuente como han ofuscado los entornos no productivos y así asegurar que no hay problema con los cumplimientos de GDPR. Además de Goldcar, Miguel Egea nos enseñará como estamos colaborando con Ibercaja para gobernar sus datos, a través de un sistema a medida de medición de la calidad del dato.

Y como ya avanzamos, durante las tardes, daremos paso a nuestros mentores y MVP más expertos para que nos ayuden a asentar conocimientos y aprender cosas nuevas. Todos ellos además son Microsoft Certified Trainers (MCT), así que la calidad de sus formación y conocimiento está más que garantizada.

Miguel Egea nos hablará de cómo abordar los proyectos de BI usando Power BI como herramienta general.
Enrique Catalá nos contará como mejorar nuestros procesos analizando los planes de ejecución de las consultas. Un tema que siempre ha generado mucho interés en nuestros alumnos.
Pau Sempere nos ayudará a despegar con las iniciativas y pruebas de concepto de Machine Learning. Aunque ya no podemos decir que es una tecnología novedosa, no siempre es fácil arrancar proyectos de ML, así que no está de más revisar este tema en detalle.
Miguel López nos dará las pinceladas necesarias para que nos atrevamos a presentarnos al examen de certificación de Azure Fundamentals (AZ-900). Nuestro “azure-man” nos dará un montón de información y tips para perder el miedo.

Espero que os guste todo lo que tenemos ya preparado , para que te animes a unirte a nosotros a disfrutar de la experiencia del SolidQ Summit y podamos pasar mejor estos días de cambio de ritmo hacia la normalidad.

Recomendando productos con Inteligencia…Artificial?: ¿Qué son?

Recomendando productos con Inteligencia…Artificial?: ¿Qué son?

Acercar el producto perfecto al cliente idóneo es el sueño de toda empresa. Los sistemas de recomendación basados en inteligencia artificial convierten este sueño en una realidad. Reflexionemos un momento y preguntémonos cuántos de nosotr@s usamos un recomendador de productos basado en inteligencia artificial (de forma directa o indirecta) diariamente.

Y es que son una realidad tan presente en nuestra sociedad que es prácticamente imposible responder que no a esta pregunta.

En esta entrada pretendemos realizar una breve introducción a los sistemas de recomendación, pasando por los casos de éxito por excelencia. En blogs venideros veremos qué tipos existen en el mercado, así como también como se pueden implementar de forma satisfactoria.

Casos de éxito

Amazon

Amazon, empresa líder en el sector de comercio electrónico, fue uno de los pioneros en incorporar este tipo de sistemas.

Se basaba inicialmente en:

  • Eventos tales como compras, búsquedas de productos, adiciones a la cesta de la compra, palabras clave utilizadas, departamentos, etc.
  • Valoraciones de los productos comprados
  • Usuarios que se comportan de manera similar en cuánto a los productos que ha comprado se refiere (lo que se conoce como filtro colaborativo. Pero hablaremos más extensamente en una entrada de blog dedicada a él)

La empresa reportó un incremento del 29% de ventas (12.83 miles de millones de dólares) en el segundo cuatrimestre fiscal del año anterior al que se realizó el estudio.

Gran parte de ese crecimiento fue atribuido a la forma en la que Amazon integró su sistema de recomendación de productos a todas y cada una de las partes del proceso de compra, consiguiendo que el 35% de las compras a través de amazon.com sean generadas gracias a su motor de recomendaciones (cifra que hoy se mantiene e incluso se supera).

Netflix

Netflix, plataforma de las más utilizadas para consumir contenido online en la que sus usuarios pagan una cuota por consumir contenido multimedia, reportó que el 80% de éste es elegido gracias a su sistema de recomendación.

Facebook

Facebook recomienda personas a personas (quizás podrías conocer a…) e incluso recomienda qué anuncios (Facebook Ads) deben ver qué personas, pues serán con más probabilidad los que le interesen.

Y no son los únicos…

Existen infinidad de empresas y procesos donde los sistemas de recomendación basados en inteligencia artificial tienen cabida: YouTube recomendando vídeos, Spotity y Apple Music con la creación de listas de reproducción creadas ad-hoc.

Casos SolidQ

Desde SolidQ hemos implementado con éxito numerosos sistemas de recomendación basados en inteligencia artificial. Un caso muy interesante fue el de sacarle rentabilidad a las cuentas bancarias de los clientes de un banco en el mercado de USA mediante la recomendación de los productos bancarios que estaban disponibles. Esto reportó no sólo un incremento de la rentabilidad de las cuentas bancarias, sino que también incrementó los ingresos del banco en más de un 10%.

Conclusiones

Los sistemas de recomendación basados en inteligencia artificial son una realidad, encontrándose muy presentes en nuestra vida cotidiana. Incluir en nuestro sistema de información un sistema de recomendación puede llegar a enriquecerlo de manera muy satisfactoria. Cabe destacar que no se limitan a los productos y clientes, pues ya hemos visto casos como el de Facebook donde se recomiendan personas a personas (quizás conozcas a…), por lo que tienen cabida en prácticamente todas las empresas.

En las siguientes entradas veremos el estado del arte, pasando por los diferentes tipos que podemos encontrar y cómo implementarlos de manera satisfactoria. Lee aquí la segunda parte de este post.

¿Quieres formarte en Machine Learning? En SolidQ venimos trabajando en proyectos de Machine Learning desde hace algunos años y esta experiencia nos ha servido para adaptar nuestro conocimiento y crear los contenidos formativos objeto de este Módulo de Machine Learning con el que adquirir nuevos conceptos y conocimientos relacionados con analítica avanzada, dar el salto para no quedarte en el BI Tradicional” y seguir creciendo como profesional. Aprovecha la oportunidad y no dejes escapar el descuento que tenemos para ti… ¡antes de que se agote!

¿Quieres poner en marcha tu proyecto de Machine Learning? Conseguir el éxito en proyectos de analítica avanzada y su monetización requiere de datos, un buen modelo… y su interpretación asociada al caso de negocio. Esta combinación es imprescindible para que el proyecto tenga sentido y sea rentable. Por esta razón, durante nuestro Ideation Workshop nos reunimos en una sesión con todas las partes implicadas de tu equipo, para poner en contexto el proyecto y asegurar tanto su viabilidad técnica como los hitos de negocio en términos de rentabilidad. ¡Infórmate! Mira: Machine Learning Ideation Workshop: ¿Cómo empiezo mi proyecto?

Un paseo por Azure ML Services 

Un paseo por Azure ML Services 

Azure ML Services, nuestro punto de encuentro para ML en la nube

Azure se ha convertido en la pieza central de la plataforma de análisis de datos de Microsoft desde hace años. En los últimos meses el área de Machine Learning se ha visto enriquecida con funcionalidades y servicios que forman una plataforma que permite centralizar los desarrollos de Machine Learning, así como proveer de todas las piezas necesarias para consumir datos, entrenar nuestros modelos y productivizarlos de la manera que necesitemos. El hecho de ser una colección de servicios de Azure nos permite además combinarlos fácilmente con otros que no están dentro del área de ML pero que sí forman parte de arquitecturas de nivel empresarial, desde Azure Kubernetes Services a Azure SQL pasando por Key Vault o Container Registry.

En éste artículo vamos a repasar los puntos fundamentales de Azure ML Services y cómo nos permiten acelerar nuestros proyectos de ML, pero antes repasaremos la idea global de Azure ML Services. Su objetivo es servir a todas las fases del proceso de desarrollo y puesta en producción de los modelos, y por tanto, como comentábamos, nos sirve de todos los servicios cubriendo el ciclo de vida de una solución de ML

Arquitectura básica Azure ML Services

En el diagrama se muestra el ciclo desde el desarrollo con scripts Python a la docu del SDK (ahora también R, en preview) y cómo se van usando los diferentes servicios y recursos disponibles. Se observa que el cómputo, los repositorios de datos y el servicio de registro de experimentos están desacoplados. De esta manera los diferentes experimentos son flexibles en cuanto a paso entre entornos (apuntar a datos de producción / desarrollo / QA es tan fácil como pasar un argumento diferente a nuestro script) como en el escalado de datos y cómputo. Bastaría con especificar otra configuración a la hora de lanzar nuestro experimento.

Este modo de ejecución con los recursos intercambiables pero entornos, scripts y dependencias constantes resuelve algunos de los puntos más problemáticos del desarrollo de soluciones de ML: la reproducibilidad y la puesta en producción de modelos (y ya de paso, la gestión de dependencias de librerías, otro caballo de batalla histórico).

Workspace en Azure ML Services

El Azure ML Services Workspace es el punto central de gestión y exploración de experimentos. Ahora cuenta con una nueva página dedicada, ya no se encuentra dentro del portal de Azure (ml.azure.com). Aquí podemos ver todos los elementos disponibles en el servicio. Además de usar la página web y la interfaz gráfica que nos ofrece podemos acceder a los diferentes recursos a través de los SDK de Python o R (en preview en éste último caso), Azure CLI o API REST. Sin embargo, dada la rápida evolución del servicio y las mejoras que se aplican, a veces tenemos funcionalidad disponible a través del SDK de Python o Azure CLI que no tenemos en el sitio web.

Azure ML Studio overview

El Workspace, al centralizar todos los recursos, sirve como hub de exploración y monitorización de experimentos y desarrollos. Y lo primero que tenemos que tener para poner en marcha estos desarrollos son datos!

Datos

En Azure ML Services se pueden obtener datos de diferentes maneras. El propio servicio tiene dos almacenamientos propios, un Blob Storage y un File Share. El almacenamiento por defecto inicial es el File Share, pero podemos cambiarlo a través del SDK. Las diferentes maneras a través de las que podemos trabajar con datos son las siguientes

  • Subiendo nuestros propios datos a los almacenamientos propios que se crean como parte del servicio (los citados Blob Storage y File Share)
  • Registrando datastores dentro del workspace, con credenciales específicas para acceder a ellos. Esta tarea puede ser parte de las tareas del equipo IT para liberar a los desarrolladores de ML de acceder a las fuentes externas, obtener claves de acceso o SAS keys (los dos modos soportados en éste momento). Podemos registrar los siguientes orígenes de datos como datastores:
    • Azure Blob Storage
    • Azure File Share
    • Azure Data Lake Storage Gen1&2
    • Azure SQL Database
    • Azure PostgreSQL database
    • Azure MySQL database
  • Accediendo directamente a las fuentes dentro de los scripts:
    • Si la fuente de datos no se puede registrar como Datastore (un bucket S3 de Amazon, por ejemplo), se puede acceder directamente a la fuente desde nuestro script Python. Las credenciales, idóneamente, deberán estar securizadas en un Key Vault.

Datastores

Podemos crear datastores desde el SDK y desde la interfaz gráfica. La configuración es bastante directa si tenemos los datos de acceso (cuenta y account key o SAS key)

Creación de un nuevo datastore

Si estamos en las opciones 1 o 2, donde tenemos nuestros datos registrados en un datastore (sea externo o propio del servicio), podremos acceder al datastore completo pasándolo a nuestros scripts especificando el tipo de acceso. Así podríamos acceder a todo el datastore.

Datasets

Sin embargo, si además tenemos identificados conjuntos de datos que querremos utilizar y que, idealmente, han sido validados por el grupo de ingeniería del dato o por los data scientist si también cubren ese rol, podremos registrar datasets concretos y pasarlos a nuestros scripts como «named inputs» para poder acceder incluso más fácilmente a ellos.

Podemos crearlos tanto desde la interfaz web como desde el SDK, como la mayoría de operaciones del servicio

Creación de un dataset en Azure ML Services

Por ejemplo, una vez tenemos un dataset registrado y obtenida su referencia

from azureml.core import Workspace, Datastore, Dataset, ScriptRunConfig, ComputeTarget, Experiment
from azureml.train.sklearn import SKLearn

#cogemos la referencia al workspace 
ws = Workspace.from_config(auth=int_auth)

#apuntamos al dataset previamente registrado
dataset = Dataset.get_by_name(workspace=ws, name = 'wine')

#creamos el estimador para ejecutar nuestro experimento 
est = SKLearn(
                source_directory='./scripts',
                entry_script='train.py',
                compute_target=comp,
                inputs = [dataset.as_named_input('train')], #al pasarlo como named_input lo hacemos visible dentro del script de entrenamiento
                pip_packages=['azureml-sdk', 'pyarrow>=0.12.0']
)

Podríamos acceder dentro de nuestro script de entrenamiento sólo con el siguiente código

#dentro del script train.py
#obtener el contexto en el cual está corriendo el script para poder acceder a los objetos
run = Run.get_context()

#leer la referencia desde el input y pasarlo a un DataFrame de Pandas para empezar a operar
df = run.input_datasets['train'].to_pandas_dataframe()

Los datasets que registremos y usemos pueden ser de dos tipos:

  • Tabular: datasets con estructura tabular. Todos los que provengan de bases de datos relacionales serán de éste tipo, y muchos de los que tengamos en almacenamientos como Blob Storage también. CSVs, Parquet, Excel, etc. siguen siendo los formatos más populares y la gran mayoría de problemas de ML (especialmente los que resuelven problemas de negocio habituales) se basan en datos en formato tabular.
  • Ficheros: Las soluciones de ML que usan datos en formato semi-estructurado o no estructurado (JSON, XML, video, fotos, audio, etc.) son cada vez más habituales. Para poder entrenar modelos que usan éste dato podemos registrar datasets en formato fichero, donde no hay una estructura pre-fijada y realmente acabamos creando un puntero a una lista de ficheros en un almacenamiento como Blob Storage o Azure Data Lake Gen1 ó Gen2

Una vez registrados podemos usarlos como citábamos anteriormente pero también aplicar perfilado de datos sobre ellos. El perfilado de los datos y la exploración visual y estadística de los mismos es una fase fundamental en los proyectos de ML. Además Azure ML incorpora una funcionalidad llamada Data Drift, que basándose en éste perfilado nos informa de cuan diferentes son dos conjuntos de datos. Esto es realmente importante para entender ciertas situaciones donde el mismo modelo puede estar dando resultados muy diferentes sobre conjuntos de datos diferentes y queremos evaluar si se debe a diferencias en el dato o a que nuestro modelo es muy inestable y tenemos que re-evaluar cómo lo hemos construido o incluso la aproximación al problema.

Perfilado de dataset en Azure ML Services

Computación

¡Una vez obtenido el dato deberemos ejecutar nuestros procesos y entrenar nuestros modelos en algún lado! Azure ML Services nos ofrece 4 tipos de cómputo para diferentes escenarios:

  • Compute Instances: Son máquinas virtuales con Jupyter, JupyterLab y R Studio instalados y accesibles a través del navegador. Son ideales para prototipado, experimentación y escalado de experimentos si hemos empezado el desarrollo en local y necesitamos VMs que sean fácilmente desplegables y que no se usen constantemente.
  • Training clusters: Clústeres de máquinas virtuales que pueden actuar cada una por su lado para escenarios de computación paralela (búsquedas de hiperparámetros, por ejemplo) pero que también pueden actuar como una sola super-máquina si incluimos un controlador MPI (entrenamiento de grandes redes neurales con máquinas que equipan GPUs, por ejemplo).
  • Inference clusters: Son clústeres de Azure Kubernetes Services, ideales para desplegar nuestros modelos en contenedores y crear endpoints que pueden consumirse desde el SDK de Python / R o bien como API REST
  • Attached Compute: Se trata de recursos de computación en Azure que podemos reaprovechar para ejecutar experimentos. Podemos usar:
    • DSVMs
    • Azure Databricks
    • Azure Data Lake Analytics
    • Azure HDInsight
    • Azure Batch

Además de todas estas opciones, siempre podemos empezar desarrollando en local y una vez tenemos un prototipo que funciona empezar a testearlo y escalarlo con los recursos de computo de los que dispongamos. Puedes encontrar más información sobre cómputo remoto en Azure ML Services aquí 

Opciones de cómputo en Azure ML Services

Para ejecutar un script en el compute instance que se muestra en la captura, podríamos definir un estimador de tipo SKLearn (que ya incluye la librería scikit-learn que usaremos en el experimento), seleccionar nuestro cómputo, crear un experimento y enviarlo para su ejecución:

#apuntar al contexto de computación
comp = ComputeTarget(ws, name = 'compute-instance-demo')

#%%
# estimador que ya incluye la librería SKLearn
est = SKLearn(
                source_directory='./scripts',
                entry_script='train.py',
                compute_target=comp,
                inputs = [dataset.as_named_input('train')], #input para leer desde el script de entrenamiento
                pip_packages=['azureml-sdk', 'pyarrow>=0.12.0'] #ademas de sklearn necesitamos pyarrow y azureml-sdk para poder trabajar con los métodos de obtención de datos
)

# creamos el experimento (o una nueva ejecución si ya existe) y lo enviamos. 
# esto creará una imagen Docker que se montará en nuestro Compute Instance con las dependencias que hemos declarado en el estimador. 
# Será éste contenedor donde se ejecutará nuestro script "train.py"
exp = Experiment(workspace=ws, name = 'submitted_wine')

run = exp.submit(est) #enviamos el experimento con el estimador 
run.wait_for_completion(show_output=True)

Nuestro script train.py completo

from azureml.core import Workspace, Datastore, Dataset
from azureml.core.run import Run
from sklearn import datasets 
import pandas as pd
import numpy as np 
from sklearn.ensemble import RandomForestClassifier 
from sklearn.model_selection import train_test_split, cross_validate
from sklearn.metrics import balanced_accuracy_score, f1_score, confusion_matrix

#conseguir el contexto 
run = Run.get_context()

#leer de los inputs declarados
df = run.input_datasets['train'].to_pandas_dataframe() 

#separar nuestro dato
y = df.pop('Class')
X = df

clf = RandomForestClassifier(n_estimators = 100)

#validación cruzada sobre el dato
cv = cross_validate(clf, X, y, scoring='accuracy', cv=5, n_jobs=-1)
acc = str(round(np.average(cv['test_score']), 3))

#registrar métricas de rendimiento directamente contra el servicio de Azure ML
run.log(name = 'accuracy', value = acc)

Una vez ejecutado, podremos ver la salida en nuestro entorno de desarrollo pero también en el portal de Azure ML Services, donde tendremos todos los logs, los objetos generados (modelos, gráficos, etc.) que hayamos registrado así como las métricas (como «accuracy» que hemos registrado en nuestro script)

Resultado de un experimento en remoto

El uso de computación remota en Azure ML puede ser mucho más complejo: desde el uso de diferentes recursos de cómputo en pipelines complejas hasta la ejecución de deep learning en paralelo sobre VMs equipadas con GPUs pasando por el uso de clústers Databricks para el entrenamiento paralelo de modelos ML usando Big Data. Todos estos escenarios se salen del ámbito de éste post pero pueden ser tan complejos y fascinantes como casos de uso tengamos.

Desarrollo y no-code

Una buena parte del desarrollo de soluciones de ML se apoya en código por su flexibilidad y escalabilidad, pero a veces otros modos de desarrollo encajan mejor en nuestro escenario. Por ejemplo, usuarios que están aprendiendo sobre ML y quieren hacer experimentos rápidos y entender los conceptos de pipelines, o incluso Data Scientists que quieren, con muy poco esfuerzo, analizar si el modelo es viable con la información disponible y sin preocuparse de implementar pruebas exhaustivas.

Para estos escenarios, Azure ML ofrece dos funcionalidades: AutoML y Designer. Ambas funcionalidades se enmarcan dentro de la versión Enterprise del servicio. La diferencia entre el modo Básico y Enterprise es que para ciertos recursos de computación se nos cobrará un plus por core, además de algunas funcionalidades que sólo están disponibles en Enterprise. Puedes ver las diferencias detalladas aquí 

AutoML

AutoML es una implementación de un concepto que se ha hecho bastante popular en los últimos 2-3 años, la automatización de ciertas partes de los flujos de los proyectos de Machine Learning aplicando buenas prácticas. Así, el resultado de un experimento de AutoML nos devolverá una lista de experimentos y modelos con información relacionada a su rendimiento: tiempo de ejecución, precisión en las predicciones, tipo de algoritmo y preprocesado utilizado, etc.

En el mercado ya existen diferentes implementaciones, pero Microsoft añade un punto extra: crea los experimentos automáticos no de manera aleatoria sino probando algoritmos y técnicas de preprocesamiento que han demostrado ser eficaces en otros problemas de ML con conjuntos de datos parecidos en el pasado. Resumiendo: un recomendador de pipelines de ML. Machine Learning aplicado al Machine Learning 🙂

AutoML en Azure ML Services

Podemos acceder a AutoML tanto desde la interfaz gráfica como desde el SDK de Python. El SDK permite algunas opciones de configuración extra como el uso de conjuntos de validación específicos (divididos por tiempo, por ejemplo) además del uso de split aleatorio o validación cruzada.

Con AutoML podemos atacar 3 tipos de problemas de ML actualmente:

  • Clasificación (y multiclasificación)
  • Regresión
  • Series temporales

En todos ellos tenemos incluidas funcionalidades de preprocesado de datos, generación de atributos, generación de modelos compuestos (voting y stacking) y más. Para una lista detallada de funcionalidades puedes consultar la documentación aquí

AutoML usa funcionalidades ya citadas en éste post que son los cimientos del servicio: datastores, datasets y cómputo. Para crear un experimento AutoML deberemos seleccionar el dataset previamente registrado o crearlo en el momento

Selección de un dataset para AutoML en Azure ML Services

Especificar dónde va a ejecutarse el experimento (en qué recurso de cómputo). Este punto es importante dado que dependiendo del nivel de paralelismo que podamos alcanzar (en nodos de un cluster) podremos ejecutar varias iteraciones de la exploración automática de manera paralela (N nodos = N modelos en paralelo)

Selección de label y cómputo en Azure ML Services

Y finalmente especificar la configuración avanzada en el caso de que lo necesitemos. Por ejemplo, limitar el tiempo de ejecución, eliminar algoritmos que sabemos que no nos darán buenos resultados (si procede), configurar el tipo de validación a usar, etc.

Tipos de experimentos en AutoML Azure ML Services

Una vez tengamos definidas todas las fases, el experimento empezará a ejecutarse en el contexto de computación que hayamos elegido hasta que se agote el tiempo de ejecución o bien lleguemos al límite de la métrica de rendimiento establecido. Podremos ver como van evolucionando las diferentes ejecuciones y su resultado. Al final AutoML siempre genera dos modelos de ensemble, voting y stacking. En nuestro caso, como se ve en la siguiente captura, es el que mejor rendimiento ha alcanzado

Configuración avanzada AutoML

Podemos aplicar automáticamente interpretabilidad sobre éste modelo (a pesar de ser un ensemble de modelo, habitualmente considerado una caja negra) pero también sobre cualquier otra que quisieramos para analizar en profundidad su rendimiento y entender si tenemos algún tipo de sesgo o fallo relativo al entendimiento del dataset.

Finalmente, tenemos el modelo (el pipeline realmente, compuesto por el preprocesado del dato y el modelo entrenado) disponible para descargarlo en formato .pkl y aplicarlo donde necesitemos o para publicarlo directamente sobre un cluster de inferencia (ACI ó AKS)

Resumen modelos AutoML

Designer

Para los más veteranos/as del mundo de ML en Azure recordaréis que durante unos años, además de las VMs y HDInsight teníamos como único recurso el Azure ML Studio. Ésta herramienta gráfica es muy útil para prototipado rápido y explicar los diferentes flujos de información que podemos generar para una solución de ML, pero estaba limitado en lo referente a versionado de soluciones, escalabilidad e integración con otros servicios y plataformas.

Con Designer tenemos una experiencia muy parecida a la de Azure ML Studio (ahora llamado Azure ML Studio Classic) pero con una interfaz renovada y basándonos en computación remota como el resto de experimentos de Azure ML Services. Así, podemos diseñar y ejecutar prototipos hasta que estemos contentos con el resultado y después, con sólo cambiar el recurso de computación que ejecuta cierta fase del pipeline, escalar nuestra potencia de cómputo tanto como necesitemos. Esto lo convierte en una herramienta muy adecuada para usuarios/as que ya conocen los principios de ML y quieren desarrollar soluciones sin meterse a los pormenores del código o para Data Scientists más experimentados pero que quieren crear soluciones visuales rápidas y ser capaces de escalarlas a soluciones de nivel empresarial sin limitaciones de recursos.

Azure ML Designer en Azure ML Services

Éste servicio está, como casi todos en Azure, en desarrollo constante, y está en el roadmap del equipo de producto seguir añadiendo funcionalidades e integraciones con otras piezas de Azure para hacer las soluciones de Machine Learning parte integral y pervasiva de la plataforma de datos de Azure.

Seguid atentos a más post más detallados sobre soluciones que implementamos en nuestros clientes y mejoras en la plataforma que están por venir durante 2020.

Felices predicciones! 🙂

 

¿Quieres formarte en Machine Learning? En SolidQ venimos trabajando en proyectos de Machine Learning desde hace algunos años y esta experiencia nos ha servido para adaptar nuestro conocimiento y crear los contenidos formativos objeto de este Módulo de Machine Learning con el que adquirir nuevos conceptos y conocimientos relacionados con analítica avanzada, dar el salto para no quedarte en el BI Tradicional” y seguir creciendo como profesional. Aprovecha la oportunidad y no dejes escapar el descuento que tenemos para ti… ¡antes de que se agote!

¿Quieres poner en marcha tu proyecto de Machine Learning? Conseguir el éxito en proyectos de analítica avanzada y su monetización requiere de datos, un buen modelo… y su interpretación asociada al caso de negocio. Esta combinación es imprescindible para que el proyecto tenga sentido y sea rentable. Por esta razón, durante nuestro Ideation Workshop nos reunimos en una sesión con todas las partes implicadas de tu equipo, para poner en contexto el proyecto y asegurar tanto su viabilidad técnica como los hitos de negocio en términos de rentabilidad. ¡Infórmate! Mira: Machine Learning Ideation Workshop: ¿Cómo empiezo mi proyecto?

Cargar datos en formatos complicados: Covid-19

Cargar datos en formatos complicados: Covid-19

Seguro que en más de una ocasión os habéis encontrado en la situación en la que queréis realizar un análisis de datos que se encuentran en formatos difíciles de analizar, pues ninguna herramienta en el mercado es capaz de cargarlos inicialmente. Estamos hablando de PDFs, Excels sin formato y un largo etcétera con el que tenemos que lidiar.

Nuestra necesidad surgió cuando nos dispusimos a realizar un análisis de los datos del tema más candente del momento; el coronavirus (Covid-19). Buscamos en las diversas webs oficiales del Gobierno y, los datos que más se ajustaban a nuestras necesidades de análisis, estaban en formato PDF y además distribuidos en documentos con formatos diferentes.

En esta entrada del blog vamos a enseñaros con qué herramientas podemos automatizar la extracción de datos desde estos orígenes que carecen de formato estructurado.

Empezando a buscar los datos

En la web del instituto de salud Carlos III perteneciente al ministerio de Sanidad, se puede tener acceso a un análisis bastante simple de la evolución del virus, así como también del número de casos confirmados, hospitalizados, fallecidos, etc. Tras la tabla del número de casos por comunidad autónoma, existe un enlace donde nos podemos descargar los datos en formato csv (Comma Separated Value), formato más que conocido entre los profesionales de nuestro sector:

Para nuestra sorpresa, podemos encontrar un gran número de valores nulos, así como también varios disclaimers indicando que el objetivo de esos datos es saber el valor acumulado en la última fecha conocida y que, por lo tanto, no se puede deducir que el incremento de nuevos casos es la diferencia entre los últimos dos días, pues no coincidirá en la mayoría de los casos:

Por otro lado, este origen de datos carecía de históricos que nos pudieran permitir el análisis histórico para, entre otros, poder visualizar tendencias. Esto unido a la falta de fiabilidad/consolidación de los datos nos hizo decantarnos por una segunda fuente de datos oficial del gobierno. En esta web, se actualiza la información del Covid-19 diariamente. El problema principal es que los datos están en tablas incrustadas en archivos en formato pdf.

Es tan importante tener a nuestra disposición unos datos de calidad como ser capaces de capturarlos y explotarlos de manera correcta. Es por ello por lo que vamos a tratar de conseguir estos datos en un formato estándar que luego podamos usar para realizar un análisis. Asimismo, es crucial que planteemos esta carga de datos de manera que sea automatizable.

Problema y solución

Problema Estrategia para solucionarlo
Los PDFs se encuentran en diferentes URLs: https://www.mscbs.gob.es/profesionales/saludPublica/ccayes/alertasActual/nCov-China/documentos/Actualizacion_46_COVID-19.pdf => 16/03/2020

Cambiando el número 46 al 47 podemos capturar los datos del día 17/03/2020

Usar una librería para descargar todos los PDFs hasta el día actual desde la URL
La información se encuentra en tablas en formato PDF Conseguir una librería que sea capaz de leer de PDFs
Las tablas se encuentran en páginas diferentes. Por ejemplo, la tabla de datos del día 16/03/2020 se encuentra en la primera página, mientras que en la del 17/03/2020 se encuentra en la segunda Buscar si esa tabla se encuentra en la primera o en la segunda página con la librería que lee los PDFs
El formato de las tablas cambia. A medida que avanzan los días se van añadiendo colunnas. Por ejemplo:

Tabla día 17/03/2020:

Tabla día 25/03/2020:

Identificar todos los formatos y tratar de estandarizarlo de manera que se nos quede un conjunto de datos unificado. De esta manera este script de carga sólo tendrá un mínimo mantenimiento para añadir aquellos formatos nuevos
Existen filas que totalizan:

Eliminar estas filas totalizadoras

Una vez tenemos claros todos los problemas con los que vamos a tener que lidiar, ya podemos ponernos manos a la obra para llevar a cabo la carga de datos. En nuestro caso, vamos a realizar un script en el lenguaje de programación Python.

En primer lugar, necesitaremos las siguientes librerías:

import pandas as pd # básico para tratar con conjuntos de datos
import requests # realizar peticiones a las URLs
import tabula # trabajar los PDFS
import datetime # fechas
from datetime import timedelta

Establecemos un lugar donde almacenaremos todos los PDFs de forma local:

path = r"C:\Users\pcorral\Blog_Covid19\"

Para que se pueda automatizar la carga de datos, debemos establecer rangos dependientes de la fecha actual. Es por ello por lo que vamos a generar el rango de forma dinámica:

date_today = datetime.datetime.now()
var_date = datetime.datetime(2020, 3, 8) # fecha inicial donde empiezan los PDFs
days_to_loop = (date_today - var_date).days
start_loop = 39 # PDF inicial donde empezó a contabilizarse en el origen. Esto no cambiará
end_loop = start_loop + days_to_loop

rango_a_iterar = range(start_loop, end_loop)

Ahora necesitamos descargarnos todos estos PDFs a la carpeta local:

# Bucle para guardar todos los PDFs en local
for w in rango_a_iterar: # iteramos sobre todos los PDFs
    name = f"covid_{str(w)}.pdf"
    # realizamos la petición a la URL para poder guardar el PDF
    doc = requests.get(f"https://www.mscbs.gob.es/profesionales/saludPublica/ccayes/alertasActual/nCov-China/documentos/Actualizacion_{str(w)}_COVID-19.pdf", verify=False)
    with open(path + name, 'wb') as f: 
        f.write(doc.content) # una vez leído el PDF, lo almacenamos en local

Como hemos comentado anteriormente, necesitamos dar de alta los diferentes formatos para que podamos unificar finalmente el conjunto de datos. Los formatos identificados son los siguientes:

format_1 = ['CCAA', 'Total casos', 'IA (casos/100.000 habitantes)', 'Ingreso en UCI', 'Fallecidos']
format_1_reformat = ['CCAA', 'TOTAL conf.', 'IA (14 d.)', 'UCI','Fallecidos']

format_2 = ['CCAA', 'Total casos', 'IA Total*', 'Ingreso en UCI', 'Fallecidos']

format_3 = ['CCAA', 'Total casos', 'IA últimos 14 días', 'Ingreso en UCI','Fallecidos']

format_4 = ['Unnamed: 0', 'Unnamed: 1', 'Unnamed: 2', 'Unnamed: 3', 'Unnamed: 4', 'Unnamed: 5', 'Nuevos']
format_4_reformat = ['CCAA', 'TOTAL conf.', 'IA (14 d.)', 'Hospitalizados', 'UCI', 'Fallecidos', 'Nuevos']

format_5 = ['Unnamed: 0', 'Unnamed: 1', 'Unnamed: 2', 'Casos que han',
       'Casos que han.1', 'Unnamed: 3', 'Unnamed: 4', 'Unnamed: 5']
format_5_reformat = ['CCAA', 'TOTAL conf.', 'IA (14 d.)', 'Hospitalizados', 'UCI', 'Fallecidos', 'Curados', 'Nuevos']

format_6 = ['CCAA', 'TOTAL conf.', 'IA (14 d.)', 'Hospitalizados', 'UCI', 'Fallecidos', 'Curados', 'Nuevos']

ideal_format = format_6 # el formato ideal será el último (el más actual)

Ahora ya estamos preparados para iterar sobre los PDFs y recuperar los datos de las tablas:

df = pd.DataFrame()

for i in rango_a_iterar: # iteramos sobre todos los PDFs
    df_aux = None
    var_date = var_date + timedelta(days=1)
    
    # añadimos un try-catch por si hubiera algun día intermedio donde no se han subido datos, que continúe con los siguientes
    # días. De hecho, existen dos días que, por alguna razón, no se han subido PDFs 
    try:
        # identificamos que la página donde se encuentra la tabla con los datos cambia a la primera 
        # cuando el nº del pdf es menor al 47
        if i < 47:
            df_aux = tabula.read_pdf(path + f"covid_{str(i)}.pdf", pages = "2", multiple_tables = True)
        else:
            df_aux = tabula.read_pdf(path + f"covid_{str(i)}.pdf", pages = "1", multiple_tables = True)
    except:
        continue
    
    # La tabla se puede encontrar o en la posición 0 o en la 1, dependiendo de como se haya construido la
    # tabla incial en el PDF
    if len(df_aux) == 1:
        df_aux = df_aux[0]
    else:
        df_aux = df_aux[1]

    cols_to_add = []

    # Reformateamos la tabla, añadiendo alguna columna si fuera necesario y cambiamos el nombre de las que si están
    # ya presentes pero se llaman diferente.
    if list(df_aux.columns) == format_1 or list(df_aux.columns) == format_2 or list(df_aux.columns) == format_3:
        df_aux.columns = format_1_reformat
        cols_to_add = set(ideal_format) - set(format_1_reformat)
        print(cols_to_add)
    elif list(df_aux.columns) == format_4:
        df_aux = df_aux[2:]
        df_aux.columns = format_4_reformat
        cols_to_add = set(ideal_format) - set(format_1_reformat)
    elif list(df_aux.columns) == format_3:
        df_aux = df_aux[2:]
        cols_to_add = set(ideal_format) - set(format_1_reformat)
    elif list(df_aux.columns) == format_5:
        df_aux = df_aux[5:]
        df_aux.columns = format_5_reformat
        cols_to_add = set(ideal_format) - set(format_5_reformat)

    # Ponemos a nulo aquellas columnas que no se encontraban originalmente en la tabla, pues no sabemos su valor
    for c in cols_to_add:
        df_aux[c] = None

    df_aux['Fecha'] = var_date # añadimos la columna fecha
    
    df = pd.concat([df, df_aux.reset_index(drop=True)], axis=0)

Eliminamos los totales para limpiar el dataset:

df = df[df['CCAA'] != 'ESPAÑA']
df = df[df['CCAA'] != 'Total']

Por último, lo exportamos a csv:

df.to_csv('data.csv', sep='\t', index=False, encoding="latin1")

Este script se debería lanzar diariamente, pues sabemos que los datos se consolidan cada día alrededor de las 21 de la noche. Esta información y protocolo para la carga de datos se ha realizado sobre los datos del Covid-19. Sin embargo, es una tarea común a todos los proyectos de análisis de datos, pudiéndose extrapolar la mayoría del proceso.

Resultado

Podemos obtener un resultado uniforme y listo para trabajar con la visualización con herramientas como Power BI:

Conclusión

En este blog hemos querido enseñaros alguna de las técnicas que empleamos para realizar la extracción de datos de orígenes poco frecuentes. ¿Os imagináis el trabajo que supondría tener que extraer y consolidar manualmente estos datos desde miles de documentos? Y además añadiendo el incremento de probabilidad de error si nos dedicamos a copiar esos datos manualmente.

En SolidQ contamos con infinidad de recursos para que, independientemente del origen de datos, la extracción y consolidación, se realice de forma eficiente y efectiva.

Recursos

Este post tendrá el código estático. No obstante, podéis tener acceso al código actualizado diariamente accediendo a mi GitHub.

Si quieres aprender cómo utilizar herramientas como Power BI y modelar y visualizar tus datos, consulta todos nuestros cursos de 0 a experto con Power BI, desde nuestro curso de Power BI para usuarios de negocio hasta formación más avanzada como DAX, Data Governance o Power Query.

¿Qué es Power Platform?

¿Qué es Power Platform?

Power Platform

Power Platform es un conjunto de herramientas de Microsoft integrada dentro de Office 365, diseñada para analizar, crear soluciones y automatizar procesos de una empresa. Estas herramientas de Microsoft son: Power Apps, Power Automate, Power BI y Power Virtual Agent.

Todas estas herramientas están pensadas para usuarios de negocio, lo que significa que puedes desarrollar aplicaciones y automatizar procesos sin necesidad de escribir una línea de código.

Además pueden integrarse con otras herramientas de Microsoft dentro de Office 365, Dynamics 365, Azure, etc… y crear soluciones integrales para su organización.

Herramientas Microsoft Power Platform

A continuación una pequeña descripción sobre cada una de ellas:

Power Apps

Power Apps permite crear aplicaciones Web y Móvil que aportan transformación digital a procesos manuales y obsoletos de su empresa obteniendo datos de distintos orígenes, todo ello sin necesidad de programación, de una forma rápida, eficaz y rentable.

PowerApps

Power Automate

Power Automate, antes llamado Microsoft Flow, es una herramienta que nos permite crear flujos de trabajo automáticos para ahorrarnos procesos manuales y repetitivos que no aportan valor a nuestro negocio.

Power Automate

Power BI

Power BI es una herramienta de análisis de datos empresariales, que permite dar sentido a sus datos mediante paneles interactivos en tiempo real, liberando la información necesaria para mejorar la toma de decisiones e impulsar la evolución de su empresa.

Además permite la conexión a cientos de orígenes de datos y es accesible desde cualquier dispositivo.

PowerBI

Power Virtual Agent

Con Power Virtual Agent (PVA) automatizamos los niveles de soporte de su empresa a través de bots, desde la creación del diálogo para ponerlos en sistemas de chats usando IA, los usuarios no tienen que pasar demasiado tiempo definiendo estos diálogos, ya que esta herramienta puede comprender las intenciones y activar las acciones correctas.

Power Virtual Agent

En las siguientes referencias pueden encontrar más información sobre cada una de estas herramientas que componen Power Platform.

Referencias:

Si quieres dar forma a tu proyecto con Power BI, en SolidQ podemos guiarte en el proceso (mentoring), ayudarte a su desarrollo mediante nuestro framework, así como formarte en aquellas áreas que necesites. Consulta todos nuestros cursos de 0 a experto con Power BI, desde nuestro curso de Power BI para usuarios de negocio hasta formación más avanzada como DAX, Data Governance o Power Query.

¿Como crear parámetros What-if en PowerBI?

¿Como crear parámetros What-if en PowerBI?

En agosto del 2018 Microsoft nos dió una gran noticia incluyendo dentro de su herramienta Power BI Desktop, la posibilidad de crear variables What-if (Hipótesis) para sus informes. Como vemos en la siguiente imagen, se puede acceder dentro del apartado Modeling (Modelado) en el botón que pone New Parameter (Nuevo Parámetro) que es el único dentro de la sección What If (Hipótesis).

parametro what-if en power bi

¿Qué es el parámetro What-if?

El uso de este parámetro da la capacidad de transformar dinámicamente los datos, permite demostrar como los datos cambian en distintos escenarios. Por ejemplo, cuantos ingresos tendría o como sería un importe si las ventas de sus productos aumentaran o disminuyeran un 10%, 20% o un 30%.

Esta funcionalidad crea una tabla independiente con un solo campo que contiene una serie de valores que pueden ser usador para plantear hipótesis junto con otras métricas por medio de un parámetro que se crea al generar la tabla de what-if.

Se establece una escala numérica respecto a un intervalo (min, max) y un crecimiento que introducimos manualmente y que genera y completa la tabla que hemos mencionado anteriormente, proporcionado una variable que podemos usar con nuestras métricas.

¿Cómo se hace?

En primer lugar, como he mencionado en el menú superior accedemos a Modeling y pulsamos sobre el botón New Parameter.

Se nos abrirá la siguiente ventana en la cual debemos completar los siguientes campos.

Parametros WhatIF power bi

En nuestro caso vamos a realizar un descuento, por ello ponemos como se ve en la imagen ese nombre, además el tipo de dato será decimal ya que es un %.

Una vez pulsamos OK, nos aparecerá en nuestro informe un nuevo filtro, esto se produce porque hemos seleccionado  Add Slicer to this page. Además vemos la nueva tabla creada con el nombre DESCUENTO y una nueva medida con nombre DESCUENTO VALUE, que devuelve los valores seleccionados de la tabla.

parametro what-if

En el supuesto de no haber seleccionado Add Slicer to this page, podemos ir a la tabla DESCUENTO, seleccionar la métrica DESCUENTO VALUE y aplicarle como visualización Slicer.

Localizacion WhatIF

Una vez lo tenemos creado, podemos aplicar los valores del slicer para realizar las hipótesis en una métrica.

Importe = SUM(Facturas[Importe])
Importe con Hipotesis = [Importe] - (SUM(Facturas [Importe]) * (Descuento[Descuento Value]))

En este caso realizamos una gráfica muy sencilla en la cual mostramos el IMPORTE y el IMPORTE CON HIPÓTESIS por semanas. Aplicando el slicer podemos visualizar semanalmente como afecta el descuento al importe.

Ejemplo WhatIF

Referencias:

https://docs.microsoft.com/es-es/power-bi/desktop-what-if

Si quieres dar forma a tu proyecto con Power BI, en SolidQ podemos guiarte en el proceso (mentoring), ayudarte a su desarrollo mediante nuestro framework, así como formarte en aquellas áreas que necesites. Consulta todos nuestros cursos de 0 a experto con Power BI, desde nuestro curso de Power BI para usuarios de negocio hasta formación más avanzada como DAX, Data Governance o Power Query.

El misterio de Rafa Nadal resuelto Machine Learning

El misterio de Rafa Nadal resuelto Machine Learning

Como sabemos, Rafael Nadal ha perdido por primera vez en la historia tres tie-breaks seguidos. Hoy nos planteamos analizar datos históricos de los partidos jugados desde el 2000 hasta el 2016 y, finalmente gracias a Machine Learning, predecir quién ganará cada partido.
Este proceso es completamente extrapolable a otros proyectos y lo realizaremos en el lenguaje de programación Python.

(más…)

Lidiando con Power BI y los límites de Google Analytics

Lidiando con Power BI y los límites de Google Analytics

A la hora de realizar informes tirando consultas contra el API de Google Analytics nos encontramos que normalmente, ya sea por prisa o por límites presupuestarios, se hacen informes adhoc en Power BI en modo import, evitando una arquitectura de ETL más canónica, que implicaría por ejemplo, llevar los datos a tablas en SQL Server y realizar cargas incrementales para tener un repositorio centralizado de información. Esta arquitectura podría ser o en la nube o en hardware on-premise.

Detallamos algunos problemas comunes al trabajar con Power BI y Google Analytics y algunas soluciones.

(más…)