[ML] Clustering

jul ee·2025년 5월 20일

데이터 성장기

목록 보기
103/139

🖇  Clustering 종류
🖇  비계층적 군집분석: K-means Clustering
🖇  비계층적 군집분석 실습
🖇  계층적 군집분석: Hierarchical Clustering
🖇  계층적 군집분석 실습
🖇  군집 분석 평가 지표


Clustering(군집분석)은 유사한 성질을 가진 데이터들을 하나의 그룹(군집)으로 묶는 비지도학습 기법이다.

레이블이 없는 데이터를 대상으로 내부 구조를 파악하고 비슷한 패턴을 가진 데이터를 분류한다.

Clustering의 핵심 목표는 군집 내의 데이터는 최대한 유사하게, 군집 간의 데이터는 최대한 이질적으로 만드는 것이다. 하나의 군집 안에는 서로 가까운 데이터들이 모이도록 하고, 서로 다른 군집은 명확하게 구분되도록 한다. 이러한 군집화는 고객 세분화, 추천 시스템, 이미지 분류, 이상 탐지 등 여러 분야에서 다양하게 활용되고 있다.

이 글에서는 Clustering의 개념과 종류를 정리하고, K-means와 계층적 군집 분석의 작동 원리 및 시각화 방법, 클러스터 평가 지표까지 포함하여 군집 분석 전반을 다루고 있다. PCA를 활용한 차원 축소와 군집화 병행 사례를 통해 군집 분석이 데이터 탐색과 해석에 어떻게 활용될 수 있는지도 이해해 보았다.

자세한 실습 과정 및 출력 결과는 GitHub repository에서 확인할 수 있다.




🖇  Clustering 종류

군집분석은 크게 두 가지 방식으로 나뉜다.

계층적 군집분석(Hierarchical Clustering)

  • 데이터 간의 유사도를 기반으로 군집을 점차적으로 결합해 나가거나 분할하는 방식이다.
  • 일반적으로 덴드로그램(Dendrogram)을 활용해 군집 간의 병합 과정을 시각화하며, 군집의 수를 미리 결정하지 않는다는 특징이 있다.

비계층적 군집분석(Non-Hierarchical Clustering)

  • 대표적으로 K-means Clustering이 사용된다.
  • 분석 전에 군집의 수(K)를 먼저 정해두고, 각 군집 중심(centroid)을 기준으로 데이터를 반복적으로 재분류하여 최적의 군집 구성을 찾는다.

K-means는 계산 속도가 빠르고 단순하지만, 군집 수를 사전에 지정해야 하고 초기 중심값에 따라 결과가 달라질 수 있다. 계층적 군집 분석은 직관적인 구조 파악에 유리하지만, 계산량이 많고 대용량 데이터에는 다소 비효율적일 수 있다.

각 방법은 목적과 데이터 특성에 따라 선택된다. 아래에서 더 자세히 알아보자.



🖇  비계층적 군집분석: K-means Clustering

K-means는 비지도학습 기반 군집화 기법 중 가장 많이 사용되는 알고리즘이다.

분석자는 군집 수 K를 사전에 정하고, K개의 중심점(centroid)을 기준으로 데이터를 군집화한다. 알고리즘은 다음의 과정을 반복 수행한다.

  1. 초기 중심점 K개를 임의로 설정한다.

  2. 각 데이터 포인트를 가장 가까운 중심점에 할당하여 군집을 형성한다.

  3. 각 군집의 중심점을 다시 계산한다.

  4. 중심점이 더 이상 크게 이동하지 않을 때까지 2~3번 단계를 반복한다.

이 과정에서 중심점이 이동하면서 군집의 모양이 점차 안정화되며 최종적으로 군집이 확정된다.


K-means의 한계

  • 군집의 수(K)를 직접 지정해야 한다.
  • 초기 중심점이 랜덤하게 정해지기 때문에 결과가 달라질 수 있다.
  • 구형(cluster)이 아닌 구조에는 적합하지 않을 수 있다.

군집 수 결정 방법 – Elbow Method

K-means를 사용할 때 가장 중요한 결정 중 하나는 군집 수(K)를 몇으로 정할 것인지이다.

이를 위해 사용하는 대표적인 방법이 엘보우 기법(Elbow Method)이다.

