Agrupación jerárquica aglomerativa: ejemplo y análisis

Rodrigo Ricardo Publicado el 26 marzo, 2024 8 minutos y 30 segundos de lectura

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 kk. 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)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:

  1. Inicialización: cada punto es un clúster propio.
  2. Cálculo de distancias: se calcula la matriz de distancias entre todos los clústeres.
  3. Fusión: se encuentran los dos clústeres más cercanos y se unen.
  4. Actualización: se recalcula la matriz de distancias entre el nuevo clúster y los restantes.
  5. 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).

Métodos de enlace más comunes

MétodoCómo se calcula la distancia entre clústeresSensibilidad a outliers
Enlace simpleDistancia mínima entre cualquier punto de un clúster y cualquier punto del otroMuy sensible (efecto cadena)
Enlace completoDistancia máxima entre puntos de los dos clústeresPoco sensible (tiende a clústeres compactos)
Enlace promedioDistancia promedio entre todos los pares de puntosModerada
Método de WardMinimiza el incremento de la varianza intra-clústerPoco 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:

ABCDE
A00.7071.4145.6576.364
B0.70700.7074.9505.657
C1.4140.70704.2434.950
D5.6574.9504.24300.707
E6.3645.6574.9500.7070

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}CDE
{A,B}00.7074.9505.657
C0.70704.2434.950
D4.9504.24300.707
E5.6574.9500.7070

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.

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}DE
{A,B,C}04.2434.950
D4.24300.707
E4.9500.7070

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

VentajasDesventajas
No necesitas definir kkCostoso computacionalmente (O(n3)O(n3))
Dendrograma interpretableSensible a la elección del enlace
Puedes extraer cualquier número de clústeres despuésNo 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?

  1. Si tus datos tienen ruido o outliers → evita enlace simple. Usa completo o Ward.
  2. Si esperas clústeres alargados o con formas raras → enlace simple puede funcionar.
  3. Si buscas clústeres compactos y equilibrados → Ward es tu mejor opción.
  4. 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

  1. No normalizar los datos: si una variable va de 0 a 1000 y otra de 0 a 1, la primera dominará la distancia.
  2. Usar enlace simple con datos ruidosos: obtendrás un efecto cadena y clústeres sin sentido.
  3. Interpretar la altura del dendrograma como distancia solo si se usó distancia euclidiana: con otros enlaces, la altura no es directamente una distancia.
  4. 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:

  1. Explicar el funcionamiento paso a paso del algoritmo de agrupación jerárquica aglomerativa (bottom-up) y diferenciarlo del enfoque divisivo.
  2. Calcular manualmente una matriz de distancias y realizar fusiones sucesivas usando enlace simple, dado un pequeño conjunto de datos.
  3. 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.
  4. Comparar los métodos de enlace (simple, completo, promedio, Ward) en términos de sensibilidad a outliers y forma de los clústeres resultantes.
  5. Seleccionar el método de enlace apropiado según las características de un problema real (ruido, forma de clúster, escalas de variables).
  6. Implementar en Python (con scikit-learn y scipy) un modelo de clustering jerárquico aglomerativo y visualizar su dendrograma.
  7. 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...

Rodrigo Ricardo
Rodrigo Ricardo Editor y fundador