[ML] 머신러닝 7강 - 그룹을 나누려면, 클러스터링

 

클러스터링 (군집분석) <- 비지도 학습

별도의 정답(레이블)없이 데이터 패턴을 파악, 세분화

 

비지도 학습

  • 데이터의 군집화
  • 차원 축소
  • 이상치 탐지

🔍 핵심! 비지도 학습은 '라벨' 대신 '데이터 자체의 유사성과 패턴'에 집중

 

군집분석

  • 비슷한 특성을 가진 데이터를 묶어서,
  • 각 그룹 내 데이터끼리 유사도를 최대화 하고,
  • 다른 그룹과 차이는 최대화하는 기법

데이터의 구조 파악 : 정답 없이 데이터의 자연스러운 분포를 확인

세분화 : 마케팅 -> 고객 세분화, 제조업 -> 센서 데이터로 기계작동 패턴 분류 등

 

군집분석의 절차

1. 데이터 수집 및 전처리 : 이상치 제거, 결측치 처리,  스케일링/정규화

2. 군집 수 또는 파라미터 설정 : k-means는 k 설정, DBSCAN은 거리(ε), 최소 데이터 수(minPts) 등

3. 군집화 알고리즘 적용 : 설정에 따라 알고리즘 수행

4. 결과 해석 및 평가 : 실루엣 계수 등 군집 평가 지표 활용

5. 사후 활용 : 마케팅 전략, 제품 개선, 이상치 탐지 등

 

주요 군집 분석 알고리즘 소개

: 정답값이 없는 상황에서 왼쪽 사진을 오른쪽 사진처럼 군집화!

Clustering(군집분석) : 거리기반


K-Means

Wikipediak-means clustering​ 참고

알고리즘 개요 (중심점을 찾아나가는 과정)

: 미리 군집 수 k 지정

: 무작위로 k개 중심을 선택 후, 각 데이터 포인트를 가장 가까운 중심에 할당

: 각 군집의 중심을 다시 계산 -> 재할당하는 과정 반복

: 군집 내 데이터와 중심 간 거리의 제곱합을 최소화

 

장점

  • 계산속도 빠르고, 구현 간단
  • 대용량 데이터 비교적 잘 작동

단점

  • 군집 수 k를 미리 알아야함
  • 이상치에 취약 (중심값에 영향을 미침)
  • 구형 구조가 아닌 복잡한 형태의 분포를 파악하기 어려움

예시

: 고객 데이터를 나이, 월평균 지출액, 자주 구매하는 카테고리(원-핫 인코딩 후 스케일링 적용) 등을 가지고 분석

: k=3 으로 설정한다면, 아래 군집으로 나뉠 수 있음

  • "저가 위주의 고객"
  • "중간 가격대 선호 고객"
  • "고가 제품 위주 고객"

 

DBSCAN (Density-Based Spatial Clustering of Applications with Noise)

DBSCAN : 밀도 기반

알고리즘 개요

: 밀도 기반 군집화 기법.

✔️ 일정거리 내 데이터가 많으면(최소 포인트 수 이상) 그 영역을 '밀도가 높다'고 판단 -> 군집으로 결정

: k를 미리 설정하지 않아도 됨. 노이즈 포인트(어느 군집에도 속하지 않는 점)을 구분할 수 있음

 

장점

  • 군집 수를 사전에 알 필요가 없음
  • 노이즈와 이상치를 자연스럽게 처리
  • 구형이 아닌 복잡한 형태의 군집도 잘 찾아냄

단점

  • 파라미터 ε와 minPts에 민감
  • 데이터 밀도가 균일하지 않으면 성능이 떨어질 수 있음

예시

  • 지리정보(GIS) 분석에서 지역별로 가게가 얼마나 밀집되어 있는지 분석할 때 사용
  • 특정 지점에 가게가 몰려 있으면 하나의 군집, 중간에 뜨문뜨문 있는 가게는 노이즈로 분류

 

계층적 클러스터링

-> 덴드로그램을 그려서 확인

알고리즘 개요

