domingo, 14 de enero de 2024

Aplicación Práctica: K-Means (Aprendizaje No Supervisado)

 

Definición del Algoritmo K-Means: K-Means es un algoritmo de agrupamiento (clustering) que se utiliza para dividir un conjunto de datos en grupos homogéneos llamados "clusters". Su objetivo principal es agrupar datos similares en conjuntos y asignar etiquetas a los grupos. El número de clusters, denotado por "k", es un parámetro que se establece antes de ejecutar el algoritmo.

Pasos del Algoritmo K-Means:

1.     Inicialización de Centroides:

Selecciona aleatoriamente K puntos del conjunto de datos como centroides iniciales. Un centroide es el punto representativo de un cluster.

2.     Asignación de Puntos a Clúster:

Asigna cada punto del conjunto de datos al cluster cuyo centroide está más cercano. Esto se hace generalmente utilizando la distancia euclidiana.

3.     Actualización de Centroides:

Recalcula los centroides de cada cluster tomando la media de todos los puntos asignados a ese cluster.

4.     Repetición:

Repite los pasos 2 y 3 hasta que los centroides de los clusters no cambien significativamente o hasta que se alcance un número predeterminado de iteraciones.

Funcionamiento del Algoritmo:

·     El algoritmo trata de minimizar la suma de las distancias cuadradas entre cada punto y el centroide de su cluster asignado.

·       En cada iteración, los puntos pueden cambiar de cluster, y los centroides se recalculan.

·       El algoritmo converge cuando los centroides ya no cambian significativamente o cuando se alcanza un número máximo de iteraciones.

Aplicaciones y Usos de K-Means:

1.     Segmentación de Clientes:

En marketing, K-Means puede utilizarse para segmentar clientes en grupos con características similares, facilitando estrategias de marketing personalizadas.

2.     Compresión de Imágenes:

Puede aplicarse para comprimir imágenes, reduciendo la cantidad de colores utilizados mientras se mantiene la calidad visual.

3.     Agrupamiento de Documentos:

En minería de texto, se puede utilizar para agrupar documentos similares, facilitando la organización y búsqueda de información.

4.     Análisis de Datos Biológicos:

En biología, K-Means se ha utilizado para analizar patrones en datos genéticos y clasificar genes.

5.     Detección de Anomalías:

Puede identificar patrones inusuales en conjuntos de datos, siendo útil en la detección de anomalías o fraudes.

Ejemplo 1

Ejemplo práctico con Python utilizando la biblioteca scikit-learn para aplicar el algoritmo K-Means y matplotlib para realizar algunas visualizaciones.

Este código realiza los siguientes pasos:

Importa las bibliotecas necesarias (NumPy, pandas, matplotlib, scikit-learn).

Crea un DataFrame con los datos de los clientes.

Escala los datos para que tengan la misma magnitud.

Aplica el algoritmo K-Means con K=3 clusters.

Visualiza los resultados mediante un gráfico de dispersión, coloreando cada punto según su cluster y marcando los centroides en rojo.

Este ejemplo proporcionará una representación visual de cómo se han agrupado los clientes. 

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

# Datos de clientes
data = {
    'Frecuencia': [10, 5, 2, 8, 3, 12, 6, 15, 4, 9],
    'Monto_Gastado': [500, 200, 1000, 800, 150, 600, 300, 1200, 250, 700]
}

df = pd.DataFrame(data)

# Escalamos los datos para que tengan la misma escala
scaler = StandardScaler()
scaled_data = scaler.fit_transform(df)

# Aplicamos K-Means con K=3 clusters
kmeans = KMeans(n_clusters=3, random_state=42)
df['Cluster'] = kmeans.fit_predict(scaled_data)

# Visualizamos los resultados
plt.figure(figsize=(10, 6))

# Scatter plot para mostrar los clusters
for cluster in df['Cluster'].unique():
    plt.scatter(df[df['Cluster'] == cluster]['Frecuencia'],
                df[df['Cluster'] == cluster]['Monto_Gastado'],
                label=f'Cluster {cluster}')

# Centroides
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1],
            marker='X', s=200, c='red', label='Centroides')

plt.title('Segmentación de Clientes con K-Means')
plt.xlabel('Frecuencia de Compra')
plt.ylabel('Monto Total Gastado')
plt.legend()
plt.show()

