본문으로 바로가기

실루엣 점수: 클러스터링 품질 평가 방법

공식, 해석 범위, scikit-learn 예제, 최적의 클러스터 수 선택, 타 지표와의 비교까지 실루엣 점수를 실습 중심으로 안내합니다.
업데이트됨 2026년 7월 31일  · 12분 읽다

AI로 탐색하기

ChatGPT에서 열기Claude에서 열기Perplexity에서 열기

클러스터링 모델을 학습한 뒤, 생성된 클러스터가 제대로 된 것인지 어떻게 판단할 수 있을까요?

만능 해답은 없습니다. 전통적인 지도 학습에서는 예측값을 실제 레이블과 비교해 정확도를 구할 수 있지만, 클러스터링에서는 그렇게 할 수 없습니다. k=5를 선택했지만, 다른 k 값이 더 나을 수도 있습니다. 레이블이 없으면 알고리즘이 실제 구조를 찾았는지, 아니면 데이터를 임의로 분할했는지 알기 어렵습니다.

실루엣 점수는 이런 상황에서 유용한 지표입니다. 각 포인트가 배정된 클러스터에 얼마나 잘 맞는지를, 가장 가까운 다른 클러스터와 비교해 보여주며, 가장 널리 쓰이는 지표 중 하나입니다. 레이블 없이도 사용할 수 있고 해석이 쉽습니다.

이 글에서는 공식과 해석 방법을 설명하고, scikit-learn을 활용한 Python 예제를 보여드리며, 언제 유용하고 언제 최적이 아닌지까지 다룹니다.

클러스터링이 처음이신가요? 알고리즘의 원리와 Python 사용법은 scikit-learn으로 배우는 k-평균 클러스터링 입문 튜토리얼에서 확인하세요. 

실루엣 점수란?

실루엣 점수는 -1과 1 사이의 숫자로, 각 포인트가 클러스터에 얼마나 잘 맞는지를 알려줍니다.

이 점수는 두 가지를 보여줍니다.

  1. 해당 포인트가 자신이 속한 클러스터 내 다른 포인트들과 얼마나 가까운지
  2. 포인트가 속하지 않은 가장 가까운 다른 클러스터로부터 얼마나 떨어져 있는지

포인트가 자기 그룹 안쪽에 잘 위치하고 다른 클러스터와 멀리 떨어져 있으면 점수가 높습니다. 경계에 있거나 이웃 클러스터에 더 가까우면 점수가 낮습니다.

요컨대, 실루엣 점수는 이 균형을 보여줍니다. 각 클러스터 내부에서 포인트들이 얼마나 촘촘히 모여 있는지와, 클러스터 간이 얼마나 잘 분리되어 있는지를 모두 반영합니다. 둘 다 똑같이 중요합니다. 포인트를 잘 묶었지만 클러스터끼리 겹쳐 있으면 쓸모가 없고, 반대로 클러스터 간은 잘 분리했지만 내부가 느슨해도 유용하지 않습니다.

잘 분리된 클러스터와 겹치는 클러스터 비교

잘 분리된 클러스터와 겹치는 클러스터 비교

점수가 높을수록 클러스터가 더 잘 정의되어 있음을 의미합니다. 1에 가까우면 포인트가 자기 클러스터 안에 촘촘히 모여 있고 다른 클러스터와 멀다는 뜻입니다. 0에 가까우면 클러스터가 겹치거나 경계가 모호합니다. 음수면 포인트가 배정된 클러스터보다 다른 클러스터에 더 가깝다는 의미입니다.

실루엣 점수는 어떻게 작동할까?

모든 포인트는 각자의 실루엣 점수를 가지며, 이 점수는 두 거리에서 계산됩니다.

첫 번째는 해당 포인트가 배정된 클러스터 내 다른 포인트들과의 평균 거리입니다. 값이 작으면 클러스터 내 다른 포인트들과 가깝고, 크면 클러스터에 느슨하게 연결되어 있음을 의미합니다.