: 유사도가 가장 높은 군집들끼리 병합 -> 최종적으로 하나의 군집(트리) 형성

: 하나의 군집을 분할해 나가는 방법도 있음(분할적 접근)

 

장점

  • 군집의 계층 구조 파악 수월(덴드로그램)
  • 군집 수를 명확히 결정하지 않아도, 덴드로그램의 특정 높이(cut)에 따라 유연하게 군집 수 결정 가능

단점

  • 계층 복잡도가 높아서 대규모 데이터에 적용하기 어려움

예시

  • 유전자 데이터 분석: 유전자 발현 패턴이 유사한 것끼리 계층적으로 묶어, 생물학적 특성 추론
  • 다양한 문서(텍스트) 클러스터링에서 단어의 사용 빈도 등을 기반으로 문서 구조를 시각화

▼ 클러스터링 코드 예시

더보기
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from sklearn.datasets import load_iris
from sklearn.cluster import KMeans, DBSCAN, AgglomerativeClustering
from sklearn.model_selection import train_test_split
from sklearn.metrics import silhouette_score
from sklearn.decomposition import PCA

# 1. 데이터 로드
iris = load_iris()
X = iris.data
y = iris.target  # 실제 품종 레이블(군집 학습 자체에는 사용하지 않음)


# 3. K-Means
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans_labels = kmeans.fit_predict(X)

# 4. DBSCAN
dbscan = DBSCAN(eps=0.5, min_samples=5)
dbscan_labels = dbscan.fit_predict(X)

# 5. 계층적 클러스터링 (AgglomerativeClustering)
agg = AgglomerativeClustering(n_clusters=3)
agg_labels = agg.fit_predict(X)

# 6. 각 군집 결과의 실루엣 지수 평가
kmeans_sil = silhouette_score(X, kmeans_labels)
dbscan_sil = silhouette_score(X, dbscan_labels)
agg_sil = silhouette_score(X, agg_labels)

print("=== 군집 결과 비교 ===")
print("K-Means: 실루엣 점수 =", kmeans_sil, "| 클러스터 라벨 =", np.unique(kmeans_labels))
print("DBSCAN: 실루엣 점수 =", dbscan_sil, "| 클러스터 라벨 =", np.unique(dbscan_labels))
print("Agglomerative: 실루엣 점수 =", agg_sil, "| 클러스터 라벨 =", np.unique(agg_labels))

# 7. 시각화를 위해 PCA로 차원 축소 (2차원)
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

# 8. 군집 결과 시각화
fig, axes = plt.subplots(1, 3, figsize=(15, 4))

# K-Means 시각화
axes[0].scatter(X_pca[:, 0], X_pca[:, 1], c=kmeans_labels)
axes[0].set_title("K-Means")

# DBSCAN 시각화
axes[1].scatter(X_pca[:, 0], X_pca[:, 1], c=dbscan_labels)
axes[1].set_title("DBSCAN")

# Agglomerative 시각화
axes[2].scatter(X_pca[:, 0], X_pca[:, 1], c=agg_labels)
axes[2].set_title("Agglomerative")

plt.tight_layout()
plt.show()

군집 분석 평가 방법

정답이 없기 때문에 군집 평가 지표가 매우 중요함

 

실루엣 계수

각 데이터 포인트의 응집도(a)와 분리도(b)를 이용해 계산

  • 응집도(a) : 같은 군집 내 데이터와의 평균 거리
  • 분리도(b) : 가장 가까운 다른 군집과의 평균 거리

범위

  • -1 과 1 사이
  • 1에 가까울수록 해당 데이터가 잘 군집됨
  • 0 근처면 군집 경계에 위치
  • 0보다 작으면 잘못 군집 가능성

 

Davies-Bouldin Index

군집 내 분산과 군집 간 거리의 비율을 활용, 거리를 비교하면서 군집끼리 얼마나 겹치는지 측정

 

범위

  • 0 이상
  • 값이 0에 가까울수록 잘 구분됨
  • 값이 커질수록 군집 간 겹침이 많아 군집화 품질 낮음

 

