財務部が取引先ごとの入金の履歴から Python で翌月の入金の遅れの兆しを予測し、金額と確率で並べた確認の優先度の一覧を出す
翌月に支払期日が来る請求ごとに、取引先の入金の履歴から期日を過ぎて入金される確率を出します。確率に請求額を掛けた順に並べ、兆しの理由の印を付けた確認の優先度の一覧にして、財務部の担当者に渡します。
- 連携・自動化
- Python
- 対象業界
- 商社/物流/製造
- 対象部門
- 経理/財務
- 対象業務
- 内容確認・チェック/集計・分析
- 主な課題
- 判断に時間がかかる/属人化している/期限・対応漏れが起きる
- AIで行う処理
- 予測
- 主な効果
- 判断支援/工数削減/機会損失防止
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 月の中ごろに、翌月に期日が来る請求の一覧を会計システムから書き出す
- 取引先ごとに、直近6か月の入金の日付と期日を並べ、遅れの日数を目で見る
- 一部入金、支払日の変更の連絡、振込の名義の変化がなかったかを、消込のメモと営業の連絡で確かめる
- 遅れが続いている、または増えていると思う取引先に印を付ける
- 印を付けた取引先を請求額の大きい順に並べ、営業の担当に事前の確認を頼む
- 期日のあとに、入金が無かった請求の一覧を作って営業に回す
- 自動毎月15日の夜、会計システムと販売管理システムから、請求・入金・消込・仮受金・出荷の記録を書き出す
- 自動仮受金の記録を請求と突き合わせ、消込が遅れただけの入金を見分けて、請求ごとの「本当の入金日」を作る
- 自動取引先の台帳の休日の扱いで、期日を営業日に直し、請求ごとの遅れの営業日数を作る
- 自動翌月に期日が来る請求ごとに、期日を5営業日以上過ぎて入金される確率を出し、較正する
- 自動確率 × 請求額で並べ、兆しの理由の印(遅れの伸び、一部入金、支払日の変更の連絡、名義の変化)を付ける
- 人担当者が一覧の上から見て、営業に事前の確認を頼む先を決める
- 人営業から返ってきた事情を一覧に書き込む
各工程の詳しい説明を読む
- 月の中ごろに、翌月に期日が来る請求の一覧を会計システムから書き出す
- 取引先ごとに、直近6か月の入金の日付と期日を並べ、遅れの日数を目で見る
- 一部入金、支払日の変更の連絡、振込の名義の変化がなかったかを、消込のメモと営業の連絡で確かめる
- 遅れが続いている、または増えていると思う取引先に印を付ける
- 印を付けた取引先を請求額の大きい順に並べ、営業の担当に事前の確認を頼む
- 期日のあとに、入金が無かった請求の一覧を作って営業に回す
(a)遅れと消込の失敗が混ざっている。 2番目の「遅れの日数」は、消込の日付から出しています。名義違いの入金が仮受金に入ったまま何日か置かれると、その間は「遅れ」に見えます。 担当者は消込のメモで見分けていますが、メモの書き方は人によってばらばらです。
(b)休日の扱いで遅れに見える。 期日が土日や祝日に当たったとき、前の営業日に払う取引先と、次の営業日に払う取引先があります。後者を暦の日数で数えると、毎回1〜3日の遅れに見えます。 取引先の台帳に休日の扱いの列はありますが、目で見るときに毎回は確かめていません。
(c)どこから確かめるかが勘で決まる。 600社を全部見る時間は無いので、担当者は気になる取引先から見ます。見ていない取引先の小さな変化は、期日のあとまで誰も気づきません。
(d)理由が残らない。 営業に確認を頼んだ理由は口頭か短いメールで伝え、なぜその取引先を選んだかの記録が残りません。 担当者が替わると、どの取引先を見張っていたかも引き継がれません。
- 【自動】 毎月15日の夜、会計システムと販売管理システムから、請求・入金・消込・仮受金・出荷の記録を書き出す
- 【自動】 仮受金の記録を請求と突き合わせ、消込が遅れただけの入金を見分けて、請求ごとの「本当の入金日」を作る
- 【自動】 取引先の台帳の休日の扱いで、期日を営業日に直し、請求ごとの遅れの営業日数を作る
- 【自動】 翌月に期日が来る請求ごとに、期日を5営業日以上過ぎて入金される確率を出し、較正する
- 【自動】 確率 × 請求額で並べ、兆しの理由の印(遅れの伸び、一部入金、支払日の変更の連絡、名義の変化)を付ける
- 【人】 担当者が一覧の上から見て、営業に事前の確認を頼む先を決める
- 【人】 営業から返ってきた事情を一覧に書き込む
6番目で、担当者は600社を自分で並べる代わりに、並んだ一覧の上から理由を確かめます。 一覧の下の方は流し見で済ませます。時間を使うのは、確率と金額の両方が大きい先と、理由の印が新しく付いた先です。
取引先への連絡を自動にしないのは、意図してのことです。 期日の前に「お支払いは大丈夫でしょうか」と聞くこと自体が、取引先との関係に響きます。聞くかどうか、誰がどう聞くかは、営業の担当が取引先の事情を見て決めます。
02今回想定するシステム構成
会計システム(請求・入金・消込・仮受金) 販売管理システム(受注・出荷・与信の限度額)/取引先の台帳(支払条件・休日の扱い・名義の別名) │ ▼【トリガー】毎月15日 22時(翌月に期日が来る請求の分) Python(pandas) ├──▶ 仮受金と請求を突き合わせ、本当の入金日を作る ├──▶ 休日の扱いで期日を営業日に直し、遅れの営業日数を作る ├──▶ 取引先ごとの履歴の項目を作る ▼ scikit-learn(HistGradientBoostingClassifier → CalibratedClassifierCV(FrozenEstimator)) │ 請求ごとの「5営業日以上の遅れ」の較正した確率 ▼ Python ── 確率 × 請求額で並べる、兆しの理由の印、前月からの動き ▼ 【担当者が理由を確かめ、営業に事前の確認を頼む先を決める】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(pandas・scikit-learn) | R |
| 処理エンジン | scikit-learn の HistGradientBoostingClassifier と CalibratedClassifierCV | LightGBM、LogisticRegression(係数で説明したい場合) |
| 集計 | Python(本当の入金日の作成、営業日での遅れの数え方、金額を掛けた並べ替え、印付け) | 会計システムの帳票 |
| データの取得元 | 会計システムと販売管理システムの書き出し、取引先の台帳 | 銀行の入金明細の書き出し |
| 結果の出力先 | 財務部の共有フォルダの確認の一覧 | 担当者への通知 |
会計システムと販売管理システムには、何も書き込みません。 書き出した記録を読むだけです。与信の限度額を下げる、出荷を止める、といった処理を一覧から自動で掛ける作りにはしません。 それは与信の管理の規程に沿って、決裁を経て行うことです。
土台になるのは、scikit-learn の HistGradientBoostingClassifier です。 損失は log_loss で、2値の分類では確率を返します。欠けた値(NaN)をそのまま扱えるので、取引を始めて間もなく、直近6か月の遅れの記録が揃わない取引先も、項目を捨てずに入れられます。取引先の業種や支払の方法のような区分は、pandas の Categorical の型にしておけば、既定の categorical_features="from_dtype" で区分として扱われます。
遅れる請求は全体の数%なので、偏りをならす必要があります。 class_weight="balanced" を使うと、クラスの数に反比例する重みで学ばせます。ただし、重みを掛けて学ばせた確率は、実際の遅れの割合より高く出ます。 金額を掛けるなら、そのままでは使えません。
そこで、CalibratedClassifierCV で確率を較正します。 学ばせ済みのモデルを FrozenEstimator で包んで渡すと、fit に渡した記録はすべて較正だけに使われるので、学ばせる記録と較正の記録を自分で分けておきます。方法は sigmoid(Platt の方法)にします。公式ページでは、isotonic は較正の記録が1,000件よりずっと少ないときは過学習しやすいので勧められないとされ、偏りの大きい記録では切片を持つ sigmoid が向く場合があるとされています。
どの項目が全体として効いているかは、permutation_importance で確かめます。 1つの項目の列をかき混ぜて、指標がどれだけ下がるかで重要さを測る方法で、既定では5回くり返します。これは全体の傾向を見る道具で、1社ずつの理由を説明するものではありません。 1社ずつの理由は、第7章の決まった計算の印で示します。
03どうやって実装するのか
処理の起点を決める
毎月15日の22時に動かします。 月の前半の入金の消込が終わり、翌月に期日の来る請求が出そろった時点です。翌月末の期日まで2週間以上あるので、営業が取引先に事情を確かめる時間が残ります。 締め日と支払日が自社と違う場合は、翌月の期日の2週間前になるよう日を決めます。
月末の期日の5営業日後にも、もう一度動かします。 こちらは予測ではなく、実際に入金が無かった請求と、15日の一覧で順位が低かったのに遅れた請求を並べるためです。外れた先を見ることが、次の月の項目と基準を直す材料になります。
消込の作業が終わっていない日は、動かしません。 消込の途中で書き出すと、まだ消し込んでいない入金がすべて「未入金」に見え、履歴の項目が一斉に悪く出ます。 消込の担当が「当日分の消込を終えた」と記録してから書き出します。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 請求 | 請求番号、取引先コード、請求日、支払期日、請求額 | 会計システム |
| 入金と消込 | 入金日、入金額、振込の名義、消し込んだ請求番号、消込の日 | 会計システム |
| 仮受金 | 入金日、入金額、振込の名義、仮受金に置いた理由、後で消し込んだ請求番号 | 会計システム |
| 取引先の台帳 | 支払条件、支払日、期日が休日のときの扱い(前の営業日・次の営業日)、名義の別名、親会社 | 取引先の台帳 |
| 出荷と受注 | 月ごとの出荷額、受注残 | 販売管理システム |
| 与信 | 与信の限度額、限度額に対する売掛金の割合 | 販売管理システム |
| 連絡の記録 | 支払日の変更・支払の方法の変更・分割の依頼の連絡の日と中身 | 財務部の連絡の記録の表 |
質を決めるのは、仮受金の記録です。 名義違いや手数料引きで消し込めなかった入金が、いつ入っていて、後でどの請求に消し込んだかが残っていれば、本当の入金日を作れます。後で消し込んだ請求番号が空のまま残っている仮受金は、担当者に回して結びつけてもらいます。
休日の扱いの列は、空の取引先を無くします。 空のままだと、期日が休日に当たった月だけ遅れが出て、毎年同じ月に「兆し」が出る取引先ができます。 分からない取引先は、過去の入金で休日に当たった月の入金日を見て、前か後かを埋めます。
連絡の記録は、財務部と営業が受けた連絡を1つの表に集めます。 支払日を変えたい、支払の方法を変えたい、分けて払いたいという連絡は、遅れの前ぶれとしていちばん分かりやすい記録です。 メールや電話のままでは読めないので、日付と区分だけでも表に書きます。
データの取得方法を決める
会計システムからは、請求・入金・消込・仮受金を、決まった列の並びで書き出す設定を作ります。過去の記録は、最初に3年分をまとめて書き出し、その後は毎月の差分を足します。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 請求と期日 | 会計システムの書き出し | 予測の対象、遅れの数え方の起点 |
| 入金・消込 | 同上 | 本当の入金日 |
| 仮受金と後の消込 | 同上 | 消込が遅れただけの入金の見分け |
| 休日の扱い・名義の別名 | 取引先の台帳 | 営業日での期日、名義の突き合わせ |
| 出荷・受注残・与信 | 販売管理システムの書き出し | 取引の大きさの変化 |
| 連絡の区分と日 | 連絡の記録の表 | 前ぶれの印 |
営業日の数え方には、銀行の休業日の表を使います。 土日と祝日、年末年始の休業日を1つの表にして、期日と入金日の間の営業日の数を数えます。表は年に1回、翌年分を足します。
名義の別名は、仮受金の突き合わせで増やしていきます。 担当者が仮受金を請求に結びつけたとき、その振込の名義を取引先の台帳の別名に足します。別名が増えるほど、翌月から仮受金に置かれる入金が減ります。
AIへ渡す前に整形する
- 本当の入金日を作る … 消込済みの請求は消込のもとの入金日を、仮受金から後で消し込んだ請求は仮受金に入った日を入金日にします
- 期日を営業日に直す … 期日が休日のときは、取引先の休日の扱いで前か次の営業日に動かします
- 遅れを数える … 本当の入金日と直した期日の間の営業日の数を、請求ごとの遅れにします。一部入金の請求は、全額がそろった日で数えます
- 正解を作る … 遅れが5営業日以上の請求を「遅れた」(1)、それ以外を0にします
- 履歴の項目を作る … 取引先ごとに、直近3回・6回の遅れの平均と最大、遅れの伸び(直近3回の平均 − その前の3回の平均)、一部入金の回数、仮受金に置かれた回数、名義が変わった回数
- 取引の項目を作る … 請求額の、取引先の過去12か月の平均に対する比、出荷額の前年同月比、受注残、与信の限度額に対する売掛金の割合、支払の方法、業種
- 連絡の項目を作る … 直近3か月の支払日の変更・方法の変更・分割の依頼の有無
1番目がこの構成の土台です。 第3章の(a)のとおり、消込の日付で数えると、仮受金に置かれていた日数がそのまま遅れになります。仮受金に入った日を入金日にすれば、取引先は期日どおりに払っていたことになります。
4番目で「5営業日以上」にするのは、1〜2日のずれを拾わないためです。 振込の締めの時刻や、取引先の経理の都合で1日ずれることは珍しくありません。どの日数を遅れとするかは、財務部と営業で決めて、規程に合わせます。
AIに処理させる
させるのは、翌月に期日が来る請求ごとに「5営業日以上遅れて入金される確率」を出すことだけです。 並べ替え、理由の印、営業への依頼の判断は、決まった計算と人で行います。
| 見るもの | 使うもの | 判断できないときの扱い |
|---|---|---|
| 遅れる確率(較正済み) | 第7章の前処理の5〜7番目の項目 | 取引を始めて6か月未満なら new_customer |
| 確かめる順 | 確率 × 請求額(決まった計算) | 請求額が与信の限度額を超えていれば over_limit を必ず上に置く |
| 兆しの理由 | 決まった条件の印(下の表) | 印が無く確率だけが高ければ model_only |
| 印 | 条件 |
|---|---|
delay_trend | 遅れの伸びが3営業日以上 |
partial | 直近6回のうち一部入金が2回以上 |
contact | 直近3か月に支払日の変更・方法の変更・分割の依頼の連絡がある |
name_change | 直近3か月に振込の名義が変わった |
order_jump | 請求額が過去12か月の平均の2倍以上 |
理由の印を、モデルの中身から作らないのは、1社ずつの説明に使えないからです。 permutation_importance は全体としてどの項目が効いているかを示しますが、この取引先の確率が高い理由を教えてはくれません。 印は担当者が読んで確かめられる事実だけで作り、印の無いまま確率だけが高い先は model_only として、担当者が履歴を開いて確かめます。
| させないこと | 理由 |
|---|---|
| 与信の限度額の変更・出荷の停止 | 与信の管理の規程と決裁で決める |
| 取引先への連絡・督促 | 取引先との関係に響く。営業が事情を見て決める |
| 取引先の信用の評価の結論 | 決算や外部の情報も見て、与信の担当が判断する |
| 仮受金を請求に結びつける推測 | 名義と金額が合わないものは人が結びつける |
| 遅れの定義(何営業日から遅れか)の変更 | 財務部と営業で決める |
4行目を守らないと、正解がゆがみます。 金額が近いからと仮受金を請求に機械で結びつけると、別の取引先の入金を消し込んだことになり、その取引先の遅れが消えます。 結びつけは人が行い、結びつけた記録だけを本当の入金日に使います。
指示内容を固定する
この構成は生成AIを使わないので、プロンプトの代わりに、モデルの設定と計算の規則を書いておきます。
【正解】
- y = 1 … 本当の入金日が、営業日に直した期日から5営業日以上後(一部入金は全額がそろった日)
- y = 0 … それ以外
- 学ばせる請求 = 期日が過去3年以内で、本当の入金日が確定したもの
- 仮受金に入ったまま請求に結びついていない入金のある取引先の請求は、学ばせる記録から外す
【モデル】
- HistGradientBoostingClassifier(loss="log_loss", class_weight="balanced",
early_stopping="auto", random_state=0)
・業種、支払の方法は pandas の Categorical にする
- 記録の分け方(期日の順)
・学ばせる = 期日が古い方から 30か月
・較正 = 次の 3か月
・確かめ = 直近の 3か月
- 較正 = CalibratedClassifierCV(FrozenEstimator(学ばせたモデル), method="sigmoid")
・fit には「較正」の3か月だけを渡す
- 確かめ = 直近3か月で、確率を10の帯に分け、帯ごとの予測の平均と実際の遅れの割合を比べる
- 学ばせ直しは四半期に1回。permutation_importance(n_repeats=5) を「確かめ」の3か月で測り、
前回から順位が大きく動いた項目を記録する
【並べ方】
- priority = 較正した確率 × 請求額
- over_limit の請求は priority にかかわらず一覧の先頭に置く
- 同じ取引先に複数の請求があれば、取引先ごとに priority を合計して並べる
【印】
- delay_trend / partial / contact / name_change / order_jump … 上の表の条件
- new_customer … 取引の開始から6か月未満(確率は出すが、印として必ず付ける)
- model_only … 確率が上位10%で、上の5つの印がどれも無い
記録を期日の順に分けるのは、未来の記録で学ばせないためです。 入金の遅れは、景気や業界の動きで時期ごとに増えたり減ったりします。ばらばらに混ぜて分けると、確かめの当たり方が良く出すぎます。 学ばせる・較正・確かめの3つを期日の順に並べ、使うときと同じ条件で確かめます。
較正の3か月を別に取るのは、FrozenEstimator で包んだモデルは fit に渡した記録をすべて較正に使うからです。 学ばせた記録で較正すると、学ばせた記録に当てはまりすぎた確率をそのまま信じることになります。
出力形式を固定する
請求ごとに、次の形のJSONを作り、取引先ごとにまとめた表にして共有フォルダに置きます。
{
"invoice_no": "",
"customer_code": "",
"due_date": "",
"due_date_business": "",
"amount": 0,
"proba_late": 0.0,
"priority": 0,
"flags": ["delay_trend | partial | contact | name_change | order_jump | new_customer | model_only | over_limit"],
"history": { "delay_avg_last3": 0, "delay_avg_prev3": 0, "partial_count_6": 0, "suspense_count_6": 0 },
"rank_last_month": 0,
"model_version": "",
"review": { "asked_sales": false, "sales_note": "", "by": "", "decided_at": "" },
"actual": { "paid_date": "", "delay_business_days": null }
}
1つ目の理由は、history に印のもとの数を残すことです。 担当者は、delay_trend が付いた理由を、直近3回とその前の3回の遅れの平均で確かめられます。会計システムを開かずに、一覧の上で「本当に伸びているか」が分かります。
2つ目は、rank_last_month で前月からの動きが分かることです。 先月は下の方にいた取引先が急に上がってきたら、確率が上がったのか、請求額が増えたのかを分けて見ます。 金額が増えただけなら、取引が増えたという良い知らせのこともあります。
3つ目は、review と actual を同じ行に残すことです。 営業に確かめてもらった先が、実際に遅れたかどうかが後から並びます。確かめたことで遅れが防げたのか、確かめなくても期日どおりだったのかは、この2つを並べ続けて初めて見えてきます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 会計システム | 毎月の書き出しの受け取り | 請求・入金・消込・仮受金 |
| 販売管理システム | 毎月の書き出しの受け取り | 出荷額、受注残、与信の限度額 |
| 取引先の台帳 | 表の読み込み | 支払条件、休日の扱い、名義の別名 |
| 連絡の記録の表 | 表の読み込み | 支払日の変更などの連絡の区分と日 |
| 確認の優先度の一覧 | 共有フォルダへの書き出し | 取引先ごとの確率・金額・印 |
| 担当者への通知 | 社内の連絡の場 | 一覧の場所と、over_limit・新しく上位に入った先の件数 |
通知には、取引先の名前と金額を流しません。 流すのは一覧の場所と件数だけです。どの取引先が遅れそうかという情報は、営業の現場に広く出回ると、取引先への態度に出ます。 営業への依頼は、担当者がその取引先の営業の担当だけに伝えます。
営業から返ってきた事情は、一覧の review の欄に担当者が書き込みます。 営業が直接書き込む作りにはしません。一覧を見られる人を財務部に限っておくためです。
人が確認する
担当者が見るのは、一覧の上から50社ほどと、印の付いた先です。 下の方の取引先は、印が無ければ流し見で済ませます。全社を前の方法で見直す運用にすると、第10章の20.0時間には収まりません。
over_limitを先に見る … 与信の限度額を超える請求です。確率にかかわらず、与信の担当と相談します- 上位の先の印を読む …
delay_trendとcontactが付いた先は、営業に事前の確認を頼む候補です model_onlyの先の履歴を開く … 印が無いのに確率が高い先です。履歴を見て理由が分からなければ、頼まずに翌月まで様子を見ますnew_customerを見る … 取引の始まったばかりの先は、履歴が短く確率がぶれます。営業の担当に取引の様子を聞きます- 依頼したかと事情を書く …
reviewに残します
3番目で、理由の分からない先に連絡を頼まないのは、意図してのことです。 モデルが高い確率を出しても、担当者が事実で確かめられない理由で取引先に事情を聞けば、まじめに払っている取引先に不快な思いをさせます。 事実の印が付いた先から頼みます。
財務部の課長は、四半期に1回、一覧の上位と実際の遅れを並べて見ます。 確率の帯ごとの実際の遅れの割合がずれてきたら、学ばせ直しの時期を早めます。
例外に対処する
| 起きること | 対応 |
|---|---|
| 消込が終わっていない | 書き出さず、消込の担当の記録を待つ |
| 仮受金が請求に結びついていない | その取引先の請求を学ばせる記録から外し、担当者に結びつけを頼む |
| 休日の扱いが空の取引先 | 過去の休日に当たった月の入金日から前か後かを埋め、埋めたことを印にする |
| 取引先の合併・社名の変更 | 新旧の取引先コードを台帳で結び、履歴を引き継ぐ |
| 支払条件を変えた(サイトの延長・でんさいへの切替) | 変えた月から項目を立て、3か月は印 contact を残す |
| 相殺や値引きで請求額と入金額が合わない | 相殺・値引きの記録で差を説明できれば全額がそろったものとし、できなければ担当者に回す |
| 期日の前に全額が入った | 遅れ0として扱い、一覧から外す |
| 取引先が倒産・法的な手続きに入った | 一覧から外し、与信の担当と法務の対応に移す |
上から2行目は、最初の数か月に多く出ます。 仮受金を請求に結びつけたまま記録を残さない運用だった場合、過去の仮受金の多くが宙に浮いています。 一度にすべてを結びつけるのは重いので、請求額の大きい取引先から順に結びつけ、結びついた取引先から学ばせる記録に入れます。
最後の行の取引先は、予測の対象ではなくなります。 法的な手続きに入った先への対応は、債権の届出や回収の手続きで、この一覧で扱うものではありません。
記録を残す
- 書き出した記録の件数、仮受金の結びつけの状態、休日の扱いを埋めた取引先
- 請求ごとの較正した確率、priority、印、前月の順位
- 担当者が営業に頼んだかと、営業から返ってきた事情(
review) - 実際の入金日と遅れの営業日数(
actual) - モデルの版、学ばせた・較正した・確かめた期間、帯ごとの予測と実際の遅れの割合
- 四半期ごとの permutation_importance の結果
4つ目の実際の入金日は、翌月の期日の5営業日後の実行で書き込みます。 予測と実際が同じ行に並ぶので、確率が高かったのに期日どおりだった先、低かったのに遅れた先を毎月数えられます。後者が続く業種や支払の方法があれば、項目を足す場所です。
04実装レベルの3段階
最小構成は、確かめるための段階です。 毎月の作業は減りません。 半自動化で、取引先ごとに入金の日付を並べて遅れを見る時間は無くなります。 ただし、印の付いた先のどれから見るかは、担当者が金額を見て決めることになります。本格構成で、担当者は並んだ一覧の上から理由を確かめるだけになり、この段階が本記事の想定です。 差が大きいのは、600社の中から先に見る先を選ぶ作業が、印だけでは決まらないからです。 段階を飛ばさないでください。 半自動化の印の一覧を半年使うと、どの印が実際の遅れにつながったかが先に分かります。それを見てから確率を足すほうが、担当者が一覧の並びを信じられます。
05工数削減シミュレーション
導入後 600件 × 2分 ÷ 60 = 20 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 掛けで売る取引先が数百社あり、毎月の入金の消込のあとに、期日どおりに入らなかった先を財務部が洗い出して営業に確かめてもらっている商社・メーカー・物流会社。入金の遅れに気づくのが期日を過ぎてからで、遅れが続く先への手当てが後手になっている場合。過去2年以上の請求と入金と消込の記録が会計システムに残っている場合。
- 取引先が数十社で、担当者が全社の入金の様子を把握している場合。取引の大半が前払いか現金で、掛けの売上が少ない場合。消込が月末にまとめて手で行われ、入金の日付が請求と結びついて残っていない場合。なお、与信の限度額の変更、取引の停止、督促と法的な手続きの判断は、この構成では代替できません。
07最小構成で試す方法
- 会計システムから、過去2年分の請求・入金・消込・仮受金を書き出す
- 表計算で、仮受金から後で消し込んだ請求に、仮受金に入った日を入金日として書き入れる
- 取引先の台帳の休日の扱いで期日を直し、請求ごとの遅れの営業日数を出す
- 消込の日で数えた遅れと、3番目の遅れを並べ、遅れの件数がどれだけ変わるかを数える
- 過去に実際に遅れが続いた取引先10社について、遅れが始まる前の6か月に、一部入金・遅れの伸び・連絡があったかを見る
4番目を、必ず数えてください。 消込の日で数えた遅れの何割が、仮受金と休日の扱いによる見かけの遅れだったかが分かると、いまの「遅れがちな取引先」の見方が、どれだけ消込の都合で決まっていたかが分かります。
| 出てきた内容 | 判断 |
|---|---|
| 見かけの遅れを除いても遅れる先が残り、5番目で前ぶれが見える | Python で HistGradientBoostingClassifier の確率に進む |
| 仮受金の後の消込の請求番号が残っていない | 仮受金の結びつけの記録の残し方を直すのが先 |
| 遅れる請求が年に数件しかない | 予測より、第7章の印の条件だけを毎月出すほうが合う |
3行目のときは、無理に予測を作らないでください。 遅れる請求が少なすぎると、確率の較正ができません。印の条件だけで一覧を作るほうが、担当者にとっても読みやすい一覧になります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 消込の日で遅れを数え、仮受金の日数が遅れになる | 仮受金に入った日を入金日にする |
| 休日の扱いを見ず、毎年同じ月に遅れが出る | 取引先の台帳の休日の扱いで期日を営業日に直す |
| 重みを掛けた確率に金額を掛ける | CalibratedClassifierCV で較正してから掛ける |
| 学ばせた記録で較正する | 較正の3か月を別に取り、FrozenEstimator で包む |
| 記録をばらばらに混ぜて確かめる | 期日の順に学ばせる・較正・確かめを分ける |
較正の記録が少ないのに isotonic を使う | sigmoid にする |
| permutation_importance で1社ずつの理由を説明する | 1社ずつの理由は事実の印で示す |
| 仮受金を金額だけで請求に機械で結びつける | 結びつけは人が行う |
| 消込の途中で書き出す | 消込の担当の記録を待つ |
| 理由の分からない先に連絡を頼む | 事実の印が付いた先から頼む |
上の2行が、この構成の外れのほとんどです。 どちらも「本当に遅れたのか」を正しく数えられているかの問題で、モデルを凝らすより、仮受金の結びつけと休日の扱いをそろえるほうが効きます。
3行目と4行目は、並びの意味を壊します。 較正していない確率に金額を掛けると、遅れの少ない業種の大口の取引先が、上に並びすぎます。 帯ごとの予測と実際の遅れの割合を毎回並べ、ずれていないかを見てください。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 取引先ごとの請求額、入金日と入金額、振込の名義、与信の限度額、支払条件の変更の連絡です。取引先の多くは法人ですが、個人事業主の取引先では、振込の名義が個人の氏名になります。
- 一覧を見られる人を財務部に限る … どの取引先が遅れそうかという情報は、営業の現場に広く出回ると、取引先への態度に出ます。 営業には、その取引先の担当にだけ伝えます
- 確率を取引先に伝えない … 営業が事情を聞くときも、「遅れる確率が高いと出た」とは言いません。 聞くのは事実(支払日の変更の連絡の後の様子など)だけです
- 外部の生成AIのサービスに入金の記録を貼り付けない … 予測は社内の環境で動かします
- 与信と取引の判断に一覧を直接つながない … 限度額の変更、出荷の停止は、与信の管理の規程に沿って決裁を経て行います
- 振込の名義の個人の氏名を、一覧に出さない … 一覧には取引先コードと台帳の名前だけを出し、振込の名義は担当者が会計システムで確かめます
誤りが起きた場合のリスクは、遅れる先を下に並べて見落とすことと、まじめに払っている先を上に並べて事情を聞いてしまうことの2つです。 前者は較正のずれや、新しい取引先の履歴の短さで起き、後者は仮受金と休日の扱いによる見かけの遅れで起きます。後者は取引先との関係を傷つけるので、事実の印が無い先には連絡を頼まないと決めておきます。
10まず何から始めるか
1週目:見かけの遅れを数える
第8章の手順で、過去2年の請求の遅れを、消込の日で数えた場合と本当の入金日で数えた場合で並べます。見かけの遅れの割合を、財務部の課長と営業の部長に見せてください。
2週目:仮受金を結びつけ、休日の扱いを埋める
請求額の大きい取引先から順に、過去の仮受金を請求に結びつけ、取引先の台帳の休日の扱いの空を埋めます。ここが終わった取引先から、学ばせる記録に入れられます。
3週目:遅れの定義と印の条件を決める
何営業日から遅れとするか、印の条件(遅れの伸び・一部入金・連絡など)を、財務部と営業で決めます。連絡の記録の表の書き方もこのときに決めます。
4週目:印の一覧を出す
Python で毎月の本当の入金日・営業日の遅れ・印を作り、印の付いた先の一覧を出すところまで組みます。この時点では確率を出さず、印の一覧を担当者に使ってもらいます。
2か月目以降: HistGradientBoostingClassifier の較正した確率と、確率 × 請求額の並べ替えを足します。一覧と実際の遅れを毎月並べて外れ方を数え、 1件5分が何分になったかを実測します。担当者が替わっても、一覧の上から理由を確かめれば同じ先を見張れるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
損失が log_loss で確率を返すこと。欠けた値(NaN)をそのまま扱えること。categorical_features の既定が from_dtype であること。class_weight="balanced" がクラスの数に反比例する重みを掛けること。early_stopping="auto" が記録が10,000件を超えるときに有効になること | scikit-learn: HistGradientBoostingClassifier | 2026-10-27 |
sigmoid(Platt の方法)・isotonic・temperature で確率を較正すること。isotonic は較正の記録が1,000件よりずっと少ないときは過学習しやすく勧められないこと。偏りの大きい記録では sigmoid が向く場合があること。学ばせ済みのモデルを FrozenEstimator で包むと fit の記録がすべて較正に使われ、学ばせる記録と較正の記録を自分で分ける必要があること | scikit-learn: CalibratedClassifierCV | 2026-10-27 |
項目の列をかき混ぜたときの指標の下がり方で重要さを測ること。n_repeats の既定が5であること | scikit-learn: permutation_importance | 2026-10-27 |
遅れの定義(何営業日からか)、与信の限度額の変更、取引先への連絡の仕方は、自社の与信の管理の規程に沿って財務部と営業で決めてください。 本記事は上記の公開資料で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-2068)についてのご相談はこちらから。