/usr/local/lib/python3.10/dist-packages/sklearn/cluster/_kmeans.py:870: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning warnings.warn(



Ejemplo 1

Vamos a crear un conjunto de datos ficticios para la aplicación de K-Means en la segmentación de clientes para una empresa de gimnasio. Supongamos que tenemos los siguientes datos:

Nombre del Cliente

Antigüedad del Cliente en meses

Frecuencia que asiste al GYM por semana

Precio de la entrada por mes

Utilizaremos estos datos para segmentar a los clientes en clusters y visualizar los resultados. con Python utilizando scikit-learn y matplotlib:

Este código crea un conjunto de datos ficticios para clientes de un gimnasio, aplica el algoritmo K-Means con K=3 clusters y visualiza los resultados en un gráfico de dispersión.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

# Crear datos ficticios
np.random.seed(42)

clientes = {
    'Nombre': ['Cliente A', 'Cliente B', 'Cliente C', 'Cliente D', 'Cliente E', 'Cliente F', 'Cliente G', 'Cliente H', 'Cliente I', 'Cliente J'],
    'Antiguedad': np.random.randint(1, 36, 10),  # Antigüedad en meses
    'Frecuencia_Semanal': np.random.randint(1, 6, 10),  # Frecuencia de asistencia al GYM por semana
    'Precio_Entrada': np.random.uniform(30, 80, 10)  # Precio de entrada por mes
}

df_gym = pd.DataFrame(clientes)

# Escalar los datos para que tengan la misma magnitud
scaler = StandardScaler()
scaled_data_gym = scaler.fit_transform(df_gym.drop('Nombre', axis=1))

# Aplicar K-Means con K=3 clusters
kmeans_gym = KMeans(n_clusters=3, random_state=42)
df_gym['Cluster'] = kmeans_gym.fit_predict(scaled_data_gym)

# Visualizar los resultados
plt.figure(figsize=(10, 6))

# Scatter plot para mostrar los clusters
for cluster in df_gym['Cluster'].unique():
    plt.scatter(df_gym[df_gym['Cluster'] == cluster]['Frecuencia_Semanal'],
                df_gym[df_gym['Cluster'] == cluster]['Precio_Entrada'],
                label=f'Cluster {cluster}')

# Centroides
plt.scatter(kmeans_gym.cluster_centers_[:, 1], kmeans_gym.cluster_centers_[:, 2],
            marker='X', s=200, c='red', label='Centroides')

# Etiquetas y título
plt.title('Segmentación de Clientes del Gimnasio con K-Means')
plt.xlabel('Frecuencia Semanal de Asistencia al GYM')
plt.ylabel('Precio de la Entrada por Mes')
plt.legend()
plt.show()

/usr/local/lib/python3.10/dist-packages/sklearn/cluster/_kmeans.py:870: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning warnings.warn(

 


Ejemplo 2

Del ejemplo 1 se va a ajustar el número de clusters, explorando diferentes características y analizando las segmentaciones resultantes. Utilizaremos un número diferente de clusters (por ejemplo, K=4) y visualizaremos la segmentación en tablas y gráficos. Se mostrará estadísticas descriptivas para cada cluster.

Código actualizado: Este código ajusta el número de clusters a 4 y presenta un gráfico de dispersión con los puntos coloreados según su cluster. También se imprime una tabla con la segmentación de clientes y estadísticas descriptivas por cluster.

La interpretación de los clusters puede depender de la naturaleza específica de los datos y del contexto del negocio.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

# Crear datos ficticios
np.random.seed(42)

clientes = {
    'Nombre': ['Cliente A', 'Cliente B', 'Cliente C', 'Cliente D', 'Cliente E', 'Cliente F', 'Cliente G', 'Cliente H', 'Cliente I', 'Cliente J'],
    'Antiguedad': np.random.randint(1, 36, 10),  # Antigüedad en meses
    'Frecuencia_Semanal': np.random.randint(1, 6, 10),  # Frecuencia de asistencia al GYM por semana
    'Precio_Entrada': np.random.uniform(30, 80, 10)  # Precio de entrada por mes
}

df_gym = pd.DataFrame(clientes)

# Escalar los datos para que tengan la misma magnitud
scaler = StandardScaler()
scaled_data_gym = scaler.fit_transform(df_gym.drop('Nombre', axis=1))

# Aplicar K-Means con K=4 clusters
kmeans_gym = KMeans(n_clusters=4, random_state=42)
df_gym['Cluster'] = kmeans_gym.fit_predict(scaled_data_gym)

# Visualizar los resultados
plt.figure(figsize=(12, 8))

# Scatter plot para mostrar los clusters
for cluster in df_gym['Cluster'].unique():
    plt.scatter(df_gym[df_gym['Cluster'] == cluster]['Frecuencia_Semanal'],
                df_gym[df_gym['Cluster'] == cluster]['Precio_Entrada'],
                label=f'Cluster {cluster}')

# Centroides
plt.scatter(kmeans_gym.cluster_centers_[:, 1], kmeans_gym.cluster_centers_[:, 2],
            marker='X', s=200, c='red', label='Centroides')

# Etiquetas y título
plt.title('Segmentación de Clientes del Gimnasio con K-Means (K=4)')
plt.xlabel('Frecuencia Semanal de Asistencia al GYM')
plt.ylabel('Precio de la Entrada por Mes')
plt.legend()
plt.show()

# Tabla de segmentación
segmentacion_table = df_gym[['Nombre', 'Cluster']].sort_values(by='Cluster')
print("Tabla de Segmentación:")
print(segmentacion_table)

# Estadísticas descriptivas por cluster
estadisticas_por_cluster = df_gym.groupby('Cluster').describe().transpose()
print("\nEstadísticas Descriptivas por Cluster:")
print(estadisticas_por_cluster)

/usr/local/lib/python3.10/dist-packages/sklearn/cluster/_kmeans.py:870: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning warnings.warn(

 



No hay comentarios:

Publicar un comentario

Aplicación Práctica: Regresión Logística (Aprendizaje Supervisado)

  Definicion.-   La regresión logística es un método estadístico utilizado para modelar la probabilidad de que una variable dependiente bina...