Capítulo 11 Aprendizaje No supervisado

Ahora que ya sabemos cómo crear algoritmos de aprendizaje supervisado, entender el no supervisado se convierte en un ejercicio intuitivo.

Mientras que en el aprendizaje supervisado tenemos un conjunto de variables que usamos para predecir una determinada clase de salida (sube/baja, renuncia/no renuncia), en el aprendizaje no supervisado no tenemos clases de salida esperadas. En el aprendizaje supervisado teníamos data de entrenamiento y data de testeo que nos permitía validar la efectividad del modelo por la cercanía a la clase conocida. En el aprendizaje no supervisado no tenemos output predeterminado. Esto genera a su vez un gran reto porque es muy difícil saber si ya culminamos con el trabajo o podemos aun generar otro modelo con el que nos sintamos más satisfechos.

El ejemplo más sencillo para entender este tipo de aprendizaje es cuando tenemos nuestra base de clientes y queremos segmentarlos por primera vez. En ese caso buscamos clientes que se comporten de la misma forma, pero al ser la primera vez no sabemos cuántos segmentos podemos tener. El reto está en determinar el corte de ¿cuántos segmentos buscamos crear?.

Las principales aplicaciones del aprendizaje no supervisado están relacionadas en el agrupamiento o clustering de datos. Aquí, el objetivo es encontrar subgrupos homogéneos dentro de los datos. Estos alogoritmos se basan en la distancia entre observaciones. El ejemplo de la segmentación de clientes sería un ejemplo de clustering.

Los algoritmos más utilizados de agrupamiento son: agrupamiento por k-medias y agrupamiento jerárquico.

11.1 Agrupamiento por k-medias

Para entender este método utilizaremos ejemplos primero con una cantidad mínima de variables y luego poco a poco iremos creando un modelo más genérico.

11.1.1 Agrupamiento con k = 2

Supongamos que tenemos un listado de jugadores en un campo de fútbol y tomamos una foto desde arriba para tener sus coordenadas (variable 1 sería el eje x y variable 2 sería el eje y). No podemos ver de qué equipo es cada jugador así que a todos los pintaremos como puntos negros.

Este método nos permite agrupar a partir de la definición de centroides. Definiremos tantos centroides como grupos queremos obtener. Como para este caso sabemos que deben de haber dos equipos utilizaremos 2 centroidoes (k = 2)

El algoritmo k-medias coloca entonces en una primera iteración estos 2 puntos (centroides) de forma aleatoria en el plano. Luego, calcula la distancia entre cada centro y los demás puntos de la data. Si está más cercano a un centroide entonces lo asigna al centroide 1, sino al centroide 2.

Ya se ha realizado una primera agrupación. Ahora cada centroide dentro de cada grupo se ubica en la media de los demás puntos de su grupo y se da otra iteración para volver a asignar a todos los puntos. Esta iteración se hace una y otra vez hasta que los centroides quedan fijos.

Para crear este modelo en R utilizaremos la función kmeans(data, centers = k).

Esto quiere decir que para estos dos centros la distancia promedio a los otros puntos es la mínima, por ende el algoritmos los asigna a un grupo u otro. Veamos aproximadamente dónde se encuentran estos centros si los marcásemos con una equis.

Así, una vez creado el modelo podemos obtener los resultados del agrupamiento, equipo 1 o equipo 2.

Esta asignación de equipos los podemos agregar como una columna más de nuestro data set jugadores para poder visualizarlos en R.

Hemos encontrado dos centroides hasta minimizar la suma de los cuadrados de diferencia entre cada centroide y los demás puntos del clúster. Podemos acceder y ver cuánto es este valor, dado que es parte de los resultados del modelo.