두 번째는 가장 가까운 이웃 클러스터(본인 클러스터 제외)의 포인트들과의 평균 거리입니다. 값이 크면 다른 클러스터와 명확히 분리되어 있고, 작으면 경계에 가깝습니다.

포인트와 클러스터 간 거리

포인트와 클러스터 간 거리

실루엣 값은 이 두 수치를 비교합니다. 클러스터 안쪽에 잘 있고 다른 클러스터와 멀면 높은 점수를, 경계(다른 클러스터에 가까움)에 있으면 낮은 점수를, 자기 클러스터보다 다른 클러스터에 더 가깝다면 음수를 받습니다.

여기서 기억해야 할 점은 어느 한 쪽 거리만으로는 충분하지 않다는 것입니다. 

촘촘한 클러스터가 바로 옆에 다른 클러스터와 붙어 있을 수 있습니다. 반대로 잘 분리되어 있어도 내부가 흩어져 있을 수 있습니다. 두 거리 모두를 함께 봐야 배정 결과를 신뢰할 수 있습니다.

실루엣 점수 공식

단일 포인트에 대한 공식은 다음과 같습니다.

실루엣 점수 공식

실루엣 점수 공식

여기서:

  • a 는 해당 포인트가 같은 클러스터의 모든 다른 포인트와 가지는 평균 거리

  • b 는 가장 가까운 이웃 클러스터 내 모든 포인트와의 평균 거리

공식은 ba 의 차이를, 둘 중 더 큰 값으로 나눕니다. 

일반적으로 다음과 같이 해석할 수 있습니다.

  • ba 보다 훨씬 클 때: 포인트가 다른 클러스터와 멀고 자기 클러스터에 가깝습니다. 분자는 b에 가깝고, 분모도 b이므로 점수는 1에 가깝습니다

  • ab 보다 훨씬 클 때: 포인트가 자기 클러스터보다 다른 클러스터에 더 가깝습니다. 분자는 -a에 가까운 큰 음수, 분모는 a이므로 점수는 -1에 가깝습니다

  • ab 가 비슷할 때: 포인트가 두 클러스터의 경계에 있습니다. 분자는 0에 가깝고 점수도 그렇습니다

자세한 내용은 다음에서 이어집니다.

실루엣 점수 해석 방법

실루엣 점수를 읽는 대략적인 기준은 다음과 같습니다.

  • 1에 가까움: 포인트가 클러스터 내부에 잘 위치해 있고 다른 클러스터와 멀리 떨어져 있음
  • 약 0.7: 양호한 클러스터링으로, 그룹이 뚜렷하고 포인트가 클러스터 내 다른 포인트들과 가깝음
  • 약 0.5: 무난한 클러스터링으로, 클러스터 간 약간 겹침이 있으나 구분 가능
  • 0 근처: 클러스터가 겹치거나 경계가 불분명. 구조가 실제가 아닐 수 있음
  • 0 미만: 포인트가 잘못된 클러스터에 더 가까움. 잘못된 클러스터 수를 선택했거나, 애초에 데이터가 클러스터링에 적합하지 않을 때 발생할 수 있습니다.

위 기준은 어디까지나 대략적인 가이드입니다. 좋은 실루엣 점수의 기준은 데이터셋에 따라 달라집니다.

희소하고 고차원인 데이터는 클러스터가 좋아도 점수가 낮게 나오는 경우가 많습니다. 밀집되고 잘 분리된 데이터는 0.7 이상의 점수가 나올 수 있습니다. 보편적 임계값과 비교하기보다, 같은 데이터셋에서 모델 간 점수를 비교하세요.

실루엣 점수 계산 방법

실루엣 점수는 포인트마다 계산합니다. 단일 포인트에 대해 다음과 같이 진행합니다.

1단계: a, 즉 포인트가 자기 클러스터 내 다른 모든 포인트와 가지는 평균 거리를 계산합니다. 예를 들어 클러스터에 다른 포인트가 4개 있고, 그 거리들이 1.2, 1.5, 1.0, 1.3이라면:

실루엣 점수 계산 (1)

실루엣 점수 계산 (1)

