데이터 분석/데이터 사이언스
데이터 사이언스 - 8. 비지도 학습 (Unsupervised Learning) (8.1 군집 분석 (Clustering))
개발_노트
2025. 3. 20. 17:03
8.1 군집 분석 (Clustering)
군집 분석(Clustering)은 비지도 학습(unsupervised learning)의 한 종류로, 데이터를 유사한 특성을 가진 그룹(클러스터)으로 자동으로 분류하는 기법이다.
라벨이 없는 데이터를 분석하는 데 사용되며, 고객 세분화, 이상 탐지, 이미지 분할 등 다양한 분야에서 활용된다.
이 장에서는 대표적인 군집 분석 기법인 K-Means 클러스터링과 계층적 클러스터링을 다룬다.
8.1.1 K-Means 클러스터링 (K-Means Clustering)
1) K-Means란?
K-Means는 데이터를 K개의 클러스터로 자동 분류하는 대표적인 군집 알고리즘이다.
각 데이터 포인트는 가장 가까운 중심점(centroid)을 기준으로 클러스터에 할당된다.
2) K-Means 알고리즘 과정
- 군집 개수(K)를 지정
- K개의 중심점(초기 centroid)을 랜덤하게 설정
- 각 데이터 포인트를 가장 가까운 중심점에 할당하여 클러스터 구성
- 클러스터의 중심점을 새롭게 계산
- 중심점의 변화가 특정 임계값(tol) 이하로 감소하거나 최대 반복 횟수(max_iter)에 도달할 때까지 반복
📌 Python 코드 예제 (K-Means 클러스터링 적용)
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
# 샘플 데이터 생성 (3개의 클러스터)
X, _ = make_blobs(n_samples=300, centers=3, cluster_std=1.0, random_state=42)
# K-Means 모델 생성 및 학습
kmeans = KMeans(n_clusters=3, tol=1e-4, max_iter=300, random_state=42) # tol: 임계값, max_iter: 최대 반복 횟수
kmeans.fit(X)
# 예측 (각 데이터의 군집 할당)
labels = kmeans.labels_
# 중심점 가져오기
centroids = kmeans.cluster_centers_
# 시각화
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', alpha=0.6, edgecolors='k')
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', marker='X', s=200, label="Centroids")
plt.title("K-Means Clustering Example")
plt.legend()
plt.show()
✅ K-Means 클러스터링의 특징
- 빠르고 효율적인 군집화 알고리즘
- K(군집 개수)를 사전에 설정해야 함
- 구 형태로 분포된 데이터에 효과적
- 초기 중심점 선택에 따라 결과가 달라질 수 있음 → 여러 번 실행하여 최적의 클러스터 찾기 필요
3) 최적의 K 값 선택 (엘보우 기법, Elbow Method)
K 값(클러스터 개수)을 선택하는 방법 중 가장 널리 사용되는 기법은 엘보우 기법(Elbow Method)이다.
이 방법은 K 값을 변화시키면서 오차 제곱합(SSE, Sum of Squared Errors)을 측정하여, SSE가 급격히 감소하는 지점을 최적의 K 값으로 선택한다.
📌 Python 코드 예제 (엘보우 기법 활용)
sse = []
for k in range(1, 10):
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans.fit(X)
sse.append(kmeans.inertia_) # inertia_는 SSE 값
# 시각화
plt.plot(range(1, 10), sse, marker='o')
plt.xlabel("Number of Clusters (K)")
plt.ylabel("SSE (Inertia)")
plt.title("Elbow Method for Optimal K")
plt.show()
✅ 엘보우 기법 해석
- 그래프에서 급격한 감소가 멈추는 지점(무릎, elbow)이 최적의 K 값
- 너무 많은 K를 선택하면 과적합(overfitting) 위험이 있음
8.1.2 계층적 클러스터링 (Hierarchical Clustering)
1) 계층적 클러스터링이란?
- 데이터 간 유사도를 기반으로 계층적으로 군집을 형성하는 알고리즘
- 데이터 포인트 간 거리를 계산하여 비슷한 것끼리 묶어 나가는 방식
- 트리 형태의 덴드로그램(Dendrogram)을 통해 군집 구조를 시각적으로 표현 가능
2) 계층적 클러스터링 알고리즘 유형
- 병합적 클러스터링(Agglomerative Clustering):
- 각 데이터 포인트를 개별 클러스터로 시작
- 가까운 클러스터끼리 합쳐 나감
- 일반적으로 많이 사용됨
- 분할적 클러스터링(Divisive Clustering):
- 전체 데이터를 하나의 클러스터로 시작
- 점점 세분화하여 여러 개의 클러스터로 나눔
3) 계층적 클러스터링 과정
- 각 데이터 포인트를 개별 클러스터로 시작
- 두 개의 가장 가까운 클러스터를 합침
- 위 과정을 반복하여 하나의 클러스터가 될 때까지 수행
- 덴드로그램(Dendrogram)으로 군집 형성 과정 시각화 가능
📌 Python 코드 예제 (계층적 클러스터링 적용)
import scipy.cluster.hierarchy as sch
from sklearn.cluster import AgglomerativeClustering
# 덴드로그램 시각화
plt.figure(figsize=(10, 5))
sch.dendrogram(sch.linkage(X, method="ward"))
plt.title("Dendrogram (Hierarchical Clustering)")
plt.xlabel("Data Points")
plt.ylabel("Distance")
plt.show()
# 계층적 클러스터링 모델 적용 (3개 군집)
hierarchical = AgglomerativeClustering(n_clusters=3)
labels = hierarchical.fit_predict(X)
# 결과 시각화
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap="viridis", alpha=0.6, edgecolors='k')
plt.title("Hierarchical Clustering Example")
plt.show()
✅ 계층적 클러스터링의 특징
- 덴드로그램을 통해 데이터의 군집 구조를 시각적으로 분석 가능
- K 값을 미리 정하지 않아도 됨
- 데이터 개수가 많아지면 계산량 증가 (느림)
8.1.3 K-Means vs 계층적 클러스터링 비교
비교 항목 | K-Means | 계층적 클러스터링 |
군집 개수(K) | 미리 지정 필요 | 자동 결정 가능 |
속도 | 빠름 (대규모 데이터 적합) | 느림 (작은 데이터 적합) |
데이터 구조 | 원형 분포 데이터에 적합 | 다양한 형태의 데이터에 적합 |
시각적 분석 | 덴드로그램 없음 | 덴드로그램 제공 |
초기 설정 | 초기 중심점 선택 필요 | 초기 설정 불필요 |
✅ 언제 K-Means를 사용할까?
- 데이터가 크고 원형 분포를 이루는 경우
- 빠른 속도가 필요한 경우
✅ 언제 계층적 클러스터링을 사용할까?
- 작은 데이터에서 군집 구조를 시각적으로 분석하고 싶은 경우
- K 값을 미리 알 수 없는 경우