본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] K-평균(K-Means) 최적의 K값을 정하는 5가지 방법과 성능 해결 전략

by Papa Martino V 2026. 4. 8.
728x90

K-평균(K-Means) 최적의 K값
K-평균(K-Means) 최적의 K값

 

비지도 학습(Unsupervised Learning)의 대표 주자인 K-평균(K-Means) 군집화를 수행할 때 개발자가 마주하는 가장 큰 난제는 바로 "데이터를 몇 개의 그룹(K)으로 나눌 것인가?"입니다. 정답이 없는 상태에서 최적의 K를 찾는 과정은 모델의 신뢰성을 결정짓는 핵심 단계입니다. 본 포스팅에서는 직관적인 엘보우 방법부터 통계적인 실루엣 분석까지, K값을 정하는 5가지 핵심 기법과 파이썬 실무 예제 7가지를 통해 이 문제를 완벽하게 해결해 드립니다.


1. K-평균 군집화와 최적의 K값 결정의 중요성

K-Means 알고리즘은 사전에 설정된 K개의 중심점(Centroids)을 기준으로 데이터와의 거리를 최소화하며 그룹을 형성합니다. K값이 너무 작으면 서로 다른 특성을 가진 데이터가 하나로 묶이는 과소군집이 발생하고, 반대로 너무 크면 의미 없는 세분화가 일어나는 과잉군집 문제가 발생합니다.

K값 결정 기법별 특징 및 차이점 비교

방법론 핵심 지표 장점 단점
엘보우 방법 (Elbow Method) Inertia (SSE) 계산이 매우 빠르고 직관적임 '팔꿈치' 지점이 모호할 수 있음
실루엣 분석 (Silhouette) 실루엣 계수 ($s$) 군집 간 거리와 응집도를 모두 고려 연산량이 상대적으로 많음
덴드로그램 (Dendrogram) 계층적 거리 데이터 간의 관계 시각화 우수 대용량 데이터에서 가독성 저하
갭 통계량 (Gap Statistic) Log(Inertia) 차이 통계적 유의성 검증 가능 구현이 복잡하고 시간이 소요됨
비즈니스 도메인 지식 업무 목적 (KPI) 가장 현실적이고 실행 가능한 결과 데이터의 통계적 특성 간과 위험

2. 실무 개발자를 위한 K-Means K값 최적화 Python Example 7가지

실제 프로젝트 환경에서 데이터를 분석하고 최적의 군집 수를 도출하기 위한 파이썬 실전 코드입니다.

Example 01. 엘보우 방법(Elbow Method) 구현 및 시각화

군집 내 오차 제곱합(SSE)이 급격히 줄어들다가 완만해지는 지점을 찾는 가장 대중적인 방법입니다.

import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs

# 테스트 데이터 생성
X, _ = make_blobs(n_samples=500, centers=4, cluster_std=0.60, random_state=0)

inertia = []
K_range = range(1, 11)

for k in K_range:
    kmeans = KMeans(n_clusters=k, init='k-means++', random_state=42)
    kmeans.fit(X)
    inertia.append(kmeans.inertia_)

plt.plot(K_range, inertia, 'bx-')
plt.xlabel('Number of Clusters (K)')
plt.ylabel('Inertia (SSE)')
plt.title('Elbow Method For Optimal K')
plt.show()

Example 02. 실루엣 계수(Silhouette Score)를 이용한 정밀 진단

실루엣 계수는 1에 가까울수록 군집화가 잘 되었음을 의미하며, 평균값을 통해 최적의 K를 도출합니다.

from sklearn.metrics import silhouette_score

for k in range(2, 6):
    kmeans = KMeans(n_clusters=k, random_state=42).fit(X)
    score = silhouette_score(X, kmeans.labels_)
    print(f"K={k} 일 때 실루엣 계수: {score:.4f}")

Example 03. Yellowbrick 라이브러리를 활용한 시각적 분석

복잡한 시각화 코드를 줄이고 전문가 수준의 군집화 리포트를 생성하는 실무 팁입니다.

# pip install yellowbrick
from yellowbrick.cluster import KElbowVisualizer

model = KMeans(random_state=42)
visualizer = KElbowVisualizer(model, k=(2,10))
visualizer.fit(X)        
visualizer.show()

Example 04. 덴드로그램(Dendrogram)을 통한 계층적 구조 파악

데이터가 결합되는 과정을 계통도로 확인하여 적절한 절단 지점(K)을 판단합니다.

from scipy.cluster.hierarchy import dendrogram, linkage

linked = linkage(X, 'ward')
plt.figure(figsize=(10, 7))
dendrogram(linked, orientation='top', distance_sort='descending', show_leaf_counts=True)
plt.title('Hierarchical Clustering Dendrogram')
plt.show()

Example 05. Calinski-Harabasz 지수 (분산비율 기준)

군집 간 분산과 군집 내 분산의 비율을 사용하여 값이 높을수록 좋은 K값으로 간주합니다.

from sklearn.metrics import calinski_harabasz_score

for k in range(2, 6):
    labels = KMeans(n_clusters=k, random_state=42).fit_predict(X)
    ch_index = calinski_harabasz_score(X, labels)
    print(f"K={k} CH Index: {ch_index:.2f}")

Example 06. 데이터 스케일링이 K값 결정에 미치는 영향 해결

단위가 다른 변수들이 K값 선정에 왜곡을 주지 않도록 표준화 과정을 반드시 포함해야 합니다.

from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline

pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('kmeans', KMeans(n_clusters=3, random_state=42))
])
pipeline.fit(X)

Example 07. PCA(주성분 분석) 후 군집화 결과 시각화

고차원 데이터를 2차원으로 축소하여 우리가 정한 K값이 시각적으로 타당한지 검증합니다.

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
kmeans = KMeans(n_clusters=4, random_state=42).fit(X_pca)

plt.scatter(X_pca[:, 0], X_pca[:, 1], c=kmeans.labels_, cmap='viridis')
plt.title('K-Means Clustering Result with PCA')
plt.show()

3. 결론: 최적의 K값을 찾는 실무 가이드라인

결론적으로, 완벽한 단 하나의 K값 결정법은 존재하지 않습니다. 실무에서는 엘보우 방법으로 대략적인 범위를 좁히고, 실루엣 분석을 통해 군집의 품질을 정밀하게 검증하며, 마지막으로 비즈니스 도메인의 요구사항(예: 고객 등급을 3단계로 나눌 것인지 5단계로 나눌 것인지)을 반영하여 최종 확정하는 것이 가장 현명한 방법입니다.

내용 출처 및 기술 참조:

  • Scikit-learn Documentation: Clustering - K-Means sections
  • Rousseeuw, P. J. (1987). Silhouettes: A graphical aid to the interpretation and validation of cluster analysis.
  • Pattern Recognition and Machine Learning (Christopher Bishop)
  • Python Data Science Handbook (Jake VanderPlas)
728x90