056 클러스터링의 이해
키워드: 클러스터링, 비지도 학습
개요
클러스터링은 비지도 학습의 대표적인 기법으로, 레이블 없이 데이터를 유사한 그룹으로 나누는 작업입니다. 이 글에서는 클러스터링의 개념과 활용 사례를 알아봅니다.
실습 환경
- Python 버전: 3.11 권장
- 필요 패키지:
pycaret[full]>=3.0
클러스터링이란?
비슷한 특성을 가진 데이터 포인트를 같은 그룹(클러스터)으로 묶는 것입니다.
분류 vs 클러스터링
분류 (지도 학습):
데이터 → [모델] → 미리 정의된 레이블 (개/고양이)
학습 데이터에 정답 필요
클러스터링 (비지도 학습):
데이터 → [모델] → 발견된 그룹 (그룹 A/B/C)
정답 없이 패턴 발견
클러스터링 활용 사례
| 분야 | 활용 사례 |
|---|---|
| 마케팅 | 고객 세분화, 타겟 마케팅 |
| 소매 | 상품 그룹화, 진열 최적화 |
| 의료 | 환자 그룹화, 질병 패턴 발견 |
| 금융 | 리스크 그룹화, 사기 패턴 탐지 |
| 이미지 | 이미지 분할, 색상 양자화 |
| 텍스트 | 문서 군집화, 토픽 모델링 |
클러스터링의 종류
1. 분할 기반 (Partitioning)
데이터를 K개의 클러스터로 분할:
# 056 K-Means
# 056 - 가장 대표적
# 056 - 클러스터 중심(centroid) 기반
# 056 - K 값 미리 지정 필요
2. 계층적 (Hierarchical)
데이터 간 거리 기반 트리 구조:
# 056 Agglomerative (병합형)
# 056 - 각 데이터가 하나의 클러스터에서 시작
# 056 - 점점 병합하여 큰 클러스터 형성
# 056 Divisive (분할형)
# 056 - 전체가 하나의 클러스터에서 시작
# 056 - 점점 분할하여 작은 클러스터 형성
3. 밀도 기반 (Density-based)
데이터 밀집 영역 기반:
# 056 DBSCAN
# 056 - 밀도가 높은 영역을 클러스터로
# 056 - 이상치 자동 탐지
# 056 - K 값 지정 불필요
4. 모델 기반 (Model-based)
확률 분포 기반:
# 056 Gaussian Mixture Model (GMM)
# 056 - 데이터가 여러 가우시안 분포의 혼합
# 056 - 소속 확률 제공
# 056 - 유연한 클러스터 형태
간단한 클러스터링 예제
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
# 056 샘플 데이터 생성
X, y_true = make_blobs(n_samples=300, centers=4, cluster_std=0.6, random_state=42)
# 056 K-Means 클러스터링
kmeans = KMeans(n_clusters=4, random_state=42, n_init=10)
y_pred = kmeans.fit_predict(X)
# 056 시각화
plt.figure(figsize=(12, 5))
# 056 원본 데이터
plt.subplot(1, 2, 1)
plt.scatter(X[:, 0], X[:, 1], c='gray', alpha=0.5)
plt.title('Original Data (No Labels)')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
# 056 클러스터링 결과
plt.subplot(1, 2, 2)
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis', alpha=0.7)
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1],
c='red', marker='X', s=200, label='Centroids')
plt.title('K-Means Clustering Result')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
plt.tight_layout()
plt.savefig('clustering_intro.png', dpi=150)
클러스터링 평가
정답이 없으므로 내부 평가 지표 사용:
1. 실루엣 점수 (Silhouette Score)
from sklearn.metrics import silhouette_score
# 056 -1 ~ 1 범위
# 1에 가까울수록 좋은 클러스터링
score = silhouette_score(X, y_pred)
print(f"실루엣 점수: {score:.4f}")
2. 칼린스키-하라바스 지수
from sklearn.metrics import calinski_harabasz_score
# 056 높을수록 좋음
ch_score = calinski_harabasz_score(X, y_pred)
print(f"칼린스키-하라바스 지수: {ch_score:.2f}")
3. 데이비스-볼딘 지수
from sklearn.metrics import davies_bouldin_score
# 056 낮을수록 좋음
db_score = davies_bouldin_score(X, y_pred)
print(f"데이비스-볼딘 지수: {db_score:.4f}")
최적 클러스터 수 결정
엘보우 방법
import matplotlib.pyplot as plt
inertias = []
K_range = range(1, 11)
for k in K_range:
kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)
kmeans.fit(X)
inertias.append(kmeans.inertia_)
plt.figure(figsize=(8, 5))
plt.plot(K_range, inertias, 'bo-')
plt.xlabel('Number of Clusters (K)')
plt.ylabel('Inertia')
plt.title('Elbow Method')
plt.grid(True, alpha=0.3)
plt.savefig('elbow_method.png', dpi=150)
# 056 꺾이는 지점(엘보우)이 최적 K
실루엣 분석
silhouette_scores = []
for k in range(2, 11):
kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)
labels = kmeans.fit_predict(X)
score = silhouette_score(X, labels)
silhouette_scores.append(score)
plt.figure(figsize=(8, 5))
plt.plot(range(2, 11), silhouette_scores, 'bo-')
plt.xlabel('Number of Clusters (K)')
plt.ylabel('Silhouette Score')
plt.title('Silhouette Analysis')
plt.grid(True, alpha=0.3)
plt.savefig('silhouette_analysis.png', dpi=150)
# 056 가장 높은 점수의 K가 최적
클러스터링 vs 분류
| 항목 | 분류 | 클러스터링 |
|---|---|---|
| 학습 방식 | 지도 학습 | 비지도 학습 |
| 레이블 | 필요 (정답) | 불필요 |
| 클래스 수 | 미리 정의됨 | 발견됨 |
| 목적 | 예측 | 패턴 발견 |
| 평가 | 정확도, F1 등 | 실루엣 등 |
클러스터링 전처리
from sklearn.preprocessing import StandardScaler
# 1. 스케일링 (매우 중요!)
# 056 대부분의 클러스터링 알고리즘은 거리 기반
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 2. 차원 축소 (선택적)
# 056 고차원 데이터에서 시각화 및 성능 개선
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
PyCaret 클러스터링 미리보기
from pycaret.clustering import *
from pycaret.datasets import get_data
# 056 데이터 로드
data = get_data('jewellery')
# 056 환경 설정
clust = setup(data, normalize=True, session_id=42, verbose=False)
# 056 모델 생성
kmeans = create_model('kmeans', num_clusters=4)
# 056 결과 확인
plot_model(kmeans, plot='cluster')
정리
- 클러스터링은 레이블 없이 데이터를 그룹화
- K-Means, 계층적, DBSCAN이 대표적
- 실루엣 점수로 클러스터링 품질 평가
- 엘보우 방법으로 최적 K 결정
- 스케일링이 매우 중요
다음 글 예고
다음 글에서는 PyCaret 클러스터링 모듈 시작하기를 다룹니다.
PyCaret 머신러닝 마스터 시리즈 #056