머신러닝_클러스터링

김정현·2025년 12월 6일

머신러닝

목록 보기
6/9

비지도 학습의 대표 기법인 군집 분석은 별도의 정답(레이블) 없이 데이터의 패턴을 파악하고 세분화함으로써 다양한 분야(마케팅, 제조, 이상탐지 등)에서 유용하게 활용될 수 있다.

1. 비지도 학습 개요

비지도 학습이란?

  • 비지도 학습(Unsupervised Learning)은 정답(레이블) 없이 데이터에서 패턴이나 구조를 찾는 머신 러닝 기법을 의미합니다.

  • 활용 영역
    - 데이터의 군집화(Clustering)
    - 차원 축소(Dimensionality Reduction)
    - 이상치 탐지(Anomaly Detection) 등

지도 학습과의 비교

  • 지도 학습(Supervised Learning)

    • 입력 데이터에 대한 정답(레이블)을 알고 있는 상태에서 모델을 학습하여, 새로운 데이터가 들어왔을 때 레이블을 예측.
    • ex) 이미지 분류, 스팸 메일 분류
  • 비지도 학습(Unsupervised Learning)

    • 별도의 레이블이 없고, 오직 입력 데이터만으로부터 구조를 파악.
    • ex) 고객 그룹화(세분화), 문서 토픽 분류

핵심 포인트! 비지도 학습에서는 ‘라벨’ 대신 ‘데이터 자체의 유사성과 패턴’에 집중합니다.


2. 군집 분석(Clustering)의 개념

군집 분석이란?

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

  • 목적

    1️⃣ 데이터의 구조 파악

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

    2️⃣ 세분화(Segmentation)

    : 마케팅에서는 고객 세분화를, 제조업에서는 센서 데이터로 기계 작동 패턴 분류 등을 수행

군집 분석의 절차

1️⃣ 데이터 수집 및 전처리

: 이상치 제거, 결측치 처리, 스케일링/정규화

2️⃣ 군집 수 또는 파라미터 설정

: K-Means의 경우 k 설정, DBSCAN은 거리(ε), 최소 데이터 수(minPts) 등

3️⃣ 군집화 알고리즘 적용

: 설정에 따라 알고리즘 수행

4️⃣ 결과 해석 및 평가

: 실루엣 계수 등 군집 평가 지표 활용

5️⃣ 사후 활용

: 마케팅 전략, 제품 개선, 이상치 탐지 등


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

K-Means

  • [코드스니펫] K-Means 클러스터링 학습 과정 GIF
    https://en.wikipedia.org/wiki/K-means_clustering#/media/File:K-means_convergence.gif

https://en.wikipedia.org/wiki/K-means_clustering#/media/File:K-means_convergence.gif

1️⃣ 알고리즘 개요

: 미리 군집 수 k를 지정해야 함

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

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

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

2️⃣ 장점

: 계산 속도가 빠르고 구현이 간단

: 대용량 데이터에도 비교적 잘 작동

3️⃣ 단점

: 군집 수 k를 미리 알아야 함

: 이상치에 취약(중심값에 영향을 미침)

: 구형(球形) 구조가 아닌 복잡한 형태의 분포를 파악하기 어려움

4️⃣ 예시

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

: k=3으로 설정한다면 “저가 위주의 고객”, “중간 가격대 선호 고객”, “고가 제품 위주 고객” 등으로 군집이 나뉠 수 있음

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

1️⃣ 알고리즘 개요

: 밀도 기반 군집화 기법. 일정 거리(ε) 내 데이터가 많으면(최소 포인트 수 minPts 이상) 그 영역을 ‘밀도가 높다’고 판단해 하나의 군집으로 결정

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

2️⃣ 장점

: 군집 수를 사전에 알 필요가 없음

: 노이즈와 이상치를 자연스럽게 처리

: 구형이 아닌 복잡한 형태의 군집도 잘 찾아냄

3️⃣ 단점

: 파라미터 ε와 minPts에 민감

: 데이터 밀도가 균일하지 않으면 성능이 떨어질 수 있음

4️⃣ 예시

: 지리정보(GIS) 분석에서 지역별로 가게가 얼마나 밀집되어 있는지 분석할 때 사용

: 특정 지점에 가게가 몰려 있으면 하나의 군집, 중간에 뜨문뜨문 있는 가게는 노이즈(Cluster에 속하지 않는 포인트)로 분류

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

1️⃣ 알고리즘 개요

: 데이터 포인트 각각이 하나의 군집으로 시작 → 유사도가 가장 높은 군집들끼리 병합 → 최종적으로 하나의 군집(트리) 형성

: 또는 하나의 군집에서 시작해 분할해 나가는 방법도 있음(분할적 접근)

: 덴드로그램(Dendrogram)으로 시각화가 가능

2️⃣ 장점

: 군집의 계층적 구조 파악이 쉬움(덴드로그램)

: 군집 수를 명확히 결정하지 않아도, 덴드로그램의 특정 높이(cut)에 따라 유연하게 군집 개수 결정 가능

