조건을 조금 바꿔도 같은 결론일까: 분석 설정과 결과를 함께 비교하기

분석 결과 폴더에서 정밀도 100%인 파일을 찾았어요. 이것만 보고 좋은 설정이라고 골라도 될까요? 그 설정이 실제 문제 다섯 건 중 두 건만 찾아냈다면 결론이 달라질 수 있어요. 이번에는 검토 대상을 고르는 점수의 임계값을 세 가지로 바꾸고, 좋아진 수치와 함께 나빠진 수치도 남기는 비교 기록을 만들어요.

첨부 링크는 이 글의 예제 ZIP으로 연결돼요. 압축을 푼 뒤 링크에 표시된 파일을 열면 입력·코드·완성 자료를 함께 사용할 수 있어요.

상황은 검토 업무의 선별 기준을 시험하는 담당자로 좁혔어요. 열 건의 점수와 실제 문제 여부는 모두 합성 자료예요. 점수는 설명용 순위 점수이고 문제 발생 확률로 검증된 값이 아니에요. 새 모델을 학습시키는 실험도 아니며, 고정된 점수에서 어느 값 이상을 사람이 검토할지 비교해요.

분석 설정을 하나씩 바꾸며 결과 변화를 확인하는 장면
설명 삽화 1. 어떤 설정을 바꾸었는지와 결과를 함께 남겨야 판단이 얼마나 안정적인지 볼 수 있어요.

가장 좋은 숫자를 찾기 전에 질문을 정해요

이번 목표는 ‘실제 문제의 80% 이상을 찾으면서 사람이 검토할 건수를 5건 이하로 유지할 수 있는가’예요. 두 조건은 예제의 운영 요구로 미리 정한 값이에요. 결과를 본 뒤 잘 나오는 쪽으로 바꾸지 않아요.

입력 CSV (ZIP: input.csv)의 점수와 실제 문제 표시는 다음과 같아요. 1이면 실제 문제, 0이면 문제 없음이에요.

항목 점수 실제 문제
Q01 0.95 1
Q02 0.85 1
Q03 0.75 0
Q04 0.65 1
Q05 0.55 0
Q06 0.45 1
Q07 0.35 1
Q08~Q10 0.25, 0.15, 0.05 모두 0

실제 문제는 Q01·Q02·Q04·Q06·Q07의 다섯 건이에요. 모든 실행에서 입력, 정답 표시, 계산 코드, 검토 규칙을 고정해요. 바꾸는 것은 임계값 0.4·0.6·0.8뿐이에요. 점수가 임계값과 같아도 검토에 포함하도록 점수 ≥ 임계값으로 경계도 명시해요.

열 건의 고정된 점수와 실제 문제 표시, 재현율 80% 이상과 검토량 5건 이하라는 비교 기준
그림 1. 제공 계산 예제의 브라우저 화면이에요. 실제 문제 표시는 합성 정답이며 외부에서 측정한 도구 성능이 아니에요.

정밀도와 재현율의 분모를 나눠 계산해요

정밀도는 검토 대상으로 골라낸 것 중 실제 문제의 비율이고, 재현율은 실제 문제 전체 중 골라낸 비율이에요. 각각 TP/(TP+FP), TP/(TP+FN)으로 계산해요. TP는 찾은 실제 문제, FP는 문제 없는데 검토 대상으로 고른 항목, FN은 놓친 문제예요. 정의는 scikit-learn의 정밀도와 재현율 공식 문서와 대조했어요. 실제 예제 계산은 별도 패키지 없이 수행했어요.

임계값 0.4에서는 Q01~Q06 여섯 건을 검토해요. 실제 문제 네 건을 찾아 TP=4, 불필요한 검토 두 건으로 FP=2, 놓친 Q07 한 건으로 FN=1이에요. 정밀도는 4/6=66.7%, 재현율은 4/5=80%예요.

실행 임계값 검토 건수 TP / FP / FN 정밀도 재현율 두 기준 모두 충족
s04 0.4 6 4 / 2 / 1 66.7% 80% 아니요: 검토량 초과
s06 0.6 4 3 / 1 / 2 75% 60% 아니요: 재현율 부족
s08 0.8 2 2 / 0 / 3 100% 40% 아니요: 재현율 부족

정밀도만 보면 s08이 좋아요. 하지만 검토하지 않은 문제 세 건을 숨기게 돼요. 이번 질문에는 세 설정 모두 탈락이 정답이에요. 가장 높은 점수를 남기는 작업과 운영 요구를 충족하는 조건을 찾는 작업을 구분해야 해요.

임계값별 정밀도와 재현율, 놓친 문제 수를 함께 비교해 세 설정 모두 두 목표를 충족하지 못함을 보여주는 결과
그림 2. 실패한 설정도 비교표에 남겼어요. 정밀도 100%가 모든 문제를 찾았다는 뜻은 아니에요.
작은 조건 변경으로 판단 경계를 넘는 결과를 찾는 장면
설명 삽화 2. 결론이 바뀌는 조건은 숨기지 말고 추가 확인이 필요한 경계로 기록해요.