2단계: 가장 가까운 이웃 클러스터(자기 클러스터를 제외하고 평균 거리가 가장 낮은 클러스터)를 찾습니다. 그리고 그 클러스터의 모든 포인트와의 평균 거리 b를 계산합니다. 예를 들어 가장 가까운 클러스터에 5개의 포인트가 있고 거리들이 2.4, 2.8, 3.0, 2.6, 2.7이라면:

실루엣 점수 계산 (2)

실루엣 점수 계산 (2)

3단계: ab를 공식에 대입합니다.

실루엣 점수 계산 (3)

실루엣 점수 계산 (3)

4단계: 데이터셋의 모든 포인트에 대해 이를 반복합니다. 클러스터링의 전체 실루엣 점수는 모든 포인트 점수의 평균입니다.

Python에서의 실루엣 점수 예시

Scikit-learn은 sklearn.metrics 내부에 실루엣 점수를 계산하는 두 가지 함수를 제공합니다.

  • silhouette_score() 전체 클러스터링의 평균 점수를 반환

  • silhouette_samples() 각 포인트별 점수를 반환

다음은 합성 데이터셋에서 KMeans와 함께 사용하는 방법입니다.

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_score, silhouette_samples

# Synthetic data with 4 clusters
X, _ = make_blobs(n_samples=500, centers=4, cluster_std=1.0, random_state=42)

# Clustering model
kmeans = KMeans(n_clusters=4, random_state=42, n_init=10)
labels = kmeans.fit_predict(X)

# Overall silhouette score
score = silhouette_score(X, labels)
print(f"Overall silhouette score: {score:.3f}")

# Per-point silhouette values
sample_scores = silhouette_samples(X, labels)
print(f"First 5 point scores: {sample_scores[:5]}")

위 코드를 실행하면 다음과 같은 출력이 나타납니다.

Python 예제 출력

Python 예제 출력

전체 점수 0.791은 네 개의 클러스터가 잘 정의되고 잘 분리되어 있음을 의미합니다.

포인트별 점수는 각 데이터 포인트를 자세히 분석할 수 있게 해줍니다. 

개별 점수가 높은 포인트는 클러스터 내부에 잘 위치해 있습니다. 낮거나 음수인 포인트는 경계에 있거나 오배정되었을 수 있어 이상치 탐지나 경계 포인트 검토에 유용합니다.

최적의 클러스터 수 선택

실루엣 점수의 가장 흔한 활용 중 하나는 KMeans에서 적절한 k를 고르는 것입니다. 

절차는 세 단계입니다.

  1. 여러 k 값에 대해 KMeans를 학습
  2. 각 학습 결과에 대해 실루엣 점수 계산
  3. 점수가 가장 높은 k 선택

코드는 다음과 같습니다.

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_score

X, _ = make_blobs(n_samples=500, centers=4, cluster_std=1.0, random_state=42)

# Fit KMeans for k=2 to k=10 and keep track of the silhouette score for each
k_values = range(2, 11)
scores = []
for k in k_values:
    kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)
    labels = kmeans.fit_predict(X)
    scores.append(silhouette_score(X, labels))
    print(f"k={k}: silhouette = {scores[-1]:.3f}")

k에 대해 다음과 같은 점수가 출력됩니다.

k 값에 따른 실루엣 점수

k 값에 따른 실루엣 점수

가장 높은 점수는 k=4에서 나옵니다. 이 값을 선택하면 됩니다.

다만 실루엣 점수가 도메인 지식을 대체하지는 않는다는 점을 명심하세요. 예컨대 비즈니스 문제상 고객 세그먼트가 5개여야 하는데 실루엣 점수가 4에서 가장 높다면, 무조건 4를 선택하지 마세요. 지표는 데이터의 구조가 가장 깔끔한 지점을 보여주지만, 때로는 문제 맥락에서 의미 있는 클러스터 수가 정답입니다.

실루엣 점수와 다른 클러스터링 지표 비교

실루엣 점수는 아마 가장 흔한 클러스터링 평가 지표이지만, 유일한 선택지는 아닙니다. 아래는 대안들과의 비교입니다.

