clustering de datos python

Una guía para los métodos de agrupación de datos en Python

La agrupación en clústeres es una técnica analítica útil que tiene aplicaciones importantes en una serie de industrias. Todo científico de datos debe saber cómo realizar este análisis, así que aquí hay una guía para comenzar a usar Python.

La agrupación en clústeres es el proceso de separar diferentes partes de datos en función de características comunes. Industrias dispares, incluidas la venta minorista, las finanzas y la atención médica, utilizan técnicas de agrupación para diversas tareas analíticas. En el comercio minorista, la agrupación puede ayudar a identificar distintas poblaciones de consumidores, lo que luego puede permitir que una empresa cree publicidad dirigida basada en la demografía del consumidor que puede ser demasiado complicada para inspeccionar manualmente. En finanzas, la agrupación puede detectar diferentes formas de actividad de mercado ilegal, como la falsificación de libros de pedidos, en la que los comerciantes colocan pedidos grandes de manera engañosa para presionar a otros comerciantes a comprar o vender un activo. En el cuidado de la salud, los métodos de agrupamiento se han utilizado para determinar los patrones de costos de los pacientes, los trastornos neurológicos de aparición temprana y la expresión génica del cáncer.

Python ofrece muchas herramientas útiles para realizar análisis de conglomerados. La mejor herramienta a utilizar depende del problema en cuestión y del tipo de datos disponibles. Python presenta tres técnicas ampliamente utilizadas: agrupamiento de K-means, modelos de mezcla gaussiana y agrupamiento espectral. Para tareas de dimensiones relativamente bajas (varias docenas de entradas como máximo), como la identificación de distintas poblaciones de consumidores, el agrupamiento de K-means es una excelente opción. Para tareas más complicadas, como la detección de actividad de mercado ilegal, será más adecuado un modelo más robusto y flexible, como un modelo de mezcla guassiana. Finalmente, para problemas de alta dimensión con potencialmente miles de entradas, el agrupamiento espectral es la mejor opción.

Además de seleccionar un algoritmo de agrupamiento adecuado para el problema, también debe tener una forma de evaluar qué tan bien funcionan estos algoritmos de agrupamiento. Por lo general, la distancia promedio dentro del clúster desde el centro se usa para evaluar el rendimiento del modelo. Específicamente, la distancia promedio de cada observación desde el centro del cúmulo, llamado centroide, se usa para medir la compacidad de un cúmulo. Esto tiene sentido porque un buen algoritmo de agrupamiento debería generar grupos de datos que estén muy juntos. Cuanto más cerca estén los puntos de datos entre sí dentro de un grupo, mejores serán los resultados del algoritmo. La suma dentro de la distancia del clúster trazada contra el número de clústeres utilizados es una forma común de evaluar el rendimiento.

Para nuestros propósitos, realizaremos un análisis de segmentación de clientes en los datos de segmentación de clientes del centro comercial .


Técnicas de agrupamiento de datos en Python

  • Agrupamiento de K-medias
  • Modelos de mezcla gaussiana
  • Agrupamiento espectral

Te puede interesar: Una guía para seleccionar modelos de aprendizaje automático en Python

Lectura de datos

Comencemos leyendo nuestros datos en un marco de datos de Pandas:

import pandas as pd

df = pd.read_csv("Mall_Customers.csv")

print(df.head())
agrupamiento de datos-python

Vemos que nuestros datos son bastante simples. Contiene una columna con ID de cliente, sexo, edad, ingresos y una columna que designa el puntaje de gasto en una escala de uno a 100. El objetivo de nuestro ejercicio de agrupación será generar grupos únicos de clientes, donde cada miembro de ese grupo es más similar entre sí que con los miembros de los otros grupos.

Agrupación de K-Means 

El agrupamiento de K-means es un tipo de aprendizaje automático no supervisado, lo que significa que el algoritmo solo se entrena con entradas y no con salidas. Funciona encontrando los distintos grupos de datos (es decir, clústeres) que están más cerca entre sí. Específicamente, divide los datos en grupos en los que cada punto cae en un grupo cuya media es la más cercana a ese punto de datos.

Importemos la clase K-means del módulo de clústeres en Scikit-learn:

from sklearn.clusters import KMeans

A continuación, definamos las entradas que usaremos para nuestro algoritmo de agrupamiento de K-means. Usemos la edad y el puntaje de gasto:

X = df[['Age', 'Spending Score (1-100)']].copy()

