- K-Means: Fundamentos e Implementación
K-Means: Fundamentos e Implementación
Bienvenido a una de las técnicas de aprendizaje no supervisado más utilizadas en la ciencia de datos: el algoritmo K-Means. Esta lección te guiará desde los fundamentos conceptuales hasta una implementación práctica en Python con scikit-learn. Comprenderás el flujo iterativo del algoritmo, los métodos para elegir el número de clústeres, la importancia de una inicialización inteligente y la sensibilidad a la escala de los datos. Al finalizar, serás capaz de aplicar K-Means a problemas reales de segmentación.
Algoritmo paso a paso: de la inicialización a la convergencia
K-Means es un algoritmo iterativo que busca particionar un conjunto de datos en K grupos disjuntos (clústeres). Cada clúster se representa mediante su centroide (la media de todos los puntos que pertenecen al clúster). El proceso sigue cuatro etapas fundamentales:
- Inicialización de centroides: se eligen K puntos iniciales (pueden ser aleatorios o mediante K-Means++).
- Asignación de puntos: cada punto del conjunto de datos se asigna al centroide más cercano (usualmente distancia euclidiana).
- Actualización de centroides: se recalculan los centroides como la media de todos los puntos asignados a cada clúster.
- Verificación de convergencia: si los centroides no cambian (o el cambio es menor a un umbral), el algoritmo se detiene; de lo contrario, se repite desde el paso 2.
La función objetivo que K-Means minimiza es la inercia (suma de distancias al cuadrado de cada punto al centroide de su clúster). El algoritmo garantiza convergencia a un óptimo local, pero el resultado depende fuertemente de la inicialización.
Visualiza Flujo del algoritmo: Inicialización → Asignación → Actualización → ¿Convergencia? → (No) → Asignación ... → (Sí) → Fin.
Elección de K: método del codo y silhouette
Seleccionar el número de clústeres K es un paso crítico. No existe un valor perfecto, pero dos técnicas empíricas son ampliamente utilizadas:
- Método del codo (Elbow): se ejecuta K-Means para distintos valores de K (por ejemplo, 1 a 10) y se calcula la inercia. Se grafica la inercia vs. K; el punto donde la reducción de la inercia se vuelve marginal (forma de codo) sugiere un K adecuado.
- Coeficiente de Silhouette: mide cuán similar es un punto a su propio clúster (cohesión) comparado con otros clústeres (separación). El promedio global del coeficiente (rango -1 a 1) indica qué tan bien separados están los grupos. Un valor cercano a 1 sugiere clústeres densos y bien separados.
Ambos métodos son complementarios: el codo da una visión de la variabilidad, mientras que silhouette evalúa la consistencia interna.
Inicialización inteligente: K-Means++
La inicialización estándar (aleatoria) puede llevar a malos óptimos locales o convergencia lenta. K-Means++ (Arthur y Vassilvitskii, 2007) mejora el proceso de la siguiente manera:
- Se elige el primer centroide aleatoriamente entre los puntos.
- Para cada punto, se calcula la distancia al centroide más cercano ya elegido.
- El siguiente centroide se selecciona con probabilidad proporcional al cuadrado de esa distancia (mayor distancia → mayor probabilidad).
- Se repite hasta obtener K centroides.
Esta técnica dispersa los centroides iniciales y mejora significativamente la calidad y reproducibilidad de los resultados. En scikit-learn, K-Means++ es el método por defecto (init='k-means++').
Sensibilidad a la escala de datos: importancia de la estandarización
K-Means utiliza distancias euclidianas. Si las variables tienen escalas muy diferentes (ej. ingresos en miles vs. edad en unidades), las variables con magnitudes mayores dominarán el cálculo de la distancia, sesgando los clústeres. Siempre estandariza (o normaliza) los datos antes de aplicar K-Means:
- Estandarización (Z-score): cada variable se transforma a media 0 y desviación estándar 1.
- Normalización Min-Max: escala los valores a un rango fijo (generalmente [0,1]).
La estandarización es la práctica más común en segmentación y clustering, pues preserva la forma de la distribución.
Ejemplo práctico: segmentación de clientes con Python (scikit-learn)
A continuación, un caso completo de segmentación de clientes basado en datos simulados de compras y demografía. Se aplica el flujo completo: estandarización, determinación de K (codo + silhouette), ejecución de K-Means con K-Means++ y análisis de los perfiles resultantes.
1. Carga de librerías y generación de datos de ejemplo
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score
# Datos sintéticos: 200 clientes
np.random.seed(42)
data = pd.DataFrame({
'ingreso_anual': np.random.normal(60000, 15000, 200),
'gasto_promedio': np.random.normal(800, 250, 200),
'edad': np.random.randint(22, 70, 200),
'frecuencia_compras': np.random.poisson(12, 200)
})
2. Estandarización de los datos
scaler = StandardScaler()
X_scaled = scaler.fit_transform(data)
3. Método del codo y silhouette para elegir K
inertias = []
silhouettes = []
K_range = range(2, 11)
for k in K_range:
km = KMeans(n_clusters=k, init='k-means++', random_state=42)
labels = km.fit_predict(X_scaled)
inertias.append(km.inertia_)
silhouettes.append(silhouette_score(X_scaled, labels))
# Visualización rápida (codo y silhouette)
plt.figure(figsize=(12,5))
plt.subplot(1,2,1)
plt.plot(K_range, inertias, marker='o')
plt.title('Método del codo'); plt.xlabel('K'); plt.ylabel('Inercia')
plt.subplot(1,2,2)
plt.plot(K_range, silhouettes, marker='s', color='tomato')
plt.title('Coeficiente Silhouette'); plt.xlabel('K'); plt.ylabel('Silhouette')
plt.tight_layout()
plt.show()
4. Selección de K óptimo (ejemplo K=4) y entrenamiento final
K_optimo = 4
modelo_final = KMeans(n_clusters=K_optimo, init='k-means++', random_state=42)
cluster_labels = modelo_final.fit_predict(X_scaled)
# Agregar etiquetas al DataFrame original
data['cluster'] = cluster_labels
5. Perfiles de los segmentos (interpretación)
# Agrupar por cluster y obtener medias
perfiles = data.groupby('cluster').mean()
print(perfiles)
# Visualización de perfiles en escala original (opcional)
perfiles_estandarizados = pd.DataFrame(
scaler.inverse_transform(perfiles.values),
columns=data.columns[:-1]
)
print(perfiles_estandarizados)
Interpretación Por ejemplo, el clúster 0 podría representar clientes jóvenes con alta frecuencia de compra y gasto moderado; el clúster 1, clientes mayores con alto ingreso pero bajo gasto. La segmentación revela patrones de comportamiento que guían estrategias de marketing.
KPI clave y resumen técnico
Inercia
Suma de distancias intra-clúster. Menor es mejor (pero sobreajuste con K alto).
Silhouette
Entre -1 y 1. Valores > 0.5 indican clústeres razonables.
Iteraciones
Número de ciclos hasta convergencia (K-Means++ suele requerir menos).
Estabilidad
Resultados consistentes tras múltiples inicializaciones con K-Means++.
Consideraciones finales y advertencias
- Siempre estandariza las variables antes de ejecutar K-Means.
- El algoritmo asume clústeres esféricos y de tamaño similar. Para formas complejas, considera DBSCAN o clustering espectral.
- K-Means es sensible a valores atípicos: los centroides pueden verse arrastrados. Realiza una limpieza previa o usa K-Medoids.
- Para datos categóricos, utiliza K-Modes o transforma con one-hot encoding y escala.
- La elección de K nunca es automática: combina métricas cuantitativas con conocimiento del negocio.
Referencias y buenas prácticas
La implementación de scikit-learn ofrece parámetros clave: n_init (número de inicializaciones, default 10), max_iter (300 por defecto), y tol (tolerancia para convergencia).
Para clusters de alta dimensionalidad, considera reducir dimensiones con PCA antes de clustering.
El entendimiento profundo de K-Means te prepara para conceptos más avanzados como Mini-Batch K-Means (escalable a grandes volúmenes), y variantes como Fuzzy C-Means. Domina este algoritmo y tendrás una herramienta sólida para exploración y segmentación.
Lección: K-Means: Fundamentos e Implementación — Odisea Algorítmica: De la Regresión al Aprendizaje Profundo
No hay comentarios por ahora.
Compartir este contenido
Compartir enlace
Compartir en redes sociales
Compartir por correo electrónico
Please iniciar sesión para compartir esto Artículo por correo electrónico.