部品ごとの発注・納期回答・仕入先の遅れの実績から来月に欠品しそうな部品を見込み、確かめる仕入先と代わりの手配の案を購買担当に示す
来月に入荷を予定している部品について、仕入先の過去の遅れ方から「回答の納期より遅れて届く確率」を見込みます。在庫の余裕と合わせて欠品しそうな部品を順に並べ、確かめる仕入先と代わりの手配の案を購買担当に示します。
- 連携・自動化
- Python
- 対象業界
- 商社/建設/製造
- 対象部門
- 生産/購買
- 対象業務
- 比較検討/集計・分析
- 主な課題
- 判断に時間がかかる/属人化している/期限・対応漏れが起きる
- AIで行う処理
- 予測
- 主な効果
- 判断支援/工数削減/機会損失防止
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- 月の半ばに、生産管理システムから来月の所要量と、来月に入荷を予定している発注の一覧を書き出す
- 担当者が、自分の受け持ちの仕入先について、在庫と所要量と発注残を見比べ、余裕の少ない部品に印を付ける
- 印を付けた部品の仕入先について、最近の遅れの有無を入荷の履歴で調べる。履歴をたどらない担当者もいる
- 気になる仕入先へ電話かメールで、回答の納期どおりに出せるかを確かめる
- 遅れそうだと分かった部品について、在庫の融通、別の仕入先からの手配、代わりの部品の使用を検討する
- 検討の結果を一覧にして、生産管理課と組立の段取りを相談する
- 確かめなかった部品のうち、実際に遅れたものは、組立の直前に欠品として分かる
- 自動毎月10日の夜、Python が生産管理システムの書き出しから、来月に入荷を予定している発注の明細と所要量・在庫を読む
- 自動明細ごとに、仕入先・部品・回答の変更の回数・発注から回答までの日数などの特徴を作る
- 自動LightGBM の二値分類のモデルで、明細ごとに「回答の納期より5稼働日以上遅れて届く確率」を見込む
- 自動部品ごとに在庫の余裕(何稼働日遅れたら欠品するか)を計算し、遅れの確率と合わせて欠品のおそれの順に並べる
- 自動上位の部品ごとに、見込みを押し上げた理由の上位3つと、部品マスタにある代わりの手配の候補を添える
- 人購買担当が一覧を見て、確かめる部品を決め、仕入先へ問い合わせる
- 人遅れが分かった部品について、代わりの手配の案から実際の手を選び、生産管理課と相談する
- 自動翌月、実際の入荷の実績で見込みの答え合わせをする
各工程の詳しい説明を読む
- 月の半ばに、生産管理システムから来月の所要量と、来月に入荷を予定している発注の一覧を書き出す
- 担当者が、自分の受け持ちの仕入先について、在庫と所要量と発注残を見比べ、余裕の少ない部品に印を付ける
- 印を付けた部品の仕入先について、最近の遅れの有無を入荷の履歴で調べる。履歴をたどらない担当者もいる
- 気になる仕入先へ電話かメールで、回答の納期どおりに出せるかを確かめる
- 遅れそうだと分かった部品について、在庫の融通、別の仕入先からの手配、代わりの部品の使用を検討する
- 検討の結果を一覧にして、生産管理課と組立の段取りを相談する
- 確かめなかった部品のうち、実際に遅れたものは、組立の直前に欠品として分かる
(a)回答の納期を信じて待つしかない。 回答の日付が入っていれば、システムの上では欠品になりません。遅れやすい仕入先の回答も、ほとんど遅れない仕入先の回答も、同じ重みで扱われています。 欠品の多くは、回答があったのに届かなかった部品です。
(b)確かめる部品の選び方が人に頼っている。 「あの商社は年度末に遅れる」「この協力会社は回答を2回変えてきたら危ない」という勘所は、長く担当している人の頭の中にあります。担当替えがあると、最初の数か月は欠品が増えます。
(c)調べるのに時間がかかり、途中で打ち切られる。 3番目の履歴の調べ方は、発注ごとに入荷の記録を開いて回答の日付と比べるやり方です。240点を毎月調べ切ることはできず、忙しい月から省かれます。
(d)代わりの手配を考える時間が残らない。 欠品が分かったのが組立の数日前だと、別の仕入先も代わりの部品も間に合いません。割増の運賃で急がせるか、組立の順番を変えるかしか手が残らない状態になります。
- 【自動】 毎月10日の夜、Python が生産管理システムの書き出しから、来月に入荷を予定している発注の明細と所要量・在庫を読む
- 【自動】 明細ごとに、仕入先・部品・回答の変更の回数・発注から回答までの日数などの特徴を作る
- 【自動】 LightGBM の二値分類のモデルで、明細ごとに「回答の納期より5稼働日以上遅れて届く確率」を見込む
- 【自動】 部品ごとに在庫の余裕(何稼働日遅れたら欠品するか)を計算し、遅れの確率と合わせて欠品のおそれの順に並べる
- 【自動】 上位の部品ごとに、見込みを押し上げた理由の上位3つと、部品マスタにある代わりの手配の候補を添える
- 【人】 購買担当が一覧を見て、確かめる部品を決め、仕入先へ問い合わせる
- 【人】 遅れが分かった部品について、代わりの手配の案から実際の手を選び、生産管理課と相談する
- 【自動】 翌月、実際の入荷の実績で見込みの答え合わせをする
6番目が、この設計の分かれ目です。 見込みは過去の遅れ方から出したもので、仕入先の工場の火災、物流の止まり、商社の在庫の引き当ての事情は知りません。購買担当は一覧の順位を動かしてよく、動かした理由を残します。問い合わせるかどうかを決めるのは、いつも人です。
4番目で在庫の余裕を別に計算しているのも、意図してのことです。 遅れの確率は仕入先と発注の性質で決まり、欠品になるかどうかは自社の在庫と所要量で決まります。2つを1つのモデルにまとめると、在庫が多い部品の遅れを学ばなくなります。 遅れの見込みはモデル、欠品の判定は決まった計算に分けます。
02今回想定するシステム構成
生産管理システムの夜間の書き出し(毎月10日) │ 発注の明細・納期回答の履歴・入荷の実績・在庫・所要量 ▼【トリガー】定時(毎月10日 22:00) Python ├──▶ 特徴の作成(仕入先/部品区分/回答の変更の回数/ │ 発注から回答までの日数/仕入先の直近の遅れの割合/月末・連休の印) ▼ LightGBM(objective="binary")+ 確率の較正(sigmoid) │ 明細ごとの「5稼働日以上遅れる確率」 ▼ 在庫の余裕の計算 ── 何稼働日遅れたら欠品するか(在庫+先の入荷−所要量) ▼ 欠品のおそれの順位 ── 確率 × 余裕を超える遅れの見込み ├──▶ 理由(pred_contrib の上位3つ) └──▶ 代わりの手配の候補(部品マスタの承認済みの代替品・第二の仕入先・他の倉庫の在庫) ▼ 【購買担当が確かめる部品を決め、仕入先へ問い合わせる】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(pandas・LightGBM の二値分類・scikit-learn の確率の較正) | R、BigQuery ML |
| 集計 | Python(部品ごとの在庫の余裕と欠品のおそれの順位) | 生産管理システムの所要量の計算 |
| データの取得元 | 生産管理システムのCSV出力(発注、納期回答の履歴、入荷、在庫、所要量) | 生産管理システムのデータベースの読み取り専用の口 |
| 結果の出力先 | 購買課の共有フォルダの一覧と、仕入先ごとの確かめる部品の表 | 社内チャットへの通知 |
| 記録 | 購買担当の判断と問い合わせの結果の表 | 生産管理システムの備考の欄 |
生産管理システムには書き込みません。 回答の納期も、発注の内容も、今のまま人が入れます。この構成は見込みを横に並べるだけで、発注を変える権限を持ちません。
見込みには、LightGBM の二値分類を使います。 目的の関数(objective)を binary にすると、0と1のラベルを使った対数損失の分類(ロジスティック回帰)になります。遅れる明細は全体の一部なので、偏りへの手当てとして is_unbalance か scale_pos_weight のどちらかを使いますが、この2つは同時には使えず、どちらか一方を選ぶとされています。
出てきた確率は、そのまま使わずに較正します。 scikit-learn の CalibratedClassifierCV は、isotonic・sigmoid・temperature の方法で分類器の確率を較正するもので、交差検証で元のモデルを学習し、分けておいたデータで較正します。isotonic は較正に使うサンプルが少ない(1000に比べてずっと少ない)と過学習しやすく勧められないとされ、偏りの大きいデータでは sigmoid が向く場合があるとも書かれています。仕入先ごとの遅れの件数は多くないので、sigmoid を選びます。
理由の表示には、LightGBM の pred_contrib を使います。 予測のときに特徴ごとの寄与を返す指定で、SHAP の値に相当する行列に最後の列として期待値が付く形で返ります。明細ごとに寄与の大きい特徴を上から3つ取り出し、言葉に置き換えて一覧に出します。
生成AIは使いません。 見込みも理由も数字と決まった言い回しで出します。欠品のおそれを文章で考えさせると、もっともらしい理由が根拠なく付きます。
03どうやって実装するのか
処理の起点を決める
毎月10日の夜に、来月分をまとめて見込みます。 来月の所要量は月の前半に確定し、仕入先の納期回答も、来月の入荷分はこのころまでにおおむね出そろいます。10日に出せば、確かめて代わりの手配を考える時間が3週間ほど残ります。 これより遅いと、別の仕入先からの取り寄せが間に合わない部品が増えます。
月の後半にもう一度、変わった明細だけを見込み直します。 毎月25日の夜に、10日から後に納期回答が変わった明細と、所要量が増えた部品だけを対象にします。回答の変更そのものが、遅れの強い兆しだからです。 全件をやり直すと一覧の順位が大きく動き、購買担当がどこまで確かめたかが分からなくなります。
毎月の初めに、前の月に入荷を予定していた明細で答え合わせをします。 見込んだ確率と実際に遅れたかどうかを並べ、確率の帯ごとの実際の遅れの割合を出します。モデルの学び直しは四半期に一度と、仕入先が大きく入れ替わったときにします。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 発注の明細 | 発注番号、部品番号、仕入先、数量、発注日、希望の納期 | 生産管理システム |
| 納期回答の履歴 | 明細ごとの回答の日付と、回答を受けた日。回答が変わるたびの履歴 | 生産管理システムの変更の履歴 |
| 入荷の実績 | 明細ごとの入荷日と入荷の数量、分けて届いた回数 | 生産管理システム |
| 在庫と所要量 | 部品ごとの現在の在庫、来月の日ごとの所要量、安全在庫 | 生産管理システムの所要量の計算 |
| 部品マスタ | 部品区分、承認済みの代替品、第二の仕入先、他の倉庫に置いているか | 生産管理システムの部品マスタ |
| 稼働日のカレンダー | 自社の稼働日と、仕入先の大型連休 | 購買課が持つ表 |
質を決めるのは、納期回答の履歴です。 最後の回答の日付しか残っていなければ、「回答を2回変えてきた」という一番強い兆しが使えません。生産管理システムが回答の上書きの履歴を持っていない場合は、回答を入れるたびに別の表へ1行ずつ残す運用から始めます。 半年分たまれば、学習に使えます。
部品マスタの代替品と第二の仕入先も外せません。 代わりの手配の案はここから作ります。マスタに無い代替品をこの構成が考え出すことはありません。 品質保証の承認を経ていない部品を候補に出さないためです。
データの取得方法を決める
生産管理システムからは、毎晩CSVで書き出したものを読みます。 読み取り専用のデータベースの口があればそちらでも構いませんが、本番のデータベースへ直接つなぐのは避けます。 毎月10日と25日の夜に動くので、その日の夜の書き出しが終わってから始めます。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 過去2年分の発注の明細と入荷の実績 | 生産管理システムのCSV | 学習のデータ(5稼働日以上遅れたかどうか) |
| 納期回答の変更の履歴 | 変更の履歴のCSV、または回答の記録の表 | 回答の変更の回数・最初の回答からのずれの特徴 |
| 来月に入荷を予定している明細 | 生産管理システムのCSV | 見込む対象 |
| 在庫・所要量・安全在庫 | 所要量の計算の結果のCSV | 在庫の余裕の計算 |
| 代替品・第二の仕入先・他の倉庫 | 部品マスタのCSV | 代わりの手配の候補 |
学習のデータは、見込む時点に戻して作ります。 過去の明細について、入荷の予定の前の月の10日の時点で分かっていた情報だけで特徴を作り直します。その日より後に回答が変わった回数を入れると、見込むときには分からない情報で学習することになり、検証では当たるのに本番で外れます。
仕入先の直近の遅れの割合も、同じく時点に戻して数えます。 「その時点から見て過去6か月に、その仕入先の明細が5稼働日以上遅れた割合」を、学習の明細ごとに計算し直します。今の割合を過去の明細に付けると、結果を知ったうえで学ぶことになります。
AIへ渡す前に整形する
- 遅れを稼働日で数える … 最後の回答の日付から入荷日までを、自社のカレンダーの稼働日で数えます。暦の日数で数えると、連休をまたいだ明細だけが遅れて見えます
- ラベルを決める … 5稼働日以上遅れた明細を1、それ以外を0とします。分けて届いた明細は、必要な数量の8割が届いた日を入荷日とします
- 回答の特徴を作る … 回答の変更の回数、最初の回答から最後の回答までのずれ、発注から最初の回答までの日数、回答が無いまま希望の納期に近づいているか
- 仕入先の特徴を作る … 過去6か月の遅れの割合、明細の件数、同じ月に抱えている自社の発注の数
- 時期の特徴を作る … 入荷の予定が月末か、仕入先の大型連休の前後か、年度末か
- 取り消した発注を外す … 自社の都合で取り消した明細と、納期を自社から後ろへずらした明細は、遅れとして数えません
2番目の「5稼働日」は、購買課と生産管理課で決める値です。 1日の遅れでも欠品になる部品はありますが、1日のずれまで遅れとして学ばせると、運送の都合のような偶然の分が増えて、仕入先の遅れ方が見えにくくなります。 何日の遅れで欠品するかは、次の在庫の余裕の計算で部品ごとに見ます。
6番目を省くと、自社の都合で後ろへずらした明細が、仕入先の遅れとして残ります。 生産の計画が変わって「入荷を2週間待ってほしい」と頼んだ明細は、変更の履歴に自社からの依頼の印を付け、学習から外します。
AIに処理させる
この構成の「AI」は、明細ごとの「5稼働日以上遅れて届く確率」の見込みだけです。 在庫の余裕、欠品のおそれの順位、代わりの手配の候補は、決まった計算と部品マスタから出します。
| 段 | させること | させないこと |
|---|---|---|
| 遅れの見込み | 明細ごとの5稼働日以上遅れる確率 | 何日遅れるかの断定 |
| 確率の較正 | 確率の目盛りを実際の遅れの割合に合わせる | 仕入先ごとの手直し |
| 欠品のおそれ | 確率と在庫の余裕を掛け合わせた順位 | 確かめる部品の決定 |
| 理由 | 寄与の大きい特徴の上位3つ | 仕入先の事情の推し量り |
| 代わりの手配 | 部品マスタにある候補の列挙 | 発注の振り替え・割増の運賃の判断 |
見込みには、LightGBM の objective="binary" を使います。 遅れる明細は全体の1割から2割程度と想定されるので、偏りの手当てとして scale_pos_weight を使います。is_unbalance と同時には使えないので、どちらか一方に決めて設定ファイルに書いておきます。 評価の指標は auc と average_precision を並べて見ます。順位の良さと、上位の当たり具合を別々に見るためです。
確率は、scikit-learn の CalibratedClassifierCV で較正します。 方法は sigmoid です。欠品のおそれの順位は「確率 × 余裕を超える遅れの見込み」で作るので、確率の目盛りがずれていると、順位そのものがずれます。 「30%」と出た明細が、実際に10件に3件くらい遅れているかを、答え合わせで毎月確かめます。
検証は時間の順で分けます。 scikit-learn の TimeSeriesSplit は、未来のデータで学習して過去を評価しないための分け方で、k番目の分割では前のk個の区切りで学び、次の区切りで評価します。ただしサンプルが等しい間隔で並んでいることを前提にしています。 発注の明細は月によって件数がばらつくので、この構成では入荷の予定の月で区切って、前の月までで学習し次の月で検証する分け方を自前で作ります。
在庫の余裕は、次の計算で出します。 部品ごとに、来月の日ごとの所要量を在庫と先に届く入荷から順に引いていき、その明細が届かなかったら何日目に安全在庫を割るかを数えます。その日数から入荷の予定日を引いたものが「余裕の稼働日」です。余裕が5稼働日未満の部品は、遅れの確率が低くても一覧の上に寄せます。
| 機械にさせないこと | 理由 |
|---|---|
| 確かめる部品を決める | 仕入先との付き合いと、今月の事情を知らない |
| 仕入先へ問い合わせる | 問い合わせ方で仕入先との関係が変わる |
| 発注を別の仕入先へ振り替える | 価格・品質・契約の条件に関わる |
| 代替品を考え出す | 品質保証の承認を経ていない部品を使えない |
1行目がいちばん起きやすい失敗です。 順位が出ると、上から順に機械的に電話したくなります。仕入先が自社の大口の取引先でもある場合や、先週すでに話している場合は、確かめ方を変える必要があります。 順位は確かめる候補であって、問い合わせの指示ではありません。
指示内容を固定する
この構成は生成AIを使わないため、指示は Python の設定ファイルに書きます。 何をどう見込み、どの規則で順位と候補を出すかを、購買課と生産管理課が読める形で残すためです。
# 部品の欠品のおそれの見込みの設定(shortage_risk.yaml)
対象: 来月に入荷を予定している発注の明細(自社の都合で取り消したものを除く)
単位: 稼働日(自社のカレンダー。仕入先の大型連休は別の表)
ラベル:
遅れ: 最後の回答の日付から5稼働日以上あとに入荷(分納は必要数の8割が届いた日)
除外: 自社の依頼で納期を後ろへずらした明細
特徴:
- 仕入先, 部品区分, 数量, 発注から希望の納期までの稼働日数
- 回答の変更の回数, 最初の回答から最後の回答までのずれ, 発注から最初の回答までの日数
- 仕入先の過去6か月の遅れの割合, 仕入先の明細の件数(見込む時点に戻して数える)
- 入荷の予定が月末か, 仕入先の大型連休の前後か, 年度末か
見込み:
モデル: {objective: binary, scale_pos_weight: 学習のデータの比から決める}
較正: CalibratedClassifierCV(method: sigmoid)
理由: pred_contrib の上位3つ(最後の列の期待値は使わない)
学び直し: 四半期ごと(1月・4月・7月・10月)と、仕入先の大きな入れ替えのあと
検証: 入荷の予定の月で区切る。前の月までで学び、次の月で確かめる
評価: auc, average_precision, 確率の帯ごとの実際の遅れの割合
欠品のおそれ:
余裕の稼働日: その明細が届かないときに安全在庫を割る日 − 入荷の予定日
順位の値: 遅れの確率 × (余裕の稼働日が5未満なら1.0、5以上10未満なら0.5、10以上なら0.1)
一覧に出す: 順位の値の上位60件と、余裕の稼働日が0以下の明細の全件
代わりの手配の候補(部品マスタにあるものだけ):
- 他の倉庫の在庫(移せる数量)
- 承認済みの代替品(在庫と発注残)
- 第二の仕入先(過去の発注の有無と、最後の発注の日)
守ること:
- 部品マスタに無い代替品・仕入先を候補に出さない
- 仕入先の過去の遅れの割合を、学習の範囲を超えて言葉で評価しない(「遅れがちな仕入先」などと書かない)
- 明細の件数が10件未満の仕入先は「実績が少ない」の印を付ける
- 結果を生産管理システムの発注や納期の欄に書き込まない
「実績が少ない仕入先に印を付ける」は、新しく取引を始めた仕入先への備えです。 過去の明細が数件しかないと、たまたま1回遅れただけで遅れの割合が高く出ます。印を見た購買担当が、数字ではなく取引を始めたときの話を思い出せるようにします。
出力形式を固定する
明細ごとに、次の形のJSONと、それを一覧にした表で出します。
{
"run_id": "SR-2026-10-10",
"model_version": "sr-2026Q4",
"po_line": { "po_no": "P-2026-08-1123-02", "part_no": "", "supplier": "", "qty": 0 },
"promised_date": "2026-11-12",
"late_probability": 0.00,
"slack_workdays": 0,
"risk_score": 0.00,
"reasons": [
{ "feature": "answer_change_count", "label": "回答の変更が2回", "contribution": 0.00 }
],
"alternatives": [
{ "type": "other_warehouse | approved_substitute | second_supplier", "detail": "", "qty_available": 0 }
],
"flags": ["few_records"],
"buyer_decision": { "action": "", "contacted_at": "", "result": "", "reason": "" }
}
late_probability から alternatives までは Python が埋め、buyer_decision は購買担当が書きます。
1つ目の理由は、見込みと人の判断を同じ記録に並べられることです。 翌月の答え合わせで、確かめなかった明細が遅れたのか、確かめて手を打った明細が間に合ったのかを分けて数えられます。手を打って間に合った明細を「遅れなかった」と数えると、次の学習で仕入先の遅れ方が実際より良く見えます。
2つ目は、reasons の label で問い合わせの切り口が決まることです。 「回答の変更が2回」なら変更の理由を、「月末の入荷」なら出荷の締めの日を、最初に聞けます。
仕入先ごとに、確かめる明細を次の表にまとめます。
| 仕入先 | 部品番号 | 回答の納期 | 遅れの確率 | 余裕の稼働日 | 主な理由 | 代わりの手配の候補 |
|---|
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 生産管理システム | 夜間のCSVの書き出しを読む | 発注・回答の履歴・入荷・在庫・所要量・部品マスタ |
| 回答の記録の表 | 表の読み取り | 生産管理システムに履歴が無い場合の回答の変更 |
| 購買課の共有フォルダ | ファイルの書き出し | 欠品のおそれの一覧と、仕入先ごとの表 |
| 社内チャット | 通知 | 一覧ができたことと、余裕が0以下の明細の件数 |
| 判断の記録の表 | 購買担当が書き込む | 問い合わせの結果と、取った手 |
生産管理システムへは書き込みません。 回答の納期を見込みで書き換えると、所要量の計算が見込みで動き、別の部品の発注まで自動で前倒しされます。 見込みはあくまで横に置く一覧です。
判断の記録は、購買担当が書く表に分けます。 生産管理システムの備考の欄に書くと、後から集めるのが手間です。明細の番号で一覧と結び付く形で残し、翌月の答え合わせで読み込みます。
人が確認する
購買担当は、一覧の上から順に、仕入先ごとの表で確かめます。 全件を開く必要はありません。
- 余裕の稼働日が0以下の明細を先に見る … 回答どおりに届いても欠品する明細です。仕入先への問い合わせより先に、所要量と在庫の数字を確かめます
- 上位の明細の理由を読む …
reasonsを読み、知っている事情と照らします。先週すでに話した仕入先は、確かめたことを記録して順位を下げてよい - 仕入先へ問い合わせる … 仕入先ごとの表で1社1回にまとめます
- 遅れが分かったら代わりの手配を選ぶ … 候補から実際の手を選び、生産管理課と相談します。発注の振り替えと割増の運賃は、購買課長の承認を経ます
- 判断を記録する … 何をしたか、仕入先が何と答えたかを
buyer_decisionに書きます
目標は、240件をならして1件6分です。 上位の明細は問い合わせと代わりの手配の検討で10分以上かかり、下位の明細は一覧で流し見て数十秒です。
例外に対処する
| 起きること | 対応 |
|---|---|
| 書き出しのCSVが届いていない・件数が前の月の半分以下 | 見込まずに止め、購買課と情報システムへ知らせる |
| 納期回答がまだ無い明細 | 確率は出さず「回答なし」として一覧の上に出す |
| 明細の件数が10件未満の仕入先 | 確率を出したうえで「実績が少ない」の印を付ける |
| 初めて買う部品 | 部品区分の特徴だけで見込み、印を付ける |
| 所要量が計算されていない部品 | 余裕を出さず「所要量なし」として人に見せる |
| 部品マスタに代わりの手配の候補が無い | 候補の欄を空にし、「代替なし」の印を付ける |
| 確率の帯ごとの実際の遅れの割合が大きくずれた | 学び直しを前倒しし、ずれた月の一覧に注意書きを付ける |
| 仕入先の被災・物流の止まりの知らせ | 見込みを待たず、その仕入先の明細を全件人に回す |
2行目を「確率0」として扱わないことが大事です。 回答が無いこと自体が遅れの兆しで、機械が分からない明細ほど人が先に見るべきです。
最後の行は、過去の遅れ方からは分からない出来事です。 災害や大きな事故の知らせが入ったら、その仕入先の明細はモデルの順位を使わずに、購買担当が全件を確かめます。
記録を残す
- 実行の日時、使ったモデルの版、読み込んだCSVの件数
- 明細ごとの特徴の値、遅れの確率(較正の前と後)、余裕の稼働日、順位の値
- 明細ごとの理由の上位3つと、
pred_contribの値 - 購買担当の判断 … 確かめたか、順位を動かしたか、その理由、仕入先の答え、取った手
- 翌月の入荷の実績と、答え合わせの結果(確率の帯ごとの実際の遅れの割合)
- 学び直しの日時と、そのときの検証の指標
購買担当の判断の記録は、モデルの答え合わせに欠かせません。 確かめて手を打った明細は、手を打たなければ遅れていたのかもしれません。手を打った明細を学習のラベルから外すかどうかを、記録を見て決めます。
04実装レベルの3段階
半自動化で、1件20分が10分程度になります。 在庫の余裕と仕入先の遅れの割合は自動で出ますが、規則の順位は「遅れの割合が何%以上」といった線で切るため、回答の変更と月末と連休が重なったような明細の重みが付けられず、確かめる部品が多めに残ります。本格構成で6分になり、この段階が本記事の想定です。 段階を飛ばさないでください。 半自動化の規則の順位を3か月使うと、購買担当がどの明細を順位と違う判断で確かめたかが記録に残ります。それがモデルに足すべき特徴の候補です。
05工数削減シミュレーション
導入後 240件 × 6分 ÷ 60 = 24 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 電子部品・機構部品・樹脂成形品などを数十社の仕入先から買い、組立の工場へ供給している製造業。仕入先から納期回答をもらっていても、その日に届かないことが毎月あり、欠品が組立の直前に分かっている場合。生産管理システムに発注・納期回答・入荷の実績が2年分ほど残っている場合。設備の部品を手配する商社や、現場向けの資材を取り寄せる建設会社の購買部門。
- 仕入先が数社で、どの部品も納期どおりに届いている場合。発注のたびの納期回答の日付や回答の変更が記録されておらず、入荷日しか残っていない場合(まず回答の記録から始める)。部品の点数が少なく、担当者が全件を毎週電話で確かめられる場合。なお、どの仕入先に発注を振り替えるか、割増の運賃を払って急がせるか、生産の順番を入れ替えるかの判断は、この構成では代替できません。
07最小構成で試す方法
- 過去6か月に入荷を予定していた発注の明細を、生産管理システムから書き出す
- 明細ごとに、最後の回答の日付と入荷日の差を稼働日で数え、5稼働日以上遅れたものに印を付ける
- 仕入先ごとに、遅れた明細の割合と、回答を変えた明細のうち遅れた割合を表にする
- 先月の点検で確かめた240点と、実際に遅れた明細を突き合わせる
- 「回答を2回以上変えた明細」「遅れの割合が高い仕入先の明細」だけで選んでいたら、何件を拾えたかを数える
ここまではモデルを作らずに、表計算と数行の集計でできます。 「履歴を使えば、勘で選ぶより多くの遅れを拾えるか」を先に確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 回答の変更や仕入先の割合で、勘より多くの遅れを拾えた | モデルを作る段に進む |
| 勘とほぼ同じだった | 特徴が足りない。回答の記録の取り方を見直す |
| 回答の変更の履歴が取れなかった | 回答の記録の運用から始める。 半年待つ |
3行目が出ることは珍しくありません。 回答を入れるたびに1行残す運用を始め、半年分たまってから同じ表を作り直してください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 検証ではよく当たるのに、本番で外れる | 見込む時点より後の回答の変更や遅れの割合が特徴に混ざっている。 時点に戻して作り直す |
| 確率の目盛りがずれて順位がおかしい | 較正し、確率の帯ごとの実際の遅れの割合を毎月見る |
| 遅れの確率だけで並べてしまう | 在庫の余裕と掛け合わせる。 在庫の多い部品が上に来ない |
| 回答の上書きで変更の履歴が残っていない | 回答を入れるたびに別の表へ1行残す運用から始める |
| 自社の都合でずらした明細が遅れとして学ばれる | 自社からの依頼の印を付けて外す |
| 実績の少ない仕入先が極端な確率になる | 印を付け、件数の少なさを人に見せる |
| 回答の無い明細が下位に沈む | 確率を出さず「回答なし」として上に出す |
| 理由の欄が仕入先を悪く言う言葉になる | 事実の言い方(回答の変更の回数・月末の入荷)にそろえる |
| 代替品の候補に未承認の部品が出る | 部品マスタにあるものだけを候補にする |
| 順位をそのまま問い合わせの指示として使う | 確かめるかどうかは購買担当が決め、理由を残す |
is_unbalance と scale_pos_weight を両方指定する | 同時に使えない。どちらか一方に決めて設定に書く |
| 手を打って間に合った明細を「遅れなかった」と学ぶ | 判断の記録を見て、ラベルの扱いを決める |
上の3行が、この構成の失敗のほとんどです。 どれも「数字は出ているのに、その数字の意味がずれている」という同じ形をしています。見込みの時点、確率の目盛り、欠品との関係の3つをそろえてあるかで、一覧が使われ続けるかが決まります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 仕入先ごとの発注の数量と時期、納期回答とその変更の履歴、入荷の実績、部品の在庫と所要量です。仕入先ごとの遅れの割合は、取引先の評価として扱われうる情報です。
- データを社外のサービスへ出さない … 学習も見込みも社内のサーバーで行います。生産の計画と仕入先との取引の量が分かるデータです
- 仕入先ごとの遅れの割合を、取引先の評価と混ぜない … この構成の数字は「来月の欠品に先回りする」ためのものです。取引の継続や価格の交渉の材料に流用するなら、評価の基準を別に決めてから使います
- 一覧を仕入先に見せる場面を想定する … 理由の欄を事実の言い方にそろえ、他の仕入先の名前や数字が見えない形で切り出せるようにします
- 発注の振り替えと割増の運賃は人が承認する … この構成は候補を並べるだけです。価格・品質・契約の条件に関わる判断を、順位で代えません
- モデルの版と学習のデータの範囲を残す … どの期間のデータで学び、どの版で見込んだかが分からないと、外れたときに原因をたどれません
- 閲覧できる人を購買課と生産管理課に絞る … 共有フォルダの権限で絞り、社内チャットへの通知には件数だけを書きます
誤りが起きた場合のリスクは、欠品する部品を見落とすことと、遅れない部品に手を打って余計な費用をかけることの2つです。
10まず何から始めるか
1週目:納期回答の変更の履歴が取れるかを確かめる
生産管理システムで、納期回答の上書きの履歴が書き出せるかを情報システムの担当と確かめます。取れない場合は、回答を入れるたびに別の表へ1行残す運用を、この週から始めます。
2週目:過去6か月の遅れを数える
過去6か月の明細について、最後の回答の日付から入荷日までを稼働日で数え、5稼働日以上遅れた明細の割合を仕入先ごとに出します。 あわせて、自社の都合でずらした明細に印を付けます。
3週目:先月の点検と突き合わせる
先月確かめた240点と、実際に遅れた明細を並べます。勘で選んだ部品の外で、どれだけ遅れが起きていたかを数えます。 この数が、構成を進めるかどうかの判断の材料です。
4週目:在庫の余裕の計算を作る
Python で部品ごとの余裕の稼働日を出し、規則の順位で来月分の一覧を作ります。この時点ではモデルを使わず、半自動化の段階として購買課に使ってもらいます。
2か月目: 時点に戻した学習のデータを作り、LightGBM の二値分類と確率の較正を足します。規則の順位とモデルの順位を並べて見せます。3か月目以降: 答え合わせを毎月回し、1件20分が何分になったかと、組立の直前に分かった欠品の件数を数えます。購買担当の判断の記録から特徴を1つ足して学び直した時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
objective の binary が0と1のラベルを使う対数損失の二値分類(ロジスティック回帰)であること。is_unbalance と scale_pos_weight が偏りへの手当てで、同時には使えずどちらか一方を選ぶこと。評価の指標に auc・average_precision・binary_logloss があること | LightGBM: Parameters | 2026-10-08 |
LGBMClassifier の predict_proba がクラスごとの確率を返すこと。pred_contrib で特徴ごとの寄与を返し、SHAP の値と違って最後の列に期待値が付くこと | LightGBM: LGBMClassifier | 2026-10-08 |
CalibratedClassifierCV が isotonic・sigmoid・temperature の方法で確率を較正し、交差検証で学習と較正を行うこと。isotonic は較正のサンプルが少ない(1000に比べてずっと少ない)と過学習しやすく勧められないこと。偏りの大きいデータでは sigmoid が向く場合があること | scikit-learn: CalibratedClassifierCV | 2026-10-08 |
TimeSeriesSplit が未来のデータで学習して過去を評価しないための分け方で、k番目の分割で前のk個の区切りを学習に使うこと。サンプルが等しい間隔で並んでいる前提であること | scikit-learn: TimeSeriesSplit | 2026-10-08 |
どの仕入先に発注を振り替えるか、割増の運賃を払うかは、購買課と生産管理課で決めてください。 本記事は公開されている部品の仕様で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1025)についてのご相談はこちらから。