Lo siguiente que debemos hacer es determinar la cantidad de clústeres que usaremos. Usaremos el método del codo, que traza la suma de cuadrados dentro de los grupos (WCSS) frente al número de grupos. Necesitamos definir un bucle for que contenga instancias de la clase K-means. Este ciclo for iterará sobre los números de clúster del uno al 10. También inicializaremos una lista que usaremos para agregar los valores de WCSS:

for i in range(1, 11):
    kmeans = KMeans(n_clusters=i, random_state=0)
    kmeans.fit(X)

Luego agregamos los valores WCSS a nuestra lista. Accedemos a estos valores a través del atributo de inercia del objeto K-means:

for i in range(1, 11):
    kmeans = KMeans(n_clusters=i, random_state=0)
    kmeans.fit(X)
    wcss.append(kmeans.intertia_)

Finalmente, podemos trazar el WCSS frente al número de grupos. Primero, importemos Matplotlib y Seaborn, que nos permitirán crear y formatear visualizaciones de datos:

import matplotlib.pyplot as plt
import seaborn as sns 

Vamos a diseñar las tramas usando Seaborn:

sns.set()

Luego grafique el WCSS frente a los grupos:

plt.plot(range(1, 11), wcss)

A continuación, agregue un título:

plt.title('Selecting the Numbeer of Clusters using the Elbow Method')

Y finalmente, etiqueta los ejes:

plt.xlabel('Clusters')
plt.ylabel('WCSS')
plt.show()
agrupamiento de datos-python

A partir de este gráfico, podemos ver que cuatro es el número óptimo de grupos, ya que aquí es donde aparece el «codo» de la curva.

agrupamiento de datos-python

Podemos ver que K-means encontró cuatro grupos, que se descomponen así:

  1. Clientes jóvenes con una puntuación de gasto moderada.

  2. Clientes jóvenes con una alta puntuación de gasto.
  3. Clientes de mediana edad con un puntaje de gasto bajo.

  4. Clientes senior con un puntaje de gasto moderado.

Este tipo de información puede ser muy útil para las empresas minoristas que buscan apuntar a datos demográficos de consumidores específicos. Por ejemplo, si la mayoría de las personas con altos puntajes de gasto son más jóvenes, la empresa puede dirigirse a esas poblaciones con anuncios y promociones.

Modelo de mezcla gaussiana (GMM)

Este modelo asume que los clústeres se pueden modelar utilizando una distribución gaussiana. Las distribuciones gaussianas, conocidas informalmente como curvas de campana, son funciones que describen muchas cosas importantes, como la altura y el peso de la población.

Estos modelos son útiles porque las distribuciones gaussianas tienen propiedades bien definidas, como la media, la varianza y la covarianza. La media es solo el valor promedio de una entrada dentro de un grupo. La varianza mide la fluctuación en los valores de una sola entrada. La covarianza es una matriz de estadísticas que describe cómo se relacionan las entradas entre sí y, específicamente, cómo varían juntas.

En conjunto, estos parámetros permiten que el algoritmo GMM cree grupos de identidad flexibles de formas complejas. Mientras que K-means generalmente identifica grupos de forma esférica, GMM puede identificar grupos de diferentes formas de manera más general. Esto hace que GMM sea más robusto que K-means en la práctica.

Comencemos por importar el paquete GMM de Scikit-learn:

from sklearn.mixture import GaussianMixture

A continuación, inicialicemos una instancia de la clase GaussianMixture. Comencemos por considerar tres grupos y ajustemos el modelo a nuestras entradas (en este caso, edad y puntaje de gasto):

from sklearn.mixture import GaussianMixture
n_clusters = 3
gmm_model = GaussianMixture(n_components=n_clusters)
gmm_model.fit(X)

Ahora, generemos las etiquetas de clúster y almacenemos los resultados, junto con nuestras entradas, en un nuevo marco de datos:

cluster_labels = gmm_model.predict(X)
X = pd.DataFrame(X)
X['cluster'] = cluster_labels

A continuación, tracemos cada clúster dentro de un bucle for:

for k in range(0,n_clusters):
    data = X[X["cluster"]==k]
    plt.scatter(data["Age"],data["Spending Score (1-100)"],c=color[k])

Y, finalmente, formatee la trama:

plt.title("Clusters Identified by Guassian Mixture Model")    
plt.ylabel("Spending Score (1-100)")
plt.xlabel("Age")
plt.show()
agrupamiento de datos-python

Los grupos rojos y azules parecen relativamente bien definidos. El grupo azul son los clientes jóvenes con un puntaje de gasto alto y el rojo son los clientes jóvenes con un puntaje de gasto moderado. El grupo verde está menos definido ya que abarca todas las edades y puntajes de gasto de bajos a moderados.

