군집 분석에서 K-평균·계층적 군집·DBSCAN을 고르는 기준

K-평균, 계층적 군집, DBSCAN의 특성과 실루엣 계수·엘보우 방법을 활용한 군집 모델 선택 전략을 정리한다.

2026-08-14 · 최초 발행 2025-10-14

라벨 없는 데이터에서 구조를 찾는 방식

군집 분석은 유사한 특성을 지닌 데이터 포인트를 거리, 밀도, 연결성에 따라 묶는 비지도 학습 기법이다. 고객 분석, 이상 탐지, 문서 주제 분류처럼 정답 라벨이 없는 데이터에서 패턴을 찾고, 이후 의사결정이나 피처 엔지니어링에 연결할 때 쓰인다.

결과는 알고리즘만으로 결정되지 않는다. 유클리드·맨해튼·코사인 같은 거리 척도, Standardization·Normalization을 포함한 스케일링, PCA·UMAP 같은 차원 축소, 군집 형상에 대한 가정, 노이즈 처리 방식이 함께 작동한다. 고차원에서는 거리의 분별력이 낮아질 수 있으므로 스케일링과 차원 축소를 먼저 적용해 안정성과 성능을 확보해야 한다.

데이터 특성에 따라 달라지는 선택

K-평균과 유클리드 거리를 사용하는 계층적 군집, DBSCAN은 모두 스케일의 영향을 받는다. 연속형 데이터와 구형 군집에는 유클리드 거리가 어울리고, 희소하거나 로버스트한 처리가 필요한 경우에는 맨해튼 거리, 텍스트와 고차원 방향성을 다룰 때는 코사인 거리를 고려할 수 있다.

K-평균은 구형이고 크기가 유사한 군집을 대규모 데이터에서 빠르게 다뤄야 할 때 적합하다. 계층적 군집은 덴드로그램을 바탕으로 군집 구조를 탐색하고 설명하기 쉬워 중소 규모 데이터에 맞는다. DBSCAN은 임의 형상의 군집과 노이즈·이상치가 있는 경우에 강점이 있지만, epsmin_samples에 민감하다.

파라미터도 알고리즘별로 다르다. K-평균에서는 k, 초기화, 반복 수, 랜덤 시드를 관리하며 k-means++ 초기화를 권장한다. 계층적 군집은 ward·average·complete 등의 linkage, 거리 임계값, 클러스터 수를 선택한다. DBSCAN은 eps, min_samples, 거리 척도와 함께 k-d tree·ball tree 같은 인덱싱 구조를 검토한다.

알고리즘별 동작과 제약

K-평균은 중심과 할당을 반복한다

K-평균은 데이터 포인트를 중심에 할당하고 중심을 갱신하는 과정을 반복해 관성(inertia)을 최소화한다. 복잡도는 O(n × k × t)이며, 대규모 데이터에서는 미니배치로 확장할 수 있다.

다만 구형 군집을 전제로 하고 이상치에 민감하다. 사용할 군집 수 k도 사전에 정해야 한다.

계층적 군집은 병합 과정을 구조로 남긴다

응집형 계층적 군집은 개별 데이터에서 시작해 군집을 단계적으로 병합한다. 거리 정의에는 ward, average, complete 같은 linkage 규칙이 쓰인다.

메모리와 시간 복잡도는 O(n^2)이므로 중소 규모 데이터에 적합하다. 덴드로그램을 제공하며, 절단 높이를 기준으로 군집 수를 정할 수 있어 k를 미리 지정하지 않아도 된다.

DBSCAN은 밀도와 연결성으로 군집을 만든다

DBSCAN은 밀도가 충분한 영역의 연결성을 기반으로 군집을 만들고, 포인트를 코어·보더·노이즈로 구분한다. 인덱싱을 적용하면 평균 복잡도는 O(n log n)이다.

임의 형상과 노이즈에 견고하지만 밀도가 불균일한 데이터에서는 주의가 필요하다. epsmin_samples를 고정하면 재현성은 높지만, 적절한 값을 찾기 위한 튜닝 부담이 있다.

알고리즘 성능(대용량) 확장성 일관성(재현성) 안정성(이상치/노이즈) 운영 편의
K-평균 높음 매우 높음(미니배치) 중간(초기화 영향) 낮음(이상치 민감) 높음(k만 지정)
계층적 중간 낮음~중간(n^2 한계) 높음(결정적 병합) 중간(linkage 의존) 중간(덴드로그램 해석 용이)
DBSCAN 중간 중간(인덱스 필요) 높음(파라미터 고정 시) 높음(노이즈 견고) 중간~낮음(eps 튜닝 필요)

실루엣과 엘보우로 후보를 좁히기

실루엣 계수는 군집 내부의 응집도와 다른 군집과의 분리도를 함께 본다.

s(i) = (b(i) - a(i)) / max{a(i), b(i)}에서 a(i)는 동일 군집 내 평균거리, b(i)는 가장 가까운 이웃 군집까지의 평균거리다. 평균 s가 ≈ 0.5 이상이면 양호하고, 0에 가까우면 군집 경계가 분명하지 않으며, 음수이면 오할당 가능성을 살펴봐야 한다. k 또는 eps 후보를 비교할 때는 샘플별 바 차트로 군집 품질을 함께 확인할 수 있다.

엘보우 방법은 k가 증가할 때 관성(inertia)이 줄어드는 곡선에서 기울기가 급격히 바뀌는 지점을 찾는다. 다만 항상 명확한 팔꿈치가 나타나는 것은 아니므로 실루엣 계수와 도메인 지식을 함께 반영해야 한다.