엘보우 기법은 군집 수에 따른 모형의 응집도(inertia)를 계산하여 군집 수가 증가함에 따라 응집도가 어떻게 변하는지를 시각화한다. 일반적으로 응집도는 군집 수가 늘어날수록 감소하지만, 일정 시점부터 감소율이 둔화되는 구간이 존재한다.

이 꺾이는 지점(elbow)을 최적의 군집 수로 선택한다. 예를 들어, 1~10개의 군집을 시도했을 때 응집도가 급격히 감소하다가 3 또는 4에서 완만해진다면 이 값을 최적 K로 설정한다.



🖇  비계층적 군집분석 실습

# KMeans 라이브러리
from sklearn.cluster import KMeans
import pandas as pd

# 데이터 불러오기
from sklearn.datasets import load_wine
dataset = load_wine()
data = pd.DataFrame(dataset.data, columns=dataset.feature_names)
df = data.copy()
# KMeans 선언 및 학습
kmeans = KMeans(n_clusters=3)
kmeans.fit(df)

# KMeans 예측
pred = kmeans.predict(df)
pred

# 실제값과 예측값 비교
#  - 이때 pred는 target값과 매칭되는 것이 아니라 단지 군집을 의미하는 것
df['target'] = dataset.target
df['pred'] = pred
df

1) PCA -> 군집 -> 시각화

고차원 데이터에서는 각 군집 간의 분포나 경계를 파악하기 어렵다. 이때 PCA(주성분 분석)를 통해 데이터의 차원을 2차원 또는 3차원으로 줄이면 군집 간의 분포 구조를 시각화할 수 있다.

와인 데이터셋에 대해 PCA를 적용해 2개의 주성분만 추출하고 K-means를 적용하면, 2차원 공간 상에서 각 데이터가 어떤 군집에 속하는지 시각적으로 확인할 수 있다. 이 과정은 군집 간 거리, 형태, 겹침 여부 등을 직관적으로 파악하는 데 유용하다.

# PCA
from sklearn.decomposition import PCA
df = data.copy()
pca = PCA(n_components=2)
df = pca.fit_transform(df)
df = pd.DataFrame(df)
df.head()

# Kmeans
kmeans = KMeans(n_clusters=3)
kmeans.fit(df)
pred = kmeans.predict(df)
df['kmeans'] = pred
df

# 각 군집의 중심점
centers = kmeans.cluster_centers_


# 시각화
import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=(12, 6))
sns.scatterplot(x=df.iloc[:,0], y=df.iloc[:,1], hue=df['kmeans'])
plt.scatter(centers[:,0], centers[:,1])

이렇게 PCA 공간 상에서 K-means가 설정한 중심점(centroid)도 함께 시각화하면 각 군집이 어떤 위치를 중심으로 형성되었는지도 볼 수 있다.


2) 클러스터 개수 찾는 방법 (엘보우 방법, elbow method)

# 군집 수 찾기
inertia = []
for i in range(1,10):
    kmeans = KMeans(n_clusters=i, random_state=2022)
    # 컬럼 이름을 모두 문자열로 변환
    df.columns = df.columns.astype(str)
    kmeans.fit(df)
    inertia.append(kmeans.inertia_)

plt.plot(range(1,10), inertia)

급격하게 감소하다가 완만해 지는 지점쯤을 선택하면 된다.
해당 예제에서는 2~4 사이에서 클러스터 지정할 수 있다.




🖇  계층적 군집분석: Hierarchical Clustering

계층적 군집 분석은 개체 간 유사도(거리)를 기준으로 군집을 점차적으로 병합하거나 분할하는 방식이다.

초기에는 각 데이터를 하나의 군집으로 간주하고, 가장 가까운 두 군집부터 순차적으로 병합해나간다.

대표적인 시각화 도구는 덴드로그램(Dendrogram)이다. 덴드로그램은 군집 간 결합 순서를 나무 형태로 표현하며 전체 구조를 시각적으로 확인할 수 있다.

덴드로그램 해석

트리 구조의 높이는 군집 간의 거리(또는 유사도)를 의미한다.

특정 높이에서 트리를 수직으로 자르면, 해당 높이에 따른 군집 수를 정할 수 있다. 군집 수를 사전에 정하지 않아도 시각적으로 구조를 파악한 후에 적절한 군집 수를 선택할 수 있다는 점이 큰 장점이다. 아래 실습에서 직접 확인해 본다.

