DANA 4840 — K-means (exploración 2): USArrests, escala, codo y salida de R

Notas de exploración sobre K-means con datos reales (USArrests): qué hace la función, por qué scale(), cómo leer tamaños, centroides, WSS, betweenss/totss y por qué aggregate() devuelve medias en unidades originales. Para el ejercicio manual con cuatro puntos A–C–D y centros fijos, conviene el post anterior sobre MacQueen y centers como matriz.


1. Qué es K-means

K-means agrupa observaciones en K clusters minimizando (de forma aproximada y iterativa) la variabilidad dentro de cada grupo: cada punto se asigna al centroide más cercano y los centroides se actualizan como media de los miembros del grupo.

Ejemplo típico en R:

kmeans(x, centers = 4, nstart = 25)
Parte Significado
x Matriz o data.frame solo numérico (aquí suele ir scale(USArrests)).
centers = 4 K = 4: cuatro grupos. También puede ser una matriz de centros iniciales (como en el worksheet con A y C).
nstart = 25 Se prueban 25 conjuntos de centros iniciales aleatorios y se guarda la solución con menor tot.withinss. Reduce la mala suerte de una sola inicialización.

Sin set.seed(), los resultados numéricos pueden cambiar entre ejecuciones aunque nstart sea alto.


2. Qué datos son USArrests

Dataset incluido en R: 50 estados (filas) y cuatro variables numéricas:

Variable Interpretación
Murder Tasa de homicidios
Assault Tasa de asaltos
UrbanPop Porcentaje de población urbana
Rape Tasa de violación

La pregunta de clustering es descriptiva: ¿qué estados quedan juntos si medimos “similitud” por perfil de crimen y urbanización? No implica causalidad ni etiquetas “buenas” o “malas” fuera del contexto del análisis.


3. Por qué scale()

Las magnitudes difieren mucho (por ejemplo Assault suele ser grande en crudo frente a Murder). Sin escalar, la variable con mayor varianza domina las distancias euclídeas.

df <- scale(USArrests)

scale() centra cada columna (media 0) y la divide por su desviación típica (desvío 1) usando los datos presentes. Así cada variable pesa de forma comparable al calcular distancias en K-means.


4. Cómo funciona K-means por dentro (idea)

Paso Acción
1 Elegir K centroides iniciales.
2 Asignar cada punto al centroide más cercano (euclídeo en el espacio de x).
3 Recalcular cada centroide como media de los puntos del cluster.
4 Repetir 2–3 hasta que las asignaciones (o los centroides) se estabilicen.

5. Método del codo (elbow) y elección de K

En un gráfico habitual, el eje horizontal es k (número de clusters) y el vertical es total within-cluster sum of squares (tot.withinss) u otra medida de error dentro del grupo.

  • Cuando k crece, tot.withinss suele bajar (más clusters ⇒ puntos más cerca de “su” centro).
  • Se busca un “codo”: una k donde bajar k más aporta poco extra frente al coste de interpretar más grupos.

Muchos materiales de curso usan k = 4 con USArrests como ilustración cuando el codo sugiere cuatro grupos; la k óptima no es única: depende del criterio y del contexto.


6. Salida típica: tamaños de cluster

Tras kmeans(df, 4, nstart = 25) puede aparecer algo como:

K-means clustering with 4 clusters of sizes 8, 13, 16, 13
Cluster Estados (con esa solución)
1 8
2 13
3 16
4 13

8 + 13 + 16 + 13 = 50. Los números exactos dependen de la solución elegida entre los nstart intentos.


7. Cluster means (sobre datos escalados)

La tabla km$centers da el centroide de cada cluster en las mismas unidades que x. Si x = scale(USArrests):

Valor Lectura
Positivo Por encima de la media global de esa variable (en el conjunto escalado).
Negativo Por debajo de la media global.
Cerca de 0 Cerca del “promedio típico” del dataset.

Ejemplo de lectura: un cluster con Murder, Assault y Rape altos en positivo sugiere perfil de crimen relativamente alto respecto al resto de estados; otro con esos valores negativos sugiere crimen relativamente bajo.


8. Vector cluster

Asigna a cada fila un entero 1 … K:

Alabama 1
Alaska 4
...

Significa: Alabama va al cluster 1, Alaska al 4, etc. Es la partición final de esa llamada a kmeans.


