K-Means
K-Means Clustering
데이터를 K개 군집으로 분할하는 비지도 학습 알고리즘.
K-Means Clustering
데이터를 K개 군집으로 분할하는 비지도 학습 알고리즘.
K-Means는 데이터를 K개의 군집(cluster)으로 분할하는 대표적인 비지도 학습 알고리즘입니다. 라벨이 없는 데이터에서 유사한 특성을 가진 그룹을 자동으로 찾아내며, 고객 세분화, 이미지 압축, 이상 탐지 등에 널리 활용됩니다.
1957년 Stuart Lloyd가 제안하고 1967년 James MacQueen이 명명한 K-Means는 60년 이상 사용되어 온 클래식 알고리즘입니다. 구현이 간단하고 빠르며, 대용량 데이터에도 효율적으로 동작해 여전히 가장 많이 사용되는 클러스터링 기법입니다.
알고리즘은 1) K개의 초기 중심점(centroid) 선택, 2) 각 데이터를 가장 가까운 중심점에 할당, 3) 각 군집의 평균으로 중심점 업데이트, 4) 수렴할 때까지 2-3 반복의 과정으로 동작합니다.
실무에서 최적의 K값은 Elbow Method(관성 그래프의 꺾이는 지점)나 Silhouette Score로 결정합니다. sklearn의 KMeans는 백만 개 데이터도 수 초 내에 처리 가능하며, MiniBatchKMeans는 더 큰 데이터셋에 적합합니다.
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt
import numpy as np
# 샘플 데이터 생성 (고객 데이터 시뮬레이션)
np.random.seed(42)
X = np.vstack([
np.random.randn(100, 2) + [0, 0], # 그룹 1
np.random.randn(100, 2) + [5, 5], # 그룹 2
np.random.randn(100, 2) + [10, 0] # 그룹 3
])
# 데이터 표준화 (중요!)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Elbow Method로 최적 K 찾기
inertias = []
silhouettes = []
K_range = range(2, 11)
for k in K_range:
kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)
kmeans.fit(X_scaled)
inertias.append(kmeans.inertia_)
silhouettes.append(silhouette_score(X_scaled, kmeans.labels_))
# 최적 K로 클러스터링 (silhouette 최대값 기준)
best_k = K_range[np.argmax(silhouettes)]
print(f"최적 K: {best_k}")
kmeans_final = KMeans(n_clusters=best_k, random_state=42, n_init=10)
labels = kmeans_final.fit_predict(X_scaled)
print(f"Silhouette Score: {silhouette_score(X_scaled, labels):.3f}")
print(f"각 군집 크기: {np.bincount(labels)}")
"K-Means로 고객 세분화를 진행했습니다. Elbow Method로 확인한 결과 K=5가 최적이고, Silhouette Score 0.62로 군집이 잘 분리되었습니다. VIP, 일반, 이탈 위험 등 5개 그룹으로 마케팅 전략을 수립할 수 있습니다."
"K-Means는 거리 기반 알고리즘이라 스케일에 민감합니다. StandardScaler로 정규화가 필수이고, 초기 중심점 선택에 따라 결과가 달라지므로 k-means++나 여러 번 실행(n_init)으로 안정성을 높입니다."
"비구형(non-spherical) 군집이나 밀도가 다른 경우엔 K-Means보다 DBSCAN이 더 적합해요. 하지만 해석이 쉽고 속도가 빨라서 탐색적 분석 초기 단계에는 K-Means로 시작하는 게 좋습니다."
스케일이 다른 피처가 있으면 거리 계산이 왜곡됩니다. StandardScaler나 MinMaxScaler로 반드시 정규화하세요.
직관에 의존하지 말고 Elbow Method와 Silhouette Score로 객관적으로 K를 결정하세요.
초기값 의존성을 줄이려면 n_init=10 이상으로 설정해 여러 번 실행 후 최적 결과를 선택합니다.