Ahora, probemos cuatro grupos:

...
n_clusters = 4
gmm_model = GaussianMixture(n_components=n_clusters)
...
agrupamiento de datos-python

Aunque cuatro grupos muestran una ligera mejora, tanto el rojo como el azul siguen siendo bastante amplios en términos de edad y valores de puntaje de gasto. Entonces, probemos cinco grupos:

agrupamiento de datos-python

Cinco grupos parecen ser apropiados aquí. Se pueden describir de la siguiente manera:

  1. Clientes jóvenes con un puntaje de gasto alto (verde).

  2. Clientes jóvenes con un puntaje de gasto moderado (negro).

  3. Clientes jóvenes a de mediana edad con un puntaje de gasto bajo (azul).

  4. Clientes de mediana edad a mayores con un puntaje de gasto bajo (amarillo).

  5. Clientes de mediana edad a mayores con un puntaje de gasto moderado (rojo).

Los modelos de mezcla gaussiana son generalmente más robustos y flexibles que el agrupamiento de K-medias. Nuevamente, esto se debe a que GMM captura formas de clúster complejas y K-means no. Esto permite que GMM identifique con precisión grupos que son más complejos que los grupos esféricos que identifica K-means. GMM es un método ideal para conjuntos de datos de tamaño y complejidad moderados porque es más capaz de capturar grupos en conjuntos que tienen formas complejas.

Agrupación espectral

El agrupamiento espectral es un método común utilizado para el análisis de conglomerados en datos de alta dimensión y, a menudo, complejos. Funciona realizando una reducción de dimensionalidad en la entrada y generando grupos en el espacio dimensional reducido. Dado que nuestros datos no contienen muchas entradas, esto será principalmente con fines ilustrativos, pero debería ser sencillo aplicar este método a conjuntos de datos más grandes y complicados.

Comencemos importando la clase SpectralClustering del módulo de clúster en Scikit-learn:

from sklearn.cluster import SpectralClustering

A continuación, definamos nuestra instancia de clase SpectralClustering con cinco clústeres:

spectral_cluster_model= SpectralClustering(
    n_clusters=5, 
    random_state=25, 
    n_neighbors=8, 
    affinity='nearest_neighbors'
)

A continuación, definamos nuestro objeto modelo para nuestras entradas y almacenemos los resultados en el mismo marco de datos:

X['cluster'] = spectral_cluster_model.fit_predict(X[['Age', 'Spending Score (1-100)']])

Finalmente, tracemos nuestros grupos:

fig, ax = plt.subplots()
sns.scatterplot(x='Age', y='Spending Score (1-100)', data=X, hue='cluster', ax=ax)
ax.set(title='Spectral Clustering')
agrupamiento de datos-python

Vemos que los grupos uno, dos, tres y cuatro son bastante distintos, mientras que el grupo cero parece bastante amplio. En general, vemos algunos de los mismos patrones con los grupos de conglomerados que vimos para K-means y GMM, aunque los métodos anteriores dieron una mejor separación entre los conglomerados. Una vez más, el agrupamiento espectral es más adecuado para problemas que involucran conjuntos de datos mucho más grandes, como aquellos con cientos o miles de entradas y millones de filas.

El código de esta publicación está disponible en GitHub .

Más en ciencia de datos: ¿Quiere Business Intelligence Insights de forma más rápida y sencilla?

Agregue la agrupación en clústeres a su kit de herramientas

Aunque solo consideramos el análisis de conglomerados en el contexto de la segmentación de clientes, se aplica en gran medida en una amplia gama de industrias. Los métodos de agrupación que discutimos se han utilizado para resolver una amplia gama de problemas. El agrupamiento de K-medias se ha utilizado para identificar poblaciones de pacientes vulnerables. Los modelos de mezcla gaussiana se han utilizado para detectar actividades de mercado ilegales, como el comercio falso, el pump and dump y el relleno de cotizaciones. Los métodos de agrupamiento espectral se han utilizado para abordar problemas complejos de atención médica, como la agrupación de términos médicos para el descubrimiento de conocimientos sobre atención médica.

Independientemente de la industria, cualquier organización o empresa moderna puede encontrar un gran valor en poder identificar clústeres importantes a partir de sus datos. Python proporciona muchas herramientas fáciles de implementar para realizar análisis de conglomerados en todos los niveles de complejidad de datos. Además, tener un buen conocimiento de qué métodos funcionan mejor dada la complejidad de los datos es una habilidad invaluable para cualquier científico de datos. Lo que hemos cubierto proporciona una base sólida para los científicos de datos que están comenzando a aprender cómo realizar análisis de conglomerados.