K-평균과 계층적 군집화: 엘보우와 덴드로그램으로 모델 선택하기
K-평균과 계층적 클러스터링의 동작 방식, 초기화와 거리 선택, 엘보우 방법 및 덴드로그램 기반 군집 결정 방식을 정리한다.
2026-08-14 · 최초 발행 2024-04-29
레이블 없는 데이터에서 군집 구조를 찾는 방법
군집 분석은 유사한 샘플을 묶어 데이터 안에 숨어 있는 구조를 발견하는 비지도 학습 기법이다. 군집 내부의 응집도는 높이고, 군집 사이의 분리도는 크게 만드는 것이 목표다.
K-평균과 계층적 클러스터링은 이 목표에 접근하는 방식이 다르다. K-평균은 중심점을 기준으로 반복적으로 데이터를 나누며, 계층적 방식은 병합 또는 분할을 통해 군집 트리를 만든다. 데이터 규모, 거리 정의, 해석 방식, 운영 제약에 따라 선택이 달라진다.
K-평균은 군집 내 제곱합(WCSS, SSE)을 최소화한다. 초기 중심을 정한 뒤 데이터 할당(E-step)과 중심 재계산(M-step)을 반복하고, 중심 변화량 또는 할당 변화량이 임계값 이하가 되면 수렴으로 판단한다.
계층적 클러스터링은 병합(Agglomerative) 또는 분할(Divisive) 방식으로 군집 트리를 구성한다. 어떤 연결 기준(Linkage)과 거리(metric)를 쓰는지에 따라 덴드로그램의 모양과 결과가 달라진다.
초기화와 군집 수 판단이 K-평균의 품질을 좌우한다
K-평균은 초기 중심이 좋지 않으면 지역 최적점으로 수렴하거나 결과가 불안정해질 수 있다. 재시도(n_init)와 k-means++ 초기화는 이 문제를 완화하는 수단이다.
k-means++는 첫 중심을 무작위로 고르고, 각 점에서 가장 가까운 기존 중심까지의 거리 제곱에 비례하는 확률로 다음 중심을 뽑는다. K개 중심을 고른 뒤 일반적인 K-평균 반복을 수행한다.
계산 복잡도는 O(n × k × i × d)다. 데이터가 큰 환경에서는 MiniBatchKMeans를 활용할 수 있다.
군집 수 K는 엘보우 방법으로 후보를 좁힐 수 있다. K를 늘릴 때 SSE가 감소하는 곡선에서 기울기가 급격히 달라지는 지점(knee)을 찾는 방식이다. 다만 엘보우가 뚜렷하지 않을 수 있으므로 실루엣(Silhouette), 칼린스키-하라바즈(CH), 데이비스-볼딘(DB) 지표를 함께 검토한다.
자동 knee 탐지(Kneedle 등)를 쓰더라도 최소 세그먼트 크기와 해석 가능성 같은 도메인 제약을 함께 반영해야 한다.
덴드로그램은 계층적 군집의 병합 과정을 드러낸다
계층적 클러스터링의 연결 기준으로는 단일(single, 최단), 완전(complete, 최장), 평균(average), Ward(분산 최소)가 있다. Ward는 유클리드 거리와 잘 결합한다.
덴드로그램은 어떤 순서와 거리에서 군집이 합쳐졌는지 보여준다. 컷 높이를 정하거나 목표 군집 수를 지정해 트리를 절단하면 각 샘플의 라벨을 얻을 수 있다.
계층적 방식은 복잡도와 메모리가 O(n^2) 이상이다. n이 큰 경우에는 샘플링이나 축소 표현(간선 스패닝 트리, 커널近似)을 고려해야 한다.
K-평균과 Ward 방식은 스케일 조정에 민감하므로 표준화(StandardScaler)가 권장된다. 범주형 변수가 섞인 데이터는 Gower 거리 또는 One-Hot 인코딩 후 차원 축소를 검토할 수 있다. 이상치에 평균이 민감한 K-평균에서는 로버스트 스케일링, 이상치 제거, K-medoids 대안도 선택지다. PCA나 UMAP으로 잡음 축을 줄이면 군집 안정성과 시각화를 개선할 수 있다.
데이터 준비부터 운영 피드백까지의 흐름
K-평균과 계층적 방식의 운영 차이
| 항목 | K-평균 | 계층적 |
|---|---|---|
| 성능 | 선형에 가까운 속도, 대규모 데이터 적합 | O(n^2) 이상, 대규모 비권장 |
| 확장성 | 미니배치로 온라인 학습 가능 | 증분 업데이트 제한적 |
| 일관성 | 초기화 민감, n_init로 안정화 | 결정적(동일 설정), 재현성 용이 |
| 안정성 | 이상치 민감, 스케일 의존 | 링크·거리 선택에 따른 변동 |
| 운영 편의 | K 사전 결정 필요, 엘보우/지표 병행 | 덴드로그램으로 시각적 의사결정 용이 |
K-평균에서 엘보우와 실루엣을 함께 확인하기
실행 환경은 Python 3.10+, scikit-learn 1.3+, scipy 1.10+, numpy, matplotlib를 전제로 한다. 재현성을 위해 random_state로 난수 시드를 고정한다.
# python>=3.10, scikit-learn>=1.3, numpy, matplotlib
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
X, y_true = make_blobs(n_samples=3000, centers=5, cluster_std=1.2,
random_state=42, n_features=6)
X = StandardScaler().fit_transform(X)
Ks = range(2, 11)
sse, sil = [], []
for k in Ks:
km = KMeans(n_clusters=k, init="k-means++", n_init=10,
max_iter=300, tol=1e-4, random_state=42)
labels = km.fit_predict(X)
sse.append(km.inertia_) # SSE
sil.append(silhouette_score(X, labels, metric="euclidean"))
fig, ax = plt.subplots(1, 2, figsize=(10, 4))
ax[0].plot(Ks, sse, marker="o"); ax[0].set_title("Elbow (SSE)"); ax[0].set_xlabel("K"); ax[0].set_ylabel("SSE")
ax[1].plot(Ks, sil, marker="o"); ax[1].set_title("Silhouette"); ax[1].set_xlabel("K"); ax[1].set_ylabel("Score")
plt.tight_layout(); plt.show()
엘보우가 모호하면 실루엣 최고점, CH 최대, DB 최소 지점을 교차 검증한다. 대규모 데이터에서는 MiniBatchKMeans로 바꾸고 배치 크기와 학습 반복 수를 조정한다.
계층적 군집을 잘라 라벨을 얻는 방법
# python>=3.10, scipy>=1.10, scikit-learn>=1.3, matplotlib
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler
from scipy.cluster.hierarchy import linkage, dendrogram, fcluster
import matplotlib.pyplot as plt
X, _ = make_blobs(n_samples=600, centers=4, cluster_std=1.0, random_state=7, n_features=4)
X = StandardScaler().fit_transform(X)
Z = linkage(X, method="ward", metric="euclidean") # Ward 추천(연속형, 유클리드)
plt.figure(figsize=(8, 4))
dendrogram(Z, truncate_mode="level", p=5, no_labels=True)
plt.title("Dendrogram (Ward)"); plt.xlabel("Samples"); plt.ylabel("Distance")
plt.show()
# 방법1) 군집 수 기준 절단
k = 4
labels_k = fcluster(Z, t=k, criterion="maxclust")
# 방법2) 거리 임계 기준 절단
thr = 10.0
labels_thr = fcluster(Z, t=thr, criterion="distance")
Ward 방식에서는 스케일 조정이 필수다. 범주형 또는 혼합형 데이터는 Gower 같은 거리 설계가 필요하다. n>10k 수준에서는 샘플링이나 대표점 추출 뒤 계층적→K-평균 warm start로 이어지는 2단계 접근을 적용할 수 있다.
세그먼트와 탐색 작업에 연결하는 방식
고객 세분화에서는 RFM 또는 행동 피처를 표준화한 뒤 K-평균으로 k 후보를 탐색하고, 엘보우와 실루엣으로 k를 확정한다. 이후 세그먼트 룰을 추출해 캠페인 타기팅에 연결할 수 있다.
제품 포트폴리오나 가격대 구조화에는 제품 속성 임베딩과 계층적 Ward, 덴드로그램 컷오프를 사용해 카테고리 리밸런싱과 SKU 관리로 이어갈 수 있다.
문서와 로그 탐색에서는 TF-IDF/PCA 뒤 K-평균으로 토픽을 프리클러스터링해 다운스트림 분류와 검색 인덱스 효율화를 지원한다. 이미지 색상 양자화에서는 픽셀을 샘플링하고 K-평균으로 팔레트를 뽑아 저장 용량을 줄이고 렌더링 일관성을 확보한다.
분석 효율 측면에서는 탐색 시간을 3060% 단축하고, 모델 후보 수를 줄여 실험 회차를 감소시킬 수 있다. k-means++와 스케일링을 적용한 기준에서는 실루엣 스코어가 0.050.15p 향상될 수 있으며, 세그먼트 간 이질성 증대에 따라 마케팅 응답률이 5~20% 상대 개선될 수 있다(도메인 의존).
random_state와 파이프라인을 고정하면 재현성을 강화하고 릴리즈 간 세그먼트 드리프트를 감시하기 쉬워진다. 수동 라벨링과 룰 설계 공수는 20~40% 절감할 수 있으며, 저장·연산량 최적화는 인프라 비용 절감으로 이어진다.
대규모 환경에서는 미니배치, 표본화, 하이브리드 접근으로 확장성을 확보할 수 있다. K-평균으로 후보를 탐색하고 계층적 덴드로그램으로 구조를 해석·검증한 뒤, 지표와 도메인 피드백을 바탕으로 세그먼트 운영 룰을 정하는 흐름이 적합하다.