내부 평가 vs 외부 평가

내부 평가(internal evaluation)

: 데이터 내부의 정보(분산, 거리 등)를 활용해 평가 (실루엣 계수, davies-bouldin index 등)

 

외부 평가(exteranl evaluation)

: 이미 알려진 레이블(정답)과 군집 결과를 비교(정답이 있을 때만 가능)


▼ 사례

더보기

마케팅 - 고객 세분화 후 맞춤형 마케팅

시나리오 예시

 

1️⃣ 대형 온라인 쇼핑몰에서 여러 고객들의 구매 패턴 데이터(평균 구매 금액, 구매 주기, 선호 카테고리 등)를 수집

 

2️⃣ K-Means나 계층적 군집으로 고객을 세 그룹으로 분류

  • 그룹 A: 저가 상품 위주 구매, 주기적으로 소량 구매
  • 그룹 B: 중간 가격대 상품, 꾸준한 구매, 리워드나 할인에 민감
  • 그룹 C: 고가 브랜드 위주 구매, 구매 빈도는 낮지만 1회 결제 금액이 큼

3️⃣ 활용 방안

  • 그룹 A에게는 프로모션 쿠폰, 특정 시즌 할인
  • 그룹 B에게는 멤버십 등급 혜택, 꾸준한 재구매를 위한 포인트 적립 강화
  • 그룹 C에게는 프리미엄 서비스, 맞춤형 추천, VIP 전용 이벤트

결과

  • 고객 만족도 상승, 마케팅 비용 절감, 구매 전환율 증가 효과가 기대

제조업 – 센서 데이터 군집화와 이상 탐지

시나리오 예시

 

1️⃣ 공장에 설치된 기계에서 주기적으로 측정되는 온도, 진동, 압력 등의 센서 데이터 수집

 

2️⃣ DBSCAN을 이용해 비슷한 작동 패턴의 센서 데이터를 군집화

  • 군집 1: 정상 범주(온도와 진동 값이 일정 범위 내)
  • 군집 2: 약간 불안정한 패턴(진동이 가끔 튀는 경우)
  • 노이즈: 완전히 이상치(기계 고장 상태)

3️⃣ 활용 방안

  • 불안정 군집이 얼마나 발생하는지 모니터링하여 사전 정비 계획 수립
  • 노이즈로 분류된 이상치를 즉시 점검하여 사고 예방

결과

  • 예지 정비(Predictive Maintenance)를 통해 생산 라인의 다운타임 줄이고, 비용 절감 가능

 

총 정리
1. 비지도 학습은 레이블 없이 데이터 구조를 파악하는 데 사용
2. 군집 분석은 유사한 데이터끼리 묶어 세분화하고, 다양한 분야에서 활용
3. k-means, dbscan, 계층적 군집 알고리즘별 특성 파악
4. 군집화 결과는 실루엣 계수, davies-bouldin index 등으로 정성, 정량적 평가
5. 다양한 실무 분야에서 고객 세분화, 이상치 탐지 등으로 적극 활용

+ 앞으로 알면 더 좋은 내용
: 이상치 탐지나 토픽 모델링 영역과도 연계해 폭넓은 분석 수행
(토픽 모델링: 문서를 이루는 단어패턴을 분석 -> 여러 문서에 걸쳐 자주 함께 등장하는 단어들의 집합을 하나의 토픽으로 간주하는 방식)

 

! 결론

: 군집 분석은 단순히 "데이터를 몇 개 그룹으로 묶었다"에서 끝나지 않고, 왜 그룹이 그렇게 나뉘었는지(의미 해석)와 어떻게 업무에 활용할지(실행 전략)까지 연결해야 비즈니스 가치를 창출

 


부가 자료(참고)

📚 Scikit-Learn Documentation: https://scikit-learn.org

📚 차트 시각화: matplotlib, seaborn 등을 활용해 군집 결과 시각화

📚 실루엣 계수 시각화: sklearn.metrics.silhouette_samples 활용