🖥️ IT, 컴퓨터/📁 데이터 분석

[머신러닝] DBSCAN (Density-Based Spatial Clustering of Applications with Noise)이란?

김 홍시 2025. 3. 18.
반응형

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

DBSCAN(밀도 기반 공간 클러스터링)은 밀도가 높은 지역을 클러스터로 그룹화하고 이상치(Noise)를 감지하는 비지도 학습 알고리즘입니다.
K-Means와 달리 클러스터 개수(K)를 사전에 정의할 필요가 없으며, 비원형(Non-spherical) 데이터에도 강한 성능을 발휘합니다.


🔍 DBSCAN의 핵심 개념

DBSCAN은 데이터 포인트의 밀도를 기반으로 군집을 형성하며, 아래 3가지 개념을 사용합니다.

📌 1. 주요 개념

Core Point (핵심 포인트)

  • 반경(ε) 내에 최소 개수(MinPts) 이상의 데이터 포인트가 존재하는 포인트
  • 새로운 클러스터의 중심이 될 수 있음

Border Point (경계 포인트)

  • Core Point의 ε-반경 내에 있지만, MinPts 이상을 만족하지 않는 포인트
  • 클러스터에는 속하지만, 중심 역할은 하지 못함

Noise Point (노이즈 포인트)

  • Core Point의 영향 범위(ε) 내에 포함되지 않는 고립된 점
  • 이상치(Outlier)로 간주

📌 2. DBSCAN 알고리즘 동작 과정

1️⃣ 초기 데이터에서 임의의 포인트 선택
2️⃣ 반경(ε) 내에서 MinPts 이상의 데이터가 있으면 Core Point로 설정
3️⃣ Core Point와 연결된 모든 점을 같은 클러스터로 할당
4️⃣ 경계 포인트(Border Point) 포함 여부 확인 후 클러스터 확장
5️⃣ Noise Point는 군집에서 제외
6️⃣ 더 이상 확장할 수 없을 때까지 반복


📢 K-Means vs. DBSCAN 비교

비교 항목 K-Means DBSCAN

클러스터 개수(K) 사전 정의 필요 자동으로 결정
군집 형태 원형(구형) 클러스터에 적합 다양한 형태의 클러스터 가능
이상치(Noise) 감지 불가능 (이상치 포함하여 군집화) 가능 (노이즈 감지 및 제거)
연산 속도 빠름 (대규모 데이터 가능) 느림 (고밀도 데이터에서 연산량 증가)
클러스터 크기 크기가 비슷한 군집 생성 크기가 다른 군집도 가능
고밀도 지역 감지 불가능 가능 (핫스팟 분석 가능)

K-Means는 데이터가 원형 클러스터일 때 유리
DBSCAN은 클러스터 개수가 불명확하고 이상치 감지가 필요한 경우 유리


🚀 DBSCAN 활용 사례

🏙 1️⃣ 공간 데이터 분석 및 GIS 활용

  • 상권 분석: 특정 지역에서 상업시설이 밀집된 구역 식별
  • 교통 데이터 분석: 특정 시간대에 교통량이 급증하는 구역 탐색
  • 범죄 분석: 특정 유형의 범죄가 집중되는 핫스팟 감지

📊 2️⃣ 이상치 감지(Anomaly Detection)

  • 금융 사기 탐지: 비정상적인 거래 감지
  • 센서 데이터 분석: 기계 이상 작동 탐지

📡 3️⃣ 소셜 네트워크 및 텍스트 분석

  • SNS 데이터 군집화: 특정 키워드가 밀집된 트렌드 분석
  • 고객 리뷰 분석: 유사한 의견을 가진 고객 그룹화

📊 Python을 활용한 DBSCAN 분석 예제

1️⃣ 기본적인 DBSCAN 클러스터링 적용

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
from sklearn.datasets import make_moons

# 샘플 데이터 생성 (비원형 데이터)
X, _ = make_moons(n_samples=300, noise=0.05, random_state=42)

# DBSCAN 적용
dbscan = DBSCAN(eps=0.2, min_samples=5)
labels = dbscan.fit_predict(X)

# 클러스터 결과 시각화
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', alpha=0.7)
plt.title("DBSCAN Clustering")
plt.show()

🔹 결과 해석

  • K-Means는 비원형 데이터에서 잘 동작하지 않지만, DBSCAN은 곡선 형태의 클러스터도 잘 찾음
  • 노이즈 포인트(이상치)는 별도의 클래스로 분류 (-1로 표시됨)

2️⃣ 공간 데이터에서 DBSCAN 활용 (GIS 분석)

import geopandas as gpd
from sklearn.cluster import DBSCAN

# 서울시 상권 데이터 불러오기
gdf = gpd.read_file("seoul_business.geojson")

# DBSCAN 적용 (위도, 경도를 사용하여 클러스터링)
dbscan = DBSCAN(eps=0.01, min_samples=10)
gdf['cluster'] = dbscan.fit_predict(gdf[['longitude', 'latitude']])

# 결과 시각화
fig, ax = plt.subplots(figsize=(8, 6))
gdf.plot(column='cluster', cmap='viridis', legend=True, ax=ax, alpha=0.7)
plt.title("서울시 상권 DBSCAN 클러스터링")
plt.show()

🔹 결과 해석

  • 특정 지역에서 상업시설이 집중된 구역을 클러스터링
  • 이상치는 노이즈(Noise Point)로 감지되어 군집에서 제외

3️⃣ 최적의 eps 값 찾기 (k-거리 그래프 활용)

DBSCAN에서는 반경(ε, eps) 설정이 중요하며, 최적의 값을 찾기 위해 **k-거리 그래프(K-Distance Plot)**를 사용할 수 있습니다.

from sklearn.neighbors import NearestNeighbors
import numpy as np

# k-최근접 이웃 계산
neigh = NearestNeighbors(n_neighbors=5)
neigh.fit(X)
distances, indices = neigh.kneighbors(X)

# k번째 이웃까지의 거리 정렬 후 그래프 그리기
distances = np.sort(distances[:, -1])
plt.plot(distances)
plt.xlabel("Points sorted by distance")
plt.ylabel("5th Nearest Neighbor Distance")
plt.title("Elbow Method for DBSCAN (Optimal eps)")
plt.show()

🔹 결과 해석

  • 그래프에서 급격히 변하는 지점이 최적의 eps 값
  • 적절한 eps 값을 선택하면 최적의 클러스터링 결과 도출 가능

🎯 DBSCAN의 장단점

장점
✔ 클러스터 개수(K)를 미리 지정할 필요 없음
✔ 이상치(Outlier) 감지 가능
✔ 비원형(비구형) 클러스터에도 강함
✔ 군집 크기가 다를 때도 잘 작동

단점
eps와 min_samples 설정이 까다로움
✖ 대규모 데이터에서는 연산량 증가
✖ 데이터 밀도가 균일하지 않으면 성능 저하


📌 결론

DBSCAN은 이상치 감지 및 비정형 데이터 군집화에 강력한 성능을 발휘하는 알고리즘입니다.

📢 GIS 분석, 상권 분석, 범죄 핫스팟 분석 등 공간 데이터와 결합하면 더욱 강력한 인사이트를 도출할 수 있습니다! 🚀

반응형

댓글