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.
Clustering significa agrupar casos parecidos entre sí sin que el modelo conozca etiquetas previas.
La idea general es:
Uno de los algoritmos más conocidos para esto es 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:
La letra K representa la cantidad de grupos que queremos encontrar.
Por ejemplo:
k = 2, pedimos dos grupos;k = 3, pedimos tres grupos;k = 4, pedimos cuatro grupos.El algoritmo no decide solo cuántos grupos queremos. Ese número debe indicarlo quien analiza el problema.
Supongamos que una empresa tiene datos de clientes, pero no sabe aún qué segmentos existen. Podría usar clustering para descubrir perfiles como:
Esos grupos no vienen dados de antemano: el algoritmo los propone a partir de los datos.
Vamos a agrupar clientes según:
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: ...
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.
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.
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.
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.