Clustering (Agrupamiento), K-Means con ejemplos en python

El clustering consiste en la agrupación automática de datos. Es un tipo de aprendizaje automático no-supervisado. En castellano se denomina agrupamiento. Vamos a ver en más detalle en qué consiste el clustering, el algoritmo de agrupamiento más popular: K-Means y algunos ejemplos en python.

Clustering – Agrupamiento

El clustering consiste en la agrupación automática de datos. Al ser un aprendizaje no-supervisado, no hay una respuesta correcta. Esto hace que la evaluación de los grupos identificados sea un poco subjetiva. Vamos a verlo con un ejemplo:

En el siguiente gráfico podemos ver un conjunto de datos, representados por puntos en 2 dimensiones.

Datos de ejemplo para clustering
Datos antes de ser agrupados

Con estos datos, algunas personas dirían que hay 2 grupos, tal y como se muestra en la siguiente figura.

Datos de ejemplo agrupados en 2 clusters
Datos agrupados en 2 clusters

Sin embargo, otras personas podrían decir que, en realidad, hay 5 grupos.

Datos de ejemplo agrupados en 5 clusters
Datos agrupados en 5 clusters

Esto no significa haya alguien equivocado. Tampoco que todos tengan razón. Tan sólo que los datos son tal y como son pero podemos elegir verlos como más nos convengan.

Las técnicas de clustering intentan descubrir cuál es el mejor agrupamiento de los datos. Algunas de estas técnicas necesitan que especifiquemos el número de grupos de queremos encontrar. Otras técnicas necesitan otros hiper-parámetros.

Ejemplos de Clustering

Vamos a ver 2 ejemplos en esta sección: segmentación de clientes y compresión de datos. En el ejemplo de K-Means con python agruparemos las acciones del Dow Jones de la bolsa americana que tengan un comportamiento similar.

Segmentación de clientes

En la segmentación de clientes intentamos comprender qué hace a los clientes diferentes para poder ofrecerles los productos y servicios que necesiten.

En este ejemplo podemos ver cómo una técnica de agrupamiento ha encontrado 3 grupos cuando considera 2 variables:

  • Lealtad a la marca (eje X)
  • Sensibilidad al precio (eje Y)
Segmentación de clientes con clustering
Fuente: https://select-statistics.co.uk/blog/customer-segmentation/

Los 3 grupos (clusters) que se han encontrado son:

  • Preocupados por el precio (en verde): no son leales a la marca y son muy sensitivos al precio
  • Leales a precios bajos (en negro): son leales a la marca pero sólo si es barato
  • Defensores de la marca (en rojo): son leales a la marca sin importar demasiado el precio

Por supuesto, el análisis de clustering no nos da ninguna de estas explicaciones. Sólo nos da los grupos. Una persona con conocimiento del dominio del problema será la encargada de interpretar los resultados. En el problema de segmentación de clientes, esta persona posiblemente trabajará en marketing o ventas.

Compresión de datos

También podemos usar clustering para comprimir imágenes con pérdida de información. La compresión, en este ejemplo, se hace en el número de colores diferentes que se usan.

Vamos a suponer que la imagen original utiliza una paleta de 255 colores. Para comprimir la imagen, podemos decidir usar menos bits por pixel, es decir, usar menos colores.

En la siguiente figura puedes ver cómo quedaría la foto original a medida que vamos usando menos y menos colores. Primero 10 colores, luego 3 y por último sólo 2.

La técnica de clustering nos ayuda a decidir qué nuevos colores pueden representar mejor la imagen original cuando limitamos el número posible de colores a usar (K).

Algoritmos de Clustering

La librería de python scikit-learn ofrece implementaciones eficientes de varias técnicas de agrupamiento. Esta figura muestra cómo distintos algoritmos se comportan con varios tipos de datos.

Scikit-learn ofrece la siguiente tabla que nos ayuda a comparar los diferentes algoritmos de clustering. La comparación de los algoritmos de clustering está hecha en función a los parámetros que necesitan, su escalabilidad, caso de uso y geometría (métrica usada). Algunas preguntas útiles pueden ser:

  • ¿Tengo una idea del número de grupos que quiero encontrar? … ¿o prefiero que el algoritmo lo encuentre?
  • ¿Tengo muchísimos datos? En este caso, deberemos tener en cuenta la escalabilidad del algoritmo.

