목차
1. Hierarchical Clustering(계층적 군집화)란
2. 계층적 군집화의 핵심 특징
3. 덴드로그램(Dendrogram)이란
4. 계층적 군집화의 두 가지 방식
4-1 병합형 클러스터링(Agglomerative Clustering)
4-2 분할형 클러스터링(Divisive Clustering)
5. 클러스터 간 거리 계산 방법(Linkage)
6. 병합형 계층적 군집화 예제
1. Hierarchical Clustering(계층적 군집화)란
Hierarchical Clustering(계층적 군집화)은 데이터들 사이의 유사성을 기준으로 비슷한 데이터끼리 묶어 계층적인 구조로 표현하는 비지도 학습 기법이다.
여기서 비지도 학습이란 정답 라벨이 없는 데이터에서 패턴이나 구조를 스스로 찾는 방법을 의미한다.
계층적 군집화의 가장 큰 특징은 결과가 단순히 몇 개의 군집으로 끝나는 것이 아니라, 군집이 합쳐지거나 나뉘는 과정을 트리(Tree) 구조로 표현할 수 있다는 점이다. 이 트리 구조를 덴드로그램(Dendrogram)이라고 한다.
즉, 계층적 군집화는 단순히 몇 개(K)의 그룹으로 묶는지만 보는 것이 아닌, 데이터들이 어떤 순서와 기준으로 묶이는지까지 시각적으로 확인할 수 있는 방법이라고 볼 수 있다.
2. 계층적 군집화의 핵심 특징
계층적군집화는 군집의 형성과정을 단계적으로 보여준다는 점에서 K-Means 같은 다른 군집화 기법과 차이가 있다.
장점
- 클러스터 개수 K를 처음부터 반드시 정하지 않아도 된다.
- 덴드로그램을 통해 데이터 간 관계를 시각적으로 확인할 수 있다.
- 데이터가 어떤 구조로 묶이는지 파악하기 좋다. (탐색적 데이터 분석에 유용)
단점
- 데이터 개수가 많아질수록 계산량이 커진다.
- 한 번 합쳐진 군집이나 나뉜 군집은 일반적으로 다시 되돌리기 어렵다.
- 거리 계산 방식과 연결 방식에 따라 결과가 꽤 달라질 수 있다.
주로 사용되는 경우
- 정답이 없는 데이터에서 그룹 구조를 탐색하고 싶을 때 자주 사용된다.
- 예시
- 고객 세분화
- 문서 분류
- 이미지 그룹화
- 유전자 데이터 분석 등
3. 덴드로그램(Dendrogram)이란
덴드로그램은 계층적 군집화 결과를 보여주는 트리 형태의 시각화 그래프이다.
즉, 어떤 데이터끼리 먼저 묶였는지, 그리고 그 군집들이 나중에 어떻게 더 큰 군집으로 합쳐졌는지를 보여주는 그림이다.
덴드로그램에서 중요한 것은 세로축의 높이이다.
이 높이는 보통 군집 간 거리 또는 비유사도를 의미한다.
- 낮은 높이에서 합쳐지면 서로 매우 비슷한 데이터
- 높은 높이에서 합쳐지면 덜 비슷한 데이터
따라서 덴드로그램을 보고 적절한 높이세어 선을 그으면, 그 선 아래에서 나뉘는 군집 개수를 기준으로 적절한 클러스터 수를 결정할 수 있다.
즉, 덴드로그램은 시각화의 기능 뿐만 아니라 '몇 개의 군집으로 나눌지 판단'하는 도구이다.
4. 계층적 군집화의 두 가지 방식
계층적 군집화는 크게 병합형(Agglomerative)과 분할형(Divisive) 두 가지로 나눌 수 있다.
4-1 병합형 클러스터링(Agglomerative Clustering)
병합형 클러스터링은 각 데이터를 처음에는 하나의 개별 군집으로 보고 시작한 뒤, 가장 가까운 군집끼리 하나씩 합쳐 가는 방식이다.
즉, 처음에는 데이터가 모두 따로 떨어져 있다가 점점 묶여서 최종적으로 하나의 큰 군집이 된다.
작동 방식
- 각 데이터 포인트를 하나의 군집으로 시작한다.
- 가장 가까운 두 군집을 찾는다.
- 그 두 군집을 하나로 합친다.
- 모든 데이터가 하나의 군집이 될 때까지 반복한다.
이 방식은 아래에서 위로 올라가며 군집을 만들기 때문에, bottom-up 방식이라고도 한다.
4-2 분할형 클러스터링(Divisive Clustering)
분할형 클러스터링은 병합형과 반대로 처음에는 모든 데이터를 하나의 큰 군집으로 놓고 시작한 뒤, 점점 여러 개의 작은 군집으로 나누는 방식이다.
즉 처음에는 하나였던 집단을 점차 세분화한다.
작동 방식
- 전체 데이터를 하나의 군집으로 시작한다.
- 가장 이질적인 군집을 선택한다.
- 그 군집을 둘 이상의 하위 군집으로 나눈다.
- 원하는 개수 또는 조건에 도달할 때까지 반복한다.
이 방식은 위에서 아래로 쪼개는 구조이므로, top-down 방식이라고도 한다.
* 참고
실무나 교육에서는 병합형이 훨씬 자주 소개 된다.
분할형은 개념적으로 중요하지만, Scikit-learn에서 병합형처럼 바로 제공되는 대표 구현이 많지 않아 직접 로직을 구성해서 설명하는 경우가 많다.
5. 클러스터 간 거리 계산 방법(Linkage)
계층적 군집화에서는 '어떤 군집끼리 가깝다고 볼 것인가?'가 중요하다.
이때 사용하는 기준이 연결 방식(Linkage)이다.
5-1 최단 연결법(Single Linkage)
두 군집에 속한 데이터들 중 가장 가까운 두 점 사이의 거리를 군집 간 거리로 사용한다.
- 장점 : 가느다란 형태의 군집도 잘 잡는다.
- 단점 : 중간에 점들이 이어져 있으면 멀리 있는 군집도 하나처럼 연결되는 chaining 현상이 발새알 수 있다.
5-2 최장 연결법(Complete Linkage)
두 군집에 속한 데이터들 중 가장 먼 두 점 사이의 거리를 군집 간 거리로 사용한다.
- 장점 : 군집 내부가 비교적 조밀하게 형성된다.
- 단점: 이상치에 민감할 수 있다.
5-3 평균 연결법(Average Linkage)
두 군집의 모든 점들 사이 거리의 평균값을 군집 간 거리로 사용한다.
- Single과 Complete의 중간 성격을 가진다.
- 비교적 균형 잡힌 결과를 주는 편이다.
5-4 Ward 방식
군집 간 단순 거리보다, 군집을 합쳤을 때 군집 내부 분산이 얼마나 증가하는지를 기준으로 병합한다.
- 군집 내부의 응집도를 잘 유지하는 편이다.
6. 병합형 계층적 군집화 예제
예제 1) 라이브러리 불러오기
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from scipy.cluster.hierarchy import linkage, dendrogram, fcluster
| matplotlib.pyplot | 그래프를 그릴 때 사용하는 라이브러리 산점도나 덴드로그램 시각화 시 필요하다. |
| make_blobs | 군집화 실습용 데이터를 쉽게 만들 수 있는 함수 |
| linkage | 어떤 순서로 군집을 병할할지 계산 |
| dendrogram | 병합 과정을 트리 형태로 그림 |
| fculster | 최종적으로 몇 개 군집으로 나눌지 결정해서 라벨 부여 |
예제 2) 데이터 생성
X, _ = make_blobs(
n_samples=120,
centers=3,
cluster_std=0.9,
random_state=21
)
| X | 실제 입력 데이터 |
| _ | 원래 생성된 정답 군집 번호가 들어가는 자리 이 예제는 비지도학습 예제이므로 사용하지 않아 _로 받는다. |
| n_samples=120 | 데이터 포인트를 120개 만든다. |
| center=3 | 중심점 3개를 기준으로 데이터가 생성된다. |
| cluster_std=0.9 | 각 군집이 중심점 주변으로 얼마나 퍼질지 정하는 값 값이 작으면 군집이 더 조밀이하고, 값이 크면 군집이 더 퍼진다. |
| random_state=42 | 난수 고정 값 실행할 때마다 같은 데이터가 생성되도록 해준다. 실습 코드에서는 재현성을 위해 자주 넣는다. |
예제 3) 원본 데이터 시각화
plt.figure(figsize=(6, 5))
plt.scatter(X[:, 0], X[:, 1], s=40)
plt.title("Original Data")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()
| plt.figure(figsize=(6, 5)) | 그래프 크기를 설정한다. |
| plt.scatter(...) | 산점도를 그린다. |
| X[: , 0] | 모든 행의 첫 번째 열 x축 값 |
| X[: , 1] | 모든 행의 두 번째 열 y축 값 |
| s=20 | 점의 크기 |
예제 3) 출력 결과