계층적 군집 분석은 K-means보다 계산량이 많고 대용량 데이터에 적합하지는 않지만, 데이터의 계층적 관계나 다층적 군집 구조를 파악하는 데 매우 유용하다.



🖇  계층적 군집분석 실습

# 덴드로그램
from scipy.cluster.hierarchy import dendrogram, ward

1) PCA -> 타겟별 샘플링 -> 덴드로그램

# PCA
df = data.copy()
pca = PCA(n_components=2)
df = pca.fit_transform(df)
df = pd.DataFrame(df)

# 샘플링
kdata = df[:3].copy()
kdata = pd.concat([kdata, df[70:73]])
kdata = pd.concat([kdata, df[160:163]])
kdata


# 덴드로그램
linkage = ward(kdata)
dendrogram(linkage)

덴드로그램으로 개체 간의 유사성과 군집 형성 과정을 트리 형태로 볼 수 있다.

수평축은 개체(데이터 포인트)를 나타내고, 수직축은 군집 간 결합 시의 거리(또는 비유사도)를 나타낸다.

  • Y축 값이 낮을수록 서로 유사한 개체끼리 먼저 결합된다는 것을 의미한다. 예를 들어, 개체 0과 1이 가장 먼저 결합되었다면 이 둘은 매우 유사한 특성을 가진다.

  • 덴드로그램을 수평으로 자르는 위치에 따라 군집 수를 결정할 수 있다. 일반적으로 Y축의 거리 값이 급격히 증가하기 직전 구간을 기준으로 자르면 자연스러운 군집 수를 얻을 수 있다.

예시 그래프에서는 Y=600 정도에서 선을 자르면 3개의 군집으로 구분된다. 분석 목적에 따라 조정하여 사용하면 된다.

이렇게 덴드로그램을 통해 군집 간 거리 기반 구조를 시각적으로 파악하고, 데이터 간 유사성 구조를 직관적으로 이해할 수 있다.




🖇  군집분석 평가 지표

Clustering은 지도학습과 달리 정답이 없기 때문에 모델 평가 방식이 다르다.

아래는 대표적인 군집 평가 지표이다.

1) Silhouette Coefficient (실루엣 계수)

  • 한 데이터가 자신의 군집 내에서는 얼마나 가까운지(a), 다른 군집과는 얼마나 멀리 떨어져 있는지(b)를 비교하여 계산한다.
    Silhouette = (b - a) / max(a, b)
  • 값의 범위는 -1에서 1 사이이며 1에 가까울수록 군집화가 잘 된 것을 의미한다.

2) Dunn Index

  • 가장 가까운 두 군집 간의 거리 대비, 각 군집의 최대 직경을 비교하는 지표이다.
  • 군집 간 거리가 멀고, 군집 내부가 조밀할수록 Dunn Index는 높아진다. 수치가 클수록 군집 간 명확한 구분이 가능하다는 의미이다.

이러한 평가지표는 클러스터의 품질을 수치적으로 판단하는 데 도움을 주고 최적의 군집 수 선택에도 활용될 수 있다.




인사이트 및 회고

Clustering은 비지도학습의 대표적인 기법으로, 정답 없는 데이터에서 의미 있는 구조를 찾는 데에 중요하게 작용한다.

라벨이 없는 상황에서도 데이터의 숨겨진 패턴을 발견할 수 있기 때문에 탐색적 분석, 사용자 세분화, 이상 탐지 등 다양한 분야에 적용되고 있다.

K-means는 가장 많이 사용되는 군집화 기법으로 빠르고 효율적인 분석이 가능하고, 계층적 군집 분석은 구조적인 해석과 시각화에 유리하다는 것을 알 수 있었다.

또한, Clustering을 차원 축소 기법(PCA)과 병행하면 군집 구조에 대한 시각적 이해도를 크게 높일 수 있다.

Clustering을 적절하게 활용하면 정량적 지표와 시각화를 통해 데이터가 어떤 구조를 가지고 있는지 해석의 방향을 잡을 수 있을 것이다.

profile
AI에 관심을 가지고, 데이터로 가치를 만들어 나가는 과정을 기록합니다.

0개의 댓글