K-Means

El algoritmo de clustering más usado es K-Means. Tiene una muy buena escalabilidad con la cantidad de datos. Para utilizar K-Means debemos especificar el número de grupos que queremos encontrar. A este número de grupos se le denomina K.

El algoritmo K-Means sigue los siguientes pasos:

  1. Inicialización: se elige la localización de los centroides de los K grupos aleatoriamente
  2. Asignación: se asigna cada dato al centroide más cercano
  3. Actualización: se actualiza la posición del centroide a la media aritmética de las posiciones de los datos asignados al grupo

Los pasos 2 y 3 se siguen iterativamente hasta que no haya más cambios.

Vamos a verlo con un ejemplo.

Inicialización

Se elige la localización de los centroides de los K grupos aleatoriamente. La figura muestra los datos como círculos y los centroides como cuadrados.

Fase de inicialización de K-Means

Asignación

A continuación, se asigna cada dato al centroide más cercano. En el ejemplo, los círculos cambian de color para indicar a qué centroide han sido asignados.

Fase de asignación de K-Means

Actualización

Ahora se actualiza la posición del centroide a la media aritmética de las posiciones de los datos asignados al grupo. Observa cómo la posición de los centroides (cuadrados) cambia.

Fase de actualización de K-Means

A continuación irían las fases: asignación, actualización, asignación, actualización, etc. hasta que las posiciones de los centroides no cambien.

Recomendaciones

Normalización

A la hora de usar cualquier algoritmo de clustering, es buena idea normalizar nuestros datos. En este contexto, «normalizar» se refiere a que los valores de cada atributo estén en escalas similares. Normalizar ayuda al clustering porque los grupos se forman a partir de distancias. Si hay atributos con escalas muy diferentes, los atributos de escala mayor dominarán las distancias.

Para poner un ejemplo del problema de no normalizar, imagina el caso en el que queramos encontrar grupos de inmuebles similares. Si los atributos que tenemos son el precio en euros y el número de habitaciones, seguramente obtendremos el mismo resultado de agrupamiento si eliminamos el número de habitaciones. Sin embargo, al poner ambos atributos en la misma escala, los dos se convierten en importantes.

Las técnicas más comunes de normalización son:

  • re-escalar cada atributo en el rango [0, 1]
  • suponer que cada atributo sigue una distribución normal y hacer que los datos tengan una media de 0 y una desviación típica de 1.

Hay, por supuesto, más tipos de normalización. Por ejemplo: transformación logarítmica, hacer ratios, cuantizar los datos, etc.

Selección de características

El clustering es una técnica de aprendizaje automático no-supervisada. Esto implica que no es capaz de establecer la relación entre los atributos de entrada y los resultados … sencillamente porque no hay resultados. Así que la responsabilidad de identificar qué atributos son relevantes recae sobre nosotros.

Por ejemplo, si estamos usando clustering para segmentar clientes … seguramente no es buena idea incluir el color de los ojos de los clientes. Esta es una característica posiblemente irrelevante que hará que las distancias entre los puntos multidimensionales que representan cada dato sea menos informativa … excepto si estamos vendiendo lentillas para cambiar el color de ojos!

Además, siempre es buena idea usar el menor número atributos posible debido a los que se conoce como la maldición de la dimensionalidad. En esencia se refiere a que a medida que el número de dimensiones (atributos) aumenta, la distancia discrimina cada vez menos. Una práctica común antes de hacer clustering es reducir la dimensionalidad del problema. Hay varias técnicas para este propósito tales como Principal Components Analysis (PCA), auto-enconders, etc.

Número de clusters

Algunas técnicas de agrupamiento, tales como K-Means, necesitan que especifiquemos el número de clusters (grupos) que queremos encontrar. No es obvio, a priori, saber qué número de grupos es mejor.

Por ejemplo, si queremos encontrar grupos de tallas de ropa y elegimos tener 5 grupos, podríamos llamarlos: XS, S, M, L, XL. Sin embargo, si buscamos 7 grupos, tendríamos: XXS, XS, S, M, L, XL, XXL.