Tot.withinss viene del inglés _Total within-cluster sum of squares` que significa suma total de cuadrados dentro del clúster.

11.1.2 Agrupamiento con k >= 3

Cuando tenemos 3 o más centros la idea es la misma, solo cambiamos el parámetro centers.

En este caso hemos encontrado que la suma de cuadrados dentro de los clusters es menor, con lo que podríamos indicar que este agrupamiento es más óptimo que el agrupamiento en dos grupos. Sin embargo, la suma de cuadrados no necesariamente es el mejor indicador para elegir cuántos clusters crear.

11.1.3 Determinación de clústeres óptimos

Podemos utilizar principalmente dos métodos para determinar cuántos clusters deberíamos de construir, k. El método de suma de cuadrados (wss por las siglas en inglés de Within Sum Square) y el método de silueta promedio (silhouette en inglés)

Para no tener que calcular modelos para diferentes valores de k utilizaremos la libería factoextra, la cual fue creada especialmente para realizar análisis de datos multivariados fáciles y de visualización elegante, muy útil para agrupación.

11.1.3.1 Método de suma de cuadrados

Para encontrar el “k” óptimo bajo éste método usaremos el diagrama del codo, donde primero calculamos el total de la suma total de cuadrados dentro del clúster para diferentes valores de “k”. Luego, visualmente identificaremos un punto donde haya habido una caída muy fuerte seguida de una caída más gradual de la pendiente. Para ello usaremos la función fviz_nbclust(data, tipo, metodo) e ingresaremos nuestra data, el tipo de algoritmo que se usará para agrupar y el método de medición.

En este caso el “codo” se encuentra en el valor k = 2, a partir de ahí el suma de cuadrados se reduce pero a un ritmo más lento.

11.1.3.2 Método de silueta promedio

El método descrito anteriormente es una ayuda visual que hace difícil el reconocimiento cuando los datos son más cercanos. Por ello, es mucho más frecuente realizar un análisis de siluetas (Rousseeuw 1987). Este enfoque mide la calidad de una agrupación. Es decir, se determina qué tan bien se encuentra cada objeto dentro de su grupo. Un alto ancho de silueta promedio indica un buen agrupamiento. El método de la silueta promedio calcula la silueta promedio de las observaciones para diferentes valores de “k”. El número óptimo de grupos “k” es el que maximiza la silueta promedio en un rango de valores posibles para “k”.

Para ello, cambiamos el parámetro method en la función y obtenemos el análisis de silueta.

Aquí se ve claramente que para un valor de k=2 tenemos el mejor promedio, con lo que éste se convierte en nuestro número de grupos óptimo.

11.1.4 k-medias para más de 2 variables

El método que hemos aprnedido se puede extender fácilmente a más variables. Solo que en este caso ya no sería posible visualizarlo como el equipo de fútbol y visualizaríamos solo los resultados de la agrupación y las métricas aprendidas.

Para ello, utilizaremos el siguiente dataset de clientes, en el que encontraremos un conjunto de datos de clientes de un distribuidor mayorista. Incluye el gasto anual en unidades monetarias en diversas categorías de productos.

Vamos a realizar una agrupación solo considerando el gasto realizado en comidas congeladas, abarrotes y lácteos.

Una vez tenemos nuestra data crearíamos un análisis de siluestas para determinar el mejor valor de “k”.

Nuevamente obtenemos que la cantidad de clusters recomendados es 2. Creemos entonces el modelo para k = 2 y almacenemos el clúster resultante.

Una vez que tenemos agrupados nuestros datos podemos calcular la cantidad de datos en cada cluster y la media de los valores para cada grupo y así identificar diferencias entre estos dos potenciales segmentos de clientes.

Así, hemos aprendido a segmentar clientes utilizando machine learning.

11.2 Agrupamiento jerárquico

El agrupamiento jerárquico es otro método para agrupar datos. La palabra jerárquico viene a raíz de las jerarquías que este algoritmo crea para determinar los clusters. A diferencia del k-medias no partimos indicando cuántos clusters queremos crear, sino que el algoritmo nos muestra un listado de combinaciones posibles de acuedo a la jerarquía de las distancias entre puntos. Veámoslo con un ejemplo.

11.2.1 Agrupamiento con dos variables

Para ello utilizaremos el mismo ejemplo del equipo de fútbol que utilizamos anteriormente. Con la diferencia que esta vez numeramos cada jugador para hacer más fácil la visualización.

Este algoritmo busca los dos puntos con la distancia más corta, los más cercanos, y los agrupa. Luego busca otros dos puntos con la menor distancia y pregunta: ¿la distancia entre estos dos nuevos puntos es menor que la distancia de estos puntos al grupo creado antes? Si la respuesta es sí los agrupa, sino agrupa el punto más cercano al primer grupo creado.

Entendamos el algoritmo gráficamente. Los puntos 1 y 2 tienen la jerarquía más baja dado que tienen la distancia más corta. Luego el algoritmo busca por los siguientes dos puntos más cercanos (el punto 9 y el 12) y al comparar con el punto medio del 1 y 2 opta por crear un nuevo grupo con una jerarquía ligeramente más alta y así sucesivamente.

Sin embargo, ahora que tenemos el punto 7 y 11 y calculamos la distancia resulta que esa distancia no es la menor comparado a las distancias con los otros grupos existentes Por ejemplo, el 7 está más cerca al punto medio del 1 y 2, y el 11 está más cerca al punto medio del 5 y 6.

Así, el algoritmo crea una jerarquía más alta para esta agrupación.

El algoritmo continua hasta que finalmente crea un grupo que contempla a todos como la jerarquía más alta. En el siguiente gráfico no solo podemos apreciar ello sino también en el eje y la distancia entre cada punto o grupo de puntos.

Hasta acá aun no hemos más que generado jerarquías a partir de las distancias que nos servirá luego para determinar cuántos cluster generar. Creemos en R lo avanzado hasta ahora. Lo primero que haremos es calcular las distancias entre todos los puntos. Para ello usaremos la función dist().

Con las distancias calculadas podemos crear el modelo jerárquico utilizando la función hclust(matriz_distancias)

Una vez creado nuestro modelo podemos visualizarlo utilizando la librería dendextend.

La visualización que vimos se llama dendograma. Para ello solo tenemos que convertir nuestro modelo a formato dendograma.

Hasta ahora solo hemos la jerarquía, pero lo que nos interesa es la agrupación. La agrupación se realiza por la distancia calculada (parámetro h). Probemos con una distancia de 60. Usaremos las funciones color_branches y color_labels para hacer visible los cambios.

Como la distancia de jerarquía más alta es aproximadamente 50, entonces en este caso nos agrupa a todos en un gran clúster. Probemos con un número más bajo, por ejemplo 40.

Al hacer un corte en 40 ahora tenemos dos cluster, en este caso el color rojo y el color verde. Probemos con un número más bajo, 28.

Ahora tenemos tres clúster y así podríamos ir continuando hasta obtener los clústers que necesitamos.

Habremos notado lo impráctico que es utilizar las distancias del modelo jerárquico porque éstas varían de acuerdo a los datos que tengamos. Este modelo nos permite hacer cortes no solo por distancias sino también indicando cuántos clúster queremos, parámetro k.

Vemos que nos da la misma agrupación si utilizamos distancias o número de clusters deseados.

11.2.2 Determinación de clústeres óptimos

Para calcular cuántos clústeres son óptimos crear utilizaremos nuevamente el análisis de silueta, pero esta vez con el argumento FUN = hcut para determinar que se evalúe en base a un modelo jerárquico.

No es de sorprender que el valor de k también es 2, el cual coincide con el número obtenido en el modelo k-medias.

11.2.3 Obtener la agrupación

Ahora que hemos validado que el número de clusters recomendado es 2 calculamos la agrupación a partir del modelo antes creado.

Finalmente, visualicemos la agrupación realizada con este método.

Vemos que la agrupación es la misma que con el anterior método, básicamente porque estamos hablando de dos variables y dos clusters.

Ambos métodos aprendidos son muy flexibles, con lo que la creación de modelos para más variables sigue la misma lógica aprendida en estas secciones.

11.3 Reducción de dimensionalidad

Hemos creado clusters con un número de variables controlado. Sin embargo, vamos a encontrarnos en muchos casos con muchas más variables que hacen difícil la interpretación y es importante identificar si dos variables tienen el mismo comportamiento para poder tomar solo una de ellas.

Para este caso vamos a tomar de ejemplo un datasets de clientes de tarjeta de crédito, adaptación del dataset público en Kaggle, de la siguiente ruta.

Tenemos más de 8 mil clientes con 13 atributos. Analizaremos si hay variables fuertemente correlacionadas. Para ello utilizaremos la librería corrplot.

A continuación, ingresaremos el dataset para visualizar correlaciones entre las variables,

Hay una fuerte correlación entres la variable total de compras y las compras realizadas en los 3 primeros meses. Podemos visualizarl estas dos variables para validar.

Dado ello, podríamos incluir dentro de nuestro análisis solo una de estas dos variables.

También podríamos validar la distribución de estas variables.

Vemos concentraciones de datos en algunas variables como permanencia (tiempo que lleva nuestro cliente con nosotros). Podemos validarlo haciendo un zoom a esa variable.

El 85% de nuestros datos son de clientes que llevan con nosotros 12 meses. Podríamos optar por filtar los datos para hacer un análisis sobre los clientes que tienen 1 año y así retirar esta variable del agrupamiento.

Si además analizamos las distribuciones de cada variable encontramos lo siguiente:

Vemos que hay variables que tienen máximos de 1, como hay otras que tienen un máximo de 30 mil o 50 mil. Ya habíamos visto anteriormente la importancia de normalizar los datos. Acá también lo haremos con la función scale().

Podemos comprobar que la distribución no cambia, solo la escala.

La preparación de datos y reducción de variables es un paso necesario cuando creamos modelos de machine learning. Sin embargo debemos de realizarlo con cuidado, dado que en este ejercicio al preparar los datos si bien tenemos menos variables (10), también tenemos menos filas.

Técnicas más avanzadas como el análisis de componentes principales (PCA) y el valor singular de descomposición (SVD) son utilizadas para realizar la reducción de dimensionalidad de forma más rigurosa para no perder tantos datos en nuestro análisis. Sin embargo, su interpretación aun está en desarrollo por la alta complejidad matemática que requiere para su entendimiento.

11.4 Ejercicios

En los siguientes ejercicios trabajaremos sobre data de posts de 10 empresas de fashion que tienen sus páginas en Facebook y las reacciones de sus seguidores. Para ello, trabajaremos con la data en el siguiente repositorio:

  1. Con el objeto data_posts normalizado (usar función scale()) y crea el objeto data_posts_norm. Construye un gráfico de siluetas para determinar cuántos grupos cluster son recomendados usando el algoritmo k-medias.

Solución

  1. Con el objeto data_posts construye un gráfico de siluetas para determinar cuántos grupos cluster son recomendados usando el algoritmo jerárquico.

Solución

  1. Si tuvieras que eliminar una variable del análisis, ¿qué variable sería?

Solución

  1. Elimina la variable num_reactions del objeto data_posts_norm y del objeto data_posts y vuelve a realizar un análisis de siluetas usando data_posts_norm. ¿Cambia el número de clústers?

Solución

No cambia el número de clusters porque estas existe otra variable con igual comportamiento que esta.
  1. Crea el modelo de k-medias para agrupar utilizando el número de clústers recomendado encontrado. Utilizar el objeto data_posts_norm para la creación del modelo. Crear el objeto data_posts_agrupados donde esté la data original de data_posts con la columna adicional cluster_medias indicando el cluster resultado de este modelo.

Solución

  1. Crea el modelo jerárquico para agrupar utilizando el número de clústers recomendado encontrado. Utilizar el objeto data_posts_norm para la creación del modelo. Agregar al objeto data_posts_agrupados la columna cluster_jer para almacenar el resultado del agrupamiento.

Solución

  1. Calcula el promedio de cada valor de las variables por cada grupo del modelo k-medias.

Solución

  1. Calcula el promedio de cada valor de las variables por cada grupo del modelo jerárquico.

Solución

Referencias

Rousseeuw, Peter J. 1987. Silhouettes: A Graphical Aid to the Interpretation and Validation of Cluster Analysis. Science Diret. https://www.sciencedirect.com/science/article/pii/0377042787901257/pdf?pid=1-s2.0-0377042787901257-main.pdf.