支払遅延のボトルネックを裾野から探す
目標
支払い遅延の問い合わせを受けたとき、ひとまとめの時間ではなく区間とパーセンタイルに分けて、直す場所を指し示せるようになります。また、不支払いの理由コードから審査ルールの欠陥を読み取れるようになります。
なぜ重要なのか
支払い遅延のダッシュボードが目標値に収まっているのに、苦情が入り続ける状況はよくあります。苦情を入れる人は平均にいる人ではないからです。平均は短い案件が多いから低いのであって、長い案件がないから低いのではありません。
そして遅延を直すには、どの区間が時間を食ったのかまで行く必要があります。「受付から支払いまで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に段階別の件数5行(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=の5行を書いてください。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=の7行を書いてください。- 不支払い理由コード別の件数を
/root/ins/denial.csvにcode,denied,appealed,overturnedとして書き、/root/ins/denial.txtにwrongful_denied=、wrongful_claimed_amount=、wrongful_code=の3行を書いてください。 - 支払期日を過ぎた案件の遅延利息を、
/root/ins/interest.csvにclaim_no,over_days,paid_amount,interestとして書いてください。 /root/ins/claim_report.mdに、## 확인한 것、## 지연은 어디서 생기는가、## 부당 부지급、## 권고、## 반출하지 않은 것の5つの節で報告書を書いてください(見出しは順に、韓国語で「確認したこと」「遅延はどこで生じるのか」「不当な不支払い」「勧告」「持ち出していないもの」を意味する語です)。
参考
- 2つの時刻の整数時間の差は、
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に段階別の件数5行(stage_received= … stage_paid=)とledger_decided=、gap=を書き、元帳に載っていない案件を/root/ins/funnel_gap.csvにclaim_no,decided_tsとして残してください。
同じ「決定件数」を、claim_stageとclaim.decisionの2か所で数えてみてください。2つの数字が分かれたら、その差が誰も手を付けていない案件です。
所要時間を4つの区間に分ける
支払いまで進んだ請求の区間別の所要時間を、/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=の5行を書いてください。
パーセンタイルは最近接順位法で求めます。昇順に並べたあとの、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=の7行を書いてください。
total_hがp90以上の案件だけを選び、区間別に合算してください。割合は、調査区間の合計に100を掛け、全体の合計で割った商です。
不支払いの理由と覆った案件を見分ける
不支払い理由コード別の件数を/root/ins/denial.csvにcode,denied,appealed,overturnedとして書き、/root/ins/denial.txtにwrongful_denied=、wrongful_claimed_amount=、wrongful_code=の3行を書いてください。
コード別の件数だけを見ると、均等に広がっているように見えます。異議申立ての件数と覆った件数を同じ行に並べると、1つのコードに集中しているのが見えます。
遅延利息を整数のウォンで計算する
支払期日を過ぎた案件の遅延利息を、/root/ins/interest.csvにclaim_no,over_days,paid_amount,interestとして書いてください。
支払期日は受付後240時間です。遅延日数は(所要時間 − 240)を24で割った商で、利息は支払額 × 54 × 遅延日数 ÷ 365000の商です。割り算は最後に1回だけ行ってください。
遅延と不当な不支払いの報告書を書く
/root/ins/claim_report.mdに、## 확인한 것、## 지연은 어디서 생기는가、## 부당 부지급、## 권고、## 반출하지 않은 것の5つの節で報告書を書いてください(見出しは順に、韓国語で「確認したこと」「遅延はどこで生じるのか」「不当な不支払い」「勧告」「持ち出していないもの」を意味する語です)。
5つの節が必要です。最後の節は、何を報告書に載せていないかを明らかにする場所です。このデータには診断コードが含まれています。