9. withinss y tot.withinss

Within cluster sum of squares by cluster:
[1]  ...  ...  ...  ...

Cada componente mide la dispersión dentro de un cluster respecto a su centroide (K-means usa distancia euclídea al cuadrado en la definición interna de esa suma).

km$tot.withinss es la suma de esos valores: dispersión total dentro de los cuatro grupos.

Importante: tot.withinss no es el porcentaje 71.2 %. El porcentaje aparece en la línea (between_SS / total_SS = …) (siguiente apartado).


10. betweenss y totss

R muestra a menudo:

(between_SS / total_SS =  71.2 %)

Interpretación: qué fracción de la variación total del conjunto (sobre los datos transformados que entraron en kmeans) queda entre centroides frente a dentro de clusters. Un valor más alto indica clusters más separados en ese sentido (siempre con cautela: K alto puede inflar la métrica).

Ejemplo de frase para informe:

The 4-cluster solution explains about 71.2% of the total variation in the scaled USArrests data (según esa corrida concreta).

Con set.seed(123), nstart = 25 y centers = 4, una corrida reproducible da betweenss/totss ≈ 71.2% y tot.withinss ≈ 56.4 (no confundir ambos números).


11. Por qué aggregate() sobre USArrests sin escalar

aggregate(USArrests, by = list(cluster = km$cluster), mean)

Aquí las medias son por cluster pero en unidades reales (tasas y porcentajes), lo que facilita interpretar y comparar con tablas públicas.

Ejemplo reproducible (set.seed(123)):

cluster Murder Assault UrbanPop Rape
1 13.94 243.63 53.75 21.41
2 3.60 78.54 52.08 12.18
3 5.66 138.88 73.88 18.78
4 10.82 257.38 76.00 33.19

Lectura rápida ilustrativa:

Cluster Perfil (orientativo)
1 Criminalidad alta en varias tasas, urbanización moderada
2 Criminalidad baja
3 Criminalidad intermedia, urbanización alta
4 Asaltos y violación altos, urbanización alta

Los perfiles dependen de la solución K-means obtenida.


12. Código reproducible (resumen)

set.seed(123)

# Entrada: datos estandarizados (misma escala por variable)
df <- scale(USArrests)

# k = 4, varios intentos de inicio aleatorio
km <- kmeans(df, centers = 4, nstart = 25)

km$size           # tamaños por cluster
km$centers        # centroides en espacio escalado
km$cluster        # etiqueta por estado
km$withinss       # WSS dentro de cada cluster
km$tot.withinss   # suma total de WSS dentro
km$betweenss / km$totss   # fracción explicada entre grupos

# Medias en unidades originales (más legible)
aggregate(USArrests, by = list(cluster = km$cluster), mean)
size: 8, 13, 16, 13 
withinss:
[1]  8.316061 11.952463 16.212213 19.922437
tot.withinss: 56.40317 
(between_SS / total_SS =  71.2 %)
  cluster   Murder   Assault UrbanPop     Rape
1       1 13.93750 243.62500 53.75000 21.41250
2       2  3.60000  78.53846 52.07692 12.17692
3       3  5.65625 138.87500 73.87500 18.78125
4       4 10.81538 257.38462 76.00000 33.19231

(La salida completa incluye el vector de cluster por estado y la tabla de medias escaladas en km$centers.)


Qué conviene dominar (exam / worksheet)

Concepto Idea clave
K-means Partición en K grupos por centroides y distancias
K Número de clusters
scale() Comparar variables en escala similar
centers Entero K o matriz de centros iniciales
nstart Mejor entre varias inicializaciones aleatorias
Método del codo Ayuda a elegir K (subjetivo + contexto)
cluster Grupo asignado a cada observación
centers Centroide por cluster (en las unidades de x)
withinss Dispersión interna por cluster
tot.withinss Suma de dispersiones internas
betweenss/totss Separación relativa entre grupos

Frase corta: K-means reparte los datos en K grupos asignando cada observación al centro más cercano y moviendo los centros hasta que la partición se estabiliza; scale() evita que una sola variable domine por magnitud.


Ver también

  • K-means MacQueen, worksheet cuatro puntos (A–D) — centros iniciales como matriz y WSS a mano.