A부서는 9월 처리율을 83.3%, B부서는 60%라고 보고했어요. A가 더 잘 처리한 걸까요? A는 ‘9월에 끝낸 건수’를 ‘9월에 들어온 건수’로 나눴고, B는 ‘9월에 들어온 유효 요청 중 월말까지 끝낸 비율’을 계산했다면 두 숫자를 바로 비교할 수 없어요.
첨부 링크는 이 글의 예제 ZIP으로 연결돼요. 압축을 푼 뒤 링크에 표시된 파일을 열면 입력·코드·완성 자료를 함께 사용할 수 있어요.
이번에는 요청 처리 실적을 취합하는 담당자를 가정해요. 합성 원자료 15행에서 두 보고값을 재현하고, 포함·제외 조건과 예제 계산이 적힌 지표 정의서를 만들어요. 실제 부서의 합의를 얻은 사례는 아니므로 통일 정의는 제안으로 표시해요. 목표는 서로 다른 숫자를 억지로 같게 만드는 것이 아니라 같은 질문에는 같은 계산을 적용하는 거예요.

기존 수치를 지우기 전에 계산 대상을 복원해요
요청 원자료 (ZIP: requests.csv)는 요청번호, 부서, 접수일, 완료일, 테스트 여부, 취소 여부로 구성돼요. 날짜는 한국 시간의 날짜라고 가정하고, 시간대 변환은 하지 않아요. A부서는 9월 접수 여섯 건과 8월 접수 두 건, B부서는 9월 접수 여섯 건과 8월 접수 한 건이 있어요.
| 항목 | A부서 | B부서 |
|---|---|---|
| 9월 접수 전체 | 6 | 6 |
| 그중 테스트 | 1 | 1 |
| 그중 취소 | 1 | 0 |
| 9월 유효 접수 | 4 | 5 |
| 유효 접수 중 9월 말까지 완료 | 2 | 3 |
| 8월 접수 후 9월 완료 | 2 | 1 |
A의 원래 분자는 9월 완료 다섯 건이에요. 여기에는 9월 유효 요청 두 건, 테스트 완료 한 건, 8월 접수 후 완료 두 건이 들어 있어요. 분모는 9월 접수 전체 여섯 건이므로 5/6=83.3%예요. B는 9월 유효 접수 다섯 건 중 세 건을 완료해 3/5=60%예요.
A의 방식은 같은 접수 집단의 완료 비율이 아니에요. 전월 밀린 일을 많이 끝내면 100%를 넘을 수도 있어요. 그것이 반드시 산술 오류라는 뜻은 아니지만 ‘월간 완료/접수 비’처럼 별도 이름이 필요해요. 신규 접수의 진행 상태와 이전 잔여 업무의 해소량을 한 지표로 모두 설명하기 어려워요.

이번 질문에 맞는 정의를 채워요
담당자가 알고 싶은 질문을 ‘9월에 들어온 유효 요청이 9월 말에 얼마나 끝났는가’로 정해요. 같은 접수 기간으로 묶은 집단을 코호트라고 부를 수 있어요. 이제 분자가 분모 안에 들어가도록 정의해요.
| 정의서 항목 | 이번 제안 |
|---|---|
| 지표명·버전 | 9월 접수 유효 요청의 월말 완료율, v1 |
| 단위 | 요청번호 한 개당 한 건, % |
| 입력 출처 | requests.csv, 합성 원자료 15행 |
| 접수 범위 | 2026-09-01 이상, 2026-10-01 미만 |
| 제외 조건 | 테스트=1 또는 취소=1 |
| 분모 | 위 조건을 만족하는 유일한 요청번호 수 |
| 분자 | 분모에 속하면서 완료일이 있고 2026-10-01보다 이른 요청 수 |
| 관측 종료 | 2026-09-30 종료 시점 |
| 미완료·10월 완료 | 분모에는 포함, 이번 분자에서는 제외 |
| 분모가 0일 때 | 0%가 아니라 계산 불가 |
| 책임·승인 | 작성자 제안, 실제 데이터 담당·결정권자 합의 전 |
이 정의에서는 완료일이 접수일보다 빠르거나 요청번호가 중복되면 원자료를 확인해야 해요. 한 요청에 여러 처리 이력이 있으면 최종 완료 상태를 어떤 행에서 읽을지도 추가해야 하고요. 이번 원자료는 그런 이력 없이 요청당 한 행이며, 중복 요청번호가 없는지 코드에서 검사했어요.
표에서 정의나 수집·편집 방식의 변경을 명확히 표시하라는 Government Analysis Function 안내를 참고해 제외 조건과 관측 종료일을 숫자와 함께 남겼어요. 이 문서가 이번 업무의 처리율을 정해주는 것은 아니에요.
새 정의로 계산하면 A는 50%, B는 60%예요
A에서 분모에 남는 것은 A01·A02·A03·A04예요. A05는 테스트, A06은 취소, A07·A08은 이전 달 접수라 제외해요. 분자에는 A01·A02만 남아요. A03은 10월 2일 완료, A04는 미완료이므로 2/4=50%예요.
B는 B01~B05 다섯 건이 분모이고, B01·B02·B03 세 건이 분자예요. B04는 10월 1일 완료, B05는 미완료예요. B06은 테스트, B07은 이전 달 접수라 제외해 3/5=60%가 돼요.
| 부서 | 분자 | 분모 | 새 정의의 완료율 |
|---|---|---|---|
| A | 2 | 4 | 50% |
| B | 3 | 5 | 60% |
| 전체 | 5 | 9 | 55.56% |
전체율은 (2+3)/(4+5)=55.56%예요. 부서율을 단순 평균한 55%와 달라요. 부서의 요청 수가 다르므로 전체 요청에 대한 비율은 분자·분모를 각각 합쳐 계산해야 해요. 부서에 같은 가중치를 주는 평균을 보고하려면 그 질문과 이름을 따로 정해야 해요.


