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
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Agrupamiento | formar grupos de filas parecidas sin etiquetas (clustering en inglés) | |
| Centroide | el punto medio de un grupo | |
| Distancia | lo lejos que están dos puntos | |
| Escalar | poner las columnas en la misma medida antes de medir distancias | |
| k | cuántos grupos pides | n_clusters=3 |
| Dispersión interna | lo 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ía | Distancia a 100 | Distancia a 250 | Grupo |
|---|---|---|---|
| 110 | 10 | 140 | 1 |
| 140 | 40 | 110 | 1 |
| 170 | 70 | 80 | 1 |
| 290 | 190 | 40 | 2 |
| 330 | 230 | 80 | 2 |
| 400 | 300 | 150 | 2 |
| 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
# 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
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
docker exec jupyter python3 steps/kmeans.pySe 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
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
docker exec jupyter python3 steps/elbow.pySe 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.