リネンサプライ会社が、取引先ホテルの予約室数と過去の回収量から翌週のシーツ・タオルの必要量を予測し、洗濯工場の稼働計画の案を出す
取引先ホテルが共有してくれる翌週の予約室数と、過去の回収量の記録から、ホテルごと・品目ごとの翌週の日別の必要量を予測します。 予測を工場全体に積み上げ、洗濯の稼働時間と追加の勤務の案まで出します。
- 連携・自動化
- Python
- 対象業界
- その他/医療/宿泊
- 対象部門
- 生産
- 対象業務
- 比較検討/集計・分析
- 主な課題
- 人手が足りない/判断に時間がかかる/属人化している
- AIで行う処理
- 予測
- 主な効果
- 判断支援/属人化解消/工数削減
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 金曜の午後、取引先から届いた予約室数の表をメールから開き、記録表の横に写す
- 表を送ってこない取引先には電話をかけ、翌週の混み具合を聞いてメモする
- 取引先ごとに、前年の同じ週と直近4週の回収量を記録表から探す
- 予約室数と過去の回収量を見比べ、品目ごとの翌週の日別の必要量を見積もる
- 40社分を合計し、日ごとの洗濯の量が工場の上限を超えないかを見る
- 超える日があれば、工場長と相談して残業か休日の稼働か、前倒しで洗うかを決める
- 勤務表に追加の勤務を書き込み、パートに声をかける
- 人取引先から届いた予約室数の表を、決まった共有フォルダに保存する(送ってこない取引先は、電話で聞いた室数を入力の表に書く)
- 自動金曜の15時に Python のプログラムが動き、予約室数の表を読み込んで1つの形にそろえる
- 自動予約室数の控えと、過去の回収量の記録から、取引先 × 品目 × 日の必要量を、中央の値と多めの値で予測する
- 自動予測の幅が広い取引先、予約室数が前年の同じ週から大きく動いた取引先に印を付ける
- 自動40社分を日ごとに積み上げ、工場の上限と在庫の量から、稼働時間と追加の勤務の案を計算する
- 人生産管理の担当者が、印の付いた取引先だけを開き、必要に応じて取引先に確かめて数を直す
- 人工場長が稼働計画の案を見て、追加の勤務を決める
- 人勤務表に書き込み、パートに声をかける
- 自動翌週の回収の実績が入ったら、予測と実績の差を取引先ごとに出す
各工程の詳しい説明を読む
- 金曜の午後、取引先から届いた予約室数の表をメールから開き、記録表の横に写す
- 表を送ってこない取引先には電話をかけ、翌週の混み具合を聞いてメモする
- 取引先ごとに、前年の同じ週と直近4週の回収量を記録表から探す
- 予約室数と過去の回収量を見比べ、品目ごとの翌週の日別の必要量を見積もる
- 40社分を合計し、日ごとの洗濯の量が工場の上限を超えないかを見る
- 超える日があれば、工場長と相談して残業か休日の稼働か、前倒しで洗うかを決める
- 勤務表に追加の勤務を書き込み、パートに声をかける
(a)金曜の午後に作業が集中する。 予約室数の表が届くのは金曜で、翌週の勤務を決めるのも金曜です。40社分を半日でさばくので、表を写す、探す、見比べるの各工程が雑になります。
(b)係数が担当者ごとに違う。 予約室数1室あたりのシーツの枚数を、ある担当者は2.0枚、別の担当者は1.6枚で見ています。どちらが正しいかを確かめた人はいません。 連泊のプランの比率や、ツインとダブルの比率で変わるはずの値が、担当者の経験で固定されています。
(c)予約室数の見込みは、実際の稼働とずれる。 金曜の時点の予約室数は、翌週の直前の予約で増え、キャンセルで減ります。ビジネスホテルは直前の予約で増える方向に、団体の多い旅館はキャンセルで減る方向にずれることが多く、ずれ方は取引先ごとに癖があります。 担当者はそれを経験で補っていますが、記録には残っていません。
(d)工場の稼働が直前に決まる。 5番目で上限を超える日が見つかるのは金曜の夕方です。翌週の月曜の残業をその場で決め、パートに声をかけても集まらない週があります。 集まらなければ、ほかの日に回すか、ホテルへの納品を減らす相談をすることになります。
- 【人】 取引先から届いた予約室数の表を、決まった共有フォルダに保存する(送ってこない取引先は、電話で聞いた室数を入力の表に書く)
- 【自動】 金曜の15時に Python のプログラムが動き、予約室数の表を読み込んで1つの形にそろえる
- 【自動】 予約室数の控えと、過去の回収量の記録から、取引先 × 品目 × 日の必要量を、中央の値と多めの値で予測する
- 【自動】 予測の幅が広い取引先、予約室数が前年の同じ週から大きく動いた取引先に印を付ける
- 【自動】 40社分を日ごとに積み上げ、工場の上限と在庫の量から、稼働時間と追加の勤務の案を計算する
- 【人】 生産管理の担当者が、印の付いた取引先だけを開き、必要に応じて取引先に確かめて数を直す
- 【人】 工場長が稼働計画の案を見て、追加の勤務を決める
- 【人】 勤務表に書き込み、パートに声をかける
- 【自動】 翌週の回収の実績が入ったら、予測と実績の差を取引先ごとに出す
6番目で人が見るのは、印の付いた取引先だけです。 40社のうち、毎週5〜8社という想定です。印の無い取引先は、予測の一覧を流し見て終わります。全社を開く設計にすると、15分が3分にはなりません。
7番目を人の判断に残しているのは、勤務の割り当てだからです。 計算が出すのは「月曜に2時間の残業が要る」という案までで、誰に頼むか、頼めなかったときにどの取引先の納品を調整するかは、工場長が決めます。
02今回想定するシステム構成
取引先の予約室数の表(メール添付 → 共有フォルダ) 回収・納品の記録表(取引先・品目・日ごとの数) ▼【トリガー】毎週金曜の15時 Python(pandas) ├──▶ 予約室数の表を1つの形にそろえ、控えとして保存 ├──▶ 予約室数の控え・過去の回収量・曜日を特徴量にする ▼ scikit-learn(HistGradientBoostingRegressor) │ 取引先 × 品目 × 日の必要量(中央の値:poisson / 多めの値:quantile) ▼ Python ── 印を付ける取引先、日ごとの積み上げ ▼ OR-Tools(整数計画)── 稼働時間と追加の勤務の案 ▼ 【人が印の付いた取引先と稼働計画の案を確認】── 生産管理・工場長 ▼ 勤務表への書き込み
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(pandas・scikit-learn) | R |
| 処理エンジン | scikit-learn の HistGradientBoostingRegressor(loss="poisson" と loss="quantile") | LightGBM、statsmodels の一般化線形モデル |
| 計画の計算 | Google OR-Tools(CP-SAT を使う整数計画) | PuLP |
| 集計 | Python(日ごとの積み上げと、印を付ける取引先の抽出) | - |
| 結果の出力先 | 工場の共有フォルダの見込み表と稼働計画の案 | - |
新しく足すのは、Python のプログラムと、予約室数の控えを貯める仕組みだけです。 回収・納品の記録表と勤務表はいまのものを使い、この構成から書き換えることはしません。勤務表に書き込むのは、これまでどおり工場長と生産管理の担当者です。
土台になるのは、scikit-learn の HistGradientBoostingRegressor です。 ヒストグラムに基づく勾配ブースティングの回帰で、損失関数を選べます。中央の値には "poisson" を使います。 公式のページによれば、"poisson" は内部で対数のリンクを使い、目的の値が0以上であることが求められます。枚数のように0以上の数を数える値に合い、予測が負の枚数になることがありません。
多めの値には "quantile" を使います。 quantile の引数に0から1の値を入れて、どの分位点を推定するかを指定します。0.85を指定し、「この枚数を洗っておけば、たいていの週は足りる」という目安にします。 中央の値と多めの値の差は、取引先ごとの予測のぶれの大きさとして、印を付けるのにも使います。
欠けた値(NaN)とカテゴリの項目を、そのまま渡せます。 予約室数の表を送ってこない取引先は予約室数が空ですが、平均で埋めずに渡すと、モデルが「予約室数が無いときの傾向」を別に学びます。 取引先の区分(ビジネスホテル・シティホテル・旅館)、品目、曜日は、列の型をカテゴリにして渡します。
稼働計画の計算には、Google OR-Tools を使います。 OR-Tools の整数計画の例では、Python で pywraplp.Solver.CreateSolver("SAT") として CP-SAT を使うソルバーを作り、IntVar で整数の変数を作ります。公式のページでは、連続の変数を含まない整数の問題には CP-SAT を勧めています。洗う枚数も勤務の時間も整数で扱うので、この形に当てはまります。
03どうやって実装するのか
処理の起点を決める
毎週金曜の15時に動かします。 取引先の予約室数の表は、金曜の昼までに届くよう取引先にお願いしておきます。15時に予測を出し、16時から工場長と稼働計画を相談し、17時までにパートに声をかける流れにします。いまは金曜の夕方にようやく見積もりが終わっているので、声をかけるのが2時間ほど早くなります。
届いていない取引先があっても、15時には動かします。 その取引先は予約室数を空にして予測し、印を付けます。全社がそろうのを待つと、15時が17時になり、追加の勤務の声かけに間に合いません。
水曜の朝にもう1回、同じ予測を動かし直します。 週の後半(木曜から日曜)の分について、取引先から更新した予約室数が届いていれば、その数で予測し直します。週の後半の追加の勤務を、水曜の時点で見直せるようにするためです。
学習のやり直しは、月に1回、月初めの週末にします。 予測と実績の差が、ある取引先だけ続けて大きいときは、月の途中でもその取引先の係数の見直しを先に行います。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 予約室数の表 | 取引先、宿泊日、予約室数、(あれば)連泊でリネンを替えないプランの室数、団体の予約 | 取引先からのメール添付を共有フォルダへ |
| 予約室数の控え | 予測した時点(金曜・水曜)の予約室数を、その日付とともに貯めたもの | 新しく作る |
| 回収・納品の記録 | 取引先、品目、日付、回収数、納品数 | 回収・納品の記録表 |
| 取引先の情報 | 区分、客室数、ツインとダブルの比率、契約の品目、在庫を預けている枚数 | 取引先の台帳 |
| 工場の情報 | 品目ごとの1時間あたりの処理枚数、通常の稼働時間、残業と休日の稼働の上限、在庫の枚数 | 工場長が決める表 |
質を決めるのは、2行目の予約室数の控えです。 第1章で書いたとおり、学習に使う予約室数は、予測する時点で手に入っていたものと同じ時点の控えでなければなりません。控えが無い期間は、過去の実際の稼働室数で代用することになり、その期間の学習は直前の予約の分だけずれます。控えを貯め始めた日から、この構成の精度が上がり始めます。
回収数と使用数の関係にも注意します。 回収するのは前の日に使われたリネンなので、回収の日付を1日ずらして宿泊日にそろえます。取引先によっては回収が2日に1回で、その場合は2日分をまとめて回収しているので、宿泊日ごとに按分せず、回収の単位のまま予測します。
データの取得方法を決める
予約室数の表は、取引先ごとに形がばらばらです。取引先ごとの読み込みの設定(どの列が日付で、どの列が予約室数か)を、設定ファイルに1社1行で持ちます。 新しい取引先が増えたら、その1行を足します。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 翌週の予約室数 | 共有フォルダの表(取引先ごとの形) | 予測の入力 |
| 電話で聞いた室数 | 入力の表(担当者が書く) | 表を送ってこない取引先の入力 |
| 過去の回収数 | 回収・納品の記録表 | 学習の目的の値 |
| 予約室数の控え | 控えのファイル(金曜・水曜ごと) | 学習の入力 |
| 工場の上限と在庫 | 工場長の表 | 稼働計画の計算 |
電話で聞いた室数は、「電話」という印を付けて控えに入れます。 表で届いた数と電話で聞いた数は確からしさが違うので、モデルにはその区別を項目として渡します。 電話の数が多い取引先ほど、予測の幅が広く出るはずです。
AIへ渡す前に整形する
- 予約室数の表をそろえる … 取引先ごとの設定で読み込み、取引先・宿泊日・予約室数の3列にそろえます
- 控えに保存する … そろえた表を、予測した日時を付けて控えのファイルに足します。上書きせず、毎回足します
- 回収の日付をずらす … 回収日の前日を宿泊日として扱います(2日に1回の取引先は回収の単位のまま)
- 異常な回収数を外す … 0の日(回収の休み)、通常の5倍を超える日(記録の誤り、または改装でまとめて出した日)は学習から外し、一覧に残します
- 特徴量を作る … 予約室数の控え、前年の同じ週の回収数、直近4週の「回収数 ÷ 実際の稼働室数」の比、曜日、祝日の前日、取引先の区分、品目
- 予約の伸びを特徴量にする … 前の週の水曜の控えから金曜の控えまでの予約室数の増え方
- 在庫を確かめる … ホテルに預けている枚数と工場の在庫を、品目ごとに足し合わせます
5番目の「直近4週の比」は、予測する週より前の実績だけで計算します。 予測する週の実績を混ぜると、検証では当たるのに使うと外れるモデルになります。学習と予測で同じ関数を使い、日付で切ることを関数の中に書き込みます。
6番目は、第3章の(c)の癖をモデルに学ばせるための項目です。 直前の予約で伸びる取引先は、水曜から金曜にかけても伸びています。その伸び方が、翌週の直前の上積みの手がかりになります。
AIに処理させる
させるのは、取引先 × 品目 × 日の必要量を、中央の値と多めの値で予測することです。 2つのモデルを別々に学習させます。
| 予測するもの | 使う設定 | 何に使うか |
|---|---|---|
| 中央の値 | loss="poisson" | 工場の稼働の基準。日ごとに積み上げる |
| 多めの値 | loss="quantile", quantile=0.85 | 足りなくならない側の目安。在庫と合わせて安全の幅にする |
| 予測の幅 | 多めの値 − 中央の値 | 幅が広い取引先に印を付ける |
学習の検証は、時間の順を守って行います。 scikit-learn の TimeSeriesSplit は時間の順に並んだデータを分ける仕組みで、公式のページによれば、ほかの交差検証の方法では未来のデータで学習して過去のデータで評価することになるため不適切とされています。検証の区間は1週ずつにし、gap で学習の区間の最後の数日を空けます。 金曜の時点では、その週の木曜・金曜の回収がまだ記録表に入っていないので、その状態に合わせます。
検証では、取引先の区分ごとに外れ方を分けて見ます。 ビジネスホテルは当たるのに旅館は外れる、という偏りは全体の数字では見えません。多めの値は、実績がそれを超えた日がおよそ15%に収まっているかを確かめます。 大きく超えるなら、安全の幅として使うには低すぎます。
稼働計画は、予測の後に OR-Tools で計算します。 変数は、日ごと・品目の系統ごと(シーツ類とタオル類)に洗う枚数と、日ごとの残業の時間・休日の稼働の有無です。
| 計算の中身 | 書き方 |
|---|---|
| 守ること | 各日の翌日の納品に必要な枚数(中央の値)を、在庫と洗った枚数で満たす |
| 守ること | 各日の処理の量が、通常の稼働時間と残業の時間で処理できる上限を超えない |
| 守ること | 残業は1日あたりの上限、休日の稼働は週あたりの上限を超えない |
| 小さくすること | 残業の時間 × 単価 + 休日の稼働 × 単価 + 多めの値に対する不足の枚数 × 重み |
「多めの値に対する不足」を目的の側に入れているのは、守ることにすると解けない週が出るからです。 繁忙期は、多めの値まで全部洗うと上限を超えます。中央の値は必ず守り、多めの値は「足りない枚数をできるだけ小さく」する扱いにします。 不足が残った品目と日は、案に書き出して人が判断します。
| させないこと | 理由 |
|---|---|
| 取引先ごとの納品の数を確定する | 契約の数量と取引先との相談で決まる |
| 誰に残業を頼むかを決める | 勤務の割り当ては工場長の判断 |
| 予約室数を推測で埋めた値を控えに入れる | 次の学習が自分の推測を学ぶ |
| 指定洗濯物(病院のリネンなど)の量を同じ枠で計画する | 消毒の工程が別で、処理の上限が違う |
指示内容を固定する
この構成は生成AIを使わないため、AIへの文章の指示はありません。代わりに、予測と計画の設定をこの形で書いておきます。 担当が替わっても、何を決めてあるかが読めるようにするためです。
【予測の設定】
- 目的の値: 取引先 × 品目 × 宿泊日の回収数(回収日の前日を宿泊日とする)
- 中央の値: HistGradientBoostingRegressor(loss="poisson")
- 多めの値: HistGradientBoostingRegressor(loss="quantile", quantile=0.85)
- カテゴリの項目: 取引先の区分、品目、曜日、予約室数の出どころ(表/電話/無し)
- 欠けた値: 予約室数が届かない取引先は NaN のまま渡す。前週の数で埋めない
- 予約室数: 学習も予測も「金曜15時の控え」を使う。実際の稼働室数は使わない
- 検証: TimeSeriesSplit(1週ずつ、gap は未記録の日数)
【印を付ける規則】
- (多めの値 − 中央の値) ÷ 中央の値 が 0.4 を超える取引先 × 品目
- 予約室数が前年の同じ週から ±30% を超えて動いた取引先
- 予約室数の出どころが「無し」の取引先
- 直近4週で、予測と実績の差が続けて 20% を超えた取引先
【稼働計画の設定】
- ソルバー: OR-Tools pywraplp.Solver.CreateSolver("SAT")
- 変数は整数(枚数、残業の分を15分単位、休日の稼働の有無)
- 中央の値は必ず満たす。多めの値の不足は目的関数で小さくする
- 解の状態が OPTIMAL でないときは案を出さず、工場長に知らせる
「実際の稼働室数は使わない」を明記しているのは、使ったほうが検証の成績が良く見えるからです。 実際の稼働室数は答えにかなり近い値で、検証では当たります。ところが金曜の時点では手に入らないので、使うと実際の運用で外れます。 成績の良さに引かれて入れたくなる項目なので、設定に書いて止めます。
「解の状態が OPTIMAL でないときは案を出さない」は、OR-Tools の例のとおりの確かめ方です。 例では solver.Solve() の戻り値が OPTIMAL かどうかを確かめてから結果を読んでいます。解けなかったときに途中の値を案として出すと、上限を超えた計画が案として勤務表に届きます。
出力形式を固定する
工場の共有フォルダに、次の2つの表を置きます。
【見込み表(1行=取引先 × 品目 × 日)】
{
"client_code": "H-018",
"client_type": "business_hotel",
"item": "sheet_single",
"date": "2026-10-20",
"rooms_on_books": 142,
"rooms_source": "sheet",
"pred_p50": 231,
"pred_p85": 268,
"last_year_same_week": 205,
"flags": ["booking_jump"],
"note": ""
}
【稼働計画の案(1行=日)】
| 列 | 中身 |
|---|---|
date | 日付 |
load_sheets / load_towels | シーツ類・タオル類の洗う枚数(中央の値を満たす量) |
capacity_regular | 通常の稼働時間で処理できる枚数 |
overtime_min | 残業の時間(15分単位) |
holiday_shift | 休日の稼働の有無 |
shortfall_p85 | 多めの値に対して足りない枚数(品目ごと) |
status | 計算の結果(OPTIMAL 以外は案を出さない) |
1つ目の理由は、rooms_source を出すことです。 予約室数が表で届いたのか、電話で聞いたのか、無いのかで、予測をどこまで信じてよいかが変わります。担当者は rooms_source が「無し」の取引先から先に電話をかけます。
2つ目は、shortfall_p85 を日ごとに出すことです。 工場長は、多めの値まで洗えない日がどこにあるかを見て、残業を足すか、取引先に在庫の融通を相談するかを決めます。 不足の無い週は、この列が0で並ぶだけです。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 共有フォルダ(予約室数の表) | ファイルの読み込み | 取引先ごとの表を読む |
| 回収・納品の記録表 | 表の書き出しの読み込み | 過去の回収数を読む。書き込まない |
| 取引先の台帳・工場長の表 | ファイルの読み込み | 区分、在庫、上限を読む |
| 共有フォルダ(結果) | ファイルの保存 | 見込み表と稼働計画の案を置く |
| 実行の基盤 | 工場の業務用のサーバーのタスクの予約 | 金曜15時と水曜の朝に動かす |
勤務表へは書き込みません。 稼働計画の案は見込みの表と同じフォルダに置くだけで、勤務表に書き込むのは工場長です。 案を自動で勤務表に入れると、パートへの声かけの前に勤務が決まったように見えてしまいます。
人が確認する
人が開くのは、印の付いた取引先と、稼働計画の案だけです。
- 予約室数の出どころが「無し」の取引先 … 電話をかけて室数を聞き、入力の表に書いて、その取引先だけ予測し直します
- 予約室数が大きく動いた取引先 … 団体の予約や改装による休館が無いかを取引先に確かめます
- 予測の幅が広い取引先 × 品目 … 前年の同じ週の実績と並べ、中央の値と多めの値のどちらに寄せて洗うかを決めます
- 稼働計画の案 … 工場長が
overtime_minとshortfall_p85を見て、追加の勤務を決めます - 直した数を記録する … どの取引先のどの品目を、何枚から何枚に直したか、理由とともに残します
例えば、温泉旅館に booking_jump の印が付いた週です。 予約室数が前年の同じ週より4割多く、担当者が電話で確かめると、団体の予約が入っていたと分かります。団体は浴衣とバスタオルを多く使う一方、連泊が少なくシーツの交換は通常どおりです。担当者は浴衣とバスタオルだけを多めの値に寄せ、シーツは中央の値のままにします。 この判断は、品目ごとに取引先を知っている人にしかできません。
5番目は、予測の外れの原因を切り分けるための記録です。 人が数を直した週と直さなかった週を分けておかないと、翌週の実績と比べたときに、外れたのが予測か人の判断かが分かりません。
例外に対処する
| 起きること | 対応 |
|---|---|
| 予約室数の表の形が変わった | 読み込みの設定と合わない取引先は予約室数を空にし、「無し」の印。設定を直してその取引先だけ再実行 |
| 新しい取引先が加わった | 過去の回収数が無い。同じ区分の取引先の「回収数 ÷ 予約室数」の比で予測し、印を付ける |
| 取引先が改装で一部の客室を止める | 取引先の台帳の客室数を一時的に変える。変えた期間を記録し、学習ではその期間を外す |
| 大きな催しで地域の予約が急に増える | 予約室数の控えに表れていれば予測に入る。表れない直前の増加は人が上乗せする |
| 稼働計画が解けない(OPTIMAL でない) | 案を出さず、工場長に知らせる。上限を超える日を一覧にして、人が前倒しか取引先との相談かを決める |
| 回収の記録が数日分入っていない | その日を学習から外し、見込み表の冒頭に注記する |
| 病院など指定洗濯物の取引先 | この計画の枠から外し、別の工程として扱う |
上から5行目は、計算の側の安全装置です。 繁忙期に上限が足りないと、計算は解を返しません。そのとき途中の値で案を出すと、処理しきれない量の計画が勤務表に届きます。 解けないこと自体が「人が判断すべき週」という知らせです。
記録を残す
- 予約室数の控え(取引先ごと、予測した日時ごと。上書きしない)
- 学習に使った期間、モデルの設定、検証の結果(取引先の区分ごとの外れ方)
- 見込み表と稼働計画の案の全行、計算の状態
- 人が直した数と理由、工場長が決めた追加の勤務
- 翌週の実績と予測の差(取引先 × 品目ごと)
1つ目の控えが、この構成のいちばん大事な記録です。 予約室数の表は取引先が毎週上書きして送ってくるので、控えを取らないと、「金曜の時点でいくつだったか」は二度と分かりません。 学習の材料そのものなので、最初の週から貯め始めます。保存の期間は、前年の同じ週と比べられるよう、少なくとも2年とします。
04実装レベルの3段階
半自動化で、第4章の①と②がほぼ無くなります。 表の写しと記録表の検索がプログラムに移るからです。ただし、比を掛けるだけでは、直前の予約の癖と連泊のプランの影響が残り、担当者の見直しの時間は減りません。 本格構成で、1件15分が3分になり、この段階が本記事の想定です。 差が大きいのは、印で見るべき取引先が絞られることと、稼働計画の案が日ごとの不足まで出すことです。 段階を飛ばさないでください。 半自動化の期間に予約室数の控えが貯まり、本格構成のモデルは、その控えで学習することで初めて実際の運用と同じ条件になります。 控えが3か月分そろってから、モデルに進みます。
05工数削減シミュレーション
導入後 160件 × 3分 ÷ 60 = 8 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- ホテル・旅館向けにシーツ・タオル・浴衣などを貸し出し、回収して洗い、また納めることをくり返しているリネンサプライ会社。取引先が数十社あり、生産管理の担当者が毎週、取引先に電話やメールで翌週の稼働を聞き、過去の回収量の表と見比べて必要量を見積もっている場合。洗濯工場の残業や休日の稼働が直前に決まり、パートの手配が追い付かない週がある場合。回収と納品の数を、取引先ごと・品目ごと・日ごとに1年以上記録している場合。
- 取引先が数社に限られ、毎週ほぼ同じ量を回収・納品している場合。回収の数を品目ごとに数えておらず、かごの数や重さでしか記録していない場合。取引先が予約の見込みを共有してくれず、稼働の情報がまったく得られない場合。なお、取引先との契約の数量・単価の取り決め、衛生管理の判断、従業員の勤務の割り当ては、この構成では代替できません。
07最小構成で試す方法
- 予約室数の表を毎週送ってくれる取引先から、回収量の多い5社を選ぶ
- その5社について、過去1年分の回収数(シーツとバスタオルの2品目)と、残っている予約室数の表を集める
- 取引先ごとに「回収数 ÷ 予約室数」の比を週ごとに計算し、表にする
- 翌週の予約室数に直近4週の平均の比を掛けて、シーツとバスタオルの必要量を出す
- 担当者の見積もりと並べ、翌週の実績とどちらが近かったかを4週続けて記録する
まだ予測のモデルも稼働計画の計算も作りません。 比を掛けるだけの見積もりと担当者の見積もりを比べ、予約室数がどこまで手がかりになるかを確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 比を掛けるだけでも、担当者の見積もりと同じくらい近い | 予約室数は使える。モデルに進む |
| 比が週によって大きくぶれる | 連泊のプランや団体の予約の情報が要る。取引先に表の項目を相談する |
| 予約室数の表の過去の分が残っていない | 控えを貯めることから始める。 3か月は貯める |
3行目が出ることは珍しくありません。 取引先から届いた表は、メールの添付のまま埋もれているか、上書きされています。控えを貯める仕組みは、予測をしなくても、取引先ごとの癖を後から確かめる材料になります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 検証では当たるのに、使うと毎週同じ方向に外れる | 実際の稼働室数で学習している。予測の時点の予約室数の控えで学習する |
| 予約室数の控えが無い | 取引先の表は上書きされる。最初の週から控えを貯める |
| 回収の日付と宿泊日がずれる | 回収日の前日を宿泊日にする。2日に1回の取引先は回収の単位のまま |
| 予測が負の枚数になる | 中央の値に poisson を使う。目的の値は0以上 |
| 予約室数が届かない取引先を前週の数で埋める | 埋めずに空のまま渡し、出どころを項目にする |
| 稼働計画が繁忙期に解けない | 多めの値は守ることにせず、不足を目的の側で小さくする |
| 解けなかったときに途中の値が案になる | 状態が OPTIMAL でなければ案を出さない |
| 病院のリネンを同じ枠で計画する | 指定洗濯物は消毒の工程が別。計画の枠から外す |
| 人の手直しが記録されない | 直した数と理由を見込み表の列に書く |
| 係数の見直しを毎月まとめて行う | 外れが続く取引先は、月の途中でも先に見直す |
上の2行が、この構成の失敗のほとんどです。 実際の稼働室数は手元の記録にそろっているので、何も考えずに学習するとそれを使います。検証の成績は良くなり、運用で外れます。 控えを貯めて学習するのは手間ですが、ここだけは省けません。
下から4行目は、衛生の決まりに関わります。 厚生労働省の「クリーニング所における衛生管理要領」では、感染症の病原体で汚染されたおそれのある洗濯物(指定洗濯物)を、ほかの洗濯物と区別して消毒することなどが定められています。処理の工程が違うものを、同じ上限の枠で計画しないでください。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 取引先ホテルの日別の予約室数、取引先ごとの回収・納品の数、工場の勤務の時間です。宿泊客の氏名や予約の明細は扱いません。
- 予約室数は取引先の営業上の情報として扱う … ホテルにとって日別の予約室数は、売上の見込みそのものです。見込み表を工場の外へ出さず、取引先ごとの数を別の取引先の担当者が見られないようにフォルダの権限を分けてください
- 取引先との取り決めを先に交わす … 予約室数の表を予測に使い、控えとして貯めることを、取引先に伝えておきます。貯めた控えをほかの目的に使わないことも取り決めに入れます
- 勤務の決定を自動にしない … 稼働計画の案は残業の時間までで、誰に頼むかは決めません。勤務の割り当てと時間外労働の管理は、工場長と労務の担当の仕事です
- 衛生管理の区分を計画で崩さない … 厚生労働省の要領では、リネンサプライ等クリーニング所は回収した洗濯物を種類と汚れの程度に応じて選別し、別々に区分して処理することとされています。計画の都合で区分をまとめる案を出さないよう、品目の系統の分け方を工場長と決めます
- 外部のクラウドの生成AIを通さない … この構成は、工場の中のサーバーで完結します。予測の説明を生成AIで書かせる機能を後から足す場合は、予約室数を外部に送ることになるので、取引先との取り決めを見直してから足してください
誤りが起きた場合のリスクは、必要量を少なく見て取引先にリネンが足りなくなることと、多く見て工場の残業が無駄になることの2つです。 前者は多めの値と在庫の確認で防ぎ、後者は予測と実績の差を毎週出すことで防ぎます。ホテルが客室を売れなくなる前者のほうが重いので、迷ったら多めの値の側に寄せます。
10まず何から始めるか
1週目:予約室数の控えを貯め始める
取引先から届いた予約室数の表を、決まった共有フォルダに、届いた日付を付けて保存します。上書きせず、毎週足していきます。 この作業だけは、予測を作る前から始めます。
2週目:5社・2品目で比を計算する
回収量の多い5社について、シーツとバスタオルの「回収数 ÷ 予約室数」の比を週ごとに出します。担当者の頭の中の係数と比べ、どれくらい違うかを見ます。
3週目:比による見積もりを担当者と並べる
翌週の予約室数に比を掛けた見積もりと、担当者の見積もりを並べ、翌週の実績とどちらが近かったかを記録します。4週続けて記録します。
4週目:工場の上限を表にする
工場長と一緒に、品目の系統ごとの1時間あたりの処理枚数、通常の稼働時間、残業と休日の稼働の上限、単価を表にします。稼働計画の計算は、この表の正しさで決まります。
2か月目: 全社・全品目の表の読み込みと日ごとの積み上げを作り、半自動化に進みます。予約室数の控えを貯め続けます。 3〜4か月目以降: 控えが3か月分そろったらモデルを学習させ、中央の値と多めの値を見込み表に出します。OR-Tools の稼働計画の案を足し、工場長が案のとおりにした週と直した週を記録します。 半年分の記録で、案を採った週に取引先への不足が出ていないことを確かめた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
HistGradientBoostingRegressor の損失関数に poisson と quantile があり、poisson は内部で対数のリンクを使い目的の値が0以上であることを求めること。quantile の引数で0から1の分位点を指定すること。欠けた値(NaN)を扱えること。categorical_features の既定が "from_dtype" でカテゴリ型の列をカテゴリとして扱うこと | scikit-learn: HistGradientBoostingRegressor | 2026-10-14 |
TimeSeriesSplit が時間の順に並んだデータの分割に使うもので、ほかの交差検証では未来のデータで学習し過去で評価することになり不適切とされること。gap が学習の区間の終わりから検証の前に除く件数であること | scikit-learn: TimeSeriesSplit | 2026-10-14 |
OR-Tools の整数計画の例で、Python では pywraplp.Solver.CreateSolver("SAT") で CP-SAT を使うソルバーを作り、IntVar で整数の変数を作ること。連続の変数を含まない整数の問題には CP-SAT が勧められていること。解の状態が OPTIMAL かを確かめてから結果を読むこと | Google OR-Tools: Solving a MIP Problem | 2026-10-14 |
OR-Tools の線形計画の例で、solver.Solve() の戻り値を pywraplp.Solver.OPTIMAL と比べて確かめていること。線形計画の主なソルバーが Glop であること | Google OR-Tools: Get Started with LP | 2026-10-14 |
| クリーニング所における衛生管理要領(令和7年3月26日一部改正)で、リネンサプライ等クリーニング所が定義され、回収した洗濯物を種類と汚れの程度に応じて選別し別々に区分して処理することとされていること。指定洗濯物をほかの洗濯物と区別して消毒することなどが定められていること | 厚生労働省: クリーニング所における衛生管理要領 | 2026-10-14 |
衛生管理の区分と勤務の決定は、工場長とクリーニング師、労務の担当で判断してください。 本記事は上記の公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1539)についてのご相談はこちらから。