3️⃣ 단점

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

4️⃣ 예시

: 유전자 데이터 분석: 유전자 발현 패턴이 유사한 것끼리 계층적으로 묶어, 생물학적 특성을 추론

: 다양한 문서(텍스트) 클러스터링에서 단어의 사용 빈도 등을 기반으로 문서 구조를 시각화

클러스터링 코드 예시

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()
  • 코드 해설
    • 데이터 로드를 진행합니다.
      • load_iris 함수를 사용하여 Iris 데이터를 가져옵니다.
      • 4차원의 연속형 특성(꽃받침 길이·폭, 꽃잎 길이·폭)과 3개 품종 레이블이 존재합니다.
    • 학습/테스트 데이터 분할은 선택 사항이지만, 예시로 70% 데이터를 학습에, 30%를 테스트에 사용하도록 분할했습니다.
    • 세 가지 군집 기법으로 학습을 수행합니다.
      • K-Means: n_clusters=3으로 클러스터를 3개로 분할합니다.
      • DBSCAN: eps=0.5, min_samples=5를 기본 설정으로 사용합니다.
      • AgglomerativeClustering: n_clusters=3으로 계층적 군집을 수행합니다.
    • 군집 결과 평가실루엣 지수(Silhouette Score)와 Davies-Bouldin Index를 각각 계산해 봅니다.
      • silhouette_score(X_train, labels)는 실루엣 지수를 계산하며, 값이 클수록(최대 1) 군집화가 잘 되었다고 볼 수 있습니다.
      • davies_bouldin_score(X_train, labels)는 Davies-Bouldin 지수로, 값이 낮을수록 군집화 품질이 우수함을 의미합니다.
    • PCA로 2차원 축소 후 군집 결과를 시각화합니다.
      - 4차원 데이터를 2차원으로 변환하여 산점도를 그리므로, 실제 군집 분포가 단순화되어 보일 수 있습니다.
      - 그래프에서는 각각의 모델(K-Means, DBSCAN, Agglomerative) 결과를 다른 축에 표시하여 비교합니다.


4. 군집 분석 평가 방법

❗ 비지도학습은 ‘정답’이 없기 때문에 군집 평가 지표가 매우 중요

실루엣 계수(Silhouette Score)

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

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

  • 범위
    • -1 ~ 1
    • 1에 가까울수록 해당 데이터가 잘 군집되었음을 의미
    • 0 근처면 군집 경계에 위치
    • 0보다 작으면 잘못된 군집화 가능성

Davies-Bouldin Index

  • 군집 내 분산과 군집 간 거리의 비율을 활용

    • 각 군집에 대해 다른 군집과의 거리를 비교하면서, 군집끼리 얼마나 겹치는지 측정
  • 범위

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

내부 평가 vs. 외부 평가

  • 내부 평가(Internal Evaluation)

    • 데이터 내부의 정보(분산, 거리 등)를 활용해 평가 (실루엣 계수, Davies-Bouldin Index 등)
  • 외부 평가(External Evaluation)
    - 이미 알려진 레이블(정답)과 군집 결과를 비교(정답이 있을 때만 가능)


5. 사례

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

  • 시나리오 예시

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

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

    • 그룹 A: 저가 상품 위주 구매, 주기적으로 소량 구매

    • 그룹 B: 중간 가격대 상품, 꾸준한 구매, 리워드나 할인에 민감

    • 그룹 C: 고가 브랜드 위주 구매, 구매 빈도는 낮지만 1회 결제 금액이 큼

      3️⃣ 활용 방안

    • 그룹 A에게는 프로모션 쿠폰, 특정 시즌 할인

    • 그룹 B에게는 멤버십 등급 혜택, 꾸준한 재구매를 위한 포인트 적립 강화

    • 그룹 C에게는 프리미엄 서비스, 맞춤형 추천, VIP 전용 이벤트

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

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

  • 시나리오 예시

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

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

    • 군집 1: 정상 범주(온도와 진동 값이 일정 범위 내)

    • 군집 2: 약간 불안정한 패턴(진동이 가끔 튀는 경우)

    • 노이즈: 완전히 이상치(기계 고장 상태)

      3️⃣ 활용 방안

    • 불안정 군집이 얼마나 발생하는지 모니터링하여 사전 정비 계획 수립

    • 노이즈로 분류된 이상치를 즉시 점검하여 사고 예방

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


군집분석 실습 문제

  • Wine 데이터셋 로드
    • load_wine() 함수를 통해 와인 데이터를 가져옵니다.
    • 13개 연속형 특성과 3개의 와인 품종 레이블로 구성되어 있습니다.
    • 군집 자체는 비지도학습이므로 y 레이블은 직접 사용하지 않습니다(평가용으로 간단히 참고하거나 무시).
  • 3개의 군집 모델 모두 사용
    • DBSCAN의 경우 eps, min_samples 값에 따라서 군집이 나오지 않을 수도 있습니다
  • 실루엣 지수와 Davies-Bouldin 지수 계산
  • PCA 시각화 진행
  • [코드스니펫] 클러스터링 실습 사전 코드
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    # 1. Wine 데이터셋 불러오기
    from sklearn.datasets import load_wine
    wine = load_wine()
    X = wine.data
    y = wine.target  # 실제 레이블(군집 평가엔 직접 사용 안 함)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 1. Wine 데이터셋 불러오기
