Finding the Payment-Delay Bottleneck in the Tail
한국어 원문으로 표시합니다.
목표
지급 지연 신고를 받았을 때 통짜 시간이 아니라 구간과 백분위수로 쪼개어 고칠 자리를 지목할 수 있게 되고, 부지급 사유 코드에서 심사 규칙의 결함을 읽어 낼 수 있게 됩니다.
왜 중요한가
지급 지연 대시보드가 목표치 안에 들어와 있는데 민원은 계속 들어오는 상황이 흔합니다. 민원을 넣는 사람은 평균에 있는 사람이 아니기 때문입니다. 평균은 짧은 건이 많아서 낮은 것이지 긴 건이 없어서 낮은 것이 아닙니다.
그리고 지연을 고치려면 어느 구간이 먹었는지까지 가야 합니다. "접수부터 지급까지 20일" 로는 아무도 못 고치고, "조사에서 18일" 이라야 조사 배정 규칙을 손보자는 말이 나옵니다. 접수-배정 구간이 길면 인력 문제이고 결정-지급 구간이 길면 정산 시스템 문제라, 구간을 안 나눈 보고는 엉뚱한 팀에 일을 던지게 만듭니다.
이 실습에서 쓰는 정의를 못박아 둡니다.
백분위수 오름차순 정렬 후 ceil(p × n ÷ 100) 번째 값 (최근접 순위법)
평균 합을 건수로 나눈 몫. 소수점은 버린다
지급기일 접수 후 240시간
지연일수 (접수→지급 시간 − 240) ÷ 24 의 몫. 음수면 0
지연이자 지급액 × 54 × 지연일수 ÷ 365000 의 몫 (연 5.4% 일할, 원 단위 내림)
금액은 처음부터 끝까지 정수 원으로 다룹니다. 실수로 계산하면 대사가 1원씩 어긋나고, 그 1원의 원인을 찾는 데 며칠이 갑니다.
단계
- 오른쪽 예시의 생성기를
/root/ins/make_claim.py로 저장하고python3 make_claim.py로 실행하세요. 청구 200건, 단계 이력 965행, 이의 8건이 만들어집니다. /root/ins/funnel.txt에 단계별 건수 다섯 줄(stage_received=…stage_paid=)과ledger_decided=,gap=을 적고, 원장에 안 실린 건을/root/ins/funnel_gap.csv에claim_no,decided_ts로 남기세요.- 지급까지 간 청구의 구간별 소요 시간을
/root/ins/latency.csv에claim_no,assign_h,investigate_h,review_h,pay_h,total_h로 적으세요. /root/ins/percentile.txt에n=,mean_h=,p50_h=,p90_h=,p99_h=다섯 줄을 적으세요.total_h가 p90 이상인 건만 골라/root/ins/bottleneck.txt에tail_n=,tail_total_h=,tail_assign_h=,tail_investigate_h=,tail_review_h=,tail_pay_h=,tail_investigate_pct=일곱 줄을 적으세요.- 부지급 사유 코드별 건수를
/root/ins/denial.csv에code,denied,appealed,overturned로 적고,/root/ins/denial.txt에wrongful_denied=,wrongful_claimed_amount=,wrongful_code=세 줄을 적으세요. - 지급기일을 넘긴 건의 지연이자를
/root/ins/interest.csv에claim_no,over_days,paid_amount,interest로 적으세요. /root/ins/claim_report.md에## 확인한 것,## 지연은 어디서 생기는가,## 부당 부지급,## 권고,## 반출하지 않은 것다섯 절로 보고서를 쓰세요.
참고
- 두 시각의 정수 시간 차이는
CAST(ROUND((julianday(a)-julianday(b))*24) AS INTEGER)로 구합니다. - SQLite 는 정수끼리 나누면 몫만 남깁니다. 이 실습의 계산은 전부 그 성질을 이용합니다.
- 흔한 실수 1: 3단계에 부지급 건까지 넣는 것. 지급 시각이 없는 건은 소요 시간을 잴 수 없습니다.
- 흔한 실수 2: 5단계에서 p90 을 넘는 건만 세는 것. 정의는 p90 '이상' 입니다.
- 흔한 실수 3: 이자 계산에서 나눗셈을 먼저 하는 것.
지급액 ÷ 365000 × 54 × 일수로 계산하면 대부분 0 이 나옵니다. - 흔한 실수 4: 보고서에 진단 코드를 옮겨 적는 것. 조사에서 보는 것과 문서로 내보내는 것은 다른 일입니다.
청구 데이터 만들기
오른쪽 예시의 생성기를 /root/ins/make_claim.py 로 저장하고 python3 make_claim.py 로 실행하세요. 청구 200건, 단계 이력 965행, 이의 8건이 만들어집니다.
실습 안내에 있는 생성기를 /root/ins/make_claim.py 로 저장하고 python3 로 실행하세요. 손으로 고치면 뒤 단계의 숫자가 전부 어긋납니다.
단계표와 원장을 각각 세기
/root/ins/funnel.txt 에 단계별 건수 다섯 줄(stage_received= … stage_paid=)과 ledger_decided=, gap= 을 적고, 원장에 안 실린 건을 /root/ins/funnel_gap.csv 에 claim_no,decided_ts 로 남기세요.
같은 '결정 건수' 를 claim_stage 와 claim.decision 두 곳에서 세어 보세요. 두 숫자가 갈라지면 그 차이가 아무도 손대지 않고 있는 건입니다.
소요 시간을 네 구간으로 쪼개기
지급까지 간 청구의 구간별 소요 시간을 /root/ins/latency.csv 에 claim_no,assign_h,investigate_h,review_h,pay_h,total_h 로 적으세요.
단계 시각이 모두 정시라서 julianday 차이에 24를 곱하고 반올림하면 정확한 정수 시간이 나옵니다. 지급까지 간 청구만 대상입니다.
평균 뒤에 숨은 꼬리 드러내기
/root/ins/percentile.txt 에 n=, mean_h=, p50_h=, p90_h=, p99_h= 다섯 줄을 적으세요.
백분위수는 최근접 순위법으로 잡습니다 — 오름차순으로 정렬한 뒤 ceil(p × n ÷ 100) 번째 값입니다. 평균은 합을 건수로 나눈 몫만 취하세요.
꼬리의 시간이 어느 구간으로 갔는지 지목하기
total_h 가 p90 이상인 건만 골라 /root/ins/bottleneck.txt 에 tail_n=, tail_total_h=, tail_assign_h=, tail_investigate_h=, tail_review_h=, tail_pay_h=, tail_investigate_pct= 일곱 줄을 적으세요.
total_h 가 p90 이상인 건만 골라 구간별로 합산하세요. 비중은 조사 구간 합계에 100을 곱하고 전체 합계로 나눈 몫입니다.
부지급 사유와 뒤집힌 건 가려내기
부지급 사유 코드별 건수를 /root/ins/denial.csv 에 code,denied,appealed,overturned 로 적고, /root/ins/denial.txt 에 wrongful_denied=, wrongful_claimed_amount=, wrongful_code= 세 줄을 적으세요.
코드별 건수만 보면 고르게 퍼져 보입니다. 이의 제기 건수와 뒤집힌 건수를 같은 줄에 붙여 놓으면 한 코드에 몰려 있는 것이 보입니다.
지연이자를 정수 원으로 계산하기
지급기일을 넘긴 건의 지연이자를 /root/ins/interest.csv 에 claim_no,over_days,paid_amount,interest 로 적으세요.
지급기일은 접수 후 240시간입니다. 지연일수는 (소요 시간 − 240) 을 24로 나눈 몫이고, 이자는 지급액 × 54 × 지연일수 ÷ 365000 의 몫입니다. 나눗셈은 마지막에 한 번만 하세요.
지연과 부당 부지급 보고서 쓰기
/root/ins/claim_report.md 에 ## 확인한 것, ## 지연은 어디서 생기는가, ## 부당 부지급, ## 권고, ## 반출하지 않은 것 다섯 절로 보고서를 쓰세요.
다섯 절이 필요합니다. 마지막 절은 무엇을 보고서에 담지 않았는지를 밝히는 자리입니다. 이 데이터에는 진단 코드가 들어 있습니다.