비지도 학습의 대표 기법인 군집 분석은 별도의 정답(레이블) 없이 데이터의 패턴을 파악하고 세분화함으로써 다양한 분야(마케팅, 제조, 이상탐지 등)에서 유용하게 활용될 수 있다.
비지도 학습(Unsupervised Learning)은 정답(레이블) 없이 데이터에서 패턴이나 구조를 찾는 머신 러닝 기법을 의미합니다.
활용 영역
- 데이터의 군집화(Clustering)
- 차원 축소(Dimensionality Reduction)
- 이상치 탐지(Anomaly Detection) 등
지도 학습(Supervised Learning)
비지도 학습(Unsupervised Learning)
핵심 포인트! 비지도 학습에서는 ‘라벨’ 대신 ‘데이터 자체의 유사성과 패턴’에 집중합니다.
비슷한 특성을 가진 데이터들을 묶어서(Cluster) 각 그룹 내 데이터들끼리의 유사도를 최대화하고, 다른 그룹과의 차이는 최대화하는 기법.
목적
1️⃣ 데이터의 구조 파악
: 정답 없이 데이터의 자연스러운 분포를 확인
2️⃣ 세분화(Segmentation)
: 마케팅에서는 고객 세분화를, 제조업에서는 센서 데이터로 기계 작동 패턴 분류 등을 수행
1️⃣ 데이터 수집 및 전처리
: 이상치 제거, 결측치 처리, 스케일링/정규화
2️⃣ 군집 수 또는 파라미터 설정
: K-Means의 경우 k 설정, DBSCAN은 거리(ε), 최소 데이터 수(minPts) 등
3️⃣ 군집화 알고리즘 적용
: 설정에 따라 알고리즘 수행
4️⃣ 결과 해석 및 평가
: 실루엣 계수 등 군집 평가 지표 활용
5️⃣ 사후 활용
: 마케팅 전략, 제품 개선, 이상치 탐지 등

https://en.wikipedia.org/wiki/K-means_clustering#/media/File:K-means_convergence.gifhttps://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으로 설정한다면 “저가 위주의 고객”, “중간 가격대 선호 고객”, “고가 제품 위주 고객” 등으로 군집이 나뉠 수 있음

1️⃣ 알고리즘 개요
: 밀도 기반 군집화 기법. 일정 거리(ε) 내 데이터가 많으면(최소 포인트 수 minPts 이상) 그 영역을 ‘밀도가 높다’고 판단해 하나의 군집으로 결정
: k를 미리 설정하지 않아도 되며, 노이즈 포인트(어느 군집에도 속하지 않는 점)을 구분할 수 있음
2️⃣ 장점
: 군집 수를 사전에 알 필요가 없음
: 노이즈와 이상치를 자연스럽게 처리
: 구형이 아닌 복잡한 형태의 군집도 잘 찾아냄
3️⃣ 단점
: 파라미터 ε와 minPts에 민감
: 데이터 밀도가 균일하지 않으면 성능이 떨어질 수 있음
4️⃣ 예시
: 지리정보(GIS) 분석에서 지역별로 가게가 얼마나 밀집되어 있는지 분석할 때 사용
: 특정 지점에 가게가 몰려 있으면 하나의 군집, 중간에 뜨문뜨문 있는 가게는 노이즈(Cluster에 속하지 않는 포인트)로 분류

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 데이터를 가져옵니다.n_clusters=3으로 클러스터를 3개로 분할합니다.eps=0.5, min_samples=5를 기본 설정으로 사용합니다.n_clusters=3으로 계층적 군집을 수행합니다.silhouette_score(X_train, labels)는 실루엣 지수를 계산하며, 값이 클수록(최대 1) 군집화가 잘 되었다고 볼 수 있습니다.davies_bouldin_score(X_train, labels)는 Davies-Bouldin 지수로, 값이 낮을수록 군집화 품질이 우수함을 의미합니다.

