印刷会社が受注の仕様と工程の記録から Python で受注ごとの製作の日数を「校了まで」と「校了から出荷まで」に分けて予測し、納期の回答と工程の段取りに使う
印刷の受注ごとの仕様と、お客ごとの校正の戻りの履歴、工程の受注残から、Python で製作の営業日の数を予測します。「入稿から校了まで」と「校了から出荷まで」を分けて、それぞれ真ん中と遅めの2本で出します。
- 連携・自動化
- Python
- 対象業界
- 小売/広告/教育/製造
- 対象部門
- 営業/生産
- 対象業務
- 問い合わせ対応/集計・分析
- 主な課題
- 判断に時間がかかる/属人化している/期限・対応漏れが起きる
- AIで行う処理
- 予測
- 主な効果
- 判断支援/対応スピード向上/属人化解消
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 営業が受注の仕様(品目・判型・ページ数・部数・紙・色数・加工)を生産管理の仕組みに入れ、工務課に納期を聞く
- 工務課の担当が仕様を見て、工程の並び(刷版・印刷・断裁・折・製本・加工・外注)を考える
- 似た過去の受注を台帳から探し、そのときの日数と、いまの工程の受注残を見比べる
- お客の校正の戻り方を営業に聞き、校了の日を見立てる
- 「入稿から何日、出荷は何日ごろ」と営業に答え、営業がお客に伝える
- 製作が進んでから、校正の戻りの遅れや外注の遅れで約束に間に合わない受注に気づき、工務課が段取りを組み直す
- 人営業が受注の仕様を生産管理の仕組みに入れる(これまでと同じ)
- 自動毎朝7時と、営業が見込みの画面で受注番号を入れたときに、Python が受注の仕様、お客の校正の履歴、工程の受注残を読み込む
- 自動「入稿から校了まで」の営業日の数を、真ん中(50%点)と遅め(90%点)で予測する
- 自動「校了から出荷まで」の営業日の数を、真ん中と遅めで予測する
- 自動工場の稼働の暦で営業日を日付に直し、「校了から何営業日」と「校了の見込みの日」を並べた見込みの票を作る
- 自動製作中の受注について、いまの進み具合から残りの日数を見込み直し、遅めの見込みが約束の出荷日を超える受注に印を付ける
- 人工務課の担当が見込みの票を見て、外注の空き具合などを足して納期の回答を決め、営業に返す
- 人印の付いた受注について、工務課が段取りの組み直しか、営業からお客への連絡を決める
各工程の詳しい説明を読む
- 営業が受注の仕様(品目・判型・ページ数・部数・紙・色数・加工)を生産管理の仕組みに入れ、工務課に納期を聞く
- 工務課の担当が仕様を見て、工程の並び(刷版・印刷・断裁・折・製本・加工・外注)を考える
- 似た過去の受注を台帳から探し、そのときの日数と、いまの工程の受注残を見比べる
- お客の校正の戻り方を営業に聞き、校了の日を見立てる
- 「入稿から何日、出荷は何日ごろ」と営業に答え、営業がお客に伝える
- 製作が進んでから、校正の戻りの遅れや外注の遅れで約束に間に合わない受注に気づき、工務課が段取りを組み直す
(a)答えが担当の頭の中にある。 3番の「似た過去の受注」は、担当が覚えている受注です。「このお客の会社案内はいつも三校まで行く」「この外注の製本屋は月末に混む」は、台帳には書かれていません。 担当が休む日は、営業はお客に答えを返せず、折り返しの連絡になります。
(b)校正の往復と工場の日数が混ざっている。 5番で答える日数は「入稿から出荷まで」の1本です。校正の戻りが遅れて出荷が遅れたのか、工場の工程が詰まって遅れたのかが、後から見ても分かりません。 その結果、「余裕を見て2日足す」という足し方が担当ごとに積み上がります。
(c)遅れに気づくのが遅い。 6番の気づきは、出荷の数日前に工程の予定を見たときです。校了が予定より2日遅れた時点で、校了から出荷までの日数が足りないことは分かったはずですが、それを見る仕組みがありません。
(d)1件の見立てに時間がかかる。 月300件の受注の1件ずつに、仕様の確認、過去の受注の検索、工程の受注残の確認が要ります。繁忙期ほど見立てが雑になり、雑になった月ほど遅れが出ます。
- 【人】 営業が受注の仕様を生産管理の仕組みに入れる(これまでと同じ)
- 【自動】 毎朝7時と、営業が見込みの画面で受注番号を入れたときに、Python が受注の仕様、お客の校正の履歴、工程の受注残を読み込む
- 【自動】 「入稿から校了まで」の営業日の数を、真ん中(50%点)と遅め(90%点)で予測する
- 【自動】 「校了から出荷まで」の営業日の数を、真ん中と遅めで予測する
- 【自動】 工場の稼働の暦で営業日を日付に直し、「校了から何営業日」と「校了の見込みの日」を並べた見込みの票を作る
- 【自動】 製作中の受注について、いまの進み具合から残りの日数を見込み直し、遅めの見込みが約束の出荷日を超える受注に印を付ける
- 【人】 工務課の担当が見込みの票を見て、外注の空き具合などを足して納期の回答を決め、営業に返す
- 【人】 印の付いた受注について、工務課が段取りの組み直しか、営業からお客への連絡を決める
7番目で答えを決めるのは工務課の担当です。 見込みの票が出すのは過去の受注から見た日数で、外注先から「今週は手一杯」と電話があったことは記録に入っていません。 担当は票の数字を出発点にして、記録に無い事情を足します。
3番目と4番目を別のモデルにしているのが、この構成の要です。 校了までの見込みはお客の戻り方で、校了からの見込みは工程で決まります。6番目の見込み直しでも、校了の前の受注は校了までの見込みが動き、校了の後の受注は工程の見込みだけが動きます。
02今回想定するシステム構成
生産管理の仕組み(受注の仕様、工程ごとの予定と実績の日付) + 工務の台帳(校正を出した日・戻った日・校正の回数、校了の日) + 外注の依頼の記録(外注先、加工の種類、依頼した日・戻った日) + 工場の稼働の暦(休みの日、臨時の稼働の日) │ ▼【トリガー】毎朝7時(社内のサーバーの定時実行)/見込みの画面からの呼び出し Python(pandas) ├──▶ 受注ごとの項目をそろえる(仕様・お客の戻りの履歴・受注残) ▼ scikit-learn の HistGradientBoostingRegressor(loss="quantile") │ 入稿→校了:50%点・90%点の2モデル │ 校了→出荷:50%点・90%点の2モデル ▼ Python ── 営業日を日付に直し、見込みの票と遅れの印を作る ▼ 【人】工務課が納期の回答を決め、遅れの受注の段取りを決める
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(pandas・scikit-learn) | R |
| 処理エンジン | scikit-learn の HistGradientBoostingRegressor(分位点の損失) | LightGBM の分位点回帰 |
| 集計 | Python(営業日の日付への置き換え、遅れの印、見込みの票) | 生産管理の仕組みの帳票の機能 |
| 保管 | 社内のファイルサーバー(学習の記録、見込みの票、当たり方の記録) | - |
新しく足すのは、Python の処理と、工務の台帳の「校正を出した日・戻った日」の列をそろえる作業です。 生産管理の仕組みには書き込みません。この構成が出すのは、受注ごとの日数の見込みと遅れの印までです。
予測のエンジンに HistGradientBoostingRegressor を選んだのは、1つの部品で分位点の予測と区分の項目と欠けた値を扱えるからです。 公式のページでは、loss に quantile を選ぶとピンボール損失を使い、quantile の引数で推定する分位点を0と1のあいだで指定するとされています。50%点と90%点で、別々に2つのモデルを学習します。
品目・紙・外注先のような区分の項目は、そのまま渡せます。 公式のページでは、categorical_features の既定は from_dtype で、データフレームの列の型が Categorical なら区分の項目として扱われるとされています。欠けた値(NaN)も扱え、学習のときに欠けた値を左右どちらへ送るかを分かれ目ごとに学ぶとされています。新しいお客で校正の履歴が無い受注も、そのまま予測にかけられます。
生成AIは使いません。 出すのは日数と日付の表で、工務課の担当が読むのは数字です。
03どうやって実装するのか
処理の起点を決める
毎朝7時に1回、製作中と受注したばかりの全部の受注について見込みを出します。 工務課の朝の打合せが8時半なので、打合せの前に遅れの印の付いた受注を見られる時刻にします。社内のサーバーの定時実行(Windows ならタスク スケジューラ、Linux なら cron)で Python のスクリプトを起動します。
もう一つの起点は、営業の問い合わせです。 営業がお客と話している最中に納期を聞かれたときは、見込みの画面に受注番号(または仕様)を入れると、その1件だけの見込みを返します。ここで返すのは見込みの票で、納期の回答そのものではありません。 工務課の担当の確認を経てお客に答えます。
モデルの作り直しは月に1回、月初めの夜にします。 学習に使うのは出荷まで終わった受注だけで、製作中の受注は日数が確定していないので学習に入れません。 作り直す前と後で、直近3か月の受注の当たり方(第7章「保存・ログ」)を比べ、悪くなっていれば前のモデルのまま使います。
見込みの票には、作った日時とモデルの作成日を必ず印字します。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 受注の仕様 | 受注番号、お客のコード、品目(チラシ・冊子・パンフレット・ポスターなど)、判型、ページ数、部数、紙の銘柄と厚さ、色数、製本の方式、加工の種類(PP貼り・箔押し・型抜き・ニス)、外注の有無と外注先 | 生産管理の仕組み |
| 校正の記録 | 入稿の日、校正を出した日・戻った日(初校・再校・三校…)、校了の日、校正の方式(PDF・紙の本機校正) | 工務の台帳 |
| 工程の記録 | 工程ごとの予定の日と実績の日(刷版・印刷・断裁・折・製本・加工・出荷)、使った機械 | 生産管理の仕組み |
| 工程の受注残 | 見込みを出す時点で、工程ごとに待っている受注の数と予定の通し枚数 | 生産管理の仕組み(毎朝集計) |
| 外注の記録 | 外注先、加工の種類、依頼した日、戻った日 | 外注の依頼の記録 |
| 工場の稼働の暦 | 休みの日、臨時の稼働の日 | 工場の稼働の暦 |
質を決めるのは、校正の記録です。 入稿の日と出荷の日だけでは、日数を2つに割れません。多くの印刷会社では、校正を出した日と戻った日は工務の台帳やメールにしか残っていません。 導入の最初の仕事は、過去2年分の受注について、少なくとも「校了の日」をそろえることです(第14章)。
お客の戻り方は、お客ごとの過去の記録から作ります。 直近1年の受注での「校正1回あたりの戻りの営業日の数の中央値」と「校了までの校正の回数の平均」をお客のコードごとに出し、受注の項目として付けます。受注の数の少ないお客は値が欠けたまま渡し、モデルに欠けた値として扱わせます。
データの取得方法を決める
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 受注の仕様と工程の実績 | 生産管理の仕組みの書き出し(CSV、毎朝) | 学習と予測の項目、日数の答え |
| 校正の記録 | 工務の台帳(スプレッドシートを CSV で保存) | 校了までの日数、お客の戻り方 |
| 外注の記録 | 外注の依頼の記録(CSV) | 外注先ごとの戻りの日数 |
| 工程の受注残 | 生産管理の仕組みの工程の予定から、毎朝集計 | 見込みを出す時点の混み具合 |
| 稼働の暦 | 工場の稼働の暦(CSV) | 営業日の数え方 |
日数はすべて工場の営業日で数えます。 暦の日数で数えると、連休を挟んだ受注が「遅い受注」として学習され、連休の前に受ける仕様ほど日数が長く出ます。 入稿の日から校了の日まで、校了の日から出荷の日までのそれぞれについて、稼働の暦で稼働の日だけを数えます。
工程の受注残は、その受注を受けた日の朝の値を使います。 出荷が終わってから集計した混み具合を使うと、その受注自身が混み具合に入ってしまいます。 毎朝の集計を日付ごとに保存しておき、学習のときは受注の日の朝の値を引きます。
AIへ渡す前に整形する
- 日数の答えを2つ作る … 「入稿の日から校了の日まで」と「校了の日から出荷の日まで」を、稼働の暦で営業日の数にします
- 受注を見込みの時点でそろえる … 項目は、受注を受けた日の時点で分かっていたものだけにします。実際の校正の回数は、受注の時点では分からないので入れません
- お客の戻り方を付ける … お客のコードごとに、その受注より前の1年の受注から、戻りの営業日の中央値と校正の回数の平均を出して付けます
- 区分の列の型をそろえる … 品目・判型・紙の銘柄・製本の方式・加工の種類・外注先を pandas の Categorical の型にします
- 外れた受注に印を付ける … お客の都合で製作が止まった受注(「保留」の記録があるもの)、事故で刷り直した受注は、学習から外します
- 学習と確かめの期間を時間で分ける … 受注の日の順に並べ、scikit-learn の TimeSeriesSplit で古い受注で学習し、新しい受注で確かめます
2番目と3番目が、この構成の肝です。 実際の校正の回数を項目に入れると、学習のときの当たり方はとてもよくなります。けれども受注の時点ではその数は分からず、予測のときに使えません。 同じ理由で、お客の戻り方もその受注より前の受注だけから作ります。後の受注まで含めて作ると、学習のときだけ未来の情報が混ざります。
6番目で受注を無作為に分けないのは、未来の受注で学習して過去を当てることになるからです。 公式のページでは、TimeSeriesSplit は時間の順に並んだ記録を分けるためのもので、ほかの分け方では未来の記録で学習して過去の記録で確かめることになるとされています。gap で学習と確かめのあいだを空けられるので、出荷まで2週間ほどかかる受注が多いなら、その分の受注を間に挟み、学習の側に確かめの期間の結果が漏れないようにします。
5番目の「保留」は、外すか別に数えるかを最初に決めます。 お客の社内の都合で1か月止まった受注を残すと、校了までの90%点が大きく引っ張られます。外した件数は月ごとに記録し、外しすぎていないかを見ます。
AIに処理させる
させるのは、受注ごとに「入稿から校了まで」と「校了から出荷まで」の営業日の数を、50%点と90%点で予測することだけです。
| 出すもの | 作り方 | 使いみち |
|---|---|---|
| 校了までの50%点・90%点 | 校了までのモデル2つ | 校了の見込みの日(お客への参考) |
| 校了からの50%点・90%点 | 校了からのモデル2つ | 「校了から何営業日」の回答の候補は90%点 |
| 出荷の見込みの日 | 校了の見込みの日に校了からの日数を足し、稼働の暦で日付に直す | 工程の段取り |
| 遅れの印 | 製作中の受注で、90%点の出荷の見込みが約束の出荷日を超える | 朝の打合せ |
90%点は、「10件に9件はこの日数までに終わる」日数です。 営業がお客に約束するのは90%点の側です。50%点で約束すると、2件に1件は約束より遅れます。 50%点は工務課の中で、段取りの目標として使います。
| 遅れの印 | 決め方 | 工務課の動き |
|---|---|---|
| 赤 | 校了の後で、90%点の出荷の見込みが約束の出荷日を超える | 印刷機の順番、外注の急ぎの依頼、残業を検討 |
| 橙 | 校了の前で、校了の見込みが遅れて90%点の出荷の見込みが約束を超える | 営業からお客へ、校了の期限を伝える |
| - | 約束の出荷日までに収まる | これまでどおり |
赤と橙を分けるのは、手の打ち方が違うからです。 赤は工場の中で手を打てます。橙は工場がいくら急いでも縮まないので、お客に「この日までに校了をいただければ間に合います」と伝えるのが先です。
| させないこと | 理由 |
|---|---|
| お客に約束する納期の決定 | 外注の空き具合や、お客との関係を見て工務課と営業が決める |
| 印刷機の順番の決定 | 紙の手配、版の替え、色の並びを見て工務課が決める |
| 外注先への依頼の可否 | 外注先の空き具合は記録に無い |
| お客の校正の進め方への口出し | 校正の回数はお客の社内の事情で決まる |
指示内容を固定する
生成AIを使わないので、プロンプトはありません。 かわりに、学習と予測の中身を示します。
from sklearn.ensemble import HistGradientBoostingRegressor
import numpy as np
CAT = ["item", "size", "paper", "binding", "finish", "outsourcer"]
NUM = ["pages", "copies", "colors", "paper_gsm", "proof_paper",
"cust_return_median", "cust_rounds_mean", "backlog_press", "backlog_bind"]
X_cols = CAT + NUM
for c in CAT:
df[c] = df[c].astype("category") # from_dtype で区分の項目として扱われる
def fit_pair(train, target, val):
models = {}
for q in (0.5, 0.9):
m = HistGradientBoostingRegressor(
loss="quantile", quantile=q, max_iter=300, learning_rate=0.05)
m.fit(train[X_cols], train[target],
X_val=val[X_cols], y_val=val[target]) # 1万件未満でも早期終了を効かせる
models[q] = m
return models
to_proof = fit_pair(train, "days_to_proof_ok", val) # 入稿→校了
to_ship = fit_pair(train, "days_proof_to_ship", val) # 校了→出荷
def predict(models, X):
p50 = models[0.5].predict(X)
p90 = np.maximum(models[0.9].predict(X), p50) # 90%点が50%点を下回らないように
return np.ceil(p50), np.ceil(p90) # 営業日は切り上げ
X_val と y_val を渡しているのは、早期終了のためです。 公式のページでは、early_stopping の既定の auto は、件数が1万を超えるか、X_val と y_val を fit に渡したときに早期終了が有効になるとされています。月300件の2年分は7,200件で1万に届かないので、渡さないと早期終了が効かず、max_iter の上限まで木を足します。
np.maximum で90%点を50%点より下にしないのは、2つのモデルを別々に学習するからです。 別々のモデルなので、まれに90%点のほうが小さく出る受注があります。そのまま票に出すと、遅めの見込みが真ん中より早いという読めない票になります。
営業日は切り上げます。 2.3営業日を2営業日と答えると、約束の日の夕方に出荷が間に合いません。
出力形式を固定する
工務課と営業に渡すのは、次の見込みの票です。 見込みの画面と、朝の打合せの印刷の両方で同じ形にします。
【受注 P-26-10418 の見込み(10/29 07:05 作成/モデル作成 2026-10-01)】
| 区切り | 50%点 | 90%点 | 日付の見込み | 根拠になった値 |
|---|---|---|---|---|
| 入稿→校了 | 4営業日 | 7営業日 | 校了 11/5〜11/10ごろ | お客の戻り 中央値2営業日・校正 平均2.6回 |
| 校了→出荷 | 6営業日 | 8営業日 | 校了から8営業日で出荷 | 中綴じ・PP貼り(外注)・製本の受注残 多め |
営業がお客に答えるのは、「校了をいただいてから8営業日で出荷」です。 校了の見込みの日は「いつもの戻り方なら11月5日から10日ごろ」として添え、「11月の納品をご希望なら、校了を何日までに」という形で使います。
朝の打合せには、遅れの印の一覧を出します。
| 印 | 受注番号 | 品目 | いまの段階 | 約束の出荷日 | 90%点の出荷の見込み | 主な理由 |
|---|---|---|---|---|---|---|
| 赤 | P-26-10233 | 冊子 64P 無線綴じ | 印刷済・製本待ち | 11/6 | 11/9 | 製本の外注の戻りが遅め |
| 橙 | P-26-10301 | 会社案内 24P | 再校の戻り待ち | 11/12 | 11/14 | 校了の見込みが2営業日遅れ |
機械で読む用には、同じ内容を CSV でも残します。 列は、受注番号、段階、50%点と90%点の営業日の数、出荷の見込みの日、印、モデルの作成日です。翌月に、実際の出荷の日と並べて当たり方を見るのは、この CSV です。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 生産管理の仕組み | 毎朝、受注の仕様と工程の予定・実績を CSV で書き出す | 学習と予測の項目、受注残 |
| 工務の台帳 | スプレッドシートを CSV で保存して読む | 校正の記録 |
| 外注の依頼の記録 | CSV で読む | 外注先ごとの戻りの日数 |
| 見込みの画面 | 社内の Web の画面から Python を呼ぶ | 1件ごとの見込みの票 |
| 生産管理の仕組みの納期の欄 | 書き込まない(工務課が回答を決めてから入れる) | - |
納期の欄には書き込みません。 見込みの票の日付をそのまま納期の欄に入れると、外注の空き具合を見ないまま約束が決まります。 工務課の担当が確かめた答えだけを、担当が入れます。
人が確認する
- 作った日時とモデルの作成日を見る … 票の上の日付が当日の朝であることを確かめます
- 根拠になった値を見る … お客の戻り方が空欄(新しいお客)なら、校了までの見込みは広めに読みます
- 記録に無い事情を足す … 外注先の空き具合、紙の入荷の遅れ、機械の点検の予定を足して、回答の日数を決めます
- 赤と橙の受注の手の打ち方を決める … 朝の打合せで、工場の中で手を打つか、お客に校了の期限を伝えるかを決めます
3番目で票と違う答えにしたら、理由を一言残します。 「外注の製本屋が月末で混む」が何度も出るなら、外注先の月末の受注残を項目に足す材料になります。
目標は、300件をならして1件2分です。 くり返しの仕様の受注は票を見て答えるだけで、時間を使うのは、根拠の値が空欄の受注と、記録に無い事情を足す受注です。
例外に対処する
| 起きること | 対応 |
|---|---|
| 新しいお客で戻り方の履歴が無い | 欠けた値のまま予測し、票に「お客の履歴なし」と出す |
| 過去に無い仕様(新しい加工・新しい外注先) | 予測は出すが「仕様の前例少」と出し、工務課が自分で見立てる |
| 校正の記録が台帳に無い受注 | 学習から外し、外した件数を記録する |
| お客の都合で製作が保留になった | 保留の間は見込みを止め、再開の日から見込み直す |
| 刷り直しが出た | 刷り直しの受注は学習から外し、見込みは刷り直しの工程から出し直す |
| 90%点が50%点を下回った | 50%点にそろえて出す(第7章のコード) |
| 作り直したモデルが前より外れる | 前のモデルのまま使い、作り直しの記録を残す |
| 朝の定時の実行が動かなかった | 担当が手で実行する。日付の古い票は使わない |
2行目は、とくに大事です。 箔押しを初めて外注する受注のように、学習の記録に前例の少ない仕様では、モデルは似た仕様から推しはかった日数しか出せません。 区分の項目ごとに学習の記録の件数を数え、一定の件数に満たない組み合わせの受注に印を付けます。
記録を残す
- 実行の日時、使ったモデルの作成日、学習に使った受注の期間と件数、外した件数と理由
- 受注ごとの50%点・90%点の営業日の数、日付の見込み、印
- 工務課が票と違う答えにした受注と、その理由
- 実際の校了の日と出荷の日
- 月ごとの当たり方(実際の日数が90%点以内に収まった割合、50%点以内に収まった割合)を、区切りごと・品目ごとに
最後の行の「90%点以内に収まった割合」が、この構成の健康診断です。 9割前後なら、遅めの見込みの意味どおりに働いています。公式の例のページでも、学習の記録では90%の幅に収まっていたのに、確かめの記録では8割ほどしか収まらなかった例が示されています。 学習の記録で当たっていても新しい受注で当たるとは限らないので、新しい月の受注で毎月数えます。 8割を下回る月が続けば、90%点に足す日数を、直近の外れ方から決めます。
04実装レベルの3段階
本記事の想定は本格構成です。 半自動化では校了から出荷までの見込みは出ますが、校了の見込みは担当が営業に聞いて立てています。 半自動化で1件6分が4分ほどに、本格構成で2分になります。 差が大きいのは、お客の戻り方と工程の受注残を見比べる作業が、記録があれば機械で出せる作業だからです。 段階を飛ばさないでください。 半自動化を3か月使うと、どの品目で当たり、どこで外れるかが分かります。外れる品目の工程の記録を直してから、校了までのモデルを足します。
05工数削減シミュレーション
導入後 300件 × 2分 ÷ 60 = 10 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- チラシ・パンフレット・冊子・カタログなどの商業印刷を、月に数百件の受注で回している印刷会社。受注ごとに入稿の日、校正を出した日と戻った日、校了の日、刷版・印刷・加工・出荷の日が生産管理の仕組みか工務の台帳に2〜3年分残っている場合。営業がお客に答える納期を工務課の担当に毎回聞いていて、担当が休むと答えが遅れる場合。製本や特殊な加工を外注に出す受注が混ざり、外注の日数の読みが人によって違う場合。
- 受注の大半が同じ仕様のくり返し(定期の帳票・名刺など)で、日数が決まっている場合。校正の日付が記録に残っておらず、入稿から出荷までの日数しか分からない場合。月の受注が数十件で、工務の担当が全件を覚えていられる場合。なお、お客と約束する納期の決定、工程の順番の決定、外注先への依頼の可否は、この構成では代替できません。
07最小構成で試す方法
- 工務の台帳から、直近2年の受注のうち、校正の記録がそろっている品目を1つ選ぶ(例:中綴じの冊子)
- その受注の仕様と、入稿の日・校了の日・出荷の日を書き出す
- 稼働の暦で営業日の数にし、第7章のコードで校了から出荷までの50%点と90%点を学習する
- 古い1年半で学習し、新しい半年の受注で予測させる
- 予測を、当時工務課の担当が答えた日数と、実際の日数の3つで並べる
最初は「校了から出荷まで」だけで始めます。 工程の記録は生産管理の仕組みに残っていることが多く、校正の記録をそろえる手間をかけずに試せます。 校了までのモデルは、台帳の整理が進んでから足します。
| 出てきた内容 | 判断 |
|---|---|
| 90%点に9割前後が収まり、担当の答えより早めでも外れが少ない | 品目を広げ、校了までのモデルの準備に進む |
| 90%点に収まるのが7割を下回る | 保留・刷り直しの受注が混ざっていないか、受注残の時点がずれていないかを確かめる |
| 担当の答えとほぼ同じ | 担当の見立ては良い。票で答えを速く出す意味は残る |
2行目は、ほとんどの場合、記録の問題です。 保留のまま1か月止まった受注や、刷り直しで工程をやり直した受注が混ざると、90%点が引っ張られるうえ、確かめの期間の外れも増えます。外した受注の件数と理由を並べ、工務課の記憶と合っているかを見ます。
3行目も失敗ではありません。 担当と同じ答えが票で出るなら、担当が休みの日でも営業がすぐ答えられます。 それがこの構成の効き目の半分です。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 入稿から出荷までを1本で学習する | 校了で2つに割る。 お客の側と工場の側を分ける |
| 実際の校正の回数を項目に入れる | 受注の時点で分かる項目だけにする。お客の戻り方は過去の受注から作る |
| 出荷の後の受注残を使う | 毎朝の受注残を日付ごとに保存し、受注の日の朝の値を引く |
| 暦の日数で数える | 稼働の暦で営業日を数える |
| 1万件未満で早期終了が効かない | X_val と y_val を fit に渡す |
| 90%点が50%点を下回る | 50%点にそろえて出す |
| 50%点で納期を約束する | 約束は90%点の側。 50%点は工場の中の目標 |
| 学習の記録で当たって安心する | 新しい月の受注で90%点に収まった割合を毎月数える |
| 票の日付を納期の欄に自動で入れる | 工務課が確かめた答えだけを入れる |
上の3行が、この構成の失敗のほとんどです。 どれも「受注の時点で何が分かっていたか」をそろえることから起きます。ここを押さえれば、残りは運用の注意で足ります。
下の3行は、運用に乗ってから出てくる問題です。 票が便利になるほど、50%点を約束に使いたくなり、票の日付をそのまま納期の欄に入れたくなります。票は答えの出発点で、約束を決めるのは工務課と営業です。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: お客ごとの受注の仕様と部数、校正の戻り方、外注先との取引の記録、工場の稼働の暦です。お客の印刷物の発行の時期や部数は、お客の販促や発表の予定そのものです。
- データを外に出さない … 予測は社内のサーバーの中で動き、生成AIや外部のサービスに記録を送りません
- お客の戻り方を評価に使わない … 「校正の戻りが遅いお客」という値は日数の見込みのための項目で、お客を選ぶ、価格を変えるといった判断に転用しません
- お客への約束は人が決める … 票の90%点は、10件に1件は超える日数です。お客にとって外せない発表の日の受注は、票より余裕を持って答えるかを工務課と営業で決めます
- 外注先の記録の扱い … 外注先ごとの戻りの日数は、外注先との取引の中身です。見込みの票には外注先の名前を出さず、「外注の戻りが遅め」とだけ出す形にできます
- 営業の画面の権限 … 見込みの画面で見られるのは、その営業が担当するお客の受注までにします
誤りが起きた場合のリスクは、約束した納期に遅れることと、余裕を見すぎて受注を逃すことの2つです。 前者は時点のずれで日数を短く見ると起き、後者は保留や刷り直しを学習に混ぜて日数を長く見ると起きます。どちらも前処理から出ているので、そこだけは設計で守ります。
10まず何から始めるか
1週目:日数の区切りを決める
「入稿の日」「校了の日」「出荷の日」を、何をもってその日とするかを工務課と営業で決めます。データの再入稿があった受注の入稿の日は最初か最後か、本機校正の校了はどの日か、のように具体的に決めます。
2〜3週目:1つの品目の記録をそろえる
受注の多い品目を1つ選び、直近2年の受注について、入稿・校了・出荷の日と仕様を書き出します。あわせて、工場の稼働の暦を CSV にし、保留と刷り直しの受注に印を付けます。
4週目:校了から出荷までで試す
第8章のとおり、古い1年半で学習し、新しい半年で、担当の答えと実際の日数と並べます。90%点に何割が収まったかを、工務課と一緒に見ます。
2か月目: 全部の品目で「校了から出荷まで」の毎朝の票を出す半自動化を始めます。担当はこれまでどおり自分で答えながら、票と見比べます。あわせて、工務の台帳の校正の記録を受注番号に結び付けます。3か月目以降: 校了までのモデルと営業の見込みの画面を足し、遅れの印を朝の打合せで使います。90%点に9割前後が収まる月が続き、担当が休みの日でも営業が票で納期を答えられるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
HistGradientBoostingRegressor の loss に quantile があり(1.1で追加)ピンボール損失を使うこと。quantile の引数で推定する分位点を0と1のあいだで指定すること。categorical_features の既定が from_dtype で、データフレームの Categorical の型の列を区分の項目として扱うこと。欠けた値(NaN)を扱え、分かれ目ごとに送る側を学ぶこと。early_stopping の既定 auto は件数が1万を超えるか X_val・y_val を渡したときに有効になること。max_iter の既定が100であること。fit(X, y, sample_weight=None, *, X_val=None, y_val=None, ...) の形であること(scikit-learn 1.9.1) | scikit-learn: HistGradientBoostingRegressor | 2026-10-29 |
分位点の損失で5%点と95%点のモデルを別々に学習して90%の幅を作ること。幅に収まった割合で確かめ、学習の記録では約90%だったが確かめの記録では約80%にとどまり、確かめの記録では幅が狭すぎたと書かれていること。mean_pinball_loss で評価すること | scikit-learn: Prediction Intervals for Gradient Boosting Regression | 2026-10-29 |
TimeSeriesSplit が時間の順に並んだ記録を分け、未来の記録で学習して過去で確かめることを避けること。gap・test_size・max_train_size を指定できること | scikit-learn: TimeSeriesSplit | 2026-10-29 |
お客と約束する納期、印刷機の順番、外注先への依頼は、工務課と営業の判断で決めてください。 本記事は上記の公開情報で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-2382)についてのご相談はこちらから。