결과와 포함 행을 같이 넘겨요
검증 코드 (ZIP: verify.py)를 python3 assets/verify.py로 실행하면 통일 결과 (ZIP: unified-results.csv)와 요청별 포함 판정 (ZIP: inclusion-decisions.csv)을 다시 만들어요. Python 3.12.3에서 실행했고, 원래 A 보고값 5/6과 새 정의의 2/4를 각각 확인했어요. 실행 기록 (ZIP: results.json)에는 원자료 해시도 있어요. 새 자료를 넣을 때는 접수 범위와 관측 종료를 바꾸고 고정 기대값 검사를 해당 자료에 맞게 갱신해요.
정의가 정리됐다고 부서 성과 순위를 바로 확정하지는 않아요. 9월 1일 접수는 한 달 가까이 처리할 수 있지만 9월 30일 접수는 하루밖에 없어요. 접수일 분포가 다르거나 요청 난도가 다르면 같은 정의에서도 비교가 불공정할 수 있어요. 이런 질문에는 ‘접수 후 7일 이내 완료율’처럼 모든 요청에 같은 관측 시간을 주는 별도 지표가 더 맞을 수 있고, 그 경우 7일이 지나지 않은 최근 요청을 어떻게 처리할지 정해야 해요.
접수일 원자료가 없는 부서는 이번 코호트율을 계산할 수 없어요. 기존 월간 완료/접수 비를 별도 이름으로 유지하고, 신규 정의를 언제부터 산출할 수 있는지 적어야 해요. 이름만 통일하고 과거 숫자를 이어 붙이지 마세요. 새 정의를 도입한 뒤 전체 평균 변화가 이상하다면 집단 구성비 비교를 확인해 보세요. 이 예제의 정의서·계산·원고는 2026년 10월 13일 Codex가 작성했어요.
예제 파일을 한 번에 받아 다시 확인해요
이 글의 입력·코드·완성 자료 ZIP을 새 폴더에 풀면 R21/README.txt, replay.py, assets 폴더가 함께 생겨요. 개별 코드 파일만 저장하면 보조 모듈이나 입력이 빠질 수 있으므로 처음에는 이 묶음을 사용하세요. R21 폴더에서 다음 명령을 실행하면 본문에 사용한 검사를 순서대로 수행해요.
python3 replay.py
확인할 결과는 A 2/4·B 3/5·전체5/9, 단순평균55%와 구분예요. 명령이 성공해도 이 값과 본문의 적용 범위를 함께 대조하세요. 실행 안내 (ZIP: README.txt)에 필요한 파일과 개별 명령을 적었어요. 실행 코드는 verify.py (ZIP: verify.py)에서 직접 볼 수 있어요. Python3.12의 표준 라이브러리를 사용하며, 명령이 실패하면 ZIP의 폴더 구조와 오류에 나온 파일부터 확인해요. 실제 앱 실행에 필요한 프로그램은 원래 설명을 따르세요.
설명 삽화 2장은 GPT로 생성한 개념 설명이에요. 실제 예제의 작업 화면과 실행 결과는 기존 그림·첨부 자료에서 따로 확인할 수 있어요.