宿泊プランの予約の入り方と過去の実績から、翌月の日別・部屋タイプ別の料金調整の案を出す
翌月の宿泊日と部屋タイプごとに、今の予約の入り方と過去の同じ時点の実績から、最終的に何室売れそうかを幅を持って見込みます。その見込みと決めた規則から、料金の段階を上げるか下げるかの案を一覧にします。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- その他/宿泊
- 対象部門
- 営業/経営企画
- 対象業務
- 比較検討/集計・分析
- 主な課題
- データ分析に時間がかかる/判断に時間がかかる/属人化している
- AIで行う処理
- 予測
- 主な効果
- 判断支援/属人化解消/機会損失防止
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 担当者が、宿泊の管理システムから翌月分の予約の一覧と、前年の同じ月の実績を書き出す
- 表計算で、宿泊日・部屋タイプごとに今の予約数と前年の最終的な販売室数を並べる
- 曜日と連休の並びを合わせるため、前年の日付を手でずらす
- 責任者が表を見て、日ごとに段階を上げるか下げるかを決め、料金カレンダーに書き込む
- 担当者が、料金カレンダーの変更を予約サイトとの連動の仕組みに入力する
- 翌週、同じ作業をやり直し、動きが早い日・遅い日を見直す
- 自動毎日の夜、宿泊の管理システムから予約データを書き出し、その日の予約の状態を記録として残す
- 自動週1回と月次の決定日の朝、Python のスクリプトが動き、翌月分の宿泊日・部屋タイプごとに今の予約数と過去の同じ時点の予約数を並べる
- 自動学習済みのモデルで、宿泊日までに増える室数を3つの分位点(下側・真ん中・上側)で見込み、最終的な販売室数の幅を出す
- 自動見込みと規則表から、料金の段階を上げる・据え置く・下げるの案を出す
- 自動Claude API が、案ごとの理由の文を、スクリプトが出した数字だけから書く
- 人担当者が一覧を確かめ、データの欠けや、催しの入力漏れが無いかを見る
- 人責任者が一覧を見て、案を採るか直すかを決める。幅が広い日を重点的に見る
- 人担当者が、決まった段階を予約サイトとの連動の仕組みに入力する
- 自動決まった段階と、最終的な販売室数の実績を記録し、次の学習に使う
各工程の詳しい説明を読む
- 担当者が、宿泊の管理システムから翌月分の予約の一覧と、前年の同じ月の実績を書き出す
- 表計算で、宿泊日・部屋タイプごとに今の予約数と前年の最終的な販売室数を並べる
- 曜日と連休の並びを合わせるため、前年の日付を手でずらす
- 責任者が表を見て、日ごとに段階を上げるか下げるかを決め、料金カレンダーに書き込む
- 担当者が、料金カレンダーの変更を予約サイトとの連動の仕組みに入力する
- 翌週、同じ作業をやり直し、動きが早い日・遅い日を見直す
(a)判断が1人に偏る。 段階を決められるのは責任者だけです。休暇や出張の週は見直しが止まり、その週に予約が伸びた日の段階が据え置かれます。 担当者は資料を作れますが、どの数字を見てどう判断しているかは教わっていません。
(b)同じ時点で比べられない。 表にあるのは「前年の最終的な実績」で、「前年の今ごろ何室入っていたか」ではありません。残り30日で60室入っている日が、前年と比べて早いのか遅いのかは、責任者の記憶でしか分かりません。
(c)資料づくりに時間がかかる。 240件の日付を1つずつ合わせ、部屋タイプごとに並べ直します。連休の並びが違う月は、前年のどの日と比べるかを決めるだけで時間がかかります。
(d)上げどき・下げどきを逃す。 週1回の見直しの間に予約が一気に入った日は、安い段階のまま埋まってしまいます。 逆に、入りの遅い日を下げる判断は、「まだ間に合うかもしれない」と先送りされがちです。
- 【自動】 毎日の夜、宿泊の管理システムから予約データを書き出し、その日の予約の状態を記録として残す
- 【自動】 週1回と月次の決定日の朝、Python のスクリプトが動き、翌月分の宿泊日・部屋タイプごとに今の予約数と過去の同じ時点の予約数を並べる
- 【自動】 学習済みのモデルで、宿泊日までに増える室数を3つの分位点(下側・真ん中・上側)で見込み、最終的な販売室数の幅を出す
- 【自動】 見込みと規則表から、料金の段階を上げる・据え置く・下げるの案を出す
- 【自動】 Claude API が、案ごとの理由の文を、スクリプトが出した数字だけから書く
- 【人】 担当者が一覧を確かめ、データの欠けや、催しの入力漏れが無いかを見る
- 【人】 責任者が一覧を見て、案を採るか直すかを決める。幅が広い日を重点的に見る
- 【人】 担当者が、決まった段階を予約サイトとの連動の仕組みに入力する
- 【自動】 決まった段階と、最終的な販売室数の実績を記録し、次の学習に使う
7番目が、この設計の分かれ目です。 案は案で、料金の段階を決めるのは責任者です。 ただし見るべき日が一覧の上で分かるようにします。幅が狭く、規則どおりの案が出た日は確かめるだけ、幅が広い日と、規則表の境目に近い日だけを時間をかけて考えます。
8番目の入力を自動にしないのも意図してのことです。 予約サイトへの料金の反映を自動にすると、データの欠けや見込みの誤りが、そのまま売り値に出ます。 誤った料金で入った予約は、後から直せません。
02今回想定するシステム構成
宿泊の管理システム │ 毎晩、予約データをCSVで書き出す(予約作成日・宿泊日・キャンセル日・部屋タイプ・室数) ▼ 共有ストレージ(日ごとの予約の状態の記録) ▼【トリガー】週1回と月次の決定日の朝 Python(pandas で集計、scikit-learn で見込み) ├──▶ 宿泊日・部屋タイプごとに、今の予約数と過去の同じ時点の予約数を並べる ├──▶ 宿泊日までに増える室数を、3つの分位点で見込む ├──▶ 規則表で、段階を上げる・据え置く・下げるの案を出す ▼ Claude API ── 案ごとの理由の文(スクリプトの数字だけを使う) ▼ 料金の段階の案の一覧(表計算) ▼ 【人が案を採るか直すかを決める】──▶ 予約サイトとの連動の仕組みへ入力(人)
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(pandas、scikit-learn) | Google Apps Script(集計のみ) |
| 生成AI | Claude API(案ごとの理由の文) | OpenAI API、Gemini API |
| 予約データ | 宿泊の管理システム(予約データのCSVの書き出し) | 予約サイトとの連動の仕組みの予約データ |
| 保管 | 社内の共有ストレージ(日ごとの予約の状態、学習済みのモデル、案と決定の記録) | データベース |
| 暦 | 内閣府「国民の祝日」のCSV、自施設の催しの一覧 | - |
予約サイトとの連動の仕組みと料金カレンダーは、この構成からは書き換えません。 案は一覧として出し、決まった段階の入力は担当者が行います。
集計には pandas の groupby を使います。 groupby は、データを条件でグループに分け、グループごとに関数を当て、結果をまとめる手順を指します。宿泊日・部屋タイプ・残り日数の組でグループに分け、予約数を数える処理が、この構成の土台です。
見込みには scikit-learn の HistGradientBoostingRegressor を使います。 ヒストグラムを使う勾配ブースティングの回帰で、損失の関数に quantile を選び、quantile の値を0から1の間で指定すると、その分位点を見込むモデルになります。 0.1、0.5、0.9の3つのモデルを作れば、下側・真ん中・上側の見込みが出ます。これが第1章で書いた「幅」です。
このモデルは、欠けた値をそのまま扱えます。 学習のときに、欠けた値を持つデータを分岐のどちらへ送るかを学びます。前年の同じ時点のデータが無い新しい部屋タイプでも、欠けた値として渡せば学習と見込みが止まりません。 曜日や月のような区分の値は、categorical_features で区分として指定できます。
祝日は、内閣府が公開している「国民の祝日」のCSVを使います。 1955年から2027年までの祝日が収められています。連休の並びは祝日と曜日から計算し、前年のどの日と比べるかをスクリプトが決めます。 第3章の(c)の手作業は、ここで無くなります。
03どうやって実装するのか
処理の起点を決める
起点は3つあります。毎晩の予約データの記録、週1回の見直し、月次の決定です。
1つ目の毎晩の記録が、この構成でいちばん大事です。宿泊の管理システムから予約データを書き出し、その日の時点で、どの宿泊日に何室の予約があったかを残します。 これを続けることで、「残り30日の時点で何室入っていたか」を後から正確に引けるようになります。過去の分は、予約の作成日とキャンセル日から組み立て直します(データの取得方法で後述)。
2つ目の週1回の見直しは、毎週月曜の朝に動かします。翌月と今月の残りの宿泊日について見込みと案を出し、前週から案が変わった日だけを一覧の上に出します。
3つ目の月次の決定は、毎月20日の朝に動かします。翌月の全宿泊日の案を出し、責任者が翌月分の段階を決める資料にします。
スクリプトは、社内のサーバーで決まった時刻に動かします。動いた時刻、読んだデータの日付、使ったモデルの版を、必ず記録に残します。 前夜の書き出しが失敗していたのに気づかず、古いデータで案を出すことを防ぐためです。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 予約データ | 予約番号、予約の作成日、宿泊日、泊数、部屋タイプ、室数、プラン、販売経路、キャンセル日、団体か個人か | 宿泊の管理システムのCSV |
| 日ごとの予約の状態 | 記録した日、宿泊日、部屋タイプ、その時点の予約室数 | 毎晩の記録 |
| 販売できる室数 | 宿泊日・部屋タイプごとの販売できる室数(改装・故障で止めた部屋を除く) | 宿泊の管理システム |
| 料金の段階の履歴 | 宿泊日・部屋タイプごとに、いつどの段階だったか | 料金カレンダー |
| 祝日 | 祝日の日付と名称 | 内閣府「国民の祝日」のCSV |
| 催しの一覧 | 近くの祭り、花火、大会、コンサートなどの日付と規模の目安 | 自施設で入力 |
| 規則表 | 見込みと予約の入り方の組み合わせごとに、段階をどう動かすか | 責任者と決めて表にする |
質を決めるのは、予約の作成日とキャンセル日です。 この2つがあれば、過去のどの日の時点でも「その日に何室入っていたか」を組み立て直せます。どちらかが書き出せない場合、過去の分の学習ができず、毎晩の記録を1年以上ためてから始めることになります。
催しの一覧は、人が入力するしかありません。 祝日はCSVで取れますが、近くの花火大会や音楽の催しは施設の側で拾うしかありません。この一覧が抜けると、モデルは「前年のその日だけ急に埋まった理由」を知らないまま学びます。
料金の段階の履歴も入力に入れます。 過去に段階を上げた日は、予約の入り方が遅くなっているはずです。段階の影響を知らずに学ぶと、「上げた日は入りが遅い」を「その日は人気がない」と読み違えます。
データの取得方法を決める
過去の分は、予約データから「各時点の予約室数」を組み立て直します。
| 組み立てるもの | やり方 | 何に使うか |
|---|---|---|
| 残り日数ごとの予約室数 | 予約1件ごとに、作成日からキャンセル日(無ければ宿泊日)まで「予約あり」として数える | 学習のデータ |
| 最終的な販売室数 | 宿泊日の時点で残っていた予約の室数 | 学習の答え |
| 残りで増えた室数 | 最終的な販売室数 - その時点の予約室数 | 見込む対象 |
| 前年の同じ時点の予約室数 | 曜日と連休の並びを合わせた前年の宿泊日の、同じ残り日数の予約室数 | 入り方の比較 |
見込む対象は「最終的な販売室数」ではなく「ここから増える室数」です。 今すでに入っている予約は分かっている数なので、分からない部分だけを見込みます。 最終的な販売室数は、今の予約室数に見込みを足して出します。
組み立ては pandas の groupby で行います。 予約1件を「作成日からキャンセル日まで」の期間として展開し、宿泊日・部屋タイプ・記録の日の組で室数を数えます。連泊の予約は、泊数の分だけ宿泊日ごとに分けてから数えます。 分けないと、2泊目の宿泊日の予約が数えられません。
毎晩の記録が1年分たまったら、組み立て直した値と記録の値を突き合わせます。 差が出る場合は、キャンセル日の付け方や、部屋タイプの変更の扱いが書き出しに反映されていないことが多いです。差の原因が分かるまでは、組み立て直した過去の分を学習に使いません。
AIへ渡す前に整形する
- 団体の予約を分ける … 団体の仮押さえは、まとめて入ってまとめて消えます。個人の予約とは別に数え、見込みの対象は個人の予約だけにします
- 販売できる室数で上限を付ける … 改装や故障で止めた部屋を除いた室数を、見込みの上限にします
- 特殊な期間の印 … 災害、感染症の流行、大規模な改装など、予約の入り方が普通でなかった期間に印を付け、学習から外すかを決めます
- 前年の比べる日を決める … 曜日を合わせ、連休の並びが違う日は、祝日のCSVから連休の何日目かを計算して合わせます
- 催しの一覧を結合する … 宿泊日ごとに、催しの有無と規模の目安を列として足します
- 料金の段階を列にする … その時点で売っていた段階を、学習の特徴として足します
- 欠けの確認 … 前夜の書き出しが無い、件数が前日より極端に少ない場合は、処理を止めて担当者へ知らせます
1番目を軽く見ないでください。 団体の仮押さえが30室入って2週間後に消えると、個人の予約の入り方として学べば、その日の見込みが大きく外れます。 団体の分は営業の担当者が別に把握しているので、見込みの一覧では別の列として並べます。
7番目は、古いデータで案を出さないための止め具です。 書き出しが止まったまま見込みを出すと、予約が入っていないように見え、下げる案が並びます。
AIに処理させる
させることは2つです。scikit-learn のモデルに「宿泊日までに増える室数」を見込ませることと、Claude API に案ごとの理由の文を書かせることです。
1つ目の見込みで使う特徴:
| 特徴 | 中身 |
|---|---|
| 残り日数 | 宿泊日まであと何日か |
| 今の予約室数 | その時点で入っている個人の予約の室数 |
| 前年の同じ時点との差 | 今の予約室数 - 前年の同じ時点の予約室数 |
| 直近7日の増え方 | この1週間で増えた室数 |
| 曜日・月 | 区分の値として渡す |
| 連休の何日目か、連休の前日か | 祝日のCSVから計算 |
| 催しの有無と規模 | 催しの一覧から |
| 今の料金の段階 | その時点で売っている段階 |
| 販売できる室数 | 上限 |
出すのは、0.1、0.5、0.9の3つの分位点です。 真ん中の見込みに加えて、「これより少ないことは1割くらいしかない」下側と、「これより多いことは1割くらいしかない」上側を出します。上側と下側の差が「幅」です。
2つ目の理由の文で書かせること: スクリプトが出した数字(今の予約室数、前年の同じ時点との差、見込みの幅、規則表のどの行に当たったか)から、責任者が一目で読める2〜3文を書かせます。
| させないこと | 理由 |
|---|---|
| 料金の金額や段階の決定 | 段階の案は規則表で決め、採るかは責任者が決める |
| 見込みの数字を文の中で作る・丸める | 数字はスクリプトの出力だけ。文に新しい数字を入れない |
| 競合の料金や相場の話 | 渡していない情報を書かせない |
| 規則表に無い理由の追加 | 「人気が出ている」「口コミが良い」などの推測をさせない |
| 案の取り消し | 規則表の案を、文の側で「据え置きが無難」と覆さない |
2行目がいちばん起きやすい失敗です。 「見込みは約90室」と丸めた文が一覧に並ぶと、表の数字と文の数字が食い違い、どちらを信じるかで会議が止まります。 数字は表の側だけに置きます。
規則表の例:
| 見込みの真ん中の稼働 | 前年の同じ時点との差 | 幅 | 案 |
|---|---|---|---|
| 95%以上 | + | 狭い | 1段階上げる |
| 85〜95% | + | 狭い | 据え置き(上げの候補) |
| 60〜85% | どちらでも | どちらでも | 据え置き |
| 60%未満 | - | 狭い | 1段階下げる(残り21日以上の日のみ) |
| どれでも | どちらでも | 広い | 人が判断 |
いちばん下の行が、この構成の要です。 幅が広い日は、規則で自動的に案を出さず、「人が判断」として一覧の上に出します。モデルが自信を持てない日を、人が見る日にします。
指示内容を固定する
見込みのモデルの設定(Python のスクリプトの中の指示):
目的の値:宿泊日までに増える個人の予約の室数(最終的な販売室数 - 今の予約室数)
モデル:HistGradientBoostingRegressor(loss="quantile", quantile=q) を q = 0.1, 0.5, 0.9 で3つ
区分の値として扱う列:曜日、月、連休の何日目か、今の料金の段階
学習に使う期間:直近3年。ただし特殊な期間の印が付いた宿泊日は除く
検証:直近の6か月を学習から外し、その期間で見込みと実績の差を測る
採用の条件:真ん中の見込みの誤差が、「前年の同じ時点からの増え方をそのまま足す」
単純な方法より小さいこと。小さくなければ単純な方法を使う
後処理:最終的な販売室数 = 今の予約室数 + 見込み。販売できる室数を上限に切る
下側 > 真ん中、真ん中 > 上側 になったら並べ直す
「単純な方法より小さいこと」を採用の条件に入れているのが要です。 前年の同じ時点からの増え方をそのまま足す方法は、責任者が頭の中でしていることに近い考え方です。モデルがそれより当たらないなら、モデルを使う意味がありません。 比べる相手を決めておかないと、当たっているかどうかを誰も言えません。
理由の文の指示(Claude API):
あなたはホテルの営業部で、料金の段階の案に理由を添える担当です。
下のデータだけを使って、責任者が読む理由の文を2〜3文で書いてください。
【厳守事項】
- 数字は、データに書かれた数字をそのまま使ってください。
丸める、足す、割るなどの計算をしないでください。新しい数字を書かないでください。
- 案(raise / hold / lower / human)を覆さないでください。
案が raise なら、上げる理由を書いてください。
- データに無い理由(人気、口コミ、競合の料金、天気など)を書かないでください。
- 案が human のときは、幅が広い理由(前年のデータが無い、催しがある、など)を
データの中から1つ選んで書き、「判断をお願いします」で終えてください。
- 料金の金額を書かないでください。
【データ】
宿泊日:{stay_date}({weekday}、{holiday_note})
部屋タイプ:{room_type} 販売できる室数:{capacity}
今の予約室数:{otb} 前年の同じ時点:{otb_last_year}(差 {otb_diff})
見込み(下側/真ん中/上側):{p10}/{p50}/{p90} 幅:{width_label}
当たった規則表の行:{rule_row} 案:{proposal}
催し:{event_note}
「案を覆さない」を明記しないと、文の側で判断が変わります。 生成AIは慎重な言い方を好むので、上げる案に「ただし様子を見るのが無難です」と書き添えがちです。文が案と違うことを言えば、責任者はどちらを読めばよいか分からなくなります。
出力形式を固定する
Claude API の構造化出力で、スキーマに沿ったJSONを受け取ります。 出力の形式にJSONスキーマを指定すると、制約付きのデコードでスキーマに沿った応答が返ります。オブジェクトには additionalProperties: false を付ける必要があります。
{
"stay_date": "YYYY-MM-DD",
"room_type": "",
"proposal": "raise | hold | lower | human",
"reason_text": "",
"reason_tags": ["pace_ahead", "holiday_eve", "event", "no_history", "wide_range"]
}
スクリプトの出力と合わせて、一覧は次の列にします。
| 列 | 中身 | 出どころ |
|---|---|---|
| 宿泊日・曜日・祝日 | 宿泊日と、連休の何日目か | スクリプト |
| 部屋タイプ・販売できる室数 | - | 宿泊の管理システム |
| 今の予約室数/前年の同じ時点 | 個人の予約だけ。団体は別の列 | スクリプト |
| 見込み(下側/真ん中/上側) | 最終的な販売室数 | モデル |
| 今の段階/案 | 規則表で決めた案 | スクリプト |
| 理由の文 | 2〜3文 | Claude API |
| 前週からの変化 | 案が変わったか | スクリプト |
1つ目の理由は、数字と文を別の列に分けられることです。 数字はスクリプトの列だけにあり、文は reason_text にだけあります。文の中の数字と表の数字が食い違っていないかは、スクリプトの側で機械的に確かめます。 文に表に無い数字が出ていたら、その行の文を空にして人に回します。
2つ目は、reason_tags で一覧を絞り込めることです。 責任者は「催し」や「前年のデータなし」の日だけを先に見るといった使い方ができます。proposal を human とした日を一覧の最上段に並べます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 宿泊の管理システム | CSVの書き出し(毎晩) | 予約データと販売できる室数 |
| 共有ストレージ | ファイルの保存 | 日ごとの予約の状態、学習済みのモデル、案と決定の記録 |
| 内閣府「国民の祝日」のCSV | 年に1回取り込む | 祝日の日付 |
| Claude API | Python から呼ぶ | 案ごとの理由の文 |
| 料金の段階の案の一覧 | 表計算のファイルに書き出す | 責任者が見る一覧 |
| 予約サイトとの連動の仕組み | 人が入力 | 決まった段階だけ |
宿泊の管理システムと予約サイトとの連動の仕組みへは、書き込みません。 この構成が出すのは案の一覧までで、売り値を変えるのは人の操作です。
Claude API に渡すのは、1行分の集計した数字だけです。 予約1件ごとのデータ、客の氏名、販売経路ごとの手数料は渡しません。理由の文を書くのに要るのは、第7章のプロンプトの【データ】の欄にある項目だけです。
人が確認する
人が確かめるのは2か所です。データの確認と、案の決定です。
- 担当者がデータを確かめる … 前夜の書き出しの日付、件数の急な増減、催しの一覧の入力漏れを見ます。ここで止めれば、誤った見込みが責任者に届きません
- 責任者が
humanの日を先に見る … 幅が広い日、前年のデータが無い日、催しのある日。ここに時間を使います - 責任者が前週から案が変わった日を見る … 週の見直しでは、変わった日だけを見れば足ります
- 責任者が規則どおりの日を流し見る … 幅が狭く規則どおりの案は、採るか直すかを一覧の上で決めます
- 案を直したら理由を記録する … どの日の案を、どう直したか、なぜか
5番目の記録が、規則表を育てます。 責任者が同じ理由で繰り返し案を直しているなら、それは規則表に書かれていない判断です。 3か月分の記録を見て、規則表に行を足します。責任者の頭の中にあった判断が、表の側に移っていきます。 第3章の(a)は、ここで解けます。
例外に対処する
| 起きること | 対応 |
|---|---|
| 前夜の書き出しが無い、件数が極端に少ない | 処理を止め、担当者へ知らせる。古いデータで案を出さない |
| 新しい部屋タイプで前年のデータが無い | 欠けた値として見込み、幅が広く出れば human |
| 団体の仮押さえが大きく動いた | 個人の見込みとは別の列で知らせる |
| 見込みの真ん中が販売できる室数を超える | 上限で切り、上側が上限に張り付いた日は上げの候補として印 |
| 下側が真ん中を上回る | 並べ直し、記録に残す。頻発するならモデルを作り直す |
| 催しの一覧に無い急な予約の伸び | 前週からの変化として一覧の上に出し、人が理由を確かめる |
| モデルの誤差が単純な方法より悪くなった | 単純な方法に切り替え、責任者へ知らせる |
| 理由の文に表に無い数字が出た | 文を空にして人に回す |
| Claude API が応答しない | 理由の文を空のまま一覧を出す。案と数字は出す |
1行目と7行目が、この構成を信用できるものにします。 1行目は入口の止め具、7行目は出口の止め具です。モデルが当たらなくなったことに気づける仕組みが無いと、外れた案が毎週並び続けます。
記録を残す
- 毎晩の予約データの書き出しと、日ごとの予約の状態の記録
- 学習に使った期間、特殊な期間の印、学習済みのモデルの版
- 案を出すたびの、見込み(3つの分位点)、規則表の行、案、理由の文
- 責任者が採った段階と、案と違ったときの理由
- 宿泊日を過ぎた後の、最終的な販売室数の実績
- 見込みと実績の差と、単純な方法の差の月ごとの比較
4つ目と5つ目を並べると、案の良し悪しが後から測れます。 案を採った日と直した日で、最終的な販売室数がどうだったか。「直した日のほうが良かった」が続く規則は、規則表の側を直します。
最後の行を、毎月の会議で見ます。 見込みの誤差が単純な方法より小さい状態が続いているかどうか。続いていなければ、モデルを使う理由がなくなっています。
04実装レベルの3段階
半自動化だけでも、資料づくりの時間はほとんど無くなります。 前年の比べる日をスクリプトが決め、「前年の同じ時点」の列が表に入ります。責任者にとっては、第3章の(b)がこの段階で解けます。 ただし判断は今までどおり1件ずつ行うので、③の時間は減りません。 本格構成で1件3.5分になり、この段階が本記事の想定です。 規則どおりの日は確かめるだけになり、時間を使うのは human の日と、前週から案が変わった日だけになります。 段階を飛ばさないでください。 半自動化の一覧を2〜3か月使うと、責任者がどの数字を見て、どう判断しているかが見えてきます。それを書き出したものが規則表です。 規則表の無いまま本格構成に進むと、案の根拠を誰も説明できません。
05工数削減シミュレーション
導入後 240件 × 3.5分 ÷ 60 = 14 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 客室数が100室を超え、部屋タイプが複数あり、料金を段階(ランク)で日ごとに変えているホテル・旅館。料金の上げ下げを支配人や営業の責任者が経験で決めていて、その人がいないと決まらない場合。宿泊の管理システムから予約の作成日・宿泊日・キャンセル日を含む予約データを書き出せ、過去2年以上の記録が残っている場合。
- 料金を季節ごとの固定の料金表で運用しており、日ごとに変える運用をしていない施設。客室数が少なく、1日の販売室数が数室の違いで大きく振れる施設。過去の予約データが1年分に満たない場合。なお、料金をいくらにするかの決定と、予約サイトへの反映は、この構成では代替できません。
07最小構成で試す方法
- 先月の宿泊日から10日を選ぶ(連休、催しのあった日、平日をまぜる)
- その10日について、宿泊日の30日前の時点で何室入っていたかを、予約の作成日とキャンセル日から数える
- 前年の同じ曜日・同じ連休の並びの日について、同じく30日前の時点の室数と、最終的な販売室数を数える
- 「前年の30日前からの増え方を、今年の30日前の室数に足す」単純な方法で最終的な販売室数を見込む
- 見込みと、先月の実際の販売室数を並べ、当時の責任者の段階の判断と比べる
10日は必ずやってください。 モデルを作る前に、「予約データから、過去の時点の予約室数を組み立て直せるのか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 組み立て直せ、単純な方法でもそこそこ当たる | Python での集計とモデルに進む |
| 組み立て直せたが、単純な方法が大きく外れる日がある | 外れた日の理由(催し・団体)を調べる。構成は有効 |
| キャンセル日や作成日が書き出せない | 毎晩の記録を始めるのが先。 1年ためてから進む |
3行目が出ることは珍しくありません。 失敗ではなく、過去の時点の予約室数が今まで誰にも見えていなかった理由が分かったということです。 その場合は、翌日から毎晩の記録を始めてください。記録は1日でも早く始めるほど、使えるようになる日が早く来ます。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 過去の時点の予約室数が合わない | 作成日とキャンセル日から組み立て、毎晩の記録と突き合わせる |
| 連泊の2泊目以降が数えられない | 泊数の分だけ宿泊日ごとに分けてから数える |
| 団体の仮押さえで見込みが大きく外れる | 個人の予約と分け、団体は別の列で並べる |
| 段階を上げた日を「人気がない」と学ぶ | 料金の段階を特徴に入れる |
| 催しの日だけ大きく外れる | 催しの一覧を入力し、特徴に入れる |
| 特殊な期間を学習に入れてしまう | 印を付け、外すかを決める |
| モデルが単純な方法より当たらない | 採用の条件に入れ、当たらなければ単純な方法を使う |
| 理由の文が数字を丸める | 数字を書き換えない、を指示に書き、機械的に照合する |
| 理由の文が案を覆す | 案を覆さない、を指示に書く |
| 古いデータで案を出す | 前夜の書き出しの日付を確かめ、無ければ止める |
| 料金の反映を自動にしたくなる | 反映は人が行う。 誤った料金で入った予約は直せない |
上の2行が、この構成の失敗のほとんどです。 どちらも「過去のその時点の状態」を正しく作れていないという同じ問題で、ここがずれるとモデルがどれだけ良くても案は外れます。
下から5行目は、構成を信用できるものにする1行です。 比べる相手を決めずにモデルを使い続けると、当たらなくなったことに誰も気づきません。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 予約1件ごとの宿泊日・部屋タイプ・プラン・販売経路・キャンセルの有無、そして客の氏名や連絡先を含む予約データです。集計した後の数字には個人の情報は残りませんが、毎晩の書き出しには含まれます。
- 書き出しの列を、集計に必要なものに限る … 氏名、電話番号、住所、メールアドレスは書き出しません。予約番号・日付・部屋タイプ・室数・経路だけで、この構成は動きます
- Claude API に渡すのは集計した数字だけにする … 予約1件ごとのデータは外部へ送りません
- この構成は料金の決定を代替しません … 案は案です。どの段階で売るかは、責任者と施設が決めることです
- 売り値の反映を自動にしない … 予約サイトとの連動の仕組みへの入力は人が行います。データの欠けや見込みの誤りが、そのまま売り値に出ることを防ぎます
- 規則表の変更を記録に残す … 規則表は、施設の料金の考え方そのものです。誰がいつどの行を変えたかを残します
- 販売経路ごとの手数料や、予約サイトとの取り決めを外に出さない … 経路の情報は集計に使っても、理由の文や外部へ渡すデータには入れません
誤りが起きた場合のリスクは、上げどきに上げないことと、下げるべきでない日に下げることの2つです。 前者は幅の狭さを過信して human の日を規則どおりに流すと起き、後者は古いデータで案を出すと起きます。どちらも「幅が広い日は人が見る」「古いデータでは止める」の2つの止め具で防ぐので、そこだけは設計で守ります。
10まず何から始めるか
1週目:毎晩の記録を始める
宿泊の管理システムから予約データを書き出す手順を決め、毎晩、日付を付けて保存するところまでを始めます。書き出す列を、予約番号・作成日・宿泊日・泊数・部屋タイプ・室数・経路・キャンセル日・団体か個人か、に絞ります。この記録は、他のどの作業よりも先に始めます。
2週目:10日分で試す
先月の10日について、30日前の時点の予約室数を作成日とキャンセル日から数え、単純な方法で見込んで実績と比べます。組み立て直した値が、当時の感覚と合っているかを責任者に見てもらいます。
3週目:規則表の下書きを作る
責任者に、どんなときに段階を上げ、どんなときに下げてきたかを聞き取ります。「前年より入りが早く、残り2週間で9割」のような言い方を、表の行に書き出します。完全でなくて構いません。
4週目:過去の時点の予約室数を組み立てる
Python で、過去3年分の予約データから宿泊日・部屋タイプ・残り日数ごとの予約室数を組み立てます。前年の同じ時点の列が入った一覧を、半自動化として毎週出し始めます。
2か月目: 分位点のモデルを作り、直近6か月で単純な方法と比べます。3か月目以降: 規則表で案を出し、理由の文を添えて、責任者の判断と並べます。1件10分が何分になったかを実測します。責任者が案を直す理由が規則表に書き足され、human 以外の日をほぼ規則どおりに採れるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
HistGradientBoostingRegressor がヒストグラムを使う勾配ブースティングの回帰であること。損失の関数に quantile を選び、quantile を0から1の間で指定できること。欠けた値を学習のときにどちらの分岐へ送るかを学び、そのまま扱えること。categorical_features で区分の値を指定できること。大きなデータで GradientBoostingRegressor より速いこと | scikit-learn: HistGradientBoostingRegressor | 2026-09-29 |
| groupby が、データを条件でグループに分け、グループごとに関数を当て、結果をまとめる手順を指すこと。集計の例として合計・平均・件数が挙げられていること | pandas: Group by: split-apply-combine | 2026-09-29 |
| 内閣府が、昭和30年(1955年)から令和9年(2027年)までの国民の祝日をCSV形式で公開していること | 内閣府: 国民の祝日について | 2026-09-29 |
構造化出力が、制約付きのデコードでJSONスキーマに沿った応答を返すこと。パラメータが output_config.format であること。オブジェクトに additionalProperties: false を付ける必要があること | Claude Platform: Structured outputs | 2026-09-29 |
宿泊の管理システムから予約データをどの列まで書き出せるかは、利用している製品で確かめてください。 本記事は公開されている仕様で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0305)についてのご相談はこちらから。
