본문 바로가기
데이터분석데브코스 8/이론

8 - 16. K-means Clustering, 17. K-means 실습

by DataJ 2025. 5. 28.

실습 목표

kaggle : https://www.kaggle.com/code/jiakim1324/k-means-clustering

 

🧠 K-means란?

  • 비지도 학습의 대표적인 군집화 알고리즘
  • 데이터를 K개의 클러스터로 자동 분할하여 유사한 데이터끼리 그룹화
  • 중심(centroid)은 각 군집의 평균 위치
  • 🎯 특징: 간단하고 빠르며, 시각적으로 해석하기 쉬움

⚙️ K-means 알고리즘 과정 (Lloyd 방식 기준)

  1. 초기화
    • K개의 중심점 무작위 설정 (k-means++ 방식 권장)
  2. 할당 (Assignment)
    • 각 데이터 포인트를 가장 가까운 중심점에 할당
    • 거리 기준: 일반적으로 유클리드 거리
      • 대안: 코사인 유사도, 맨해튼 거리
  3. 업데이트 (Update)
    • 각 클러스터의 중심점을 새롭게 계산 (군집 내 평균)
  4. 반복 (Repeat)
    • 클러스터링 결과가 더 이상 변하지 않거나, 최대 반복 수에 도달할 때까지 반복

📉 최적 K 선택법: 엘보우 방법 (Elbow Method)

  • 다양한 K값에 대해 SSE(Sum of Squared Errors)를 측정하여 **SSE 감소율이 급격히 줄어드는 지점(K)**을 찾음
  • "팔꿈치처럼 꺾이는 지점"이 최적의 K

📐 클러스터 품질 평가: 실루엣 계수 (Silhouette Coefficient)

  • 1 ~ 1 사이의 값
    • +1: 응집도 높고, 분리도 높음 → 군집화 잘됨
    • 0: 경계에 위치
    • 1: 잘못된 클러스터링
  • 계산식:s(i)=max(a(i),b(i))b(i)−a(i)
    • a(i): 같은 클러스터 내 평균 거리 (응집도)
    • b(i): 가장 가까운 외부 클러스터와의 평균 거리 (분리도)
  • s(i)=b(i)−a(i)max⁡(a(i),b(i))s(i) = \frac{b(i) - a(i)}{\max(a(i), b(i))}

🧪 Python 실습 예제

✅ 기본 K-means 클러스터링

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

# 데이터 생성
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.6, random_state=0)

# 모델 학습
kmeans = KMeans(n_clusters=4, random_state=0)
kmeans.fit(X)

# 시각화
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1],
            s=200, c='red', marker='X')
plt.title("K-means Clustering")
plt.show()

✅ 엘보우 방법으로 최적 K 찾기

sse = []
K_range = range(1, 11)
for k in K_range:
    kmeans = KMeans(n_clusters=k, random_state=0).fit(X)
    sse.append(kmeans.inertia_)  # inertia_는 SSE

plt.plot(K_range, sse, marker='o')
plt.title('Elbow Method')
plt.xlabel('Number of Clusters (K)')
plt.ylabel('SSE')
plt.show()

✅ 실루엣 계수로 클러스터 평가

from sklearn.metrics import silhouette_score

# 예시: K=4
kmeans = KMeans(n_clusters=4, random_state=0).fit(X)
labels = kmeans.labels_
score = silhouette_score(X, labels)
print(f'Silhouette Score (K=4): {score:.2f}')

📝 요약

항목 내용

목적 데이터를 자동으로 유사한 그룹으로 분류
핵심 단계 초기화 → 할당 → 업데이트 → 반복
하이퍼파라미터 K (클러스터 수)
평가 방법 Elbow (SSE), Silhouette Score
주요 사용 사례 고객 세분화, 이미지 분류, 문서 군집화 등