본문으로 건너뛰기

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