본문으로 건너뛰기

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