실루엣 점수(Silhouette Score)란? AI에서 군집의 응집도와 분리도를 평가하는 지표
TL;DR
실루엣 점수는 각 데이터가 자기 군집 안에서는 얼마나 가깝고, 가장 가까운 다른 군집과는 얼마나 떨어져 있는지 거리로 평가하는 지표입니다. 정답 라벨 없이 군집화 결과를 비교할 때 사용하며, 보통 사례별 실루엣 계수의 평균을 뜻합니다. 값이 높으면 선택한 거리 기준에서 더 잘 모이고 분리된 결과입니다. 다만 높은 점수가 실제 업무에 맞는 그룹이나 정답 군집 수를 보장하지는 않습니다.
핵심 3줄 요약
- 핵심 1
자기 군집과 이웃 군집을 비교합니다. 한 점에서 같은 군집의 다른 점들까지의 평균 거리와 다른 군집까지의 평균 거리를 사용합니다. - 핵심 2
평균과 개별 점수를 함께 봅니다. 전체 평균이 높아도 특정 군집이나 경계 사례의 점수는 낮을 수 있습니다. - 핵심 3
거리 기준과 데이터 조건이 중요합니다. 특징의 척도·군집 모양·표본 구성에 따라 값이 달라지므로 같은 평가 조건을 유지합니다.
이 글에서 다룰 내용
- 실루엣 점수의 한 문장 정의
- 문의 묶음으로 이해하는 거리 비교 예시
- 군집 내부 거리와 이웃 군집 거리의 계산
- 양수·0·음수와 전체 평균의 해석
- 클러스터링·관성·정확도와의 차이
- 군집 수 비교와 실전 점검 순서
- 거리 행렬·표본 추출·노이즈 처리의 주의점
실루엣 점수를 한 문장으로 정의하면 무엇인가요?
실루엣 점수는 각 사례의 군집 내부 평균 거리와 가장 가까운 다른 군집까지의 평균 거리를 비교해, 군집화의 응집도와 분리도를 요약하는 내부 평가 지표입니다.
영문으로는 Silhouette Score 또는 Silhouette Coefficient라고 부릅니다. 사례 하나의 값은 실루엣 계수이고, scikit-learn의
silhouette_score
는 모든 사례의 계수를 평균해 반환합니다. 자료마다 점수와 계수라는 말을 섞어 쓰므로 개별 값인지 전체 평균인지 확인하는 편이 좋습니다.
내부 평가라는 표현은 정답 이름표와 맞춰 채점하지 않는다는 뜻입니다. 입력 특징 또는 거리 행렬과 군집 라벨이 있으면 계산합니다. 여기서 군집 라벨은 알고리즘이 만든 그룹 번호이며, 사람이 미리 붙인 정답 클래스와 다릅니다.
한 줄 정리: 실루엣 점수는 이미 나눈 그룹이 선택한 거리 공간에서 얼마나 잘 모이고 떨어져 있는지 확인하는 숫자입니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 고객 문의의 수치 특징을 만들고 비슷한 문의끼리 묶었다고 가정해 보겠습니다. 한 문의에서 자기 그룹의 다른 문의까지 평균 거리는 2이고, 가장 가까운 다른 그룹까지 평균 거리는 6이라고 놓겠습니다. 실제 고객 자료의 측정값이 아니라 계산 원리를 설명하는 가상 예시입니다.
이 사례의 계수는
(6 - 2) / 6
이므로 약 0.67입니다. 자기 그룹 안에서 더 가깝고 다른 그룹과는 떨어져 있으므로 양수가 나옵니다. 반대로 내부 평균 거리가 4이고 다른 그룹까지 평균 거리가 2라면
(2 - 4) / 4
로 -0.5입니다. 다른 그룹 쪽이 더 가까운 사례라는 신호입니다.
음수라고 문의의 분류가 반드시 틀렸다고 단정하지는 않습니다. 서로 다른 주제가 한 문장에 섞였거나 거리 계산에 쓰인 특징이 업무 의미를 잘 담지 못했을 수도 있습니다. 점수는 원문을 다시 살펴볼 후보를 고르는 데 쓰고, 자동으로 라벨을 바꾸는 명령으로 사용하지 않습니다.
쉬운 예시: 우리 묶음 안의 평균 간격과 옆 묶음까지의 평균 간격을 견주어 보는 방식입니다. 가장 가까운 점 하나만 찾는 계산과는 다릅니다.
왜 AI에서 실루엣 점수가 중요한가요?
정답 라벨이 없는 군집을 점검합니다
문서나 고객 행동을 처음 묶을 때는 정답 그룹을 모르는 경우가 많습니다. 이때 정확도처럼 정답과 비교하는 지표를 바로 적용하기 어렵습니다. 실루엣 점수는 데이터의 거리와 군집 소속만으로 결과를 살펴보게 해 줍니다. 업무 의미를 평가하는 사람의 검토를 대체하지는 않습니다.
군집 수 후보를 같은 기준에서 비교합니다
K-means처럼 군집 수를 먼저 정하는 알고리즘에서는 여러 후보를 학습하고 점수를 비교할 수 있습니다. 공식 예제도 군집 수별 평균과 실루엣 그림을 함께 보여 줍니다. 점수가 높은 후보를 먼저 살펴보되, 작은 주제를 큰 그룹에 합친 결과인지 군집 크기와 대표 사례를 확인합니다.
평균에 가려진 경계 사례를 찾습니다
전체 평균 하나만 보면 어떤 데이터가 애매한지 알기 어렵습니다. 사례별 계수를 구하면 음수인 점, 다른 점보다 낮은 점, 유난히 점수가 낮은 군집을 따로 살펴볼 수 있습니다. 문서 원문이나 특징값을 열어 보면 잘못 섞인 주제와 애초에 경계가 흐린 자료를 구분하는 데 도움이 됩니다.
실루엣 점수는 어떻게 계산하나요?
자기 군집 안의 평균 거리를 구합니다
각 점에서 같은 군집에 속한 나머지 점들까지 거리를 구해 평균을 냅니다. 이 값을
a
라고 합니다. 자기 자신까지의 거리는 평균 대상에서 제외합니다. 군집 중심점까지의 거리 하나로 대신하는 계산이 아니므로 K-means 중심점이 없어도 군집 라벨과 거리가 있으면 평가할 수 있습니다.
가장 가까운 다른 군집을 찾습니다
그 점이 속하지 않은 군집마다 그 군집의 점들까지 평균 거리를 계산합니다. 그 평균들 가운데 가장 작은 값을
b
로 사용합니다. 가장 가까운 다른 점 하나나 가장 가까운 중심점을 고르는 것이 아닙니다. 다른 군집 전체와 평균적으로 얼마나 가까운지를 비교합니다.
차이를 거리 규모로 나눕니다
사례별 계수는
(b - a) / max(a, b)
로 계산합니다. 내부 거리보다 이웃 군집 거리가 크면 양수, 두 값이 같으면 0, 내부 거리가 더 크면 음수가 됩니다. scikit-learn API는 군집 종류가 2개 이상이고 전체 사례 수보다 적어야 계산할 수 있다고 명시합니다.
사례별 계수를 평균합니다
silhouette_samples
는 사례마다 하나의 값을 반환하고
silhouette_score
는 전체 평균을 반환합니다. 전체 평균에서는 각 사례가 반영되므로 큰 군집이 작은 군집보다 더 많은 비중을 차지합니다. 군집별 평균들을 동일 비중으로 다시 평균한 값과는 다를 수 있어 보고서에 집계 방식을 적습니다.
양수·0·음수와 실루엣 그림은 어떻게 읽나요?
점수의 범위와 한계를 함께 읽습니다
계수의 범위는 -1부터 1까지입니다. 1에 가까울수록 자기 군집 안에서 가깝고 이웃 군집과 멀리 떨어진 사례이며, 0 근처는 두 군집 사이의 경계나 겹침을 의심할 신호입니다. 이 숫자를 정답일 확률이나 정확도로 해석하지 않습니다. 0.67이라고 해서 67%가 맞았다는 뜻은 아닙니다.
군집별 분포와 크기를 살핍니다
실루엣 그림은 보통 군집마다 사례별 값을 정렬해 나란히 그립니다. 가로 방향의 값으로 응집도와 분리도를 읽고, 군집별 띠의 두께로 포함된 사례 수를 살펴봅니다. 평균선 오른쪽의 점만 보지 말고 음수 영역이 넓은 군집이나 매우 작은 군집도 확인합니다.
높은 숫자를 절대 기준으로 삼지 않습니다
모든 데이터에 적용되는 합격 점수 하나를 정하기는 어렵습니다. 거리 척도, 차원, 특징의 구성, 군집 모양이 달라지면 값의 의미도 달라집니다. 같은 데이터와 거리 기준에서 후보를 비교하고 실제로 활용할 만한 구분인지 함께 판단합니다. 다른 데이터셋의 숫자를 그대로 목표치로 삼지 않습니다.
핵심 인사이트: 실루엣은 거리로 본 군집의 모양을 평가합니다. 업무상 유용성이나 숨은 정답 그룹의 존재까지 증명하는 지표는 아닙니다.
실루엣 점수와 헷갈리는 용어는 무엇이 다른가요?
클러스터링과 실루엣 점수의 차이
클러스터링은 데이터를 그룹으로 나누는 작업입니다. 실루엣 점수는 이미 얻은 그룹을 평가합니다. 계층적 클러스터링의 트리를 일정 높이에서 잘라 라벨을 얻은 뒤에도 계산할 수 있지만, 점수 자체가 트리를 만들거나 새 입력의 군집을 예측하지는 않습니다.
K-means 관성과 실루엣 점수의 차이
K-means의 관성은 각 점과 소속 중심점 사이 거리의 제곱을 더한 값입니다. 군집 내부의 퍼짐에 초점을 둡니다. 실루엣은 같은 군집과 다른 군집까지의 평균 거리를 모두 비교하고 정해진 범위로 나타냅니다. 관성은 낮을수록 좋고 실루엣은 보통 높을수록 좋으므로 점수 방향도 다릅니다.
분류 정확도와 실루엣 점수의 차이
분류 정확도는 정답 클래스와 예측이 얼마나 일치했는지 셉니다. 실루엣 점수는 정답을 쓰지 않고 거리와 그룹 소속을 봅니다. 군집 번호는 임의의 식별자이므로 번호가 정답 번호와 같다는 이유로 맞았다고 세면 안 됩니다. 정답 라벨과 군집을 비교하려면 그 목적에 맞는 별도 평가가 필요합니다.
실전에서는 어디에 쓰이나요?
문서 묶음의 후보를 비교합니다
같은 임베딩과 거리 기준에서 서로 다른 군집 수나 군집화 설정을 비교합니다. 각 후보의 평균 점수와 군집 크기, 낮은 점수의 원문을 함께 남기면 단순히 그룹 이름이 그럴듯한지보다 구체적으로 검토할 수 있습니다. 매우 드문 문의가 큰 그룹에 흡수되지 않았는지도 봅니다.
계층적 군집의 절단 결과를 점검합니다
계층적 클러스터링에서 트리를 자르는 위치를 바꾸면 다른 군집 라벨이 생깁니다. 각 절단 결과를 같은 거리 공간에서 평가해 후보를 좁힐 수 있습니다. 다만 한 그룹만 남았거나 각 사례가 모두 별도 그룹이 된 결과에는 계산 조건이 맞지 않으므로 점수를 억지로 붙이지 않습니다.
데이터 검토 순서를 정하는 보조 지표로 씁니다
음수인 사례나 군집 평균이 낮은 그룹을 검토 목록에 올립니다. 중복 문서, 혼합 주제, 잘못된 단위, 불필요한 식별자 같은 원인을 확인할 출발점이 됩니다. 점수만 보고 데이터를 삭제하면 어려운 사례를 없애 평가를 좋게 보이게 할 수 있으므로 원본과 제외 이유를 보관합니다.
실루엣 점수를 적용할 때 어떤 순서로 확인하나요?
1. 특징과 거리 기준을 고정합니다
한 행이 무엇을 뜻하는지와 어떤 열을 거리 계산에 쓰는지 정합니다. 수치 열의 단위가 크게 다르면 표준화 등 전처리를 검토합니다. 문서 임베딩에서도 유클리드 거리와 코사인 거리가 같은 결과를 보장하지 않습니다. 군집 후보끼리 비교할 때는 평가용 특징과 거리 기준을 일관되게 유지합니다.
2. 라벨과 입력 행의 순서를 맞춥니다
특징 행렬의 각 행과 군집 라벨 배열이 같은 사례를 가리키는지 확인합니다. 데이터를 정렬하거나 일부를 제외했다면 라벨도 함께 바꿉니다. API에 들어가는 군집 수가 계산 가능한 범위인지 확인하고, 노이즈를 별도 라벨로 남긴 알고리즘에서는 평가에 포함할지 제외할지 기준을 기록합니다.
3. 전체 평균과 군집별 값을 저장합니다
평균 점수만 저장하지 말고 사례별 값과 군집 크기도 남깁니다. 특정 군집에서 음수가 많이 나오는지 원본 자료로 확인합니다. 여러 후보의 차이가 작다면 한 번 나온 순위를 확정하지 말고 초기화나 표본을 바꿨을 때도 판단이 유지되는지 살펴봅니다.
4. 표본 추출 조건과 실행 환경을 남깁니다
데이터가 크면 쌍별 거리 계산의 시간과 메모리 부담이 커집니다.
sample_size
를 지정하면 scikit-learn은 무작위 부분 표본으로 평균 점수를 계산합니다.
random_state
를 기록해 같은 표본 선택을 재현하고, 작은 군집이 표본에서 빠지거나 계산 조건이 깨지지 않았는지 확인합니다.
실전 팁: 데이터 버전, 특징과 전처리, 거리 기준, 군집 라벨, 표본 선택 조건을 점수와 함께 보관해야 나중에도 비교 이유를 설명할 수 있습니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 군집 모양에 따른 편향을 확인합니다. scikit-learn 사용자 안내는 실루엣이 DBSCAN 같은 밀도 기반 군집보다 볼록한 군집에 높은 값을 주는 경향을 설명합니다. 길게 휘어진 그룹이 낮은 점수를 받았다고 곧바로 잘못된 군집이라고 판정하지 않습니다.
둘째, 거리 행렬과 유사도 행렬을 혼동하지 않습니다. 이미 계산한 거리 행렬을 넣을 때는
metric="precomputed"
를 명시합니다. scikit-learn 문서는 이 거리 행렬의 대각선이 0이어야 한다고 안내합니다. 값이 클수록 닮았다는 유사도를 그대로 거리처럼 넣으면 해석이 뒤집힐 수 있습니다.
셋째, 평가 공간을 바꾸면 질문도 달라집니다. 원본 특징에서 계산한 점수와 시각화용 축소 좌표에서 계산한 점수는 서로 다른 공간의 분리도를 봅니다. 그림에서 점들이 멀리 떨어졌다는 이유만으로 원본 데이터도 잘 분리됐다고 보고하지 않습니다.
넷째, 노이즈 제외로 좋아진 점수만 내세우지 않습니다. 어려운 사례를 빼면 평가 대상 자체가 달라집니다. 노이즈를 제외했다면 제외 비율과 남은 군집 수를 함께 남깁니다. 포함·제외 조건이 다른 결과를 동일한 기준의 개선처럼 비교하지 않습니다.
주의: 실루엣 점수는 확률도 통계적 유의성 검정도 아닙니다. 소폭의 점수 상승만으로 군집이 실제로 더 유용해졌다고 결론 내리지 않습니다.
자주 묻는 질문
Q1. 정답 라벨이 없어도 계산할 수 있나요?
네. 입력 특징 또는 거리 행렬과 군집 소속 라벨이 있으면 계산합니다. 필요한 라벨은 군집 알고리즘이 붙인 그룹 번호이며 사람이 만든 정답일 필요는 없습니다.
Q2. 점수가 음수면 무조건 잘못 묶인 건가요?
다른 군집까지 평균 거리가 자기 군집 내부 평균 거리보다 짧다는 신호입니다. 잘못된 배정일 수 있지만 경계 사례, 군집 모양, 부적절한 거리 기준도 원인이므로 원본을 함께 확인합니다.
Q3. 점수가 가장 높으면 그 군집 수가 정답인가요?
아닙니다. 선택한 공간에서 잘 모이고 떨어진 후보라는 의미입니다. 작은 주제를 합쳐 큰 그룹을 만들었을 수도 있으므로 군집별 크기와 대표 사례, 실제 활용 목적을 함께 봅니다.
Q4. 군집이 하나만 나와도 계산할 수 있나요?
scikit-learn에서는 계산할 수 없습니다. 비교할 다른 군집이 필요합니다. 군집 종류가 2개 이상이고 사례 수보다 적어야 하며, 표본 추출 뒤에도 이 조건이 유지되는지 확인합니다.
Q5. DBSCAN 결과에도 그대로 써도 되나요?
계산 조건을 만족하는 라벨과 거리가 있으면 평가할 수 있지만 해석에 주의합니다. 밀도 기반 군집의 모양이 지표의 선호와 다를 수 있고 노이즈 처리 방침도 결과에 영향을 줍니다. 점수 하나로 알고리즘의 우열을 확정하지 않습니다.
출처
마무리
실루엣 점수는 같은 군집 안의 평균 거리와 가장 가까운 다른 군집까지의 평균 거리를 비교하는 지표입니다. 정답 라벨이 없는 군집화에서 후보를 좁히고 애매한 사례를 찾아보는 데 유용합니다.
처음 사용할 때는 평균 숫자 하나보다 거리 기준, 군집별 분포, 원본 사례를 함께 확인하세요. 입력과 평가 조건을 맞춘 뒤 높은 점수가 실제로 쓸 만한 구분과 연결되는지 살피면 군집 결과를 더 정확하게 설명할 수 있습니다.
