22. Clustering con KMeans

22.1 Cuando no tenemos etiquetas

Hasta ahora trabajamos principalmente con problemas supervisados: había una columna objetivo, como compra, aprobó o enfermedad.

Pero no siempre contamos con esa etiqueta. A veces solo tenemos datos y queremos descubrir si existen grupos naturales dentro de ellos.

Ahí entra en juego el aprendizaje no supervisado.

22.2 Qué es clustering

Clustering significa agrupar casos parecidos entre sí sin que el modelo conozca etiquetas previas.

La idea general es:

  • casos similares deberían quedar en el mismo grupo;
  • casos diferentes deberían quedar en grupos distintos.

Uno de los algoritmos más conocidos para esto es KMeans.

22.3 Qué hace KMeans

KMeans intenta dividir los datos en K grupos. Para eso, busca centros representativos llamados centroides.

Luego asigna cada caso al centro más cercano.

De forma simplificada, el proceso es:

  • elegir cuántos grupos queremos;
  • ubicar centroides iniciales;
  • asignar cada punto al centro más cercano;
  • recalcular los centros;
  • repetir hasta estabilizarse.

22.4 Qué significa la K

La letra K representa la cantidad de grupos que queremos encontrar.

Por ejemplo:

  • si k = 2, pedimos dos grupos;
  • si k = 3, pedimos tres grupos;
  • si k = 4, pedimos cuatro grupos.

El algoritmo no decide solo cuántos grupos queremos. Ese número debe indicarlo quien analiza el problema.

22.5 Un ejemplo intuitivo

Supongamos que una empresa tiene datos de clientes, pero no sabe aún qué segmentos existen. Podría usar clustering para descubrir perfiles como:

  • clientes con pocas visitas y poco gasto;
  • clientes con muchas visitas y gasto medio;
  • clientes frecuentes y de alto gasto.

Esos grupos no vienen dados de antemano: el algoritmo los propone a partir de los datos.

22.6 Ejemplo muy claro: segmentar clientes

Vamos a agrupar clientes según:

  • cantidad de visitas al sitio;
  • gasto mensual.

Usaremos KMeans con 3 grupos y luego veremos a qué grupo pertenece un nuevo cliente.

import pandas as pd
from sklearn.cluster import KMeans
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

clientes = pd.DataFrame({
    "visitas": [1, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
    "gasto": [80, 90, 100, 120, 150, 200, 260, 300, 360, 420, 500, 580]
})

modelo = Pipeline([
    ("escalador", StandardScaler()),
    ("kmeans", KMeans(n_clusters=3, random_state=42, n_init=10))
])

modelo.fit(clientes)

grupos = modelo.predict(clientes)
clientes_resultado = clientes.copy()
clientes_resultado["grupo"] = grupos

print(clientes_resultado)

centros_escalados = modelo.named_steps["kmeans"].cluster_centers_
print("Centros de los grupos:")
print(centros_escalados)

nuevo_cliente = pd.DataFrame({
    "visitas": [7],
    "gasto": [320]
})

grupo_nuevo = modelo.predict(nuevo_cliente)[0]
print("Grupo asignado al nuevo cliente:", grupo_nuevo)

Salida resumida esperada:

   visitas  gasto  grupo
...
Centros de los grupos:
...
Grupo asignado al nuevo cliente: ...

22.7 Qué está pasando en el ejemplo

No existe una columna objetivo como en clasificación. El modelo trabaja solo con las variables disponibles e intenta descubrir grupos de clientes con comportamiento parecido.

Al final, cada fila recibe un número de grupo, por ejemplo 0, 1 o 2. Esos números no significan “mejor” o “peor”: solo identifican segmentos distintos.

22.8 Por qué usamos StandardScaler

KMeans depende de distancias. Si una variable tiene valores mucho mayores que otra, dominará el agrupamiento.

Por eso, igual que en KNN o SVM, el escalado suele ser importante. En este ejemplo lo integramos mediante un Pipeline.

22.9 Cómo interpretar los grupos

KMeans no “entiende” el significado del negocio. Solo separa por similitud numérica. La interpretación humana viene después.

Por ejemplo, si un grupo concentra pocas visitas y bajo gasto, podríamos describirlo como un segmento de baja interacción. Si otro combina muchas visitas con alto gasto, podría representar clientes más valiosos.

22.10 Explicación detallada del código

  • KMeans(n_clusters=3, random_state=42, n_init=10): crea el modelo de clustering con tres grupos.
  • fit(clientes): ajusta los centroides a partir de los datos.
  • predict(clientes): asigna cada fila al grupo más cercano.
  • cluster_centers_: devuelve la posición de los centroides en el espacio transformado.
  • Pipeline([...]): asegura que el escalado y el agrupamiento se apliquen juntos.

22.11 Limitaciones y cuidados

  • KMeans necesita que indiquemos previamente la cantidad de grupos.
  • Es sensible a la escala de las variables.
  • No siempre los grupos encontrados coinciden con una interpretación útil del negocio.
  • Puede verse afectado por valores atípicos.

22.12 Errores frecuentes

  • Interpretar los números de grupo como una jerarquía: son etiquetas, no rankings.
  • No escalar los datos: puede distorsionar completamente los grupos.
  • Suponer que los grupos son “verdades absolutas”: son una propuesta del algoritmo, no una ley natural.
  • Elegir K sin criterio: la cantidad de grupos debe tener sentido analítico.

22.13 Qué deberías retener

  • KMeans agrupa casos parecidos sin usar etiquetas previas.
  • La letra K indica cuántos grupos queremos encontrar.
  • El algoritmo trabaja buscando centroides y asignando cada caso al más cercano.
  • El escalado suele ser importante porque el método depende de distancias.
  • La interpretación final de los grupos siempre requiere criterio humano.