¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Agrupar datos sin etiquetas (k-means)

Después de esta lección: Puedo agrupar datos sin etiquetas con k-means.

Lección de 50 min2 comandosLaboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

Tres turnos para un año de días

La empresa quiere tres plantillas de turnos: para días flojos, normales y fuertes. Nadie ha marcado nunca qué días son de cada tipo.

No hay etiquetas que copiar. Hace falta un método que encuentre grupos por sí solo, mirando solo lo parecidos que son los días.

Al final de esta lección

Nota

Puedo agrupar datos sin etiquetas con k-means.

Palabras clave

PalabraQué significaEjemplo
Agrupamientoformar grupos de filas parecidas sin etiquetas (clustering en inglés)
Centroideel punto medio de un grupo
Distancialo lejos que están dos puntos
Escalarponer las columnas en la misma medida antes de medir distancias
kcuántos grupos pidesn_clusters=3
Dispersión internalo lejos que quedan los puntos de su centroide (inertia en inglés)

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

k-means repite dos pasos

k-means empieza con k centroides puestos al azar. Después repite dos pasos.

Primero, cada punto va al grupo del centroide más cercano. Segundo, cada centroide se mueve a la media de los puntos de su grupo.

Cuando un paso ya no cambia ningún grupo, el método ha terminado. Los grupos no traen nombre: el nombre lo pones tú al mirarlos.

Ejemplo resuelto: un paso con seis días

DíaDistancia a 100Distancia a 250Grupo
110101401
140401101
17070801
290190402
330230802
4003001502
Centros nuevos(110 + 140 + 170) / 3 = 140(290 + 330 + 400) / 3 = 340

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un paso a mano

Código: python
# Seis días por sus alquileres, y dos centros de partida.
days = [110, 140, 170, 290, 330, 400]
centres = [100, 250]

groups = [[], []]
for one in days:
    if abs(one - centres[0]) <= abs(one - centres[1]):
        groups[0].append(one)
    else:
        groups[1].append(one)
print("grupos:", groups)

new = []
for group in groups:
    total = 0
    for one in group:
        total = total + one
    new.append(total / len(group))
print("centros nuevos:", new)
# Copia los centros nuevos en centres y ejecuta otra vez.
# ¿Cambian los grupos?

Sin escalar, decide la columna más ancha

Una distancia suma diferencias de todas las columnas. Los alquileres varían en cientos y la temperatura en unos pocos grados. Sin más, la distancia la deciden casi solo los alquileres.

Escalar lo arregla. StandardScaler resta la media de cada columna y divide entre su desviación. Después, un paso de una unidad pesa lo mismo en las dos columnas.

Escribe esto en tu cuaderno: la dispersión

Código: python
import pandas as pd

hires = pd.read_csv("hires.csv")
# La dispersión de cada columna, sin escalar.
hires[["temp_c", "hires"]].std().round(1)

Agrupa los días, ya escalados

Comando
docker exec jupyter python3 steps/kmeans.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Escribe esto en tu cuaderno: dos grupos

Código: python
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

scaled = StandardScaler().fit_transform(hires[["temp_c", "hires"]])
# Dos grupos en lugar de tres.
hires["group"] = KMeans(n_clusters=2, n_init=10, random_state=0).fit_predict(scaled)
hires.groupby("group")[["temp_c", "hires"]].mean().round(1)

k lo eliges tú

Más grupos siempre dejan los puntos más cerca de su centroide, así que la dispersión interna siempre baja. Con un grupo por día llegaría a 0, y no serviría de nada.

Busca el codo: el k a partir del cual bajar cuesta mucho y gana poco. Después pregúntate si los grupos sirven para algo, como tres plantillas de turnos.

Dispersión para k de 1 a 6

Comando
docker exec jupyter python3 steps/elbow.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un error muy común

Advertencia

Mucha gente cree que k-means encuentra el número verdadero de grupos. No lo hace: el k lo pones tú, y siempre devuelve exactamente k grupos. El codo es una pista, no una respuesta. Decide con el codo y con lo que vas a hacer con los grupos.

Para ir más lejos: cuatro plantillas

La gerente pregunta si cuatro plantillas serían mejor que tres. En tu cuaderno, copia kmeans.py y cambia n_clusters=3 por n_clusters=4.

Haz la tabla de cada grupo: media de temperatura, media de alquileres y número de días. Pon un nombre a cada grupo. ¿Merece la pena una cuarta plantilla para el grupo más pequeño? Responde con una razón de turnos, no solo con cifras.

Sobre este laboratorio y su código: Laboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.