⊢MachineLearning

비지도학습 : 군집화 모델 - DBSCAN

최 수빈 2025. 3. 17. 07:32

 

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

 

밀도 기반 군집화 알고리즘

데이터 밀도가 높은 영역을 군집으로 간주하고, 밀도가 낮은 영역을 노이즈로 처리

 

  • 비구형 군집 탐지 가능 : 원형이 아닌 군집도 효과적으로 탐색 가능
  • 노이즈 처리 가능 : 밀도가 낮은 데이터 포인트를 자동으로 노이즈로 분류
  • 군집 수 자동 결정 : 군집 개수를 미리 설정할 필요 없음

 

주요 매개변수

  • eps : 두 데이터 포인트가 같은 군집에 속하기 위한 최대 거리
  • min_samples : 한 군집을 형성하기 위해 필요한 최소 데이터 포인트 수

 

작동원리

  1. 임의의 데이터 포인트 선택
  2. 선택한 데이터 포인트의 eps 반경 내에 있는 모든 데이터 포인트를 찾음
  3. eps 반경 내 데이터 수가 min_samples 이상이면 새로운 군집 형성
  4. eps 반경 내 데이터 수가 min_samples 미만이면 노이즈로 간주
  5. 군집에 속한 데이터 포인트에 대해 2~4단계를 반복
  6. 모든 데이터가 처리될 때까지 반복

 

DBSCAN 실습

 

Kaggle의 쇼핑몰 고객 데이터(Mall_Customers.csv)를 사용하여 실습 진행

 

 

데이터 로드

import kagglehub
import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

path = kagglehub.dataset_download("vjchoudhary7/customer-segmentation-tutorial-in-python")

# 데이터 파일 경로 생성
csv_path = os.path.join(path, "Mall_Customers.csv")

# 데이터셋 불러오기
df = pd.read_csv(csv_path)

# 필요한 열만 선택
X = df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']]

 

DBSCAN 군집화 수행

from sklearn.cluster import DBSCAN
import seaborn as sns

# DBSCAN 모델 생성
dbscan = DBSCAN(eps=5, min_samples=5)

# 모델 학습 및 예측
df['Cluster'] = dbscan.fit_predict(X)

# 군집화 결과 시각화
plt.figure(figsize=(10, 7))
sns.scatterplot(x='Annual Income (k$)', y='Spending Score (1-100)', hue='Cluster', data=df, palette='viridis')
plt.title('DBSCAN Clustering of Mall Customers')
plt.show()

 

 

파라미터 튜닝

 

DBSCAN의 성능은 epsmin_samples 값에 따라 크게 달라짐

여러 값을 시도하여 적절한 파라미터를 찾음

# 다양한 eps와 min_samples 값 시도
eps_values = [3, 5, 7, 10]
min_samples_values = [3, 5, 7, 10]

for eps in eps_values:
    for min_samples in min_samples_values:
        dbscan = DBSCAN(eps=eps, min_samples=min_samples)
        df['Cluster'] = dbscan.fit_predict(X)

        plt.figure(figsize=(10, 7))
        sns.scatterplot(x='Annual Income (k$)', y='Spending Score (1-100)', hue='Cluster', data=df, palette='viridis')
        plt.title(f'DBSCAN Clustering (eps={eps}, min_samples={min_samples})')
        plt.show()

 


DBSCAN은 밀도 기반 군집화 기법 → 비구형 데이터에서도 효과적인 군집화 수행 가능
노이즈를 자동으로 탐지, 군집 개수를 사전에 설정할 필요가 없음 → 실전 데이터 분석에서 유용하게 활용 가능

DBSCAN의 성능은 epsmin_samples 값에 따라 달라지므로, 적절한 하이퍼파라미터 튜닝이 필요