Cuando te enfrentas a un montón de datos sin etiquetas y necesitas encontrar grupos naturales sin saber cuántos hay, la agrupación jerárquica aglomerativa (AHA) se convierte en tu mejor aliada. A diferencia de K-means, aquí no decides el número de clústeres al inicio. Empiezas con cada punto como su propio grupo y los vas uniendo paso a paso. El resultado visual es un dendrograma, un árbol que te muestra toda la historia del agrupamiento. En este artículo verás un ejemplo numérico completo, un análisis paso a paso y los criterios de enlace más usados, todo pensado para que aprendas aplicándolo.
¿Qué es la agrupación jerárquica aglomerativa?
La palabra aglomerativa viene de aglomerar, es decir, unir. Parte de los elementos individuales y va fusionando los más cercanos hasta formar un solo gran grupo. Es el enfoque bottom-up (de abajo arriba). Su hermana, la agrupación divisiva, hace lo contrario: empieza con todo en un clúster y va dividiendo.
La gran ventaja de la AHA es que no necesitas predefinir k. Además, el dendrograma te permite explorar diferentes niveles de granularidad: desde muchos clústeres pequeños hasta uno solo gigante. La desventaja: es computacionalmente costosa (O(n3) en implementaciones ingenuas, aunque se puede mejorar), por lo que para millones de puntos no es la primera opción.
¿Cómo funciona paso a paso?
El algoritmo sigue estos pasos:
- Inicialización: cada punto es un clúster propio.
- Cálculo de distancias: se calcula la matriz de distancias entre todos los clústeres.
- Fusión: se encuentran los dos clústeres más cercanos y se unen.
- Actualización: se recalcula la matriz de distancias entre el nuevo clúster y los restantes.
- Repetición: se repiten pasos 2 a 4 hasta que solo quede un clúster.
El corazón del método está en el paso 4: ¿cómo medimos la distancia entre un clúster recién formado y los demás? Ahí entran los métodos de enlace (linkage).
Agrupación de habilidades mixtas: ventajas y desventajas
Métodos de enlace más comunes
| Método | Cómo se calcula la distancia entre clústeres | Sensibilidad a outliers |
|---|---|---|
| Enlace simple | Distancia mínima entre cualquier punto de un clúster y cualquier punto del otro | Muy sensible (efecto cadena) |
| Enlace completo | Distancia máxima entre puntos de los dos clústeres | Poco sensible (tiende a clústeres compactos) |
| Enlace promedio | Distancia promedio entre todos los pares de puntos | Moderada |
| Método de Ward | Minimiza el incremento de la varianza intra-clúster | Poco sensible (busca esfericidad) |
Para entenderlo bien, nada como un ejemplo numérico paso a paso.
Ejemplo completo: 5 puntos en 2D
Imaginemos 5 puntos con sus coordenadas:
- A = (1, 1)
- B = (1.5, 1.5)
- C = (2, 2)
- D = (5, 5)
- E = (5.5, 5.5)
Visualmente, A, B y C forman un grupo natural (cerca de la diagonal inferior izquierda), y D y E otro grupo (diagonal superior derecha). Usaremos distancia euclidiana y enlace simple para ilustrar.
Paso 0: matriz de distancias inicial
Calculamos distancias entre cada par:
- d(A,B) = √((1-1.5)²+(1-1.5)²) = √(0.25+0.25) = √0.5 ≈ 0.707
- d(A,C) = √((1-2)²+(1-2)²) = √(1+1) = √2 ≈ 1.414
- d(A,D) = √((1-5)²+(1-5)²) = √(16+16) = √32 ≈ 5.657
- d(A,E) = √((1-5.5)²+(1-5.5)²) = √(20.25+20.25) = √40.5 ≈ 6.364
- d(B,C) = √((1.5-2)²+(1.5-2)²) = √(0.25+0.25) = 0.707
- d(B,D) = √((1.5-5)²+(1.5-5)²) = √(12.25+12.25) = √24.5 ≈ 4.950
- d(B,E) = √((1.5-5.5)²+(1.5-5.5)²) = √(16+16) = 5.657
- d(C,D) = √((2-5)²+(2-5)²) = √(9+9) = √18 ≈ 4.243
- d(C,E) = √((2-5.5)²+(2-5.5)²) = √(12.25+12.25) = 4.950
- d(D,E) = √((5-5.5)²+(5-5.5)²) = √(0.25+0.25) = 0.707
Matriz resumida:
Base de datos jerárquica: modelo y definición
| A | B | C | D | E | |
|---|---|---|---|---|---|
| A | 0 | 0.707 | 1.414 | 5.657 | 6.364 |
| B | 0.707 | 0 | 0.707 | 4.950 | 5.657 |
| C | 1.414 | 0.707 | 0 | 4.243 | 4.950 |
| D | 5.657 | 4.950 | 4.243 | 0 | 0.707 |
| E | 6.364 | 5.657 | 4.950 | 0.707 | 0 |
Paso 1: primera fusión
La distancia más pequeña es 0.707. Hay varios pares: (A,B), (B,C), (D,E). Elegimos uno arbitrariamente, por ejemplo A y B. Los fusionamos en un clúster {A,B}. Altura del dendrograma en este nivel: 0.707.
Paso 2: actualizar distancias (enlace simple)
Para enlace simple, la distancia entre {A,B} y otro clúster X es el mínimo de las distancias desde A a X y desde B a X.
- d({A,B}, C) = min( d(A,C)=1.414 , d(B,C)=0.707 ) = 0.707
- d({A,B}, D) = min( d(A,D)=5.657 , d(B,D)=4.950 ) = 4.950
- d({A,B}, E) = min( d(A,E)=6.364 , d(B,E)=5.657 ) = 5.657
Ahora los clústeres son: {A,B}, C, D, E.
Matriz de distancias actualizada:
| {A,B} | C | D | E | |
|---|---|---|---|---|
| {A,B} | 0 | 0.707 | 4.950 | 5.657 |
| C | 0.707 | 0 | 4.243 | 4.950 |
| D | 4.950 | 4.243 | 0 | 0.707 |
| E | 5.657 | 4.950 | 0.707 | 0 |
Paso 3: segunda fusión
Mínima distancia: 0.707 entre {A,B} y C, y también entre D y E. Elegimos {A,B} con C. Formamos {A,B,C}. Altura: 0.707.
Agrupación jerárquica divisiva: ejemplo y análisis
Paso 4: actualizar distancias con {A,B,C}
Enlace simple: distancia entre {A,B,C} y otro clúster = mínimo de distancias desde A, B o C hacia ese clúster.
- d({A,B,C}, D) = min( d(A,D)=5.657, d(B,D)=4.950, d(C,D)=4.243 ) = 4.243
- d({A,B,C}, E) = min( d(A,E)=6.364, d(B,E)=5.657, d(C,E)=4.950 ) = 4.950
Clústeres actuales: {A,B,C}, D, E.
Matriz:
| {A,B,C} | D | E | |
|---|---|---|---|
| {A,B,C} | 0 | 4.243 | 4.950 |
| D | 4.243 | 0 | 0.707 |
| E | 4.950 | 0.707 | 0 |
Paso 5: tercera fusión
Mínima distancia: 0.707 entre D y E. Fusionamos D y E en {D,E}. Altura: 0.707.
Clústeres: {A,B,C} y {D,E}.
Paso 6: última fusión
Distancia entre {A,B,C} y {D,E} = mínimo entre puntos: min(4.243, 4.950) = 4.243. Fusionamos todo en un solo clúster. Altura final: 4.243.
Dendrograma resultante
El dendrograma (imaginario aquí, pero dibujable) mostraría:
- Nivel 0.707: se unen A-B, luego B-C (o D-E en paralelo).
- Un escalón más arriba, a altura 0.707, se unen {A,B,C} por un lado y {D,E} por otro.
- Finalmente a altura 4.243 se unen los dos grandes grupos.
Si cortamos el dendrograma a una altura entre 0.707 y 4.243, obtenemos 2 clústeres perfectos: {A,B,C} y {D,E}. Esto confirma que el algoritmo detectó la estructura natural.
Análisis de los resultados
El enlace simple produjo un efecto de encadenamiento (chain effect): como B está cerca de A y de C, se fueron agregando de a uno. Para este conjunto pequeño funcionó bien, pero en datos ruidosos el enlace simple tiende a formar clústeres alargados y conectados. Si hubiéramos usado enlace completo, las distancias habrían sido mayores y quizás los grupos se habrían formado de forma más compacta. Con Ward, el resultado sería similar porque los grupos están bien separados.
Un aspecto clave: la escala del dendrograma importa. La altura de fusión entre {A,B,C} y {D,E} es 4.243, mucho mayor que las fusiones internas (0.707). Eso indica una separación clara entre grupos.
Aplicaciones reales de la agrupación jerárquica aglomerativa
- Bioinformática: agrupar genes con perfiles de expresión similares. El dendrograma ayuda a ver familias de genes.
- Marketing: segmentar clientes sin saber cuántos segmentos existen a priori.
- Procesamiento de imágenes: agrupar píxeles por color (superpíxeles).
- Análisis de textos: agrupar documentos por similitud de contenido (usando distancia coseno).
Ventajas y desventajas en formato práctico
| Ventajas | Desventajas |
|---|---|
| No necesitas definir k | Costoso computacionalmente (O(n3)) |
| Dendrograma interpretable | Sensible a la elección del enlace |
| Puedes extraer cualquier número de clústeres después | No escala bien a millones de puntos |
| Determinista (si no hay empates) | Diferentes enlaces dan diferentes formas |
Consejos para estudiantes: ¿cómo elegir el método de enlace?
- Si tus datos tienen ruido o outliers → evita enlace simple. Usa completo o Ward.
- Si esperas clústeres alargados o con formas raras → enlace simple puede funcionar.
- Si buscas clústeres compactos y equilibrados → Ward es tu mejor opción.
- Siempre normaliza tus datos si las variables tienen diferentes escalas (por ejemplo, usando Z-score). De lo contrario, las distancias las dominarán las variables con mayor rango.
Implementación rápida en Python (scikit-learn)
python
from sklearn.cluster import AgglomerativeClustering import numpy as np # Datos del ejemplo X = np.array([[1,1], [1.5,1.5], [2,2], [5,5], [5.5,5.5]]) # Modelo con enlace simple y 2 clústeres modelo = AgglomerativeClustering(n_clusters=2, linkage='single') etiquetas = modelo.fit_predict(X) print(etiquetas) # [0 0 0 1 1] → correcto
Para visualizar el dendrograma con scipy:
python
from scipy.cluster.hierarchy import dendrogram, linkage import matplotlib.pyplot as plt Z = linkage(X, method='single') dendrogram(Z, labels=['A','B','C','D','E']) plt.show()
Errores comunes que cometen los estudiantes al aplicar AHA
- No normalizar los datos: si una variable va de 0 a 1000 y otra de 0 a 1, la primera dominará la distancia.
- Usar enlace simple con datos ruidosos: obtendrás un efecto cadena y clústeres sin sentido.
- Interpretar la altura del dendrograma como distancia solo si se usó distancia euclidiana: con otros enlaces, la altura no es directamente una distancia.
- Cortar el dendrograma sin mirar las distancias relativas: busca el salto más grande (gap) para decidir el número de clústeres.
Conclusión
La agrupación jerárquica aglomerativa es una herramienta poderosa y visualmente intuitiva para descubrir estructuras ocultas en datos sin etiquetar. A través del ejemplo numérico con 5 puntos, hemos visto cómo las distancias se actualizan paso a paso según el método de enlace. El dendrograma resultante no solo te dice cuántos grupos existen, sino también cómo se relacionan entre sí. La clave está en elegir bien el método de enlace y siempre preprocesar los datos. Ahora ya estás listo para aplicarlo en tus propios proyectos de análisis de datos.
Resultados de aprendizaje
Después de leer este artículo, el estudiante será capaz de:
- Explicar el funcionamiento paso a paso del algoritmo de agrupación jerárquica aglomerativa (bottom-up) y diferenciarlo del enfoque divisivo.
- Calcular manualmente una matriz de distancias y realizar fusiones sucesivas usando enlace simple, dado un pequeño conjunto de datos.
- Interpretar un dendrograma identificando la altura de fusión, el número óptimo de clústeres mediante el salto más grande y las relaciones jerárquicas entre grupos.
- Comparar los métodos de enlace (simple, completo, promedio, Ward) en términos de sensibilidad a outliers y forma de los clústeres resultantes.
- Seleccionar el método de enlace apropiado según las características de un problema real (ruido, forma de clúster, escalas de variables).
- Implementar en Python (con scikit-learn y scipy) un modelo de clustering jerárquico aglomerativo y visualizar su dendrograma.
- Evitar errores comunes como la falta de normalización o la mala interpretación de la altura del dendrograma.
Explora más sobre este tema
Selecciona un tema y sigue aprendiendo...