❗ 비지도학습은 ‘정답’이 없기 때문에 군집 평가 지표가 매우 중요
각 데이터 포인트의 응집도(a)와 분리도(b)를 이용해 계산
계산 공식

군집 내 분산과 군집 간 거리의 비율을 활용
범위
내부 평가(Internal Evaluation)
외부 평가(External Evaluation)
- 이미 알려진 레이블(정답)과 군집 결과를 비교(정답이 있을 때만 가능)
시나리오 예시
1️⃣ 대형 온라인 쇼핑몰에서 여러 고객들의 구매 패턴 데이터(평균 구매 금액, 구매 주기, 선호 카테고리 등)를 수집
2️⃣ K-Means나 계층적 군집으로 고객을 세 그룹으로 분류
그룹 A: 저가 상품 위주 구매, 주기적으로 소량 구매
그룹 B: 중간 가격대 상품, 꾸준한 구매, 리워드나 할인에 민감
그룹 C: 고가 브랜드 위주 구매, 구매 빈도는 낮지만 1회 결제 금액이 큼
3️⃣ 활용 방안
그룹 A에게는 프로모션 쿠폰, 특정 시즌 할인
그룹 B에게는 멤버십 등급 혜택, 꾸준한 재구매를 위한 포인트 적립 강화
그룹 C에게는 프리미엄 서비스, 맞춤형 추천, VIP 전용 이벤트
결과
- 고객 만족도 상승, 마케팅 비용 절감, 구매 전환율 증가 효과가 기대
시나리오 예시
1️⃣ 공장에 설치된 기계에서 주기적으로 측정되는 온도, 진동, 압력 등의 센서 데이터 수집
2️⃣ DBSCAN을 이용해 비슷한 작동 패턴의 센서 데이터를 군집화
군집 1: 정상 범주(온도와 진동 값이 일정 범위 내)
군집 2: 약간 불안정한 패턴(진동이 가끔 튀는 경우)
노이즈: 완전히 이상치(기계 고장 상태)
3️⃣ 활용 방안
불안정 군집이 얼마나 발생하는지 모니터링하여 사전 정비 계획 수립
노이즈로 분류된 이상치를 즉시 점검하여 사고 예방
결과
- 예지 정비(Predictive Maintenance)를 통해 생산 라인의 다운타임 줄이고, 비용 절감 가능
load_wine() 함수를 통해 와인 데이터를 가져옵니다.y 레이블은 직접 사용하지 않습니다(평가용으로 간단히 참고하거나 무시).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 # 실제 레이블(군집 평가엔 직접 사용 안 함)
1️⃣ 비지도 학습은 레이블 없이 데이터 구조를 파악하는 데 사용
2️⃣ 군집 분석은 유사한 데이터끼리 묶어 세분화하고, 다양한 분야에서 활용
3️⃣ K-Means, DBSCAN, 계층적 군집 알고리즘별 특성을 파악해 상황에 맞춰 선택
4️⃣ 군집화 결과는 실루엣 계수, Davies-Bouldin Index 등으로 정성·정량적으로 평가
5️⃣ 다양한 실무 분야에서 고객 세분화, 이상치 탐지 등으로 적극 활용 가능
💡 앞으로 알면 더 좋은 내용!
: 이상치 탐지(Anomaly Detection)나 토픽 모델링(Topic Modeling) 영역과도 연계해 폭넓은 분석 수행
: 실무에서는 여러 알고리즘을 시도해보며 최적의 군집 수 및 파라미터를 찾는 과정(Iteration)이 필수
❗ 결론
: 군집 분석은 단순히 “데이터를 몇 개 그룹으로 묶었다”에서 끝나지 않고, 왜 그룹이 그렇게 나뉘었는지(의미 해석)와 어떻게 업무에 활용할지(실행 전략)까지 연결해야 비즈니스 가치를 창출
Q1: 군집 수(k)를 미리 어떻게 정하나요?
A1: K-Means의 경우 엘보(Elbow) 기법이나 실루엣 계수를 활용해 여러 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 활용