Si lo que estás buscando es un método más objetivo, te recomiendo que profundices en este tema con alguna de estas dos técnicas:

Ejemplo de Clustering K-Means en Python

En este ejemplo vamos a agrupar las acciones del mercado bursátil estadounidense. El objetivo es encontrar automáticamente qué acciones tienen comportamientos similares.

Los datos están disponibles en kaggle. Para simplificar el problema, vamos a usar sólo las 30 acciones de están recogidas en el índice Dow Jones.

Las técnicas de clustering están disponibles en scikit-learn en el paquete sklearn.cluster

# KMeans está en el paquete sklearn.cluster
from sklearn.cluster import KMeans

Vamos a usar datos semanales de los últimos 5 años. Este extracto muestra qué forma tienen los datos. Cada columna representa a cada empresa.

datos semanales de las acciones del Dow Jones

Cada acción tiene su propio rango de valores. Por ejemplo Apple (APPL) empieza en $67.85 y Adobe (ADBE) en $39.12.

La intención de este ejercicio es agrupar las acciones por el comportamiento de sus ganancias, en vez de por su precio de mercado. De esta forma el rendimiento de cada acción es comparable con los demás.

Vamos a calcular el rendimiento de cada acción desde el principio del periodo que estamos considerando.

start = stocks.iloc[0]               # start es el valor al principio del periodo
returns = (stocks - start) / start   # returns es el valor relativo al inicio

# dow_returns contendrá la información de returns limitada a las acciones del Dow Jones

Ahora vamos a hacer clustering con estos datos con K-Means. Instruimos a K-Means a que use 8 grupos, es decir K=8.

kmeans = KMeans(n_clusters=8, random_state=42) # K-Means con K=8
kmeans.fit(dow_returns.T);                     # haz 8 grupos con nuestros datos

Los resultados que obtenemos son los siguentes:

Cluster 0: 
    - American Express Co (AXP)
    - General Electric (GE)
    - Goldman Sachs Group (GS)
    - Coca-Cola Company (The) (KO)
    - McDonald's Corp. (MCD)
    - Pfizer Inc. (PFE)
    - Procter & Gamble (PG)
    - United Technologies (UTX)
    - Verizon Communications (VZ)
    - Wal-Mart Stores (WMT)

Cluster 1:
    - Apple Inc. (AAPL)
    - 3M Company (MMM)

Cluster 2:
    - United Health Group Inc. (UNH) 

Cluster 3:
    - Caterpillar Inc. (CAT)
    - Chevron Corp. (CVX)
    - International Business Machines (IBM)
    - Exxon Mobil Corp. (XOM)

Cluster 4:
    - Home Depot (HD)
    - Microsoft Corp. (MSFT)
    - Visa Inc. (V) 

Cluster 5:
    - Cisco Systems (CSCO)
    - Intel Corp. (INTC)
    - Johnson & Johnson (JNJ)
    - JPMorgan Chase & Co. (JPM)
    - Merck & Co. (MRK)
    - The Travelers Companies Inc. (TRV)

Cluster 6:
    - The Walt Disney Company (DIS)
    - Nike (NKE)

Cluster 7:
    - Boeing Company (BA)

Por ejemplo, la siguiente figura muestra los componentes del Cluster 4 que contiene: Home Depot, Microsoft y Visa.

Home Depot, Microsoft y Visa tienen un comportamiento similar y por eso están en el mismo cluster

Para ver el resto de los gráficos y el código completo, puedes consultar este jupyter notebook.

Resumen

Agrupar datos es muy útil para aplicaciones tales como segmentación de clientes, compresión con pérdida de datos. También para encontrar entidades con comportamientos similares (en mercados bursátiles, por ejemplo).

K-Means es la técnica de clustering más usada pero hay muchas más. Te animo a usar la tabla comparativa de los métodos de clustering que ofrece scikit-learn para decidir cuál es la más apropiada para tu problema.

Para que el clustering sea efectivo es recomendable reducir al mínimo el número de atributos, usar atributos relevantes y poner los datos en una escala similar.

Recursos

Suscríbete

Subscribe
Notify of
guest
0 Comentarios
Inline Feedbacks
View all comments