실루엣 점수 vs. 엘보 방법

엘보 방법은 KMeans에서 k를 고르는 시각적 기법입니다. 여러 k에 대해 모델을 학습하고, 관성(클러스터 내 제곱합)을 k에 대해 그린 뒤 곡선이 급격히 꺾이는 지점을 선택합니다.

엘보 방법은 빠르고 실행이 간편하다는 장점이 있습니다. 하지만 "팔꿈치"가 항상 분명하지는 않습니다. 복잡한 데이터에서는 곡선이 매끈해 보여 어디서 꺾이는지 판단하기 어렵습니다.

실루엣 점수는 각 k에 대해 실제 수치를 제공하므로 더 의미 있는 비교가 가능합니다. 계산은 더 느리지만, 시각적 해석에만 의존하지 않아도 됩니다.

빠른 점검에는 엘보 방법을, 확실한 판단이 필요할 때는 실루엣 점수를 사용하세요.

실루엣 점수 vs. 데이비스-볼딘 지수

데이비스-볼딘 지수(DBI)는 각 클러스터와 가장 유사한 다른 클러스터 간 평균 유사도를 측정합니다. DBI가 낮을수록 더 좋은 클러스터링이며, 이상적인 값은 0입니다.

DBI는 클러스터 중심을 사용해 유사도를 계산하므로, 큰 데이터셋에서는 실루엣 점수보다 계산이 빠릅니다. 또한 조밀하고 잘 분리된 클러스터를 보상한다는 직관도 유사합니다.

단점은 DBI가 전체 클러스터링에 대해서만 알려준다는 점입니다. 실루엣 점수는 포인트별 점수도 제공하므로 경계 포인트와 이상치를 찾을 수 있습니다.

대규모 데이터셋에서 속도가 중요하면 DBI를, 개별 포인트까지 살펴보고 싶다면 실루엣 점수를 사용하세요.

실루엣 점수 vs. 칼린스키-하라바스 지수

칼린스키-하라바스 지수(CH, 분산 비율 기준)는 클러스터 간 분산을 클러스터 내 분산으로 나눈 비율입니다. 값이 클수록 좋은 클러스터링이며, 상한은 없습니다.

CH는 클러스터 수준 통계만 사용하므로 대규모 데이터셋에서 빠르게 작동합니다. 실루엣, DBI와 마찬가지로 볼록하고 잘 분리된 클러스터에서 잘 작동합니다.

또한 CH는 자연스러운 스케일이 없어, 서로 다른 데이터셋 간 비교가 아니라 같은 데이터셋의 모델들끼리만 비교할 수 있습니다.

데이터셋이 크고 빠른 결과가 필요하면 CH를, 해석 용이성과 개별 포인트 통찰이 필요하면 실루엣 점수를 사용하세요.

내부 지표 vs. 외부 지표

위 지표들(실루엣, DBI, CH, 엘보)은 모두 내부 지표입니다. 정답 레이블 없이 데이터 자체만으로 클러스터링을 평가합니다. 실제 문제에서는 레이블이 없는 경우가 대부분이므로 표준 선택지입니다.

외부 지표는 알려진 레이블과 클러스터 배정을 비교합니다. 조정 랜드 지수(ARI), 정규화 상호정보량(NMI), 동질성 등이 대표적입니다. 레이블이 있을 때 클러스터링 알고리즘의 성능을 테스트하는 데 사용합니다.

레이블이 없을 때(대부분의 경우)는 내부 지표를, 레이블이 있는 데이터에서 알고리즘을 벤치마킹할 때는 외부 지표를 사용하세요.

지표들을 나란히 정리하면 다음과 같습니다.

Method Range Best value Speed Use it for
Silhouette score -1 to 1 Close to 1 Slow on large datasets Interpretability and per-point insights
Elbow method 0 to infinity Look for the elbow Fast Quick checks
Davies-Bouldin index 0 to infinity Close to 0 Fast Large datasets
Calinski-Harabasz index 0 to infinity Higher is better Fast Large, unlabeled datasets

대안과 비교한 실루엣 점수

