클러스터링 (군집분석) <- 비지도 학습
별도의 정답(레이블)없이 데이터 패턴을 파악, 세분화
비지도 학습
- 데이터의 군집화
- 차원 축소
- 이상치 탐지
🔍 핵심! 비지도 학습은 '라벨' 대신 '데이터 자체의 유사성과 패턴'에 집중
군집분석
- 비슷한 특성을 가진 데이터를 묶어서,
- 각 그룹 내 데이터끼리 유사도를 최대화 하고,
- 다른 그룹과 차이는 최대화하는 기법
데이터의 구조 파악 : 정답 없이 데이터의 자연스러운 분포를 확인
세분화 : 마케팅 -> 고객 세분화, 제조업 -> 센서 데이터로 기계작동 패턴 분류 등
군집분석의 절차
1. 데이터 수집 및 전처리 : 이상치 제거, 결측치 처리, 스케일링/정규화
2. 군집 수 또는 파라미터 설정 : k-means는 k 설정, DBSCAN은 거리(ε), 최소 데이터 수(minPts) 등
3. 군집화 알고리즘 적용 : 설정에 따라 알고리즘 수행
4. 결과 해석 및 평가 : 실루엣 계수 등 군집 평가 지표 활용
5. 사후 활용 : 마케팅 전략, 제품 개선, 이상치 탐지 등
주요 군집 분석 알고리즘 소개
: 정답값이 없는 상황에서 왼쪽 사진을 오른쪽 사진처럼 군집화!

K-Means
Wikipediak-means clustering 참고
알고리즘 개요 (중심점을 찾아나가는 과정)
: 미리 군집 수 k 지정
: 무작위로 k개 중심을 선택 후, 각 데이터 포인트를 가장 가까운 중심에 할당
: 각 군집의 중심을 다시 계산 -> 재할당하는 과정 반복
: 군집 내 데이터와 중심 간 거리의 제곱합을 최소화
장점
- 계산속도 빠르고, 구현 간단
- 대용량 데이터 비교적 잘 작동
단점
- 군집 수 k를 미리 알아야함
- 이상치에 취약 (중심값에 영향을 미침)
- 구형 구조가 아닌 복잡한 형태의 분포를 파악하기 어려움
예시
: 고객 데이터를 나이, 월평균 지출액, 자주 구매하는 카테고리(원-핫 인코딩 후 스케일링 적용) 등을 가지고 분석
: k=3 으로 설정한다면, 아래 군집으로 나뉠 수 있음
- "저가 위주의 고객"
- "중간 가격대 선호 고객"
- "고가 제품 위주 고객"
DBSCAN (Density-Based Spatial Clustering of Applications with Noise)

알고리즘 개요
: 밀도 기반 군집화 기법.
✔️ 일정거리 내 데이터가 많으면(최소 포인트 수 이상) 그 영역을 '밀도가 높다'고 판단 -> 군집으로 결정
: 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 활용
'머신러닝' 카테고리의 다른 글
| [ML] 머신러닝 8강 - 데이터가 넘 복잡할 땐, 차원 축소 (0) | 2025.11.20 |
|---|---|
| [ML] 머신러닝 6강 - 하나보단 둘, 잉상블 기법 (0) | 2025.11.19 |
| [ML] 머신러닝 5강 - 무엇인지 맞추고 싶으면 분류! (1) | 2025.11.18 |