2026년 7월 3일 | 개발 공부
두 사람이 같은 100개 샘플을 라벨링했는데 90개가 맞았다는 숫자는 처음 보면 꽤 든든하다. 나도 예전에는 annotator agreement 표를 볼 때 전체 일치율부터 눈에 들어왔다. 그런데 label 분포가 한쪽으로 기울어진 작업에서는 이 숫자가 생각보다 후하다. 대부분의 샘플이 “정상”이고 아주 조금만 “문제 있음”이라면, 두 사람이 깊게 보지 않아도 정상 쪽에서 쉽게 맞는 몫이 생긴다. Cohen's Kappa는 바로 그 우연 일치 몫을 덜어낸 뒤 남은 합의 정도를 보려는 지표다.
전체 일치율이 너무 쉽게 좋아지는 경우
예를 들어 문서 100개를 두 명이 “통과”와 “보류”로 나눴다고 해 보자. 둘이 같은 label을 준 문서가 82개라면 전체 일치율은 82%다. 숫자만 보면 꽤 괜찮아 보인다. 하지만 두 사람 모두 대부분의 문서를 통과로 찍는 성향이 있다면, 통과 쪽에서 맞는 비율은 자연스럽게 높아진다. 이때 82%라는 일치율 안에는 실제 판단이 맞아떨어진 몫과, class prior 때문에 그냥 같이 통과로 몰린 몫이 섞여 있다.
Cohen's Kappa는 관찰된 일치율을 그대로 점수로 쓰지 않는다. 먼저 각 평가자가 label을 얼마나 자주 썼는지 보고, 그 분포만으로도 기대되는 우연 일치율을 계산한다. 그다음 관찰 일치율에서 이 기대 일치율을 빼고, 남은 여지를 기준으로 다시 스케일을 맞춘다. 공식은 길게 외울 필요까지는 없지만, 관찰 일치율에서 우연 기대 일치율을 빼는 지표라고 잡아 두면 실험표를 볼 때 덜 헷갈린다.
계산 감각은 생각보다 단순하다
Kappa의 기본 형태는 “관찰 일치율 - 기대 일치율”을 “1 - 기대 일치율”로 나눈 값이다. 관찰 일치율은 두 사람이 실제로 같은 label을 준 비율이다. 기대 일치율은 각자가 label을 고르는 비율만 유지한 채 독립적으로 찍었을 때 우연히 맞을 비율이다. 그래서 label 분포가 극단적으로 치우칠수록 기대 일치율이 올라가고, 같은 전체 일치율이라도 Kappa는 더 낮게 나온다.
이 차이가 중요하다. 불균형 분류에서 accuracy가 다수 class에 끌려가는 것처럼, annotation agreement도 쉬운 다수 label에 끌려갈 수 있다. 최근에 정리한 Balanced Accuracy가 class별 recall을 평균해 accuracy 착시를 줄인다면, Cohen's Kappa는 annotator 또는 classifier label 사이의 일치에서 우연히 맞을 수 있는 배경 확률을 걷어 낸다. 서로 다른 문제지만, 둘 다 “그 숫자가 정말 어려운 부분을 설명하나”를 묻는다는 점은 닮았다.
어디에 쓰면 좋은지
나는 Kappa를 사람이 만든 label을 평가할 때 먼저 떠올린다. 의학 영상 판독 label, 문서 품질 판정, retrieval relevance label, LLM 답변의 안전성 판정처럼 “사람 둘 이상이 같은 기준을 봤는가”가 중요한 작업에서 특히 유용하다. 단순히 몇 퍼센트가 같았는지를 넘어서, label 분포가 만든 쉬운 합의를 조금 덜어내고 볼 수 있기 때문이다.
모델 평가에서도 비슷한 감각이 필요할 때가 있다. 예측 label과 gold label의 agreement를 보고 싶을 때 Kappa를 함께 두면, 전체 accuracy만 볼 때보다 class imbalance의 영향을 더 조심스럽게 읽을 수 있다. 다만 이 지표 하나로 모든 classification 품질을 대체하면 안 된다. false positive와 false negative 비용이 다른 문제에서는 MCC, Balanced Accuracy, PR curve, calibration 지표를 같이 둬야 한다. Kappa는 “합의가 우연보다 얼마나 나은가”에 강한 지표지, 모든 운영 비용을 계산하는 지표는 아니다.
해석할 때 조심할 점
Kappa 값은 보통 -1에서 1 사이로 읽는다. 1에 가까울수록 강한 일치, 0 근처면 우연 수준, 음수면 우연보다도 어긋나는 상태로 볼 수 있다. 문제는 “0.6이면 충분한가” 같은 해석이 분야와 작업 난이도에 따라 꽤 달라진다는 점이다. label이 모호하고 경계 사례가 많은 작업에서는 Kappa가 낮게 나와도 데이터가 나쁘다고 바로 단정하기 어렵다. 반대로 쉬운 label 작업에서 Kappa가 애매하면 기준서나 예시가 부족한지부터 봐야 한다.
또 하나는 prevalence 문제다. 특정 label이 압도적으로 많으면 Kappa가 생각보다 낮아지는 역설적인 상황이 생길 수 있다. 전체 일치율은 높지만 minority label에서 합의가 흔들리면 Kappa가 낮게 나온다. 이게 지표의 단점으로만 보일 때도 있지만, 나는 오히려 경고 신호로 쓴다. 실제로 중요한 label이 드물고 어려운 경우라면, 평균 agreement보다 minority label의 precision, recall, confusion matrix를 함께 봐야 한다.
실험 노트에 같이 남길 것
Kappa를 기록할 때는 값만 적으면 다음에 다시 읽기 어렵다. 최소한 label별 support, annotator별 label 분포, 전체 일치율, confusion matrix를 같이 남기는 편이 좋다. 특히 두 사람이 label을 얼마나 자주 썼는지 보지 않으면 Kappa가 왜 낮아졌는지 감이 잘 오지 않는다. agreement 숫자가 내려갔을 때 기준 자체가 어려워진 것인지, 한쪽 annotator가 특정 label을 거의 쓰지 않은 것인지, 데이터 분포가 바뀐 것인지가 섞여 보인다.
내 기준의 짧은 체크리스트는 네 가지다. 첫째, 전체 일치율과 Kappa를 나란히 쓴다. 둘째, label 분포를 평가자별로 분리해 남긴다. 셋째, disagreement 샘플을 10개 정도 직접 읽는다. 넷째, Kappa가 낮아진 이유를 “모델 실패”나 “사람 실수”로 바로 이름 붙이지 않고, 기준서 부족, label 경계 모호함, class imbalance 중 어디에 가까운지 한 번 나눈다.
Cohen's Kappa는 화려한 모델 지표는 아니다. 대신 annotation과 평가표를 볼 때 숫자의 체면을 한 번 벗겨 준다. 전체 일치율이 높아도 우연히 맞을 몫이 컸다면 그 사실을 드러내고, 낮은 값이 나왔을 때도 어디서 합의가 깨졌는지 다시 보게 만든다. 내가 이 지표를 좋아하는 이유는 거기에 있다. “많이 맞았다”에서 멈추지 않고, 어려운 부분에서도 정말 같은 판단을 했는가를 묻게 해 주기 때문이다.
'[개발 공부]' 카테고리의 다른 글
| Micro F1와 Accuracy가 겹치는 지점 (0) | 2026.07.06 |
|---|---|
| Macro F1: 클래스별 성능을 따로 평균낸 값 (0) | 2026.07.05 |
| Balanced Accuracy: 다수 클래스 뒤의 실패율 (0) | 2026.07.03 |
| Matthews Correlation Coefficient: 불균형 분류의 네 칸 점수 (0) | 2026.07.02 |
| Precision-Recall Curve: 희소 양성 데이터의 점수표 (0) | 2026.07.02 |