給食センターの献立と残食量の記録から、翌月の献立の料理ごとの残食量を予測し、仕込みの予備分と献立の見直し案を出す
給食センターが毎日量っている料理ごとの残食量と過去の献立から、翌月の献立の料理ごとの残食率を学校ごとに予測します。 残りやすい料理の仕込みの予備分と、組み合わせの見直し案を、献立を確定する前に出します。
- 連携・自動化
- Python
- 対象業界
- 教育/自治体/飲食
- 対象部門
- 生産
- 対象業務
- 比較検討/集計・分析
- 主な課題
- データ分析に時間がかかる/判断に時間がかかる/属人化している
- AIで行う処理
- 予測
- 主な効果
- 判断支援/属人化解消/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 毎日、戻ってきた食缶を料理ごとに量り、学校ごとの残食量を記録表に入れる
- 月末に記録表を集計し、センターごと・料理の区分ごとの残食率を月報にまとめる
- 翌月の献立案ができたら、栄養教諭が献立の1日ずつについて、過去に同じ料理が出た日の残食量を記録表から探す
- 同じ料理が見つかれば、そのときの組み合わせと残食率を見て、残りそうかどうかを判断する
- 残りそうな日は、調理の責任者と相談して予備分の率を下げるか、組み合わせを入れ替える
- 献立と予備分の率を確定し、調理の指示書を作る
- 人栄養教諭が翌月の献立案を献立作成のソフトに入れ、表の形で書き出す
- 自動毎月の決まった日に Python のプログラムが動き、献立案・残食量の記録・喫食数の一覧を読み込む
- 自動料理名を料理マスタの「料理コード」にそろえ、区分・主材料・調理法を付ける
- 自動過去の記録で学習したモデルが、翌月の献立の学校ごと・料理ごとの残食率を、中央の値と多めの値の2つで予測する
- 自動予測から、料理ごとの予備分の率の案と、残食率が高く出た日の一覧を作る
- 自動残食率が高く出た日について、同じ料理が過去に低い残食率だった日の組み合わせを並べ、入れ替えの候補にする
- 人栄養教諭と調理の責任者が、印の付いた日だけを開き、予備分の率と組み合わせを決める
- 人献立と予備分の率を確定し、調理の指示書を作る
- 自動翌月の実績が入ったら、予測と実績の差を料理ごとに出し、次の学習に使う
各工程の詳しい説明を読む
- 毎日、戻ってきた食缶を料理ごとに量り、学校ごとの残食量を記録表に入れる
- 月末に記録表を集計し、センターごと・料理の区分ごとの残食率を月報にまとめる
- 翌月の献立案ができたら、栄養教諭が献立の1日ずつについて、過去に同じ料理が出た日の残食量を記録表から探す
- 同じ料理が見つかれば、そのときの組み合わせと残食率を見て、残りそうかどうかを判断する
- 残りそうな日は、調理の責任者と相談して予備分の率を下げるか、組み合わせを入れ替える
- 献立と予備分の率を確定し、調理の指示書を作る
(a)同じ料理を探すところで時間が尽きる。 3番目は、記録表を料理名で検索することになります。ところが料理名の付け方が年によって揺れ、「肉じゃが」と「肉じゃが(豚)」、「ひじきの煮物」と「ひじき煮」が別の行になっています。1日分を調べるのに、検索の言葉を変えながら何度も探すことになります。
(b)組み合わせの効き目が見えない。 同じ料理でも、主菜が何だった日か、汁物があった日かで残食率が変わります。記録表からそれを読み取るには、料理ごとではなく日ごとに並べ直す必要があり、手作業ではまず行われません。
(c)判断が担当者の経験に寄る。 予備分の率を決めるのは調理の責任者で、異動や退職があると見当ごと失われます。新しく来た栄養教諭は、記録表があっても、どこを見ればよいかが分かりません。
(d)結果が分かるのは翌月の月報。 予備分を下げた料理が実際に足りたのか、組み合わせを入れ替えた日に残食が減ったのかは、月末の集計まで分かりません。手を打った効果が、次の献立に返ってこない状態です。
- 【人】 栄養教諭が翌月の献立案を献立作成のソフトに入れ、表の形で書き出す
- 【自動】 毎月の決まった日に Python のプログラムが動き、献立案・残食量の記録・喫食数の一覧を読み込む
- 【自動】 料理名を料理マスタの「料理コード」にそろえ、区分・主材料・調理法を付ける
- 【自動】 過去の記録で学習したモデルが、翌月の献立の学校ごと・料理ごとの残食率を、中央の値と多めの値の2つで予測する
- 【自動】 予測から、料理ごとの予備分の率の案と、残食率が高く出た日の一覧を作る
- 【自動】 残食率が高く出た日について、同じ料理が過去に低い残食率だった日の組み合わせを並べ、入れ替えの候補にする
- 【人】 栄養教諭と調理の責任者が、印の付いた日だけを開き、予備分の率と組み合わせを決める
- 【人】 献立と予備分の率を確定し、調理の指示書を作る
- 【自動】 翌月の実績が入ったら、予測と実績の差を料理ごとに出し、次の学習に使う
7番目で人が見るのは、印の付いた日だけです。 60件すべてを開くのではなく、予測の残食率が高い日と、予測の幅が広い日(記録が少なく見当が付けにくい日)に絞ります。全件を見る設計にすると、30分が10分にはなりません。
6番目は、AIに献立を作らせているのではありません。 過去の記録のなかから「同じ料理が残らなかった日」を探して並べるだけです。献立を入れ替えるかどうかは、栄養価と食材の調達を知っている栄養教諭が決めます。
02今回想定するシステム構成
献立作成のソフト(翌月の献立案を表の形で書き出し) 残食量の記録表(学校ごと・料理ごとの返却量) 喫食数の一覧(学校ごと・日ごとの人数) ▼【トリガー】毎月10日の夜(献立案の締め切りの翌日) Python(pandas) ├──▶ 料理名を料理マスタの料理コードにそろえる ├──▶ 過去の同じ料理の残食率、その日の組み合わせを特徴量にする ▼ scikit-learn(HistGradientBoostingRegressor、quantile) │ 学校 × 日 × 料理ごとの残食率(中央の値・多めの値) ▼ Python ── 予備分の率の案、印を付ける日、入れ替えの候補 ▼ 【人が印の付いた日だけ確認】── 栄養教諭・調理の責任者 ▼ 献立の確定と調理の指示書
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(pandas・scikit-learn) | R |
| 処理エンジン | scikit-learn の HistGradientBoostingRegressor(loss="quantile") | LightGBM、statsmodels の分位点回帰 |
| 集計 | Python(予備分の率の案と、印を付ける日の抽出) | 献立作成のソフトの帳票 |
| データの取得元 | 献立作成のソフトの書き出し、残食量の記録表 | - |
| 結果の出力先 | センターの共有フォルダの見直し表 | - |
新しく足すのは、Python のプログラムと料理マスタだけです。 献立作成のソフトと記録表はいまのものを使い、この構成から書き換えることはしません。調理の指示書を作るのも、これまでどおり人です。
生成AIは使いません。 予測は数値の記録から行い、見直し案も表の形で出します。給食は18歳未満の児童・生徒が食べるもので、生成AIのサービスには18歳未満が利用者になりうる使い方を規約で制限しているものがあります。この構成では、利用者は大人の職員だけで、生成AIも通らないため、その論点そのものが生じません。
土台になるのは、scikit-learn の HistGradientBoostingRegressor です。 ヒストグラムに基づく勾配ブースティングの回帰で、損失関数に "quantile" を選ぶと、quantile の引数に0から1の値を入れて、どの分位点を推定するかを指定できます。 0.5で中央の値、0.8で多めの値を出し、2つのモデルの差を「予測の幅」として使います。
欠けた値(NaN)をそのまま扱えます。 公式のページによれば、学習のときに分かれ目ごとに欠けた値を左右どちらに送るかを、得られる改善の大きさから学びます。初めて出る料理の「前回の残食率」のように、値が無いこと自体に意味がある項目を、平均で埋めずに渡せます。
カテゴリの項目も、そのまま渡せます。 categorical_features の既定は "from_dtype" で、データフレームの列の型がカテゴリ(Categorical)なら、カテゴリとして扱われます。料理の区分、主材料、調理法、学校を、数値に置き換えずに渡します。カテゴリの数は max_bins 以下である必要があるので、料理コードそのものではなく区分や主材料のほうを渡します。
03どうやって実装するのか
処理の起点を決める
毎月10日の夜に、翌月分をまとめて動かします。 栄養教諭が献立案を献立作成のソフトに入れ終える締め切りを9日にしておき、その翌日の夜に予測を出します。翌朝、見直し表がセンターの共有フォルダに置かれている状態にします。
献立の確定会議までに、見直しを1回はさめる日程にします。 予測が会議の当日に出ても、組み合わせを入れ替える時間がありません。10日に出して、15日ごろの会議で確定する流れが、献立の作り方に合います。
月の途中にもう1回、学校ごとの喫食数が固まった時点で動かし直します。 学校行事や学級閉鎖で喫食数が変わると、予備分の量(率ではなく量)が変わるためです。このとき、献立と予測の残食率は変えず、量だけを計算し直します。
学習のやり直しは、3か月に1回にします。 毎月学習し直すと、たまたま残食が多かった月に引っ張られます。新しい学期の初めに傾向が変わることが多いので、4月・9月・1月の前に学習し直すのが目安です。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 献立 | 日付、センター、料理名、料理の区分(主食・主菜・副菜・汁物・デザート)、1人分の量、行事食かどうか | 献立作成のソフトの書き出し |
| 残食量の記録 | 日付、学校、料理名、配缶量(kg)、残食量(kg) | 残食量の記録表 |
| 喫食数 | 日付、学校、喫食数、学年の構成(小学校・中学校) | 喫食数の一覧 |
| 料理マスタ | 料理コード、料理名の表記ゆれ、区分、主材料、調理法(揚げる・煮る・和える…)、味付けの系統 | 新しく作る |
| 行事の予定 | 遠足、運動会、短縮授業、学級閉鎖 | 学校からの連絡を給食担当が入力 |
質を決めるのは、料理マスタです。 献立作成のソフトと記録表で料理名の付け方が揺れていると、同じ料理の過去の記録が拾えず、モデルは毎回「初めて出る料理」として予測します。 第3章の(a)の問題は、AIを入れても料理マスタが無ければそのまま残ります。
残食量は、学校ごと・料理ごとの重さです。 学級ごとの記録があっても、この構成には入れません。学級の単位まで下げると、少人数の学級では特定の児童・生徒の食べ方に近づくためです。
データの取得方法を決める
献立作成のソフトからは、献立を表の形(CSV)で書き出します。書き出しの列の並びは、ソフトの版が上がると変わることがあるので、列名で読み込みます。 残食量の記録表と喫食数の一覧は、スプレッドシートを決まった名前で書き出して、共有フォルダに置きます。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 翌月の献立案 | 献立作成のソフトの書き出し | 予測の対象(学校 × 日 × 料理) |
| 過去2年以上の献立と残食量 | 記録表と献立の書き出し | 学習のデータ |
| 学校ごとの喫食数 | 喫食数の一覧 | 残食量(kg)から残食率への換算と、予備分の量の計算 |
| 行事の予定 | 給食担当の入力 | 短縮授業・遠足の翌日などの印 |
予測するのは残食量ではなく、残食率(残食量 ÷ 配缶量)です。 学校によって人数が10倍違うので、量のまま学習すると大きな学校の傾向に引っ張られます。率で学習し、量に戻すのは最後の段にします。 量に戻すときは、予測の残食率に、確定した喫食数から計算した配缶量を掛けます。喫食数が月の途中で変わっても、率の予測はそのまま使い回せます。 環境省の調査でも、残食率は「出席した人数分の学校給食の提供量に対する、食べられずに残された給食の量の割合」として扱われています。
AIへ渡す前に整形する
- 料理名をそろえる … 献立と記録表の料理名を料理マスタの表記ゆれの一覧と照らし、料理コードを付けます。付かなかった料理名は一覧にして、栄養教諭がマスタに足します
- 配缶量が0や空の行を外す … 記録の入れ忘れです。率が計算できないので学習に使いません
- 残食量が配缶量を超える行を外す … 食缶の重さの引き忘れなど、量り方の誤りです
- 行事の日に印を付ける … 遠足・運動会の当日と翌日、短縮授業の日は残食の出方が違うので、項目として渡します
- 過去の残食率を項目にする … 同じ料理コードの前回の残食率、同じ学校での直近3回の平均。予測する日より前の記録だけから計算します
- 組み合わせを項目にする … その日の主菜の調理法、汁物の有無、揚げ物の品数、デザートの有無
- 季節と曜日を項目にする … 月、曜日、長期休みの明けから何日目か
5番目を間違えると、予測が実際より良く見えます。 平均を出すときに予測する日の記録まで混ぜると、答えを見ながら予測していることになります。学習のときも予測のときも、「その日より前」の記録だけで計算する関数を1つ作り、両方から同じものを呼びます。
4番目の行事の印は、人が入れる項目です。 予定表から自動で取れない学校が多いので、給食担当が月に1回、学校からの連絡をまとめて入れます。入れ忘れると、遠足の翌日の残食が「料理のせい」として学習されます。 過去2年分の行事の印は、学校の年間行事予定から最初に一度だけまとめて入れます。
AIに処理させる
させるのは、学校 × 日 × 料理ごとの残食率を、中央の値(0.5の分位点)と多めの値(0.8の分位点)で予測することです。 2つのモデルを別々に学習させます。
| 予測するもの | 使う値 | 何に使うか |
|---|---|---|
| 中央の値 | quantile=0.5 | 予備分の率の案の基準 |
| 多めの値 | quantile=0.8 | 足りなくならない側の上限。予備分を下げすぎないための目安 |
| 予測の幅 | 多めの値 − 中央の値 | 幅が広い料理は記録が少ない。人が見る印を付ける |
学習の検証は、時間の順を守って行います。 scikit-learn の TimeSeriesSplit は、時間の順に並んだデータを学習と検証に分ける仕組みで、公式のページによれば、ほかの交差検証の方法では未来のデータで学習して過去のデータで評価することになるため不適切とされています。k回目の分割では最初のk個の区間を学習に、k+1個目を検証に使います。
検証の区間は1か月ずつにし、gap で学習の区間の最後を空けます。 gap は学習の区間の終わりから検証の前に除く件数です。翌月を予測する実際の使い方では、直近の数日の記録がまだ集計されていないので、その状態に合わせます。
| させないこと | 理由 |
|---|---|
| 1人分の量を変える | 学校給食摂取基準を踏まえて栄養教諭が決めるもの |
| 献立を作る・料理を差し替える | 栄養価、食材の調達、アレルギーの対応は人が判断する |
| 予備分を0にする案 | こぼれる分と急な人数の変動の備えは残す |
| 学級・個人の単位の予測 | 少人数になると特定の児童・生徒に近づく |
| 外れた予測を手で直して記録する | 次の学習が自分の手直しを学ぶ |
3行目は、プログラムの側で下限を持たせます。 中央の値の予測が低くても、予備分の率は調理の責任者が決めた下限を下回らないようにします。予測が外れて足りなくなった日の損失は、残食が減った分よりはるかに大きいからです。
検証で見るのは、全体の当たり具合だけではありません。 料理の区分ごと、学校種(小学校・中学校)ごとに、中央の値と実績の差の平均を出します。主菜は当たるのに副菜は外れる、中学校だけ外れるといった偏りは、全体の数字では見えません。偏りが出た区分は、印を付けやすくする(wide の基準を下げる)ことで、人の目に回します。
多めの値(0.8)の当たり方も確かめます。 実績の残食率が多めの値を超えた日が、検証の区間のおよそ2割に収まっていれば、分位点の推定がおおむね働いています。5割を超えるようなら、多めの値が低すぎ、予備分を下げる規則が危うくなります。 その場合は規則を使わず、予測を参考の数字としてだけ出す段階に戻します。
指示内容を固定する
この構成は生成AIを使わないため、AIへの文章の指示はありません。代わりに、モデルの設定と、予測の後の規則をこの形で書いておきます。 担当が替わっても、何を決めてあるかが読めるようにするためです。
【モデルの設定】
- 目的の値: 残食率(残食量 ÷ 配缶量)。0〜1
- モデル: HistGradientBoostingRegressor
中央の値 … loss="quantile", quantile=0.5
多めの値 … loss="quantile", quantile=0.8
- カテゴリの項目: 料理の区分、主材料、調理法、味付けの系統、学校、曜日
(データフレームの列の型を category にして渡す)
- 欠けた値: 初めて出る料理の「前回の残食率」は NaN のまま渡す。平均で埋めない
- 検証: TimeSeriesSplit(1か月ずつ、gap は直近の未集計の日数)
【予測の後の規則】
- 予備分の率の案 = 調理の責任者が決めた基準の率 −(基準の残食率 − 中央の値)× 係数
ただし、料理の区分ごとの下限を下回らない
多めの値が基準の残食率を超える料理は、予備分を下げない
- 印を付ける日:
中央の値が、その料理の区分の過去の75パーセンタイルを超える
または 予測の幅が 0.10 を超える
または 初めて出る料理を含む
- 入れ替えの候補:
印を付けた料理と同じ料理コードで、残食率が低かった過去の日を最大3つ
その日の主菜・汁物・デザートを並べる
- 出さないもの: 1人分の量の変更、献立の差し替えの決定、学級ごとの数字
「平均で埋めない」を明記しているのは、埋めると初めて出る料理が平均的な料理として予測されるからです。 初めて出る料理こそ、人が見るべき日です。NaN のまま渡し、別の規則で必ず印を付けます。
係数と下限は、調理の責任者と決める値です。 最初は係数を小さくし、予備分の率がほとんど動かない状態から始めます。実績と比べて足りなくなった日が出ないことを確かめてから、少しずつ上げます。
出力形式を固定する
センターの共有フォルダに、次の2つの表を置きます。
【見直し表(1行=センター × 日 × 料理)】
| 列 | 中身 |
|---|---|
date / center | 日付とセンター |
dish_code / dish_name | 料理コードと献立の料理名 |
waste_rate_p50 / waste_rate_p80 | 学校の配缶量で重み付けしたセンター全体の残食率の予測 |
margin_base / margin_proposed | 基準の予備分の率と、予備分の率の案 |
flag | high / wide / new_dish / 空 |
alt_days | 入れ替えの候補にした過去の日(最大3つ) |
note | 行事の印など |
【学校別の表(1行=学校 × 日 × 料理)】
{
"date": "2026-11-12",
"center": "第2センター",
"school_code": "E07",
"dish_code": "SD-0142",
"dish_name": "ひじきの煮物",
"served_kg_plan": 18.4,
"waste_rate_p50": 0.21,
"waste_rate_p80": 0.29,
"past_count": 9,
"flags": ["high"],
"event": ""
}
1つ目の理由は、見るべき行が flag で決まることです。 栄養教諭は見直し表を flag で絞り込んで開き、空の行は流し見で終わります。全行を読む設計にしないことが、10分に収まる条件です。
2つ目は、past_count を出すことです。 同じ料理が過去に何回出たかで、予測をどこまで信じてよいかが変わります。9回なら参考になり、1回なら見当に近いということを、数字で示します。
3つ目は、センター全体と学校ごとを分けることです。 予備分は調理の段階で決めるのでセンター全体の値で足り、学校ごとの値は配缶の量を見直すときに使います。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 献立作成のソフト | 表の形(CSV)の書き出し | 献立案を読む。書き込まない |
| 残食量の記録表 | スプレッドシートの書き出し | 過去の記録を読む |
| 喫食数の一覧 | スプレッドシートの書き出し | 人数を読む |
| 共有フォルダ | ファイルの保存 | 見直し表と学校別の表を置く |
| 実行の基盤 | センターの業務端末のタスクの予約、または教育委員会のサーバー | 毎月10日の夜に動かす |
献立作成のソフトへは書き込みません。 予備分の率の案は見直し表に出すだけで、確定した率を調理の指示書に写すのは調理の責任者です。プログラムが献立や指示書を直接変える経路を作らないことで、誤った予測がそのまま調理に届くことを防ぎます。
人が確認する
人が開くのは flag の付いた行だけです。 1センター1日分の献立で、印が付くのは1〜2品という想定です。
new_dishを先に見る … 初めて出る料理です。予測は参考にとどめ、似た料理の記録を栄養教諭が自分で確かめますhighを見る … 残食率が高く出た料理です。alt_daysの過去の日の組み合わせを見て、入れ替えるかを決めますwideを見る … 予測の幅が広い料理です。予備分の率を下げる案が出ていても、採るのは記録が増えてからにします- 決めたことを記録する … 予備分の率を案のとおりにしたか、組み合わせを入れ替えたか
例えば、ひじきの煮物に high が付いた日です。 alt_days に、同じ料理が残食率の低かった過去の日が3つ並び、そのうち2つは主菜がカレーではなく焼き魚の日だったと分かります。栄養教諭は、主菜を入れ替えるか、ひじきの煮物を別の日に移すかを、食材の発注の締め切りと栄養価の計算を見ながら決めます。表が示すのは手がかりまでです。
4番目を省かないでください。 案を採った日と採らなかった日を分けて記録しておかないと、翌月の実績が出たときに、予測が外れたのか、人が案を採らなかったのかが分かりません。
例外に対処する
| 起きること | 対応 |
|---|---|
| 料理名が料理マスタに無い | 料理コードを付けずに new_dish の印。一覧を栄養教諭に返し、マスタに足してもらう |
| 献立案の書き出しが締め切りまでに無い | プログラムは動かさず、給食担当へ知らせる。前月の献立で予測しない |
| 記録表に1週間以上の空白がある | その期間を学習から外し、見直し表の冒頭に注記する |
| 学級閉鎖・臨時休校で喫食数が大きく変わる | 予備分の「量」だけを計算し直す。率と予測はそのまま |
| 新しい学校がセンターの配送先に加わる | 学校の過去の記録が無い。同じセンターの同じ学校種の平均の傾向で予測し、wide の印を付ける |
| 行事食・セレクト給食の日 | 過去の記録と比べにくいので印を付け、予測は参考にとどめる |
| 献立作成のソフトの版が上がり、書き出しの列名が変わる | 読み込みで止め、見直し表を出さない。列の対応表を直してから動かし直す |
| 予測が実績から大きく外れた日が続く | 料理マスタの区分の付け方か、行事の印の入れ忘れを先に疑う |
上から2行目は、締め切りを守らせるための決まりです。 前月の献立のまま予測を出すと、見直し表がそれらしく見えるぶん、誤った表で確定会議が進みます。 出さないほうが安全です。
記録を残す
- 予測に使った献立案・残食量の記録・喫食数の書き出しの、そのときの版
- 学習したモデルの設定と、学習に使った期間、検証の結果(料理の区分ごとの外れ方)
- 見直し表と学校別の表の全行
- 人が決めたこと … 予備分の率を案のとおりにしたか、組み合わせを入れ替えたか
- 翌月の実績が入ったあとの、予測と実績の差(料理ごと)
- 料理マスタに足した料理名と、足した日
4つ目と5つ目を並べて持つのが、この構成のいちばんの成果物です。 案を採った日に残食が減ったのか、足りなくならなかったのかが、1年分たまると、ベテランの見当がどこまで正しかったかが数字で分かります。 異動があっても、その記録は残ります。
04実装レベルの3段階
半自動化だけでも、第4章の①はほぼ無くなります。 同じ料理を探す作業が、料理コードでの突き合わせに変わるからです。ただし、組み合わせの効き目と、記録の少ない料理の扱いは人の判断に残ります。 本格構成で、1件30分が10分になり、この段階が本記事の想定です。 差が大きいのは、組み合わせを項目に入れた予測と、見るべき日を絞る印です。人は印の付いた1〜2品だけを見て、決めたことを記録します。 段階を飛ばさないでください。 半自動化の表を3か月使うと、料理マスタの抜けと、行事の印の入れ忘れが先に見つかります。それを直してから予測に進むほうが、予測の外れが少なくなります。
05工数削減シミュレーション
導入後 60件 × 10分 ÷ 60 = 10 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 学校給食センター(共同調理場)を複数持ち、1日に数千食を調理している市町村の教育委員会や、給食の調理・配送を受託している事業者。食缶ごとの返却量を毎日量って記録しているのに、記録が月報の集計に使われるだけで、翌月の献立や仕込みの量に生かせていない場合。栄養教諭や調理の責任者が、経験から「この料理は残る」と見当を付けて仕込みの予備分を決めている場合。過去2年以上の献立と残食量の記録を、表の形で書き出せる場合。
- 単独調理場で1校分だけを調理し、残食量を料理ごとに量っていない場合。残食量の記録が月の合計だけで、日と料理の単位まで遡れない場合。献立の型が毎年大きく入れ替わり、同じ料理や似た料理がくり返し出てこない場合。なお、1人分の量(学校給食摂取基準に沿った配食の量)の決定、献立の栄養価の判断、食物アレルギーへの対応は、この構成では代替できません。
07最小構成で試す方法
- 1つのセンターについて、過去2年分の献立と残食量の記録を書き出す
- 料理名の表記ゆれを、よく出る料理の上位50品だけ手でそろえる
- 献立の区分(主食・主菜・副菜・汁物)ごとに、料理別の残食率の平均と、出た回数の表を作る
- その表を、直近1か月の実績と並べ、平均から大きく外れた日に何があったか(行事、組み合わせ)を書き出す
- 栄養教諭と調理の責任者に表を見せ、「この料理は残る」という見当と合っているかを聞く
まだ予測のモデルは作りません。 表を作るだけで、料理名がそろうか、記録の空白がどれくらいあるかが分かります。この2つが整わないうちにモデルを作っても、予測は当たりません。
| 出てきた内容 | 判断 |
|---|---|
| 平均の表が、ベテランの見当とおおむね合う | 記録は使える。モデルに進む |
| 料理名がそろわず、同じ料理が何行にも分かれる | 料理マスタが先。 モデルの問題ではない |
| 記録の空白や、配缶量の入れ忘れが多い | 量る手順と記録表の入れ方を先に直す |
2行目が出ることは珍しくありません。 料理名の揺れは、献立を作る人が替わるたびに増えます。料理マスタを作る作業は、予測をしなくても、月報の集計を正しくする効果があります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 同じ料理の過去の記録が拾えない | 料理マスタに表記ゆれの一覧を持たせる。 新しい料理名は毎月足す |
| 予測が実際より良く見える | 過去の平均の計算に、予測する日の記録を混ぜない。同じ関数を学習と予測の両方で使う |
| 交差検証の結果が良すぎる | 時間の順を無視して分けている。TimeSeriesSplit で分ける |
| 初めて出る料理が平均的な料理として予測される | 欠けた値を平均で埋めない。NaN のまま渡し、必ず印を付ける |
| 大きな学校の傾向に全体が引っ張られる | 量ではなく残食率で学習し、量に戻すのは最後にする |
| 遠足の翌日の残食が料理のせいになる | 行事の印を項目に入れる。入れ忘れを月1回確かめる |
| 予備分を下げすぎて足りない日が出る | 料理の区分ごとの下限を持たせ、多めの値が高い料理は下げない |
| 案を採ったかどうかが残らない | 人が決めたことを見直し表の列に書く |
| 学級ごとの記録を入れたくなる | 少人数では特定の児童・生徒に近づく。学校の単位にとどめる |
| 1人分の量まで見直しの対象にしたくなる | 学校給食摂取基準を踏まえて決める量。この構成では扱わない |
上の2行が、この構成の失敗のほとんどです。 料理マスタが無ければ予測の材料が集まらず、過去の平均に答えが混ざれば、検証では当たっていたのに使うと外れるモデルになります。
下の2行は、作り始めてから出てくる誘惑です。 細かい単位で予測したくなり、残る料理の量を減らしたくなります。どちらも、給食の目的とこの構成の範囲を超えます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 献立、学校ごと・料理ごとの配缶量と残食量、学校ごとの喫食数、行事の予定です。児童・生徒の氏名、学級、食物アレルギーの情報は扱いません。
- 個人に近づく単位まで下げない … 学級ごと、少人数の特別支援学級ごとの記録は入れません。学校の単位でも、ごく小さな学校は他校とまとめて扱うことを検討してください
- 食物アレルギーの対応を混ぜない … 除去食・代替食の数は別の仕組みで管理しているはずです。この構成の予備分の案を、除去食の量に当てはめないでください
- 予測で1人分の量を決めない … 学校給食摂取基準は、学校給食法第8条に基づく学校給食実施基準で定められ、文部科学省の令和3年の通知では、全国的な平均値であり、地域の実情等に配慮して弾力的に運用するものとされています。その運用を判断するのは栄養教諭で、予測ではありません
- 生成AIを後から足すときは規約を確かめる … 見直し表の説明文を生成AIで書かせたくなることがあります。生成AIのサービスには、18歳未満が利用する(しうる)サービスでの利用を制限している規約があります。 利用者を職員に限ることと、児童・生徒の情報を渡さないことを、足す前に確かめてください
- データの置き場所を決める … 記録は教育委員会の管理するフォルダに置き、外部のサービスに送らない構成にしています。プログラムを委託先が作る場合も、記録の持ち出しの範囲を契約で決めてください
誤りが起きた場合のリスクは、予備分を下げすぎて給食が足りなくなることと、残食が減らないまま予測が信じられ続けることの2つです。 前者は下限と多めの値の規則で防ぎ、後者は予測と実績の差を毎月出すことで防ぎます。
10まず何から始めるか
1週目:記録を書き出して空白を数える
1つのセンターの過去2年分の献立と残食量の記録を書き出します。配缶量の入れ忘れ、記録の無い週、料理名の揺れがどれくらいあるかを数えます。
2週目:料理マスタを作る
よく出る料理の上位50品について、料理コード、表記ゆれの一覧、区分、主材料、調理法を決めます。残りの料理は、毎月の献立に出てきた順に足していきます。
3週目:平均の表をベテランに見せる
料理別の残食率の平均と回数の表を作り、栄養教諭と調理の責任者に見せます。見当と合っているか、合っていないならどの料理かを聞き取り、行事の印の付け方を決めます。
4週目:翌月の献立に過去の記録を付ける
翌月の献立案の各料理に、過去の平均と回数を自動で付ける半自動化の表を作ります。確定会議で使ってもらい、どの列を見たかを聞きます。
2か月目: 分位点の予測を足し、見直し表に waste_rate_p50 と waste_rate_p80 を出します。予備分の率の案はまだ出さず、予測と実績の差を1か月分ためます。 3か月目以降: 予備分の率の案と印、入れ替えの候補を足し、案を採ったかどうかを記録し始めます。半年分の記録で、案を採った料理で足りなくなった日が無いことを確かめた時点で、ほかのセンターへ広げます。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
HistGradientBoostingRegressor の損失関数に quantile があり、quantile の引数で0から1の分位点を指定すること。欠けた値(NaN)を扱え、学習時に分かれ目ごとに欠けた値の送り先を学ぶこと。categorical_features の既定が "from_dtype" で、カテゴリ型の列をカテゴリとして扱い、カテゴリの数が max_bins 以下である必要があること | scikit-learn: HistGradientBoostingRegressor | 2026-10-14 |
TimeSeriesSplit が時間の順に並んだデータの分割に使うもので、ほかの交差検証では未来のデータで学習し過去で評価することになり不適切とされること。k回目の分割で最初のk個を学習、k+1個目を検証に使うこと。gap が学習の区間の終わりから検証の前に除く件数であること | scikit-learn: TimeSeriesSplit | 2026-10-14 |
| 学校給食から発生する食品ロスの調査(平成27年1月実施)で、残食率が「出席した人数分の学校給食の提供量に対する、食べられずに残された給食の量の割合」と定義されていること。残食率を把握している市区町村が約3割で、平均値が約6.9%であったこと。共同調理場のみで調理している割合が約50%であったこと | 環境省: 学校給食から発生する食品ロス等の状況に関する調査結果について | 2026-10-14 |
| 学校給食摂取基準が学校給食法第8条第1項に基づく学校給食実施基準で定められること。令和3年の通知で、全国的な平均値を示したものであり、地域の実情等に十分配慮し弾力的に運用することとされていること | 文部科学省: 学校給食実施基準の一部改正について | 2026-10-14 |
1人分の量と献立の栄養価の判断は、栄養教諭と教育委員会で行ってください。 本記事は上記の公式ページで確認できた範囲だけを扱っています。学校給食摂取基準のその後の改正の有無は、文部科学省の最新の告示で確かめてください。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1538)についてのご相談はこちらから。