from sklearn.datasets import load_wine
wine = load_wine()
X = wine.data
y = wine.target  # 실제 레이블(군집 평가엔 직접 사용 안 함)

총 정리 및 Q&A

총 정리

1️⃣ 비지도 학습은 레이블 없이 데이터 구조를 파악하는 데 사용

2️⃣ 군집 분석은 유사한 데이터끼리 묶어 세분화하고, 다양한 분야에서 활용

3️⃣ K-Means, DBSCAN, 계층적 군집 알고리즘별 특성을 파악해 상황에 맞춰 선택

4️⃣ 군집화 결과는 실루엣 계수, Davies-Bouldin Index 등으로 정성·정량적으로 평가

5️⃣ 다양한 실무 분야에서 고객 세분화, 이상치 탐지 등으로 적극 활용 가능


💡 앞으로 알면 더 좋은 내용!

: 이상치 탐지(Anomaly Detection)나 토픽 모델링(Topic Modeling) 영역과도 연계해 폭넓은 분석 수행

  • 토픽 모델링이란?
    • 문서를 이루는 단어들의 패턴(분포)을 분석하여, 여러 문서에 걸쳐 자주 함께 등장하는 단어들의 집합을 하나의 토픽(주제)으로 간주하는 방식

: 실무에서는 여러 알고리즘을 시도해보며 최적의 군집 수 및 파라미터를 찾는 과정(Iteration)이 필수

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

Q&A

Q1: 군집 수(k)를 미리 어떻게 정하나요?

A1: K-Means의 경우 엘보(Elbow) 기법이나 실루엣 계수를 활용해 여러 k값을 시도해보고, 각 경우의 군집 품질 지표를 비교하여 적정 군집 수를 결정합니다.

  • 엘보(elbow)기법이란?
    • 특정 범위의 K값(예: 1부터 10까지)을 바꿔가며 모델을 학습한 뒤, 각 K에 대한 군집 내 제곱오차 합(SSE) 또는 WCSS(Within-Cluster Sum of Squares) 값을 구해 그래프로 표현하고 어느 지점에서 꺾여(“팔꿈치”처럼) 완만해지는 지점이 Elbow Point
    • 그 Elbow Point 지점에서의 K값을 결정하는 방식

Q2: K-Means와 DBSCAN 중 어느 것을 골라야 하나요?

A2: 데이터의 구조와 필요에 따라 다릅니다. 군집 수를 알고 있거나 대략적인 예상이 가능하면 K-Means가 간단하고 빠르며, 군집이 구형(球形) 형태가 아닐 수 있거나 노이즈 처리가 중요한 경우 DBSCAN이 유리합니다.

Q3: 비지도 학습에서는 모델 성능을 어떻게 평가하나요?

A3: 비지도 학습에는 정답(레이블)이 없으므로 실루엣 계수나 Davies-Bouldin Index 같은 내부 평가 지표를 사용해 군집 품질을 평가하거나, 필요 시 외부 평가지표(실제 라벨과 비교)가 있으면 함께 활용합니다.

Q4: 군집 분석 후 결과는 어떻게 해석해야 하나요?

A4: 각 군집이 갖는 주요 특징(평균값, 주요 변수 분포 등)을 파악하여 ‘어떤 속성을 공유하는 그룹인가’를 이해하고, 이를 기반으로 마케팅 전략, 제품 추천, 이상 탐지 등 비즈니스 활용 방안을 도출합니다.

Q5: 실제 데이터에서는 이상치나 결측값 처리를 어떻게 해야 하나요?

A5: 군집 분석 전, 결측값 제거·대체, 스케일링(정규화), 이상치 처리(제거 혹은 적절한 대체)를 선행해야 합니다. 특히 K-Means는 평균값에 민감해 이상치 영향을 크게 받으므로 사전에 주의가 필요합니다.

Q6: 군집화 결과가 만족스럽지 않을 때 어떻게 해야 하나요?

A6: 다른 군집 알고리즘을 시도하거나, 파라미터(예: DBSCAN의 ε, minPts)를 조정해보거나, 추가 변수를 고려해 새로운 피처(Feature)를 생성해보는 등 데이터 전처리와 하이퍼파라미터 튜닝 과정을 반복해야 합니다.

Q7: 실무에서 군집 분석을 도입하려면 어떤 절차가 필요한가요?

A7: 먼저 분석할 목적(가설)을 설정하고, 필요 데이터(특징)를 선정·수집한 뒤, 적절한 전처리를 거쳐 군집 알고리즘을 적용합니다. 이후 결과 해석과 평가를 통해 군집을 재조정하고, 마지막으로 인사이트를 업무에 활용합니다.

부가 자료(참고)

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

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

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

profile
안녕하세요!

0개의 댓글