모델 선택은 표준화된 특징 공간과 후보 알고리즘·파라미터 범위에서 시작한다. 실루엣, 엘보우, DBI, CHI를 교차 비교하고, 부트스트랩 재학습으로 안정성을 점검한다. 피처 분포, 중심, 대표 포인트를 검토해 해석 가능성도 확인한 뒤, 최종 알고리즘·파라미터와 군집 라벨링 규칙, 운영 파이프라인을 정한다. 이 과정에서는 복잡한 모델보다 단순하고 안정적인 구성을 우선한다.

전처리부터 배포까지 이어지는 흐름

아니오입력: 원천 데이터전처리: 결측/이상치 처리,스케일링, 차원 축소알고리즘 선택K-평균 (k, init)계층적 군집 (linkage)DBSCAN (eps, min_samples)피팅/라벨 생성노이즈 라벨(-1) 처리: 재학습또는 격리평가: 실루엣, 엘보우/DBI/CHI기준 충족?배포: 스케일러+모델파이프라인 고정, 모니터링튜닝: 파라미터/특징 개선,차원 축소 재조정

Python으로 후보 모델을 비교하는 예시

수치형 특징을 사용하고, 결측값은 제거하거나 대치한 뒤 표준화를 적용한다. 필요하면 PCA를 추가한다. 후보 탐색에서는 K-평균의 k=2~10, 계층적 군집의 linkage=ward/average, DBSCAN의 eps 범위를 비교한다. 선정 단계에서는 실루엣 평균과 분포, 엘보우 곡선, 재학습 안정성을 확인하고, 운영 단계에서는 스케일러와 모델을 함께 저장해 데이터 드리프트를 감시한다.

# Python 3.10+, scikit-learn 1.4+
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans, AgglomerativeClustering, DBSCAN
from sklearn.metrics import silhouette_score
from sklearn.decomposition import PCA

# 1) 데이터 생성/전처리
X, _ = make_blobs(n_samples=3000, centers=5, cluster_std=1.2, random_state=42)
X = StandardScaler().fit_transform(X)
X_pca = PCA(n_components=2, random_state=42).fit_transform(X)  # 시각화/속도 용도

# 2) K-평균: 엘보우와 실루엣
inertias, sils = [], []
for k in range(2, 11):
    km = KMeans(n_clusters=k, init="k-means++", n_init="auto", random_state=42)
    labels = km.fit_predict(X)
    inertias.append(km.inertia_)
    sils.append(silhouette_score(X, labels))
best_k = np.argmax(sils) + 2

# 3) 계층적 군집
agg = AgglomerativeClustering(n_clusters=best_k, linkage="ward")
agg_labels = agg.fit_predict(X)

# 4) DBSCAN: 간단한 그리드 탐색
candidates = [(e, m) for e in np.linspace(0.3, 1.5, 7) for m in (5, 10, 20)]
best_cfg, best_sil = None, -1
for eps, min_pts in candidates:
    db = DBSCAN(eps=eps, min_samples=min_pts, metric="euclidean", n_jobs=-1)
    labels = db.fit_predict(X)
    # 모든 포인트가 노이즈이거나 군집이 1개면 평가 스킵
    unique = set(labels)
    if -1 in unique:
        unique.remove(-1)
    if len(unique) < 2:
        continue
    s = silhouette_score(X, labels, metric="euclidean")
    if s > best_sil:
        best_sil, best_cfg = s, (eps, min_pts)

# 결과 요약 출력
print(f"Best K for KMeans by silhouette: {best_k}, silhouette={max(sils):.3f}")
if best_cfg:
    print(f"Best DBSCAN cfg: eps={best_cfg[0]:.2f}, min_samples={best_cfg[1]}, silhouette={best_sil:.3f}")

랜덤 시드를 고정하고, joblib 파이프라인 객체로 스케일러와 모델을 동시에 저장하면 재현성을 관리할 수 있다. 부트스트랩 재학습 뒤 ARI(Adjusted Rand Index)로 라벨 안정성을 비교하고, 주기적으로 실루엣과 라벨 분포를 확인해 기준치가 낮아질 때 재튜닝을 시작한다.

세분화·탐지·주제 분류에 연결하기

고객 세분화에서는 정규화한 RFM·행동 특징으로 K-평균과 DBSCAN을 비교한 뒤 캠페인 대상군을 정의한다. 라벨을 고정한 뒤 신규 고객은 최근접 중심 할당 또는 최근접 군집 규칙으로 처리한다.

운영·보안 이상 탐지에서는 지표를 윈도우링하고 스케일링한 뒤 DBSCAN의 노이즈 라벨을 알림과 격리에 활용한다. eps는 분위수 기반으로 동적 보정하고, 오탐률은 주간 리포팅으로 관리한다.

문서·로그의 주제 군집에는 TF-IDF 또는 임베딩과 코사인 거리를 이용한 계층적 군집을 적용할 수 있다. 덴드로그램 절단으로 주제 수를 결정하고, 신조어와 도메인 용어 사전은 증분 업데이트한다.

이미지 색상 양자화에서는 픽셀 RGB 표본을 추출해 K-평균으로 팔레트를 축소한다. 저장·전송 비용을 낮추는 방식이며, 디바이스별 색공간 차이는 보정해야 한다.

세그먼트별 맞춤 메시지는 마케팅 전환율을 520% 상대 개선할 수 있고, 밀도 기반 이상 탐지는 경보당 조사 시간을 1540% 절감할 수 있다. 색상 양자화와 로그 군집은 저장·전송 비용에서 20~60% 압축 효과를 기대할 수 있다. 패턴을 가시화해 데이터 이해도와 설명 가능성을 높이고, 규칙 엔지니어링 부담을 줄여 모델 유지보수를 단순화하며, 타깃팅과 우선순위 설정의 근거를 제공한다.

군집 분석K-평균계층적 군집DBSCAN비지도 학습