데이터 분석/데이터 사이언스

데이터 사이언스 - 8. 비지도 학습 (Unsupervised Learning) (8.1 군집 분석 (Clustering))

개발_노트 2025. 3. 20. 17:03

8.1 군집 분석 (Clustering)

군집 분석(Clustering)은 비지도 학습(unsupervised learning)의 한 종류로, 데이터를 유사한 특성을 가진 그룹(클러스터)으로 자동으로 분류하는 기법이다.
라벨이 없는 데이터를 분석하는 데 사용되며, 고객 세분화, 이상 탐지, 이미지 분할 등 다양한 분야에서 활용된다.

이 장에서는 대표적인 군집 분석 기법인 K-Means 클러스터링과 계층적 클러스터링을 다룬다.


8.1.1 K-Means 클러스터링 (K-Means Clustering)

1) K-Means란?

K-Means는 데이터를 K개의 클러스터로 자동 분류하는 대표적인 군집 알고리즘이다.
각 데이터 포인트는 가장 가까운 중심점(centroid)을 기준으로 클러스터에 할당된다.

2) K-Means 알고리즘 과정

  1. 군집 개수(K)를 지정
  2. K개의 중심점(초기 centroid)을 랜덤하게 설정
  3. 각 데이터 포인트를 가장 가까운 중심점에 할당하여 클러스터 구성
  4. 클러스터의 중심점을 새롭게 계산
  5. 중심점의 변화가 특정 임계값(tol) 이하로 감소하거나 최대 반복 횟수(max_iter)에 도달할 때까지 반복

📌 Python 코드 예제 (K-Means 클러스터링 적용)

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

# 샘플 데이터 생성 (3개의 클러스터)
X, _ = make_blobs(n_samples=300, centers=3, cluster_std=1.0, random_state=42)

# K-Means 모델 생성 및 학습
kmeans = KMeans(n_clusters=3, tol=1e-4, max_iter=300, random_state=42)  # tol: 임계값, max_iter: 최대 반복 횟수
kmeans.fit(X)

# 예측 (각 데이터의 군집 할당)
labels = kmeans.labels_

# 중심점 가져오기
centroids = kmeans.cluster_centers_

# 시각화
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', alpha=0.6, edgecolors='k')
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', marker='X', s=200, label="Centroids")
plt.title("K-Means Clustering Example")
plt.legend()
plt.show()

K-Means 클러스터링의 특징

  • 빠르고 효율적인 군집화 알고리즘
  • K(군집 개수)를 사전에 설정해야 함
  • 구 형태로 분포된 데이터에 효과적
  • 초기 중심점 선택에 따라 결과가 달라질 수 있음 → 여러 번 실행하여 최적의 클러스터 찾기 필요

3) 최적의 K 값 선택 (엘보우 기법, Elbow Method)

K 값(클러스터 개수)을 선택하는 방법 중 가장 널리 사용되는 기법은 엘보우 기법(Elbow Method)이다.
이 방법은 K 값을 변화시키면서 오차 제곱합(SSE, Sum of Squared Errors)을 측정하여, SSE가 급격히 감소하는 지점을 최적의 K 값으로 선택한다.

📌 Python 코드 예제 (엘보우 기법 활용)

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

# 시각화
plt.plot(range(1, 10), sse, marker='o')
plt.xlabel("Number of Clusters (K)")
plt.ylabel("SSE (Inertia)")
plt.title("Elbow Method for Optimal K")
plt.show()

엘보우 기법 해석

  • 그래프에서 급격한 감소가 멈추는 지점(무릎, elbow)이 최적의 K 값
  • 너무 많은 K를 선택하면 과적합(overfitting) 위험이 있음

8.1.2 계층적 클러스터링 (Hierarchical Clustering)

1) 계층적 클러스터링이란?

  • 데이터 간 유사도를 기반으로 계층적으로 군집을 형성하는 알고리즘
  • 데이터 포인트 간 거리를 계산하여 비슷한 것끼리 묶어 나가는 방식
  • 트리 형태의 덴드로그램(Dendrogram)을 통해 군집 구조를 시각적으로 표현 가능

2) 계층적 클러스터링 알고리즘 유형

  • 병합적 클러스터링(Agglomerative Clustering):
    • 각 데이터 포인트를 개별 클러스터로 시작
    • 가까운 클러스터끼리 합쳐 나감
    • 일반적으로 많이 사용됨
  • 분할적 클러스터링(Divisive Clustering):
    • 전체 데이터를 하나의 클러스터로 시작
    • 점점 세분화하여 여러 개의 클러스터로 나눔

3) 계층적 클러스터링 과정

  1. 각 데이터 포인트를 개별 클러스터로 시작
  2. 두 개의 가장 가까운 클러스터를 합침
  3. 위 과정을 반복하여 하나의 클러스터가 될 때까지 수행
  4. 덴드로그램(Dendrogram)으로 군집 형성 과정 시각화 가능

📌 Python 코드 예제 (계층적 클러스터링 적용)

import scipy.cluster.hierarchy as sch
from sklearn.cluster import AgglomerativeClustering

# 덴드로그램 시각화
plt.figure(figsize=(10, 5))
sch.dendrogram(sch.linkage(X, method="ward"))
plt.title("Dendrogram (Hierarchical Clustering)")
plt.xlabel("Data Points")
plt.ylabel("Distance")
plt.show()

# 계층적 클러스터링 모델 적용 (3개 군집)
hierarchical = AgglomerativeClustering(n_clusters=3)
labels = hierarchical.fit_predict(X)

# 결과 시각화
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap="viridis", alpha=0.6, edgecolors='k')
plt.title("Hierarchical Clustering Example")
plt.show()

계층적 클러스터링의 특징

  • 덴드로그램을 통해 데이터의 군집 구조를 시각적으로 분석 가능
  • K 값을 미리 정하지 않아도 됨
  • 데이터 개수가 많아지면 계산량 증가 (느림)

8.1.3 K-Means vs 계층적 클러스터링 비교

비교 항목  K-Means 계층적 클러스터링
군집 개수(K) 미리 지정 필요 자동 결정 가능
속도 빠름 (대규모 데이터 적합) 느림 (작은 데이터 적합)
데이터 구조 원형 분포 데이터에 적합 다양한 형태의 데이터에 적합
시각적 분석 덴드로그램 없음 덴드로그램 제공
초기 설정 초기 중심점 선택 필요 초기 설정 불필요

언제 K-Means를 사용할까?

  • 데이터가 크고 원형 분포를 이루는 경우
  • 빠른 속도가 필요한 경우

언제 계층적 클러스터링을 사용할까?

  • 작은 데이터에서 군집 구조를 시각적으로 분석하고 싶은 경우
  • K 값을 미리 알 수 없는 경우