예제 4) 계층적 군집화 수행
Z = linkage(X, method='ward')
| linkage(...) | 계층적 군집화에서 어떤 점 또는 군집이 어떤 순서로 병합되는지 계산해준다. |
| X | 입력 데이터 |
| method='ward' | Ward 방식을 사용한다. |
| Z | 덴드로그램을 그리거나, 클러스터 라벨을 만들 때 사용한다. |
예제 5) 덴드로그램 시각화
plt.figure(figsize=(10, 5))
dendrogram(Z)
plt.title("Dendrogram (Hierarchical Clustering)")
plt.xlabel("Data Index")
plt.ylabel("Distance")
plt.show()
| plt.figure(figsize=(10,5)) | 새로운 그래프 창을 만든다. 그래프의 가로와 세로 길이를 10, 5로 설정한다. |
| dendrogram(Z) | 계층적 군집화 결과 Z를 이용해서 덴드로그램을 그린다. |
| plt.title(...) | 그래프의 제목을 설정한다. |
| plt.xlabel(...) | x축 이름을 설정한다. |
| plt.ylabel(...) | y축 이름을 설정한다. |
| plt.show() | 그래프를 화면에 출력한다. |
예제 5) 출력 결과
dendrogram(Z)는 linkage() 함수로 계산한 군집 병합 결과를 트리 형태로 시각화하는 함수이다.
덴드로그램의 x축은 데이터의 인덱스 또는 리프 순서를, y축은 군집이 병합될 때의 거리(distance)를 나타낸다.
따라서 덴드로그램을 통해 어떤 데이터들이 먼저 묶이고, 어느 높이에서 군집을 나누는 것이 적절한지 확인할 수 있다.