실루엣 점수의 한계

실루엣 점수에는 알아둘 만한 몇 가지 한계가 있습니다.

  • 거리 기반 클러스터링 가정: 기본적으로 유클리드 거리를 사용합니다. KMeans 같은 중심 기반 알고리즘에는 잘 맞지만, DBSCAN처럼 밀도 기반으로 임의 형태의 클러스터를 찾는 방법에는 적합하지 않을 수 있습니다
  • 작고 잘 분리된 클러스터에 유리: 조밀하고 구형에 가까우며 서로 떨어진 클러스터에 높은 점수를 부여합니다. 데이터의 클러스터가 가깝거나 겹치면, 클러스터링이 옳더라도 점수가 낮게 나올 수 있습니다
  • 불규칙한 클러스터 형태에 약함: 현실 세계의 클러스터는 항상 볼록하지 않습니다. 데이터가 그런 경우 배정이 올바르더라도 점수가 낮아질 수 있습니다
  • 대규모 데이터셋에서의 계산 비용: 포인트 간 쌍별 거리를 계산해야 하므로 복잡도가 O(n^2)입니다. 수백만 포인트 데이터셋에서는 비용이 큽니다
  • 선택한 거리 측정법에 대한 민감도: 유클리드, 맨해튼, 코사인 등 어떤 거리를 쓰느냐에 따라 점수가 달라집니다. 데이터가 유클리드 가정을 따르지 않으면 실루엣 점수가 오해를 불러올 수 있습니다

실루엣 점수 활용 모범 사례

실루엣 점수는 몇 가지 기본 원칙을 지키면 가장 효과적입니다.

  • 여러 클러스터링을 비교: 실루엣 점수를 한 번만 계산하지 마세요. 서로 다른 k 값(또는 다른 알고리즘)으로 모델을 학습해 점수를 나란히 비교하세요
  • 점수와 함께 시각화: 숫자만으로는 충분치 않습니다. 클러스터를 그려 형태가 의미 있는지 확인하세요
  • 최고 점수만을 목표로 하지 않기: 문제에 따라 의미 있는 클러스터 수가 k=5여도, k=2가 더 높은 점수를 줄 때가 흔합니다
  • 도메인 지식과 결합: 점수는 데이터의 가장 깔끔한 구조를 보여줍니다. 어떤 구조가 실제로 유용한지는 도메인 지식이 알려줍니다. 둘 다 활용하세요
  • 여러 지표로 평가: 실루엣, DBI, CH 등은 품질을 서로 다르게 측정합니다. 결과가 일치하면 좋은 신호지만, 그렇지 않다면 데이터를 직접 살펴보세요

결론

실루엣 점수는 포인트가 얼마나 촘촘히 모였는지와 클러스터 간 분리가 얼마나 좋은지를 함께 보여주기 때문에, 클러스터링을 평가하는 가장 직관적인 방법 중 하나입니다. 

포인트별로 계산해 평균을 내면 -1에서 1 사이의 단일 수치가 나옵니다. 1에 가까울수록 잘 정의된 클러스터, 0 근처나 이하이면 구조가 실제가 아닐 가능성을 뜻합니다

하지만 실루엣 점수는 출발점에 불과합니다. 클러스터 시각화와, 무엇보다 문제에 대한 도메인 지식과 함께 사용해야 합니다. 이들이 모두 같은 결론을 가리킬 때 결과를 신뢰할 수 있습니다.

실루엣 점수는 Python으로 배우는 비지도 학습의 큰 그림 속 한 부분입니다. 지금 등록하고 라벨 없는 데이터에서 클러스터링, 변환, 시각화, 인사이트 도출 방법을 배워 보세요.

주제

DataCamp으로 학습하세요

courses

R로 배우는 군집 분석

4
44.1K
계층적 클러스터링과 k-평균 클러스터링의 작동 원리에 대한 강한 직관을 기르고, 이를 활용하여 데이터에서 통찰력을 추출하는 방법을 익히십시오.
자세히 보기Right Arrow
강좌 시작
더 보기Right Arrow