결과 파일에 실행 조건을 연결해요

settings.csv (ZIP: settings.csv)에는 실행 ID, 임계값, 최소 재현율, 최대 검토량이 들어 있어요. results.csv (ZIP: results.csv)는 같은 실행 ID로 각 결과를 연결하고, predictions.csv (ZIP: predictions.csv)는 실행별로 어떤 항목을 골랐는지 남겨요. s06의 결과가 의심되면 Q01~Q04 네 건을 실제로 골랐는지부터 대조할 수 있어요.

python3 assets/verify.py

Python 3.12.3에서 위 명령을 실행했어요. results.json (ZIP: results.json)에는 입력과 설정 파일의 SHA-256, 실행 코드의 SHA-256, 실행 환경, 세 결과가 남아요. 같은 이름의 CSV를 나중에 바꿨더라도 해시가 다르면 이번 입력과 같다고 취급하지 않아요. 원본과 처리 단계를 남기는 방식은 과학 계산의 실무 지침을 참고했어요.

손계산 대조는 s04의 TP 4, FP 2, FN 1을 확인한 뒤 분모를 계산하는 순서로 해요. 코드의 출력만 다시 읽는 것보다 항목 목록으로 돌아가 계산하는 편이 분모 오류를 찾기 쉬워요. 검토 대상으로 아무것도 고르지 않으면 정밀도의 분모가 0이므로 이 예제 코드는 그 값을 None으로 남겨요. 실제 문제가 0건인 다른 자료에서는 재현율도 정의되지 않으므로, 입력 검사를 추가하고 ‘평가 불가’로 표시해야 해요.

다음 선택은 임계값 밖에 있을 수도 있어요

이 자료에서 80% 재현율을 얻으려면 최소 Q06까지 골라야 해서 검토량이 여섯 건 필요해요. 검토 한 건을 더 허용하면 s04가 이 작은 자료의 두 기준을 충족해요. 다만 인력 조건을 완화한 새 결정이므로 운영 담당자의 판단 사항으로 남겨야 해요. 점수의 구별 능력을 개선하거나, 검토 시간을 줄이거나, 위험한 항목을 별도 규칙으로 추가하는 선택도 있어요.

열 건은 방법을 확인하는 예제라서 실제 운영 성능을 추정하기에 충분한 평가 자료로 제시하지 않아요. 같은 자료를 계속 보고 임계값을 고르면 그 자료에 맞춘 선택이 돼요. 실제 도입 전에는 선택에 쓰지 않은 새 자료에서 같은 기준을 다시 확인하고, 정답 판정의 일관성도 점검해야 해요. 확률적 모델을 새로 학습시키는 경우에는 난수 시드·데이터 분할·모델 버전도 고정하거나 반복 비교할 항목으로 추가하고요.

이번 기록의 결론은 ‘0.8이 최고’가 아니라 **‘시험한 세 임계값 중 운영 요구를 동시에 충족한 것은 없음’**이에요. 계산 가정 자체를 바꿀 때는 결측 처리 기준 비교, 제한된 검토 인력을 계획할 때는 가용시간과 시나리오 계산으로 이어갈 수 있어요. 2026년 10월 13일 Codex가 합성 자료·실행 코드·원고를 작성했어요.

예제 파일을 한 번에 받아 다시 확인해요

이 글의 입력·코드·완성 자료 ZIP을 새 폴더에 풀면 R11/README.txt, replay.py, assets 폴더가 함께 생겨요. 개별 코드 파일만 저장하면 보조 모듈이나 입력이 빠질 수 있으므로 처음에는 이 묶음을 사용하세요. R11 폴더에서 다음 명령을 실행하면 본문에 사용한 검사를 순서대로 수행해요.

python3 replay.py

확인할 결과는 임계값0.4/0.6/0.8에서 TP4/3/2, 기본 운영기준 모두 미달예요. 명령이 성공해도 이 값과 본문의 적용 범위를 함께 대조하세요. 실행 안내 (ZIP: README.txt)에 필요한 파일과 개별 명령을 적었어요. 실행 코드는 verify.py (ZIP: verify.py)에서 직접 볼 수 있어요. Python3.12의 표준 라이브러리를 사용하며, 명령이 실패하면 ZIP의 폴더 구조와 오류에 나온 파일부터 확인해요. 실제 앱 실행에 필요한 프로그램은 원래 설명을 따르세요.

설명 삽화 2장은 GPT로 생성한 개념 설명이에요. 실제 예제의 작업 화면과 실행 결과는 기존 그림·첨부 자료에서 따로 확인할 수 있어요.