飲食チェーンの本部が、店舗ごとの過去の売上と天気・祝日・行事から Python で翌週の日別売上を幅つきで予測し、店舗の人時の上限とセントラルキッチンの製造量の計画に使う
POSレジの日別売上、気象庁の週間天気予報、祝日、販促と店の周りの行事の予定から、全店舗の翌週の日別売上を Python で幅つきで予測し、店舗ごとの人時の上限と、セントラルキッチンの製造量の案にします。店長は印の付いた日だけ直します。
- 連携・自動化
- Python
- 対象業界
- 宿泊/小売/飲食
- 対象部門
- 経営企画
- 対象業務
- 集計・分析
- 主な課題
- データ分析に時間がかかる/判断に時間がかかる/属人化している
- AIで行う処理
- 予測
- 主な効果
- 判断支援/属人化解消/工数削減
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 店長が、POSレジの画面で前年の同じ週と直近の4週の売上を見る
- 店長が、近所の行事・天気予報・販促の予定を思い浮かべ、翌週の日ごとの売上を本部の表に書く
- 本部の担当者が、40店の表を集めて、前年や直近と大きく違う店に電話で理由を聞く
- 本部の担当者が、店ごとの見込みを目標の人時売上高で割り、人時の上限を出して店長に返す
- 本部の担当者が、全店の見込みを足し、品目ごとの売上の構成比を掛けて、セントラルキッチンの製造量を出す
- 店長が、人時の上限の中でシフトを組む
- 翌週が終わったら、見込みと実績の差を本部の表に書く(理由は書かない)
- 自動毎日、POSレジの店舗・日ごとの売上と客数を書き出し、本部のデータの置き場所に保存する
- 自動毎日、気象庁の府県週間天気予報の電文を取り、発表の日時ごとにそのまま保存する
- 人店長が、店の周りの行事(花火大会、商業施設の催し、学校の行事)と臨時の休業・営業時間の変更を、行事の予定表に書く
- 自動毎週木曜の朝、Python が翌週の月曜から日曜の、店舗・日ごとの売上を3本(少なめ・真ん中・多め)で予測する
- 自動予測を人時の上限と、品目ごとの製造量に換算し、確かめが要る日に印を付ける
- 人店長が、印の付いた日だけを見て、直すなら理由を添えて直す
- 人本部の担当者が、店長の直しを見て、人時の上限と製造量を確定する
- 自動翌週が終わったら、予測・店長の直し・実績を並べて、どちらが当たったかを記録する
各工程の詳しい説明を読む
- 店長が、POSレジの画面で前年の同じ週と直近の4週の売上を見る
- 店長が、近所の行事・天気予報・販促の予定を思い浮かべ、翌週の日ごとの売上を本部の表に書く
- 本部の担当者が、40店の表を集めて、前年や直近と大きく違う店に電話で理由を聞く
- 本部の担当者が、店ごとの見込みを目標の人時売上高で割り、人時の上限を出して店長に返す
- 本部の担当者が、全店の見込みを足し、品目ごとの売上の構成比を掛けて、セントラルキッチンの製造量を出す
- 店長が、人時の上限の中でシフトを組む
- 翌週が終わったら、見込みと実績の差を本部の表に書く(理由は書かない)
(a)見込みの立て方が店長ごとに違う。 前年の同じ曜日に何%を掛ける店長、直近の4週の平均を使う店長、勘で丸める店長。同じ連休でも、店によって見込みの強さが違います。 本部はそれを足すしかありません。
(b)本部の取りまとめに時間がかかる。 40店の表が木曜の夕方に揃うまで待ち、揃ってから電話で確かめます。金曜の午前に製造量を決める段取りが、木曜の夜にずれ込みます。
(c)外れた理由が残らない。 雨で外れたのか、近くの店の開店で外れたのか、販促が効かなかったのか。次の見込みに生かす材料がありません。
- 【自動】 毎日、POSレジの店舗・日ごとの売上と客数を書き出し、本部のデータの置き場所に保存する
- 【自動】 毎日、気象庁の府県週間天気予報の電文を取り、発表の日時ごとにそのまま保存する
- 【人】 店長が、店の周りの行事(花火大会、商業施設の催し、学校の行事)と臨時の休業・営業時間の変更を、行事の予定表に書く
- 【自動】 毎週木曜の朝、Python が翌週の月曜から日曜の、店舗・日ごとの売上を3本(少なめ・真ん中・多め)で予測する
- 【自動】 予測を人時の上限と、品目ごとの製造量に換算し、確かめが要る日に印を付ける
- 【人】 店長が、印の付いた日だけを見て、直すなら理由を添えて直す
- 【人】 本部の担当者が、店長の直しを見て、人時の上限と製造量を確定する
- 【自動】 翌週が終わったら、予測・店長の直し・実績を並べて、どちらが当たったかを記録する
6番目で、店長は全部の日を書き直しません。 印の無い日は予測のまま使います。店長の仕事は、モデルが知らない事情(近所の店の閉店、店の前の工事)を足すことに変わります。
8番目で「どちらが当たったか」を記録するのは、店長の直しを評価するためではありません。 どんな事情のときに店長の直しが効くかが分かれば、その事情を行事の予定表の項目に足して、モデルに学ばせられます。
02今回想定するシステム構成
POSレジ(店舗・日ごとの売上と客数)── 毎日書き出し
気象庁防災情報XML(府県週間天気予報)── 毎日取得して発表日時ごとに保存
内閣府の祝日のCSV/販促の予定表/行事の予定表(店長が記入)
▼【トリガー】毎週木曜 5:00(定時実行)
Python(pandas)
├──▶ 店舗・日ごとの表に整える(休業日・営業時間の短縮を印に)
├──▶ 曜日・祝日・連休の位置・販促・行事・天気予報の列を作る
▼
LightGBM(全店で1つのモデル、分位点の損失で3本)
│ 少なめ(0.2)・真ん中(0.5)・多め(0.8)
▼
換算 ── 人時の上限 = 真ん中 ÷ 目標の人時売上高
製造量 = 全店の売上 × 品目ごとの構成比(品目の持ちで真ん中か多めを選ぶ)
▼
印付け ── 新店/行事/幅が広い/前年と大きく違う/天気予報の範囲外
▼
【店長が印の付いた日だけ確かめ、本部が確定】
▼
シフトの仕組みへ人時の上限、セントラルキッチンへ製造量の案| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(pandas・LightGBM・scikit-learn) | R |
| 処理エンジン | LightGBM(分位点の損失) | scikit-learn の HistGradientBoostingRegressor、statsmodels |
| 集計 | Python(人時の上限と製造量への換算、予測と実績の照合) | - |
| 保管 | 本部のデータの置き場所(売上・天気予報の電文・予測・直し・実績) | - |
新しく足すのは、Python の処理と、データの置き場所と、行事の予定表だけです。 POSレジ、シフトの仕組み、セントラルキッチンの製造計画の表は変えません。この構成は、どの仕組みにも直接書き込みません。 人時の上限と製造量は表で渡し、店長と製造の担当が自分の仕組みに入れます。
定時実行の場所は、社内のサーバーかクラウドの定時実行の仕組みです。 週に1回、数分から十数分で終わる処理なので、大きな計算の資源は要りません。難しいのは計算ではなく、毎日の売上と天気予報を欠かさず貯めることです。
天気は、気象庁の防災情報XMLから取ります。 公開している電文の一覧では、府県週間天気予報は「定時」の分類に入っています。公式のページでは、長期のフィードは1時間ごとに更新され数日分の電文を持つとされ、毎日決まった時刻に取りに行けば取りこぼしません。 同じページは、確実で即時の配信が要るなら気象業務支援センターや予報業務の許可を受けた事業者を使うよう案内しています。欠けた日があっても予測は止まらない作りにしたうえで、まずは防災情報XMLで始めます。
03どうやって実装するのか
処理の起点を決める
起点は3つです。 毎日の書き出し、毎日の天気予報の取得、毎週木曜の予測です。
1つ目は、POSレジの毎日の書き出しです。 閉店後の売上の締めの後に、店舗・日ごとの売上・客数・営業時間を CSV で書き出し、本部の置き場所に入れます。書き出しの仕組みが POS にあるかは、POS の会社に確かめます。 無ければ本部の集計の画面から週に1回書き出します。
2つ目は、毎日の天気予報の取得です。 防災情報XMLの長期のフィードを毎朝見に行き、府県週間天気予報の電文を、店のある地域の分だけ取り出して保存します。公式のページでは、1つのURLで1日に10GB以上のダウンロードがあると、その送り元はアクセスを止められるとされています。 すでに持っている電文を取り直さないよう、取った電文の識別子を記録しておきます。
3つ目は、毎週木曜の朝の予測です。 5時に動かし、店長が出勤する時刻には予測と印が表に並んでいるようにします。日曜の朝にもう一度動かし、天気予報が新しくなった分で製造量だけを見直します。 人時の上限はシフトが組まれた後なので、日曜には変えません。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 日別の売上 | 店舗、日付、売上(税抜)、客数、営業時間、休業の印 | POSレジの書き出し |
| 店の属性 | 店舗の番号、立地の型(駅前・郊外・商業施設)、席数、開店日、改装の期間 | 店舗の台帳 |
| 天気予報 | 地域、発表の日時、対象の日、天気、降水確率、最高・最低気温 | 防災情報XMLの府県週間天気予報 |
| 祝日 | 日付、祝日の名前 | 内閣府の祝日のCSV |
| 販促の予定 | 期間、対象の店、販促の種類(割引・新メニュー・クーポン) | 本部の販促の予定表 |
| 行事の予定 | 店舗、日付、行事の種類、規模の目安 | 店長が記入する行事の予定表 |
| 品目の構成比 | 店舗・品目ごとの直近4週の出数の割合、品目の持ちの日数 | POSの品目別の書き出しと製造の表 |
質を決めるのは、天気予報を「発表の日時ごと」に残すことです。 学ばせるときに、その日に実際に降った雨を使うと、モデルは「雨と分かっている日」の動きを覚えます。予測するときに手元にあるのは予報だけです。 学ばせる側も、木曜の時点で出ていた予報で学ばせないと、本番で外れ方が大きくなります。
そのため、天気の列は貯め始めてから効きます。 予報を貯め始めて1年ほどは、天気の列を入れたモデルと入れないモデルの両方で確かめる期間の外れ方を比べ、入れたほうが当たるようになってから天気の列を使います。
祝日は、内閣府のCSVから取ります。 公式のページには、昭和30年から令和9年までの国民の祝日のCSVが載っており、令和10年の祝日は前年の2月に載せるとされています。毎年2月に取り直す手順を入れておきます。手元で読んだ限り、CSVは Shift_JIS 系の文字コードでした。
データの取得方法を決める
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 売上と客数 | 置き場所の CSV を日付で読む | 学ばせる目的の値と、直近の動きの列 |
| 天気予報 | 保存した電文から、木曜の朝の時点で最新の発表を選ぶ | 天気の列 |
| 祝日と連休の位置 | 祝日のCSVと曜日から作る | 「連休の何日目か」「連休の最終日か」の列 |
| 販促・行事 | 予定表を店舗と日付で引く | 販促と行事の列 |
| 品目の構成比 | POSの品目別の書き出し | 製造量への換算 |
天気予報は、木曜の朝の時点で最新の発表を使います。 学ばせるときも同じで、過去の各週について、その週の木曜の朝に出ていた発表を選びます。 発表の日時ごとに保存しておく理由はここにあります。
週間天気予報の範囲の外の日は、天気の列を空のまま渡します。 木曜に翌週の日曜までを見込むと、後ろの数日は予報の範囲の外になることがあります。LightGBM の公式のページでは、欠けた値の扱いが既定で有効とされています。平年の値で埋めずに空のまま渡し、その日に「天気予報の範囲外」の印を付けます。
AIへ渡す前に整形する
- 休業日と短縮営業を分ける … 休業日は学ばせる記録から外し、営業時間の短い日は「営業時間」の列で持たせます
- 改装の期間を外す … 改装の前後の数週は売上が普段と違うので、店舗の台帳の期間で外します
- 新店を扱う … 開店から1年に満たない店は、店舗の番号の列を空にし、立地の型と席数で学ばせた動きを使います
- 曜日と連休の列を作る … 曜日、祝日、連休の何日目か、連休の最終日か、年末年始・お盆の印
- 直近の動きの列を作る … 予測を出す週の水曜までの売上だけから、同じ曜日の直近4週の平均と前年の同じ週の売上を作ります
- 販促と行事の列を作る … 予定表を店舗と日付で引き、種類ごとの印にします
- 目的の値を決める … 税抜の売上を目的の値にし、客数は列に入れません(予測する日には分からないため)
3番目は、LightGBM の決まりを使います。 公式のページでは、予測のときに学ばせたときに無かった区分の値は、欠けた値として扱われるとされています。新店の番号はモデルにとって知らない区分なので、立地の型と席数から近い店の動きで見込まれます。 新店には必ず印を付け、店長に確かめてもらいます。
5番目で「水曜まで」に限るのは、木曜の朝に手元にあるのが水曜までの売上だからです。 翌週の月曜は5日後、日曜は11日後になります。学ばせるときに前日の売上を列に入れると、本番では使えない列で学ばせたことになります。 過去の各週についても、その週の水曜までで列を作ります。
AIに処理させる
させるのは、店舗・日ごとの税抜の売上を、少なめ・真ん中・多めの3本で予測することだけです。
| 予測するもの | 使い方 | 外れたときの影響 |
|---|---|---|
| 真ん中(0.5) | 人時の上限、日持ちの短い品目の製造量 | 半分の日は上回り、半分の日は下回る |
| 多め(0.8) | 日持ちの長い品目の製造量、シフトで「声をかけておく人」の枠 | 10日のうち2日ほどはこれを上回る |
| 少なめ(0.2) | 人時の上限を下げる余地の目安 | 10日のうち2日ほどはこれを下回る |
人時の上限を真ん中で組むのは、人を多く入れすぎた日の人件費と、足りなかった日の客の待ちの両方を見たうえでの選び方です。 どちらを重く見るかは会社が決めることで、多めの側で組む会社もあります。
製造量は、品目の持ちで使い分けます。 当日中に使い切る品目は真ん中で、冷凍で持つ品目は多めで作ります。どの品目をどちらにするかは、製造の担当が品目の一覧に書きます。
| させないこと | 理由 |
|---|---|
| シフトに誰を入れるか | 店長が人の事情を見て決める |
| 人時の上限の確定 | 本部が店長の直しを見て決める |
| 仕入先への発注の確定 | 製造の担当が在庫を見て決める |
| 予算や目標の設定 | 予測は目標ではない。目標は経営が決める |
| 外れた理由の断定 | 理由の候補は人が記録から考える |
4行目を混ぜないでください。 予測を目標として店に渡すと、店長は予測に届くように販促を足し、次の週の記録が「予測に合わせた動き」で汚れます。
指示内容を固定する
この構成は生成AIを使わないので、プロンプトの代わりに、モデルの設定と換算・印付けの規則を書いておきます。
【モデル】
- LightGBM、objective="quantile"、alpha を 0.2/0.5/0.8 で3つ学ばせる
- 区分の列 = 店舗の番号、立地の型、曜日、祝日の種類、販促の種類、行事の種類
(0以上の整数に置き換えて渡す。新店の店舗の番号は空にする)
- 目的の値 = その日の税抜の売上(休業日は学ばせる記録から外す)
- 天気の列は、木曜の朝の時点で最新の予報。予報の範囲の外は空のまま渡す
- 直近の動きの列は、予測を出す週の水曜までの売上だけから作る
【確かめ方】
- TimeSeriesSplit で、週を単位に過去から順に確かめる
- 学ばせる期間の末尾と確かめる期間のあいだに gap を置く(木曜から月曜までの分)
- 比べる相手 = 前年の同じ週の同じ曜日、直近4週の同じ曜日の平均
- 店ごとの外れ方(実績の合計に対する外れの合計の割合)が、
比べる相手より小さい店だけ、予測を使う。大きい店は店長の見込みのまま
【換算】
- 人時の上限 = 真ん中 ÷ 店ごとの目標の人時売上高(30分単位に切り捨て)
- 製造量 = 全店の売上(真ん中か多め)× 品目ごとの構成比 ÷ 品目の単価の目安
(日持ちの短い品目は真ん中、冷凍で持つ品目は多め)
【印を付ける条件】
- new:開店から1年に満たない
- event:行事の予定表に記入がある
- wide:多め − 少なめ が、真ん中の5割を超える
- jump:前年の同じ週の同じ曜日から3割以上違う
- no_weather:天気予報の範囲の外
- 印の無い日は、店長の確認なしで表に載せる
比べる相手より当たらない店は、予測を使いません。 40店のうち何店かは、近くの競合の開店や駅の工事で、過去の記録が今の動きを表していないことがあります。その店は店長の見込みのままにし、なぜ当たらないかを本部が店長と話します。
gap を置くのは、本番と同じ条件で確かめるためです。 scikit-learn の公式のページでは、TimeSeriesSplit は時間の順に並んだ記録を分け、ほかの分け方では未来の記録で学ばせて過去で確かめることになるとされ、gap は各学ばせる期間の末尾から除く件数とされています。木曜に予測して翌週の月曜から当たるなら、学ばせる記録の最後と確かめる最初の日のあいだに、その日数を空けます。
区分の列を0以上の整数にするのは、LightGBM の決まりです。 公式のページでは、区分の値は0以上の整数で渡す必要があり、負の値は欠けた値として扱われるとされています。店舗の番号のように区分の数が多い列は、数値として扱うほうがよいことが多いとされ、min_data_per_group や cat_smooth で学びすぎを抑えるよう案内されています。 40店なら区分として渡し、確かめる期間で両方を比べて決めます。
出力形式を固定する
店舗ごと・日ごとに1行の表で出します。 店長には自分の店の7行を、本部には全店の280行を渡します。
store_id, date, weekday, p20, p50, p80, labor_hours_cap, flags, model_version
S012, 2026-10-19, 月, 412000, 468000, 531000, 117.0, "", 2026-10-15
S012, 2026-10-24, 土, 655000, 742000, 868000, 185.5, "event;no_weather", 2026-10-15
S031, 2026-10-24, 土, 380000, 455000, 590000, 113.5, "new;wide;no_weather", 2026-10-15
あわせて、セントラルキッチンには品目ごとの製造量の表を渡します。
item_id, item_name, shelf_type, basis, qty_mon, qty_tue, ... qty_sun
K-104, だし(1L), 当日, p50, 520, 498, ... 760
K-221, 冷凍の唐揚げ(1kg), 冷凍, p80, 64, 61, ... 95
1つ目の理由は、3本を並べて渡せることです。 店長は真ん中だけでなく幅を見て、幅の広い日にはシフトの「声をかけておく人」を厚めにします。
2つ目は、flags で確かめる日を絞れることです。 印の無い日は確認なしで使い、店長が開くのは印の付いた日だけになります。
3つ目は、model_version で後から照らせることです。 モデルを学ばせ直した週と、外れ方が変わった週を突き合わせられます。
店長が直すときは、p50 の横に manager_p50 と reason の列を足して書きます。 予測の列は書き換えません。予測と直しを別の列に残すと、翌週にどちらが当たったかを比べられます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| POSレジ | 毎日の CSV の書き出し | 店舗・日ごとの売上・客数・営業時間 |
| 気象庁防災情報XML | 長期のフィードを毎朝取得 | 府県週間天気予報の電文 |
| 内閣府の祝日のCSV | 年に1回取得 | 祝日 |
| 販促・行事の予定表 | 共有の表の読み取り | 販促と行事の列 |
| 店長への予測の表 | 共有の表に店舗ごとのシートで書く | 7日分の3本と印、直しの欄 |
| シフトの仕組み | 店長が人時の上限を入れる | この構成からは書き込まない |
| セントラルキッチン | 製造量の表を渡す | 製造の担当が製造計画の表に入れる |
シフトの仕組みにも製造計画の表にも、直接は書き込みません。 予測が大きく外れた週に、そのまま人時の上限や製造量が確定すると、誰も止める場所がありません。 本部の確定を挟みます。
店長への予測の表は、店舗ごとに見られる範囲を分けます。 他の店の売上が見えると、店どうしの比べ合いになり、直しの理由に他店の数字が入ってきます。
人が確認する
店長が見るのは、印の付いた日だけです。
newとeventを先に見る … 新店と行事の日は、モデルの知らないことが多い日です。行事の規模や人の流れを知っているのは店長ですwideとno_weatherを見る … 幅が広い日と天気予報の外の日は、シフトの「声をかけておく人」を厚めにするかを決めますjumpを見る … 前年から大きく違う日です。前年に特別な事情(改装・催し)が無かったかを思い出します- 直すなら理由を書く …
manager_p50とreasonに書きます。理由は「近くの店が閉店」「店の前の道路工事」のように事情で書きます
本部の担当者は、店長の直しの大きさを見ます。 真ん中から3割以上動かした直しは、理由を読んで、本部が知っている事情(販促の変更、近くの競合の動き)と合うかを確かめてから確定します。
翌週が終わったら、予測と直しと実績を並べます。 店長の直しが当たった事情は、行事の予定表の種類に足して、次に学ばせるときの列にします。 予測のほうが当たった事情は、店長に伝えて、直さなくてよい日を増やします。
例外に対処する
| 起きること | 対応 |
|---|---|
| POSの書き出しが欠けた日 | その日を学ばせる記録から外し、印を付ける。0で埋めない |
| 天気予報の電文が取れなかった日 | 前の日の発表を使い、使った発表の日時を記録する |
| 臨時の休業・営業時間の短縮 | 店長が行事の予定表に書く。予測の日なら営業時間の列を変える |
| 新店・改装の再開 | new の印を付け、店長の見込みを優先する |
| 比べる相手より当たらない店 | 予測を使わず、店長の見込みのままにする |
| 台風・大雪など大きな天気の崩れ | 予測のまま使わず、本部が全店に見直しを頼む |
| 予測の処理が失敗した週 | 前の週の店長の見込みの方法に戻し、本部に知らせる |
| 祝日のCSVが翌年分を含まない | 2月に取り直す。取れるまでは前年の同じ祝日を手で入れる |
| 3本の順が逆転する(少なめが真ん中を上回る) | 3本を別々に学ばせると起こりうる。小さい順に並べ直し、並べ直した日に印を付ける |
最後の行は、分位点を別々のモデルで出すときの性質です。 3つのモデルはそれぞれ独立に学ぶので、記録の少ない日には少なめの見込みが真ん中を上回ることがあります。並べ直せば表としては使えますが、その日はモデルが自信を持てていない日です。 wide と同じく、店長に回します。
6行目は、モデルに任せないでください。 大きな天気の崩れは記録に少なく、モデルは過去の数回からしか学べません。 公共交通の計画運休や自治体の呼びかけのような事情は、列にありません。
記録を残す
- 毎日の POS の書き出しの原本と、取り込んだ日時
- 天気予報の電文の原本と、発表の日時・取った日時
- 学ばせたときの記録の期間、列の一覧、設定、
model_version - 毎週の予測(3本と印)と、そのとき使った天気予報の発表の日時
- 店長の直しと理由、本部の確定の値
- 実績と、予測・直し・確定のそれぞれの外れ方
- 店ごとの、比べる相手と予測の外れ方の比べ
2つ目と4つ目で「発表の日時」を残すのが、この構成の土台です。 天気予報は発表のたびに変わるので、どの発表で予測したかが分からないと、外れた理由を天気のせいにできるかが分かりません。
04実装レベルの3段階
半自動化では、天気の列を入れません。 予報を貯め始めたばかりで、学ばせる記録が足りないからです。曜日・祝日・連休・販促だけでも、店長の見込みより当たる店が多いかを先に確かめます。 本格構成で、1件45分が15分程度になります。 店長の作業は印の付いた日の確認と直しになり、本部の作業は直しの確認と確定になります。この段階が本記事の想定です。 本格構成に進むのは、天気予報を1年ほど貯めてからです。 天気の列は、同じ季節の記録が2回以上無いと、季節と天気の動きを分けて学べません。 どの段階でも、モデルを毎週学ばせ直す必要はありません。 月に1回、前の月までの記録で学ばせ直し、確かめる期間の外れ方が前のモデルより悪くならないことを確かめてから入れ替えます。入れ替えた月は model_version が変わるので、外れ方が急に変わったときに、モデルの入れ替えのせいかどうかを切り分けられます。 メニューの大きな改定や価格の改定の後は、その前後で動きが変わるので、改定の日を販促の予定表に「改定」として書き、列として持たせます。
05工数削減シミュレーション
導入後 160件 × 15分 ÷ 60 = 40 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 数十店舗を運営し、本部のセントラルキッチンから店舗へ食材を送っている飲食チェーン。店長が毎週、前年の同じ曜日の売上を見ながら翌週の売上を見込み、本部がそれを集めて人件費の枠と製造量を決めている場合。POSレジから店舗ごと・日ごとの売上を2年分以上書き出せる場合。社内に Python を書ける担当者がいるか、外部に頼める場合。
- 店舗が数店で、店長の見込みを本部が電話で聞けば足りるチェーン。開業から1年に満たない店が多く、前年の同じ時期の売上が無い場合。予約で売上の大半が決まる業態(予約台帳を数えれば足りる)。なお、シフトに誰を入れるかの決定、仕入先への発注の確定、店舗の予算の設定はこの構成では代替できません。
07最小構成で試す方法
- POSレジから、全店の店舗・日ごとの売上を2年分書き出す
- 表計算で、店ごと・曜日ごとに「前年の同じ週」と「直近4週の平均」の2つの見込みを作る
- 過去の8週について、2つの見込みと、そのとき店長が出した見込みと、実績を並べる
- 店ごとに、どれが最も当たったかを数える
- 手元の生成AIの画面に、外れの大きかった週の表を貼り、「どの店のどの日が外れたか、曜日・祝日・販促の予定と並べて整理して」と頼む
この段階では、モデルを作りません。 まず、単純な見込みと店長の見込みのどちらがどれだけ当たっているかを知ります。
| 出てきた内容 | 判断 |
|---|---|
| 店長の見込みが単純な見込みより当たっていない店が多い | モデルを作る価値がある。 Python の構成に進む |
| 店長の見込みがどの店でも最も当たっている | モデルより、店長の見込みの集め方を速くするほうが先 |
| 外れの大きい日が行事・天気の日に集中している | 行事の予定表と天気予報の保存を先に始める |
2行目が出ることもあります。 その場合は、店長の見込みの入力の表を整え、本部の取りまとめを速くするだけでも②と③の時間は減ります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 実際の天気で学ばせて本番で外れる | 発表の日時ごとに予報を残し、木曜の時点の予報で学ばせる |
| 前日の売上を列に入れて本番で使えない | 予測を出す週の水曜までの売上だけで列を作る |
| 確かめる期間が学ばせる期間とつながっている | TimeSeriesSplit の gap で本番と同じ間隔を空ける |
| 新店の予測が他店の平均に寄る | 新店の番号は空にし、立地の型と席数で見込む。new の印で店長に回す |
| 休業日の0が学ばせる記録に入る | 休業日は外す。0で埋めない |
| 予測を目標として店に渡してしまう | 予測と予算・目標は別の表にする |
| 店長が全部の日を書き直す | 印の無い日は確認なしで使う運用を、本部が最初の2か月で一緒に作る |
| 店長の直しの理由が残らない | 直しの欄と理由の欄を予測の横に置き、空の直しは受け付けない |
| 祝日のCSVに翌年分が無い | 毎年2月に取り直す |
| 行事の予定表の書き方が店長ごとに違う | 種類と規模の目安を選ぶ形にし、自由に書く欄は備考だけにする |
| 3本の見込みの順が逆転する | 小さい順に並べ直し、並べ直した日に印を付けて店長に回す |
上の3行が、この構成の失敗のほとんどです。 どれも、学ばせるときには使えて、予測するときには使えない情報を混ぜてしまう失敗です。確かめる期間で当たって見え、本番で外れます。
6行目から8行目は、店長との関係で起きます。 予測を目標にされた、全部書き直した、理由を書かなかった。どれも、予測と直しの役割を最初に決めておけば防げます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 店舗ごと・日ごとの売上と客数、販促の予定、品目ごとの出数です。個人の情報は扱いませんが、店舗ごとの売上は社外に出さない経営の情報です。
- 売上の記録を外部の生成AIに貼らない … 最小構成で生成AIの画面を使うときは、会社が利用を認めた環境で、店舗の名前を番号に置き換えて貼ります
- 予測の表の見える範囲を分ける … 店長には自分の店だけ、本部には全店。店どうしの売上の比べ合いに使わせません
- 予測を人の評価に使わない … 予測と実績の差は店長の評価の材料ではありません。外れた週の理由を探すための記録です
- 予測を目標にしない … 予測は過去の動きの延長で、経営の意思ではありません。予算と目標は別に決めます
- 最終の判断を人に残す … 人時の上限と製造量は、本部が店長の直しを見て確定します。大きな天気の崩れの週は、予測を使わない判断も本部が行います
誤りが起きた場合のリスクは、人時の上限が低すぎて客を待たせることと、製造量が多すぎて食材が余ることの2つです。 前者は幅と印で店長に回し、後者は品目の持ちで真ん中と多めを使い分けて防ぎます。どちらも、本部の確定を挟むことで、1週分の外れが仕組みの外へそのまま出ない形にしています。
10まず何から始めるか
1週目:POSの書き出しと店舗の台帳をそろえる
全店の店舗・日ごとの売上を2年分書き出し、休業日・改装の期間・開店日を店舗の台帳に書きます。あわせて、気象庁の府県週間天気予報の電文を毎日保存する処理を、この週から動かします。
2週目:単純な見込みと比べる
表計算で前年の同じ週と直近4週の平均の見込みを作り、過去8週の店長の見込みと実績と並べます。店ごとに、どれが最も当たっているかを数えます。
3週目:行事の予定表を作る
店長に、店の周りの行事と臨時の休業を書く表を渡します。書く項目(種類・規模の目安)を本部が決め、自由に書く欄は備考だけにします。
4週目:Python で予測を作って確かめる
曜日・祝日・連休・販促・行事の列で LightGBM を学ばせ、TimeSeriesSplit で過去の週を確かめます。比べる相手より当たる店がどれだけあるかを見ます。
2か月目: 当たる店から、予測と印を店長に渡し、印の付いた日だけを見る運用を始めます。店長の直しと理由を毎週集めます。3か月目以降: 人時の上限と製造量の換算を足し、1件45分が何分になったかを実測します。天気予報を1年貯めて天気の列を足し、予測が比べる相手より当たる店が大半になった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
目的関数に分位点の回帰(quantile、alpha の既定は0.9)と Tweedie の回帰があること。区分の列を categorical_feature で指定すること | LightGBM: Parameters | 2026-10-15 |
区分の値は0以上の整数で渡し、負の値は欠けた値として扱われること。予測のときに学ばせた際に無かった区分は欠けた値として扱われること。区分の数が多い列は数値として扱うほうがよいことが多く、min_data_per_group・cat_smooth で学びすぎを抑えること。欠けた値の扱いが既定で有効なこと | LightGBM: Advanced Topics | 2026-10-15 |
TimeSeriesSplit が時間の順に並んだ記録を分け、ほかの分け方では未来で学ばせて過去で確かめることになること。gap が学ばせる期間の末尾から除く件数であること(scikit-learn 1.9.1) | scikit-learn: TimeSeriesSplit | 2026-10-15 |
| 長期のフィードが1時間ごとに更新され数日分を持つこと。1つのURLで1日10GB以上のダウンロードで送り元が止められること。確実で即時の配信には気象業務支援センター等を案内していること | 気象庁: 気象庁防災情報XMLフォーマット形式電文の公開(PULL型) | 2026-10-15 |
| 府県週間天気予報が「定時」の分類の電文であること(2026/8/6 現在の一覧) | 気象庁: 公開するXML電文一覧(PDF) | 2026-10-15 |
| 昭和30年から令和9年までの国民の祝日のCSVが載っていること。令和10年の祝日は前年の2月に載せること | 内閣府: 国民の祝日について | 2026-10-15 |
人時の上限の決め方、製造量の決め方、予測の使い方は、自社の本部と店長とセントラルキッチンで決めてください。 本記事は、翌週の日別売上を予測して換算する部分に絞って、公式のページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1745)についてのご相談はこちらから。