+
데이터의 개수가 많을 경우 덴드로그램의 leaf(데이터 노드)가 매우 많이 생성되어 그래프가 복잡해지고, 적절한 클러스터 개수를 파악하기 어려울 수 있다.
따라서 아래와 같이 truncate_mode 옵션을 사용하여 덴드로그램을 요약하여 확인할 수 있다.
plt.figure(figsize=(12,6))
dendrogram(
Z,
truncate_mode='lastp', # 덴드로그램 요약
p=12, # leaf를 12개만 보여줌
leaf_rotation=45, # x축 라벨을 45도 기울임
leaf_font_size=10, # leaf 글자 크기
show_leaf_counts=True # 클러스터 안 데이터 개수를 표시함
)
plt.title("Hierarchical Clustering Dendrogram")
plt.xlabel("Cluster Groups")
plt.ylabel("Distance")
plt.show()

예제 6) 클러스터 개수 결정
계층 구조를 바탕으로 최종 군집 번호를 부여한다.
labels = fcluster(Z, t=3, criterion='maxclust')
| fcluster(...) | |
| Z | 병합 정보 |
| t=3 | 3개의 군집으로 나누겠다는 의미 |
| criterion='maxclust' | 최대 군집 개수를 기준으로 나누겠다는 의미 |
예제 7) 결과 시각화
plt.figure(figsize=(6, 5))
plt.scatter(X[:, 0], X[:, 1], c=labels, s=40)
plt.title("Agglomerative Hierarchical Clustering Result")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()
| c=labels | 데이터 포인트의 색(color)을 labels 값에 따라 다르게 표시한다. *참고 labels = fcluster(Z, t=3, criterion='maxclust') |
예제 7) 출력 결과

'머신러닝&딥러닝' 카테고리의 다른 글
| 머신러닝 & 딥러닝 기초 27편 | 차원축소(Dimensionality Reduction) (1) | 2026.03.19 |
|---|---|
| 머신러닝 기초 26편 | DBSCAN과 Isolation Forest (밀도 기반 군집화와 이상치 탐지) (1) | 2026.03.19 |
| 머신러닝 & 딥러닝 기초 24편 | K-Means 알고리즘 완전 정리 (Clustering / 비지도학습) (1) | 2026.03.18 |
| 머신러닝 & 딥러닝 기초 23편 | 비지도학습 - 군집화(Clustering) (0) | 2026.03.18 |
| 머신러닝 & 딥러닝 기초 22편 | KNN 알고리즘 개념부터 Scikit-learn 구현까지 (0) | 2026.03.17 |