본문 바로가기
Python_Wiki/머신러닝

K-means vs. DBSCAN 순서 알아보기(feat. k찾기 / eps 설정)

by yj-data 2026. 2. 10.

K-means

  1. 라이브러리 로드
  2. 데이터 로드
  3. 데이터 중 사용할 피처만 분리해서 로드
  4. 스케일링
  5. k 찾기 (엘보우/실루엣)
  6. K-means 실행
  7. 클러스터 결과 확인 후 클러스터 별로 데이터 해석

DBSCAN

  1. 라이브러리 로드
  2. 데이터 로드
  3. 데이터 중 사용할 피처만 분리해서 로드
  4. 스케일링
  5. eps 후보 찾기 (min_samples/k distance plot)
  6. DBSCAN 실행
  7. 클러스터/노이즈 결과 확인 후 클러스터/노이즈 별로 데이터 해석
  8. 이후 제일 적절한 결과로 선정(eps도 이 단계에서 확정)

거의 유사한 흐름으로 진행된다.

 


k 개수 찾기

  1. 일단 k 개수 찾기의 개념을 알아보자.
  • 각 클러스터의 중심점 수가 k인데, 각 클러스터의 중심점에서 각 클러스터에 들어있는 데이터와의 '거리 제곱의 합'을 최소화할 수 있는 k의 개수를 찾는 것.

    2. k 개수 찾기 방법은?

  • 첫번째, 엘보우 그래프 만들기
    •  각 클러스터 개수 별 거리 제곱의 합을 구한다. 클러스터 개수가 많아질수록 거리 제곱의 합(inertia)은 무조건 줄어든다. 하지만 몇 개까지 줄어야 가장 효과적인가를 찾기 위한 것이 그래프 시각화. 그래프 기울기가 팍팍 꺾이다가 완만해지는 그 지점을 보통 선택한다.
    • 그러나, 가끔 4개도 좋아보이고 5개도 좋아보이는, 그런 애매한 지점이 나타난다. 그런 경우에는?
  • 두번째, 실루엣 스코어 사용하기
    • 실루엣 스코어란 응집도가 얼마나 좋은지 보여주는 척도. 응집이 실제로 잘 되었으면 최대 1, 안되었으면 최하 -1까지 된다. 한 점마다 실루엣 스코어를 계산해서, 모든 점의 스코어 평균을 계산하면 최종 실루엣 스코어가 됨!
    • 계산식: (특정 점과 다른 클러스터의 모든 점과의 거리의 평균 중 가장 가까운 클러스터와의 거리평균(A) - 특정 점이 속하는 클러스터의 다른 점들과의 거리평균(B)) / MAX(A,B)
    • 예를 들어, 특정 점이 해당되는 클러스터 점들과의 거리 평균이 1이고, 다른 클러스터와의 거리 평균을 쟀을때 최소값이 10이라고 하면, 해당 점의 실루엣 스코어는 (10-1)/10 = 0.9가 나옴. 그렇게 모든 점의 스코어를 구해서 평균내면 최종 스코어!

다만,

  • 분포에 따라 실루엣 스코어가 낮아도 의미 있는 클러스터링이 되는 경우가 있으니 분포와 데이터의 특성을 함께 고려해야 함
  • k도 유사하게 나오고 스코어도 유사하게 나온다면 일단 가장 작은 k로 시도해보자
  • 그래도 좀 더 k를 정할 수 있는 기준이 필요하다면, 최종 클러스터 이후 결과물을 해석해서 몇 개의 클러스터가 더 비지니스적으로 유의미한지 고민해보자

eps 찾기 ("반지름 eps 안에 최소 min_samples 개의 점이 있으면, 그 점은 핵심점이다.")

  1. min_samples 설정: 최소한 군집안에 들어있어야 하는 샘플 수
    • 정하는 법: 데이터 크기 고려, 데이터 차원 고려, 비지니스 의미 기준(최소 몇명 이상이 모여야 이 정책이나 액션이 의미가 있는지 스스로 질문하기)
  2. k-distance plot: 엘보우와 유사하게, 특정 지점에서 k번째 이웃까지의 거리를 계산하고, 모든 거리를 정렬해서 그래프로 만듦. 변곡점이 있는 즈음을 eps 값으로 고려한다.