군집 알고리즘 선택과 실루엣 점수 기반 평가
K-Means, DBSCAN, 계층적 군집의 특성과 트레이드오프를 비교하고 실루엣 점수로 군집 모델을 평가·선택하는 방법을 정리한다.
2026-08-14 · 최초 발행 2024-04-29
레이블 없는 데이터에서 그룹 구조를 찾는 방법
군집 분석은 레이블이 없는 데이터에서 패턴과 그룹 구조를 발견하는 비지도 학습 기법이다. K-Means, DBSCAN, 계층적 군집은 모두 데이터를 묶지만, 클러스터의 모양과 밀도, 이상치, 처리 규모에 따라 적합한 선택이 달라진다.
실루엣 점수는 이 선택 과정에서 군집 내부의 응집도와 군집 사이의 분리도를 함께 평가하는 기준이 된다. 모델 하나를 고르는 문제라기보다 전처리, 파라미터 탐색, 안정성 검증을 연결하는 절차로 다루는 편이 낫다.
데이터 형태에 따라 달라지는 군집 방식
K-Means는 중심과 거리의 반복 계산으로 묶는다
K-Means는 유클리드 공간에서 클러스터 중심(centroid)과 데이터 사이의 거리를 줄이는 방향으로 반복 최적화한다. 초기 중심값을 정한 뒤 데이터를 클러스터에 할당하고, 중심을 다시 갱신하는 과정을 수렴할 때까지 반복한다.
군집 수 k를 미리 정해야 하며, 구형 클러스터와 균등 분산 가정에 강점이 있다. 반대로 이상치와 스케일링의 영향을 크게 받는다.
DBSCAN은 밀도와 노이즈를 함께 다룬다
DBSCAN은 반경 eps 안에 있는 점의 수가 min_samples 이상이면 해당 점을 핵심점(core)으로 보고, 연결된 영역을 하나의 클러스터로 확장한다.
클러스터 수를 자동으로 결정하고, 이상치는 노이즈 라벨 -1로 분리할 수 있다. 비구형 클러스터를 찾는 데 유리하지만 eps와 min_samples에 민감하며, 고차원에서는 성능이 저하된다.
계층적 군집은 병합 과정을 구조로 남긴다
계층적 군집에서는 응집형(agglomerative) 방식이 일반적이다. 개별 포인트에서 출발해 유사도에 따라 클러스터를 차례로 병합하고, 그 구조를 덴드로그램으로 표현한다.
단일·완전·평균·워드(ward) 같은 연결(linkage) 기준을 지원한다. O(n^2) 메모리·시간 복잡도 특성 때문에 대규모 데이터에는 사전 축소가 필요하다.
실루엣 점수는 응집도와 분리도를 함께 본다
실루엣 점수(Silhouette Score)는 같은 클러스터 안의 응집도와 다른 클러스터와의 분리도를 [-1, 1] 범위로 정량화한다. 값이 클수록 군집 품질이 좋다.
k 선택, 파라미터 튜닝, 알고리즘 비교에 공통 지표로 쓸 수 있다. 일반적으로 0.5 이상이면 양호하고 0.7 이상이면 우수하다고 보지만, 데이터 특성에 따라 달라진다.
전처리와 후보 탐색을 하나의 흐름으로 묶기
거리 기반 모델은 피처 스케일이 맞지 않으면 결과가 왜곡된다. StandardScaler 또는 RobustScaler로 스케일을 표준화하고, 필요하다면 PCA나 UMAP으로 노이즈를 줄이며 처리 속도를 높인다. 거리나 유사도 역시 데이터 성격에 맞춰야 한다. 유클리드는 K-Means와 DBSCAN의 기본 선택지이고, 임베딩에는 코사인, 희소 데이터나 이상치가 있는 경우에는 맨해튼 거리를 고려할 수 있다.
알고리즘별로 탐색 대상도 다르다. K-Means에서는 k, 초기화(k-means++), 반복 횟수, mini-batch 여부를 확인한다. DBSCAN은 eps, min_samples, 거리 메트릭을 조정하고, 계층적 군집은 linkage와 n_clusters 또는 거리 임계치를 선택한다. 구형·비구형 구조, 밀도 차이, 이상치 수준, 데이터 크기와 차원을 함께 봐야 한다.
K-Means의 복잡도는 O(n·k·t)이며 초기값과 시드에 따른 변동이 있어 여러 시도의 평균화가 필요하다. 대규모 데이터에는 MiniBatch K-Means가 적합하다. DBSCAN은 k-d tree나 ball tree 인덱스를 사용하면 평균 O(n log n), 최악 O(n^2)이며, 파라미터 튜닝이 어긋나면 과병합이나 과분할이 생긴다. 계층적 군집은 O(n^2) 시간·공간을 사용해 일관성은 높지만 대용량 처리에는 제약이 있다.
실루엣 점수만으로 끝내지 않고 BIC(DPGMM), Davies–Bouldin 같은 지표와 비교할 수 있다. 레이블이 없는 상황에서는 재표집과 시드 반복으로 안정성도 확인한다. 마지막에는 클러스터 해석 가능성, 크기 균형, 비즈니스 피처와의 연계성을 실제 목표에 맞춰 점검한다.
스케일링 결과가 좋지 않으면 이상치 캡핑(IQR/윈저라이징)이나 RobustScaler 적용을 검토한다. DBSCAN에서 노이즈가 지나치게 많으면 eps 확대, 차원 축소 강화, min_samples 감소를 시도할 수 있다. 실루엣 점수가 낮다면 다른 메트릭이나 거리를 사용하고, 피처 공학을 다시 수행하거나 알고리즘을 바꾼다.
처리 특성과 운영 관점의 차이
| 알고리즘 | 성능(시간/공간) | 확장성 | 일관성 | 안정성(이상치/노이즈) | 운영 편의 |
|---|---|---|---|---|---|
| K-Means | O(n·k·t), 메모리 O(n+k) | MiniBatch로 수백만 샘플 처리 가능 | 초기값·시드에 민감, 반복 시 평균화 필요 | 이상치에 취약, 스케일 영향 큼 | 단순 파이프라인, 온라인 업데이트 용이 |
| DBSCAN | 평균 O(n log n), 최악 O(n^2) | 공간 인덱스/분산 처리로 대용량 가능 | 파라미터 설정 시 안정적 | 이상치 분리 강점, 밀도 차이 민감 | 파라미터 탐색 난이도, 결과 해석 난해 |
| 계층적 군집 | O(n^2) 시간·공간 | 대용량 비적합, 사전 샘플링/축소 필요 | 결정적 결과(동률 처리 제외) | linkage 선택에 따라 민감도 변화 | 덴드로그램 해석 용이, 배포는 배치형 적합 |
군집 결과를 해석하는 업무 장면
고객 세분화에서는 RFM 또는 행동 피처에 K-Means를 적용해 캠페인 타깃팅 정밀도를 높일 수 있다. 고가치 소수 집단과 잠재 이탈군을 식별해 전환율 개선으로 연결하는 방식이다.
이상치 탐지와 노이즈 제거에는 DBSCAN의 -1 라벨이 유용하다. 지도 학습 전 데이터 클리닝에 활용할 수 있고, 제조·보안 로그에서는 비정상 패턴을 조기에 탐지하는 데 쓸 수 있다.
문서나 문장 임베딩은 코사인 거리와 결합해 HDBSCAN 또는 DBSCAN으로 주제를 자동 분류할 수 있다. 지식베이스의 유사 문서를 통합하고 검색 품질을 개선하는 용도다.
좌표 데이터에서는 클러스터링으로 상권이나 혼잡 구역을 도출해 위치 기반 서비스를 최적화할 수 있다. eps를 지리적 거리(미터)로 해석하면 정책 설정도 쉬워진다. 센서·IoT 데이터는 시간창 집계 피처를 만든 뒤 군집으로 상태를 프로파일링하고 예방 정비 시나리오를 도출할 수 있으며, 계층적 군집은 모드 전이 구조를 파악하는 데 활용된다.
Scikit-Learn으로 후보 모델을 비교하는 코드
전제조건은 Python 3.9+, scikit-learn 1.3+, numpy 1.24+, matplotlib 3.7+ (옵션)이다. 아래 코드는 K-Means, DBSCAN, 계층적 군집을 비교하고 실루엣 점수로 최적 모델을 선택한다.
# python >=3.9, scikit-learn >=1.3
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans, DBSCAN, AgglomerativeClustering
from sklearn.neighbors import NearestNeighbors
from sklearn.metrics import silhouette_score
# 1) 데이터 준비(실무에서는 실제 데이터로 교체)
X, y_true = make_blobs(n_samples=5000, centers=5, cluster_std=1.2, random_state=42)
# 노이즈 혼합
rng = np.random.RandomState(42)
noise = rng.uniform(low=X.min(axis=0), high=X.max(axis=0), size=(250, X.shape[1]))
X = np.vstack([X, noise])
# 2) 전처리: 스케일링 + 차원 축소(고차원/노이즈 완화)
scaler = StandardScaler()
Xp = scaler.fit_transform(X)
pca = PCA(n_components=min(10, Xp.shape[1]), random_state=42)
Xd = pca.fit_transform(Xp)
def valid_silhouette(X, labels):
# DBSCAN 노이즈(-1) 제외 후 평가
mask = labels != -1
if mask.sum() < 2:
return None
uniq = np.unique(labels[mask])
if uniq.shape[0] < 2:
return None
return silhouette_score(X[mask], labels[mask])
results = []
# 3) K-Means: k 탐색
for k in range(2, 11):
km = KMeans(n_clusters=k, n_init='auto', random_state=42)
lab = km.fit_predict(Xd)
sil = valid_silhouette(Xd, lab)
if sil is not None:
results.append(("KMeans", {"k": k}, sil, km))
# 4) DBSCAN: eps 추정(근접거리 기반) + 그리드 탐색
nn = NearestNeighbors(n_neighbors=5).fit(Xd)
dist, _ = nn.kneighbors(Xd)
kdist = np.sort(dist[:, -1])
candidates = np.quantile(kdist, [0.80, 0.85, 0.90, 0.95])
for eps in np.unique(np.round(candidates, 3)):
for ms in [5, 10, 20]:
db = DBSCAN(eps=float(eps), min_samples=ms, metric='euclidean', n_jobs=-1)
lab = db.fit_predict(Xd)
sil = valid_silhouette(Xd, lab)
if sil is not None:
results.append(("DBSCAN", {"eps": float(eps), "min_samples": ms}, sil, db))
# 5) 계층적 군집: linkage 고정, n_clusters 탐색
for k in range(2, 11):
ac = AgglomerativeClustering(n_clusters=k, linkage='ward')
lab = ac.fit_predict(Xd)
sil = valid_silhouette(Xd, lab)
if sil is not None:
results.append(("Agglomerative", {"n_clusters": k, "linkage": "ward"}, sil, ac))
# 6) 최적 모델 선택
best = max(results, key=lambda r: r[2]) if results else None
print(f"Best model: {best[0]} | params={best[1]} | silhouette={best[2]:.3f}")
# 7) 실무 배포 시: scaler, pca, best model을 파이프라인/아티팩트로 저장 필요
재현성을 위해 시드를 고정하고 모델·전처리 버전을 관리하며 파이프라인을 직렬화한다. 안정성은 재표집·부트스트랩 실루엣 평균으로 확인하고, K-Means는 n_init을 확장(예: 10~50)할 수 있다. 확장성이 필요하면 MiniBatchKMeans, HDBSCAN(고밀도 데이터), 분산 처리(Spark MLlib, 최신 정보 확인 필요)를 검토한다.
분석 효율과 운영 품질에 미치는 영향
사전 군집 후 대표 표본을 라벨링하면 레이블링 비용을 3070% 수준으로 절감할 수 있으며, 데이터와 도메인에 따라 차이가 있다. 차원 축소와 MiniBatch를 함께 적용하면 학습 시간을 520배 단축할 수 있다.
고객 세그먼트 타깃팅에서는 캠페인·상품 적합도 향상에 따라 전환율이 515%p 개선된 사례가 관측된다. 이상치를 분리하면 다운스트림 모델 정확도가 28%p 개선될 수 있다.
실루엣 기반 자동 선택은 파라미터 의존성을 낮추고 모델 일관성을 높인다. 노이즈 라벨을 관리하면 클린 데이터 파이프라인을 구축할 수 있다.