1. 🏗️ 계층적 군집화란?
계층적 군집화는 데이터를 계층적으로 묶어 나가는 방식으로, 크게 병합(Agglomerative) 과 분할(Divisive) 두 가지 방식이 있습니다.
- 🧩 병합형(Agglomerative Clustering): 각 데이터를 개별 클러스터로 시작한 후, 가까운 것들끼리 점진적으로 병합하는 방식 (Bottom-Up)
- 🔪 분할형(Divisive Clustering): 전체 데이터를 하나의 클러스터로 시작한 후, 점진적으로 세분화하는 방식 (Top-Down)
일반적으로 병합형 군집화가 더 널리 사용됩니다.
2. 📊 덴드로그램(Dendrogram)이란?
덴드로그램은 계층적 군집화에서 데이터들이 어떻게 합쳐지거나 분할되는지를 보여주는 트리 형태의 다이어그램입니다. 덴드로그램을 통해 군집이 형성되는 과정과 최적의 클러스터 개수를 결정할 수 있습니다.
덴드로그램을 해석하는 방법:
- 높이(Height): 두 군집이 합쳐지는 거리를 나타냄. 높이가 높을수록 서로 다른 그룹임을 의미함.
- 가지(Branches): 유사한 데이터들이 먼저 묶이고, 점차적으로 더 큰 군집으로 병합됨.
- 자르기(Cutting the Dendrogram): 특정 높이에서 가지를 자르면 적절한 클러스터 개수를 결정할 수 있음.
덴드로그램은 계층적 군집화의 핵심적인 도구로, 데이터를 분석할 때 매우 유용하게 활용됩니다.
3. 🖥️ 계층적 군집화의 구현 (Python)
Python에서는 scipy 와 sklearn 라이브러리를 이용하여 계층적 군집화를 쉽게 구현할 수 있습니다. 예제 데이터를 사용하여 직접 실습해 보겠습니다.
(1) 🗂️ 데이터 준비
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import LabelEncoder
# 데이터 로드
df = pd.read_csv("Mall_Customers.csv")
# CustomerID는 분석에 필요 없으므로 제외
X = df.iloc[:, 1:].copy()
# 성별(Genre) 데이터를 숫자로 변환
encoder = LabelEncoder()
X['Genre'] = encoder.fit_transform(X['Genre'])
(2) 📊 덴드로그램 확인 후 클러스터 개수 결정하기
import scipy.cluster.hierarchy as sch
plt.figure(figsize=(10, 5))
sch.dendrogram(sch.linkage(X, method='ward'))
plt.title('Dendrogram')
plt.xlabel('Customers')
plt.ylabel('Distance')
plt.show()
6개 클러스터가 적합하다고 결정!
(3) 🏷️ 계층적 군집화 수행
from sklearn.cluster import AgglomerativeClustering
# 클러스터 개수 결정 (예: 6개)
hc = AgglomerativeClustering(n_clusters=6)
y_pred = hc.fit_predict(X)
# 결과 저장
df['Group'] = y_pred
df.head()
(4) 🎨 시각화
plt.scatter(X[y_hc == 0, 0], X[y_hc == 0, 1], s = 100, c = 'red', label = 'Cluster 1')
plt.scatter(X[y_hc == 1, 0], X[y_hc == 1, 1], s = 100, c = 'blue', label = 'Cluster 2')
plt.scatter(X[y_hc == 2, 0], X[y_hc == 2, 1], s = 100, c = 'green', label = 'Cluster 3')
plt.scatter(X[y_hc == 3, 0], X[y_hc == 3, 1], s = 100, c = 'cyan', label = 'Cluster 4')
plt.scatter(X[y_hc == 4, 0], X[y_hc == 4, 1], s = 100, c = 'magenta', label = 'Cluster 5')
plt.title('Clusters of customers')
plt.xlabel('Annual Income (k$)')
plt.ylabel('Spending Score (1-100)')
plt.legend()
plt.show()
4. ⚖️ 계층적 군집화의 장단점
✅ 장점
- ✔️ 클러스터 개수를 미리 정하지 않아도 됨
- 📊 덴드로그램을 통해 데이터의 군집 구조를 쉽게 파악 가능
- 🔀 다양한 거리 측정 방법과 연결 방식을 활용 가능
❌ 단점
- 🐢 데이터 개수가 많아질수록 연산량이 많아짐 (O(n²) 복잡도)
- ⚠️ 데이터 추가, 삭제 시 재계산이 필요함
- 🔄 병합된 군집을 되돌릴 수 없음
5. 🎯 결론
계층적 군집화는 데이터의 계층적 구조를 분석할 때 유용한 방법입니다. 특히, 군집 개수를 사전에 결정하기 어려운 경우 덴드로그램을 활용하여 최적의 클러스터 개수를 결정할 수 있다는 장점이 있습니다.
하지만 데이터 크기가 크다면 K-means와 같은 다른 군집화 방법을 고려하는 것이 효율적일 수도 있습니다. 적절한 방법을 선택하여 데이터 분석을 수행하는 것이 중요합니다.
이번 포스팅에서는 Python을 활용한 계층적 군집화의 개념과 실습을 소개해 보았습니다. 도움이 되셨길 바랍니다! 🚀