銭湯・サウナ施設が過去の入館の記録・曜日・天気・催しから Python で日別・時間帯別の来館者数を予測し、スタッフの配置とタオルの準備の数を決める
受付の入館の記録と曜日・天気・催しから、施設ごとの翌週の日別・時間帯別の来館者数と館内の人数を幅つきで見込みます。見込みから受付と見回りの人数、タオルと館内着の準備の数の案を作り、店長の確認に回します。
- 連携・自動化
- Python
- 対象業界
- その他/宿泊
- 対象部門
- 経営企画
- 対象業務
- 書類作成/集計・分析
- 主な課題
- 人手が足りない/判断に時間がかかる/属人化している
- AIで行う処理
- 予測
- 主な効果
- 判断支援/属人化解消/工数削減
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 木曜に、POSから前年の同じ週と直近4週の日ごとの入館の数を書き出す
- 翌週の天気予報と、催し・季節の湯・近所の祭りの予定を確かめる
- 前年の数に天気と催しの分を足し引きして、日ごとの来館者の見込みを決める
- 見込みと前年の時間ごとの入館の形から、受付・見回り・清掃の人数を時間帯ごとに決め、シフトの表を組む
- サウナ付き・タオルセット付きの割合を掛けて、日ごとのタオルと館内着の数を決め、リネンの業者に伝える
- 前日の夕方、翌日の天気予報が大きく変わっていれば、店長がアルバイトの出勤とタオルの数を直す
- 当日、混み方を見て、見回りを足すか、休憩をずらす
- 自動毎週水曜の夜、POSとリストバンドの仕組みから前日までの入館・退館の記録を書き出し、プログラムが読み込む
- 自動入館と退館の時刻から、過去の日ごと・30分ごとの館内の人数を作る
- 自動翌週の暦・催しの予定・天気の見通しから、施設ごとの日別の来館者数と30分ごとの館内の人数を、真ん中と幅で見込む
- 自動配置の決まりの表から、時間帯ごとの受付・見回りの人数の案を作り、券種の割合からタオル・館内着の数の案を作る
- 自動催しの初回、天気の大きな変わり目、幅の広い日に印を付ける
- 人店長が、印の付いた日の理由を見て、見込みと人数の案を直し、シフトを組む
- 【自動/人】 前日の夕方に、翌日の天気の見通しで見込みを作り直し、店長がタオルの数と出勤を直すかを決める
各工程の詳しい説明を読む
- 木曜に、POSから前年の同じ週と直近4週の日ごとの入館の数を書き出す
- 翌週の天気予報と、催し・季節の湯・近所の祭りの予定を確かめる
- 前年の数に天気と催しの分を足し引きして、日ごとの来館者の見込みを決める
- 見込みと前年の時間ごとの入館の形から、受付・見回り・清掃の人数を時間帯ごとに決め、シフトの表を組む
- サウナ付き・タオルセット付きの割合を掛けて、日ごとのタオルと館内着の数を決め、リネンの業者に伝える
- 前日の夕方、翌日の天気予報が大きく変わっていれば、店長がアルバイトの出勤とタオルの数を直す
- 当日、混み方を見て、見回りを足すか、休憩をずらす
(a)館内の人数が分からない。 4番目は入館の数の形で人数を決めていますが、混み方を決めるのは、入った後どれだけ長く館内にいるかです。 週末の郊外の施設は滞在が長く、入館の山より後に館内の人数の山が来ます。入館の山に合わせて人を置くと、本当に混む時間に手が足りません。
(b)足し引きが店長によって違う。 雨の日に何割減らすか、ロウリュの催しの日に何割増やすかが、2人の店長で違います。本部が比べようとしても、理由が書かれていないので比べられません。
(c)タオルが余る日と足りない日が出る。 多めに頼めば洗濯の費用がかさみ、少なめに頼めば週末の夕方に足りなくなって、受付で「タオルの貸し出しを止めています」と言う日があります。
(d)店長が休めない。 見込みの作り方が頭の中にあるので、木曜にシフトを組めるのは店長だけです。店長が休む週は、前の週のシフトをほぼ写して済ませています。
- 【自動】 毎週水曜の夜、POSとリストバンドの仕組みから前日までの入館・退館の記録を書き出し、プログラムが読み込む
- 【自動】 入館と退館の時刻から、過去の日ごと・30分ごとの館内の人数を作る
- 【自動】 翌週の暦・催しの予定・天気の見通しから、施設ごとの日別の来館者数と30分ごとの館内の人数を、真ん中と幅で見込む
- 【自動】 配置の決まりの表から、時間帯ごとの受付・見回りの人数の案を作り、券種の割合からタオル・館内着の数の案を作る
- 【自動】 催しの初回、天気の大きな変わり目、幅の広い日に印を付ける
- 【人】 店長が、印の付いた日の理由を見て、見込みと人数の案を直し、シフトを組む
- 【自動/人】 前日の夕方に、翌日の天気の見通しで見込みを作り直し、店長がタオルの数と出勤を直すかを決める
6番目で、店長は「足し引きを考える」代わりに「理由を確かめる」ことに時間を使います。 印の無い日は、人数の案を流し見てシフトに写します。時間を使うのは、初めての催しや、記録に例の少ない天気の日です。
シフトの確定を自動にしないのは、意図してのことです。 見込みから人数を出しても、誰がその時間に入れるか、誰が見回りに慣れているかは、店長しか分かりません。 見込みは人数の案までで、誰を入れるかは店長が決めます。
02今回想定するシステム構成
受付の券売機・POS(入館の時刻・券種) ロッカーの鍵のリストバンドの仕組み(入館・退館の時刻) 催しの予定表/内閣府の祝日の表/過去の気象のデータ(気象庁のCSV)/天気の見通し │ ▼【トリガー】毎週水曜 22時(閉館後)、毎日17時(翌日分の作り直し) Python(pandas) ├──▶ 入館と退館を組み合わせ、30分ごとの館内の人数を作る ├──▶ 暦・催し・天気の項目を作る ▼ scikit-learn(HistGradientBoostingRegressor、loss="poisson" と loss="quantile") │ 日別の来館者数と30分ごとの館内の人数(真ん中・上側・下側) ▼ Python ── 配置の決まりの表による人数の案、券種の割合によるタオル・館内着の数の案、印付け ▼ 【店長が理由を確かめ、シフトとリネンの業者への枚数を決める】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(pandas・scikit-learn) | R |
| 処理エンジン | scikit-learn の HistGradientBoostingRegressor(ポアソン損失と分位点損失) | Prophet(祝日の表と追加の項目を使う場合)、LightGBM |
| 集計 | Python(館内の人数の積み上げ、配置の人数とタオルの数の換算、印付け) | シフトの表の計算式 |
| データの取得元 | POSとリストバンドの仕組みの書き出し、催しの予定表、祝日の表、気象のCSV | 受付の日報 |
| 結果の出力先 | 運営本部の共有フォルダの見込みの表 | 店長への通知 |
POSとリストバンドの仕組みには、何も書き込みません。 前日までの記録を書き出してもらい、読むだけです。入館の制限や料金の変更を、見込みから自動で掛ける作りにはしません。
土台になるのは、scikit-learn の HistGradientBoostingRegressor です。 loss に poisson を選べ、その場合は目的の値が0以上である必要があります。 来館者数や館内の人数のような数える値に向いた損失です。loss="quantile" を選ぶと分位点(ピンボール)損失になり、quantile に0から1の値を渡して、上側・下側の幅を別のモデルで見込めます。欠けた値(NaN)をそのまま扱えるので、リストバンドの記録が欠けた日があっても、項目ごと捨てずに済みます。
祝日は、内閣府の「国民の祝日」の表を使います。 内閣府は、昭和30年(1955年)から令和9年(2027年)までの国民の祝日をCSVで公開しています。翌年分が載ったら、表を差し替えます。
過去の天気は、気象庁の「過去の気象データ・ダウンロード」から取ります。 昨日までの気象観測のデータから、複数の地点の複数の項目を抽出でき、結果はCSVの形でダウンロードできます。 気象庁ホームページのコンテンツは公共データ利用規約(第1.0版)に準拠した利用条件で使え、利用するときは出典を記載し、加工した場合はそのことも記載するよう求められています。
03どうやって実装するのか
処理の起点を決める
毎週水曜の22時、閉館の後に動かします。 店長が木曜にシフトを組む前に、翌週の見込みと人数の案ができている状態にします。リネンの業者に翌週の枚数を伝える期限にも間に合います。 期限は契約している業者に確かめて、時刻を合わせます。
毎日17時に、翌日分だけ作り直します。 翌日の天気の見通しが水曜の時点から変わっていれば、見込みと人数の案を出し直し、水曜の案との差を店長に知らせます。 決めたシフトを書き換えるのではなく、差を並べて出します。
POSの書き出しが届かない、または前日の入館の数が0のときは、動かしません。 書き出しの失敗を「来館者が0人の日」として学ばせないためです。店長に知らせ、POSの保守の会社に書き出しのやり直しを頼みます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 入館の記録 | 入館の時刻、券種(入浴のみ・サウナ付き・タオルセット付き・回数券・会員)、人数 | POSの書き出し |
| 退館の記録 | リストバンドの返却の時刻(入館の記録と結ぶ番号つき) | リストバンドの仕組みの書き出し |
| 催しの予定 | ロウリュの催し、季節の湯、近所の祭り、メディアの紹介、料金の変更の日 | 運営本部の予定表 |
| 暦 | 祝日、年末年始、大型連休、近くの学校の長期休み | 内閣府の祝日の表と自社の暦の表 |
| 過去の天気 | 日ごとの降水量、最高気温・最低気温 | 気象庁の過去の気象データ・ダウンロード |
| 天気の見通し | 翌週の日ごとの天気・最高気温・最低気温・降水の確率 | 契約している気象会社の配信、または店長の入力 |
| 休業・設備の止まり | 臨時の休業、サウナ室や浴槽の点検で止めた日と時間 | 施設の日報 |
質を決めるのは、催しの予定表です。 ロウリュの催しの日や季節の湯の日は、夕方の入館が跳ねます。催しの日を普通の日として学ばせると、普通の日の見込みが多めに、催しの日の見込みが少なめにずれます。 過去2年の催しを、日付と種類の一覧にします。
休業と設備の止まりの記録も欠かせません。 サウナ室の点検で半日止めた日は、サウナ付きの入館が減ります。止めた日と時間を印にして、学ばせる記録から外すか、項目として入れます。
データの取得方法を決める
POSからは、前日までの入館の記録を、決まった列の並びで毎日書き出す設定を作ります。リストバンドの仕組みからは、返却の時刻と、入館の記録と結ぶ番号を書き出します。会員の番号や氏名は書き出しません。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 入館の時刻と券種 | POSの書き出し | 日別の来館者数、券種の割合 |
| 退館の時刻 | リストバンドの仕組み | 滞在の時間、館内の人数 |
| 催し・休業の日 | 運営本部の予定表と施設の日報 | 催しの項目、外す日の印 |
| 祝日 | 内閣府のCSV | 暦の項目 |
| 過去の天気 | 気象庁のCSV | 天気の項目(過去) |
| 天気の見通し | 気象会社の配信か店長の入力 | 天気の項目(翌週) |
過去の天気は、最初に2年分をまとめて取り、その後は毎週1週間分を足します。 地点は、施設にいちばん近いアメダスの地点にします。見込みの資料には「出典:気象庁ホームページ」と、加工したことを書いておきます。
回数券と月の会員の入館も、券種として分けて書き出します。 会員は天気が悪くても来る常連が多く、入浴のみの一般の客とは天気への反応が違います。 券種ごとの数を残しておけば、雨の日に減るのはどの客かが分かり、タオルを渡す券種の割合の動きも読めます。
天気の見通しを店長の入力で済ませる場合は、入力の欄を決めておきます。 「晴れ・曇り・雨・雪」の4つと、最高気温の数字だけを入れてもらいます。自由な文で書くと、プログラムが読めません。
AIへ渡す前に整形する
- 入館と退館を結ぶ … リストバンドの番号で入館と退館を組にし、滞在の時間を出します。退館の記録が無いもの(返却の読み取りの失敗)は、別に数えます
- 滞在の時間を補う … 退館が無いものは、同じ施設・同じ曜日の種類・同じ券種の滞在の時間の真ん中で補い、補ったことを印にします
- 館内の人数を作る … 30分ごとに、その時刻に入館済みで退館前の人を数えます
- 異常の日を外す … 臨時の休業、設備の止まり、POSの障害の日を印にします
- 日別に束ねる … 日ごとの来館者数と、券種ごとの数、30分ごとの館内の人数を作ります
- 項目を作る … 曜日、祝日、連休の何日目か、年末年始、催しの種類、季節の湯、降水量、最高気温、最低気温、前年の同じ週の来館者数、給料日の後の週末の印
- 割合を作る … 直近8週の曜日の種類ごとに、サウナ付き・タオルセット付きの割合と、館内着を渡す割合を作ります
3番目を正しく作るのが、この構成の土台です。 入館の時刻だけで人を置くと、第3章の(a)のように山の時刻がずれます。郊外の施設では、入館の山から2時間ほど遅れて館内の人数の山が来ることが、記録を作って初めて分かります。
2番目の補いを「閉館まで館内にいた」にしないでください。 返却の読み取りに失敗した人を閉館まで数えると、夜の館内の人数が多めに出て、夜の見回りを厚くしすぎます。 補ったものの割合は毎日数え、増えたら読み取りの機械を確かめます。
AIに処理させる
させるのは、施設ごとに「翌週の日別の来館者数」と「30分ごとの館内の人数」を、真ん中と幅で見込むことだけです。 配置の人数、タオル・館内着の数、印付けは、決まった計算で行います。
| 見込むもの | 使うもの | 判断できないときの扱い |
|---|---|---|
| 日別の来館者数(真ん中) | 過去の来館者数、曜日、祝日、連休、催し、季節の湯、天気、前年の同じ週 | 催しの種類が初めてなら new_event |
| 30分ごとの館内の人数(真ん中・上側・下側) | 同上+時刻 | 上側が館内の受け入れの目安を超えたら crowd |
| 日別の券種ごとの数 | 来館者数 × 直近8週の券種の割合(決まった計算) | 割合が前月から大きく動いたら mix_shift |
真ん中はポアソン損失、幅は分位点の損失で、別々のモデルにします。 平日の朝のように館内の人数が数人の時間帯があり、二乗の誤差で学ばせると、少ない時間帯でマイナスの見込みが出ることがあります。 タオルの数には上側(quantile=0.9)を、人の配置には真ん中と上側の両方を使います。
| させないこと | 理由 |
|---|---|
| シフトの確定と、誰を入れるかの決定 | 働く人の都合と慣れは店長が見る |
| 入館の制限・料金の変更 | 客への約束に関わる。運営本部が決める |
| 衛生の管理(浴槽の水の入れ替え・消毒の頻度) | 公衆浴場の衛生の決まりと保健所の指導に沿って決める |
| 催しの効き目の推測 | 初めての催しは記録が無い。店長の見立てを並べる |
| 天気の見通しの補正 | 見通しをそのまま使い、勝手に足し引きしない |
3行目を必ず守ってください。 来館者が少ない見込みの日でも、浴槽の水や設備の衛生の手入れの回数を減らす判断に、見込みを使ってはいけません。 衛生の管理は、施設の決まりと保健所の指導で決まり、来館者の数で緩めるものではありません。
指示内容を固定する
この構成は生成AIを使わないので、プロンプトの代わりに、モデルの設定と計算の規則を書いておきます。
【モデル(2施設で1つ。施設は項目として持つ)】
- scikit-learn の HistGradientBoostingRegressor
・日別の来館者数 … loss="poisson"
・30分ごとの館内の人数(真ん中)… loss="poisson"
・30分ごとの館内の人数(上側) … loss="quantile", quantile=0.9
・30分ごとの館内の人数(下側) … loss="quantile", quantile=0.1
・categorical_features = [施設, 曜日の種類, 催しの種類, 時刻]
- 学ばせる記録 = 過去2年。休業・設備の止まり・POSの障害の日は外す
- 学ばせ直しは月に1回。確かめは直近8週を外して学ばせ、外した8週で見る
【人数の案(配置の決まりの表から)】
- 受付 = 30分ごとの入館の数の真ん中 ÷ 受付1人がさばける数(切り上げ)
- 見回り = 館内の人数の上側 ÷ 見回り1人が受け持つ人数(切り上げ)、最少1人
- 1人がさばける数・受け持つ人数は、施設ごとに店長が決めて表に置く
【タオル・館内着の数の案】
- 大タオル・小タオル = 日別の来館者数の上側 × タオルを渡す券種の割合 × 1人あたりの枚数
- 館内着 = 日別の来館者数の上側 × 館内着を渡す券種の割合
- 予備として、上の数に店長が決めた割合を足す
【印を付ける条件】
- new_event … 催しの種類が初めて、または前回から1年以上空いた
- crowd … 館内の人数の上側が、施設の受け入れの目安の9割超
- weather … 翌日の見通しの最高気温が水曜の時点から5度以上違う、または雨・雪に変わった
- mix_shift … タオルを渡す券種の割合が前月から1割以上動いた
- 印の無い日は、人数とタオルの数の案をそのままシフトの表の下書きに載せる
1人がさばける数と受け持つ人数を、プログラムに書き込まないのは、施設と季節で変わるからです。 郊外の施設の外気浴のテラスは、冬は見回りが少なくて済み、夏は熱中症の見守りで多く要ります。店長が表の値を直せば、人数の案はすぐに変わります。 表を直したら、いつ誰が直したかを残します。
見回りに上側を使うのは、混む日にこそ人が要るからです。 サウナ室で具合の悪くなる人が出るのは、混んで暑さに長くいる日です。真ん中で人を置くと、10日に1日の混む日に見回りが足りません。
出力形式を固定する
施設・日ごとに、次の形のJSONを作り、表にしてシフトの表の横に載せます。
{
"facility": "",
"date": "",
"day_type": "weekday | saturday | holiday | long_holiday",
"event": "",
"weather_input": { "sky": "", "tmax": 0, "tmin": 0, "issued_at": "" },
"visitors": { "p50": 0, "p10": 0, "p90": 0, "last_year_same_week": 0 },
"occupancy": [ { "time": "17:00", "p50": 0, "p90": 0 } ],
"staff_draft": [ { "time": "17:00", "reception": 0, "patrol": 0 } ],
"linen_draft": { "bath_towel": 0, "face_towel": 0, "room_wear": 0 },
"flags": ["new_event | crowd | weather | mix_shift"],
"model_version": "",
"manager_override": { "staff": null, "linen": null, "reason": "" }
}
1つ目の理由は、weather_input を見込みと並べて残せることです。 どの見通しで見込んだかが分かれば、外れたときに、天気の見通しの外れか、モデルの外れかを分けられます。
2つ目は、occupancy と staff_draft を同じ時刻で並べられることです。 店長は、館内の人数の山のどこに何人を置く案なのかを一目で確かめられます。入館の山と館内の人数の山のずれが、そのまま見える形にします。
3つ目は、manager_override で店長の直しが残ることです。 「この催しは前回より客が多い」と店長が直した理由が残れば、次の同じ催しのときに、その記録が学ばせる記録になります。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 受付の券売機・POS | 毎日の書き出しの受け取り | 入館の時刻と券種 |
| リストバンドの仕組み | 毎日の書き出しの受け取り | 返却の時刻と入館の記録と結ぶ番号 |
| 運営本部の予定表 | 表の読み込み | 催し・季節の湯・休業の日 |
| 内閣府の祝日の表・気象庁のCSV | ファイルの読み込み | 祝日、過去の天気 |
| 見込みの表 | 共有フォルダへの書き出し | 見込み、人数の案、タオルの数の案、印 |
| 店長への通知 | 社内の連絡の場 | 印の付いた日と、翌日分の作り直しの差 |
シフトの表へは、書き込みません。 人数の案は見込みの表に並べ、店長がシフトの表に自分で写して、誰を入れるかを決めます。 リネンの業者への枚数の連絡も、店長が確かめてから送ります。
通知には、来館者の数そのものを流しません。 流すのは「印の付いた日」と「見込みの表の場所」だけにし、施設の売上に関わる数字が連絡の場の外へ写される経路を作りません。
人が確認する
店長が見るのは、毎週の人数の案と、印の付いた日の理由です。 印の無い日は、人数の案を流し見てシフトに写します。全日を前の方法で足し引きし直す運用にすると、第10章の9.0時間には収まりません。
crowdを先に見る … 館内の人数の上側が受け入れの目安に近い日です。見回りを足すか、催しの時間をずらすかを決めますnew_eventを見る … 初めての催しの日です。店長の見立てを並べ、どちらで組むかを決めますweatherとmix_shiftを見る … 天気の変わり目と券種の割合の動きです。タオルの数を直すかを決めます- 直したら理由を書く …
manager_overrideに値と理由を残します
2番目で、見込みより店長の見立てを採る日があって構いません。 見込みは過去2年の記録の範囲で出した数で、初めての催しやメディアの紹介の効き目は知りません。 直した理由を残せば、次の同じ催しのときには記録になります。
本部の担当は、月に1回、2施設の見込みの外れ方を並べます。 同じ向きに外れる日の型(雨の土曜、給料日の後の金曜など)が見えたら、項目に足すか、店長の足し引きの決まりとして書き残します。 これが、店長の頭の中にあった見込み方の引き継ぎになります。
例外に対処する
| 起きること | 対応 |
|---|---|
| POSの書き出しが届かない、前日の入館が0 | 見込みを出さず、店長に知らせる |
| 退館の記録の欠けが多い | 滞在の時間で補い、補った割合を表に出す。多ければ読み取りの機械を確かめる |
| 臨時の休業・設備の止まり | その日を学ばせる記録から外し、翌週の見込みに印を付ける |
| テレビ・SNSで紹介された | 紹介の日の印を付け、翌週から2週間は店長の見立てを並べる |
| 料金を変えた | 変えた日から項目を立て、3か月は mix_shift の線を下げる |
| 台風・大雪の予報 | 見込みを参考にとどめ、営業時間の判断は運営本部が行う |
| 近所の競合の施設が開業・休業した | 運営本部の予定表に入れ、翌月から項目として足す |
| 天気の見通しが届かない | 平年並みの天気で見込み、weather を付けて店長に確かめてもらう |
上から4行目は、年に何度か起きます。 紹介の直後は、ふだん来ない客が一度に来て、記録の傾向が当てはまりません。この期間は見込みを人の配置の下限として使い、上側の判断は店長に任せます。 紹介の効き目の記録が数回たまれば、催しの種類の1つとして項目にできます。
記録を残す
- 読み込んだ入館・退館の記録の件数と、補った滞在の時間の割合
- 施設・日ごとの来館者数と30分ごとの館内の人数の見込み(真ん中・上側・下側)
- 人数の案、タオル・館内着の数の案、印
- 店長が直した値と理由(
manager_override) - 実際の来館者数・館内の人数、タオルの使った枚数と余り・不足
- モデルの版、学ばせた期間、配置の決まりの表の値
5つ目のタオルの余りと不足は、毎週数えます。 上側で頼んでいるのに足りない日が続くなら、タオルを渡す券種の割合が変わっています。余りが続くなら、予備の割合を下げられます。 洗濯の費用を話し合う材料にもなります。
04実装レベルの3段階
最小構成では、毎週の見込みは減りません。 1施設の1日分を数えるのに半日かかります。確かめるための段階です。 半自動化で、前年の数を書き出して足し引きを決める時間はほぼ無くなります。 ただし、人数とタオルの数への換算は手で残ります。本格構成で、店長が見るのは人数の案と印の付いた日だけになり、この段階が本記事の想定です。 差が大きいのは、30分ごとに人数を決める作業が、毎週の手作業だからです。 段階を飛ばさないでください。 半自動化の見込みを夏と冬の一巡まで並べると、外れやすい天気と催しの型が先に分かります。季節を一度見てから本格構成に進むほうが、印の空振りが減ります。
05工数削減シミュレーション
導入後 60件 × 9分 ÷ 60 = 9 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 銭湯・サウナ施設・日帰りの温浴施設を2〜5か所運営し、受付の券売機やPOSから入館の時刻と券種を書き出せる会社。翌週のシフトとタオル・館内着の準備の数を、店長が前年の同じ時期と天気予報を見た勘で決めていて、店長によって余り方・足りなさが違う場合。ロッカーの鍵やリストバンドで退館の時刻も記録している施設では、館内の人数まで見込める。旅館・ホテルの日帰り入浴の受付にも使える。
- 1施設で来館者が1日100人に満たず、店長が毎日の様子を見て足りる場合。入館の記録が日ごとの合計しか残っていない場合。イベントやテレビの紹介で来館者が大きく振れることが多く、過去の記録の傾向が当てにならない開業から1年未満の施設。なお、シフトの確定、入館の制限、衛生の管理の判断は、この構成では代替できません。
07最小構成で試す方法
- POSから、1施設の過去1年の入館の記録を書き出す
- 表計算で、曜日ごとに日別の入館の数を並べ、祝日・催しの日に色を付ける
- 気象庁の過去の気象データ・ダウンロードから、同じ期間の降水量と最高気温をCSVで取り、入館の数と並べる
- リストバンドの記録があれば、入館と退館を結んで、土曜1日分の30分ごとの館内の人数を手で数える
- 前年の同じ週の数を「翌週の見込み」とした場合の外れ方を、週ごとに数える
4番目を、1日分でいいので必ず作ってください。 入館の山と館内の人数の山がどれだけずれるかが分かると、いまのシフトの人の置き方が合っているかを、数字で確かめられます。
| 出てきた内容 | 判断 |
|---|---|
| 天気と催しで入館の数がはっきり動き、館内の人数の山がずれる | Python で HistGradientBoostingRegressor の見込みに進む |
| リストバンドの退館の記録が欠けていて、館内の人数が作れない | 読み取りの機械と返却の手順を直すのが先 |
| 前年の同じ週で十分に当たる | 館内の人数の形だけを作り、来館者数は前年の値で足りる |
2行目が出ることは珍しくありません。 失敗ではなく、混む時間に人が足りなかった理由が1つ分かったということです。 返却の読み取りを直してから、もう一度1日分を数えてください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 入館の山に合わせて人を置く | 入館と退館から館内の人数を作り、その山に合わせる |
| 退館の記録の欠けを閉館まで館内にいたと扱う | 同じ条件の滞在の時間の真ん中で補い、割合を数える |
| 催しの日を普通の日として学ばせる | 催しの予定表で種類の項目を作る |
| 休業・設備の止まりの日を学ばせる | 日報で印を付けて外す |
| 書き出しの失敗を来館者0人の日として学ばせる | 0の日は動かさず、書き出しを確かめる |
| 二乗の誤差で学ばせ、少ない時間帯がマイナスに振れる | 真ん中は loss="poisson" で学ばせる |
| 真ん中でタオルを頼み、週末に足りない | 上側(quantile=0.9)で数を出す |
| 配置の決まりをプログラムに書き込む | 施設ごとの表に置き、店長が直す |
| 見込みが少ない日に衛生の手入れを減らす | 減らさない。 衛生の管理は見込みと切り離す |
| 祝日の表の翌年分を入れ忘れる | 年に1回、内閣府のCSVを差し替える |
上の2行が、この構成の外れのほとんどです。 どちらも「館内に何人いるか」を正しく数えられているかの問題で、モデルを凝らすより、リストバンドの返却の読み取りをそろえるほうが効きます。
下から2行目は、外れではなく使い方の失敗です。 「空いている日は浴槽の手入れを減らしたい」という声が出ても、見込みは人の配置とタオルのためのもので、衛生の判断には使いません。 最初から決めておいてください。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 入館・退館の時刻、券種、催しの予定、天気、シフトの人数です。会員の番号や氏名は書き出しませんが、入館と退館の時刻の並びは、少ない時間帯では誰が来たかを推し量れる情報になりえます。
- 会員の番号・氏名を書き出さない … POSとリストバンドの書き出しには、券種と時刻と結ぶための番号だけを入れます。会員の名簿とは結びません
- 結ぶ番号は日ごとに使い捨てる … リストバンドの番号はその日の入館と退館を結ぶためだけに使い、日をまたいで同じ人をたどれる形にしません
- 見られる人を絞る … 見込みの表と元の記録は、店長と運営本部の担当に限ります
- 外部の生成AIのサービスに入館の記録を貼り付けない … 見込みは社内の環境で動かします
- 気象庁のデータの利用の条件を守る … 出典を記載し、加工したことを書き、国が作ったかのように見せない
- 衛生と安全の判断に見込みを使わない … 浴槽の水の手入れ、入館の制限、具合の悪い客への対応は、施設の決まりと保健所の指導に沿って人が決めます
誤りが起きた場合のリスクは、混む日を少なく見込んで見回りとタオルが足りなくなることと、空く日を多く見込んで人とタオルを余らせることの2つです。 前者は館内の人数ではなく入館の数で人を置くと起き、後者は催しの日を普通の日として学ばせると起きます。前者は客の安全に関わるので、見回りは上側で置きます。
10まず何から始めるか
1週目:催しと休業の一覧を作る
過去2年の催し(ロウリュ・季節の湯・近所の祭り・メディアの紹介)と、臨時の休業・設備の止まりの日を、日付と種類の一覧にします。この一覧が無いと、どのモデルも普通の日と催しの日を分けられません。
2週目:1日分の館内の人数を数える
第8章の手順で、1施設の土曜1日分の30分ごとの館内の人数を数え、入館の山とのずれを確かめます。あわせて、退館の記録の欠けが何割あるかを数えます。
3週目:配置の決まりを決める
店長と一緒に、受付1人がさばける入館の数と、見回り1人が受け持つ館内の人数を、施設ごと・季節ごとに決めて表にします。ここが決まらないと、人数の案が出せません。
4週目:Python で館内の人数を毎日作る
2施設の入館・退館の記録から、30分ごとの館内の人数を毎日作るところまで組みます。この時点では見込みを出さず、前年の同じ週との比べだけを店長に見せます。
2か月目以降: HistGradientBoostingRegressor の見込み、人数とタオルの数の案、印付けを足します。見込みと実際の来館者数・タオルの余りを毎週並べて外れ方を数え、 1件30分が何分になったかを実測します。店長が休む週も、本部の担当が見込みの表と印を見てシフトを組めるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
loss に poisson・quantile を選べ、poisson は目的の値が0以上である必要があること。quantile は分位点(ピンボール)損失で、0から1の値で分位点を指定すること。欠けた値(NaN)をそのまま扱えること。categorical_features の既定が from_dtype であること | scikit-learn: HistGradientBoostingRegressor | 2026-10-27 |
| 昨日までの気象観測のデータから、複数の地点の複数の項目を抽出でき、結果をCSVの形でダウンロードできること | 気象庁: 過去の気象データ・ダウンロード(使い方) | 2026-10-27 |
| 気象庁ホームページのコンテンツが公共データ利用規約(第1.0版)に準拠した利用条件で使えること。出典の記載、編集・加工した場合の記載、国が作成したかのような態様で公表・利用してはならないこと | 気象庁: ホームページについて(利用規約) | 2026-10-27 |
| 昭和30年(1955年)から令和9年(2027年)までの国民の祝日がCSV形式で公開されていること | 内閣府: 国民の祝日について | 2026-10-27 |
(代替候補)Prophet で祝日の表(holiday と ds の列、前後の幅)と add_regressor による追加の項目を使えること。追加の項目は過去と将来の両方で値が分かっている必要があること | Prophet: Seasonality, Holiday Effects, And Regressors | 2026-10-27 |
配置の決まり(1人がさばける数・受け持つ人数)と、タオルの予備の割合は、各施設の店長と運営本部で決めてください。衛生の管理は、公衆浴場の衛生の決まりと保健所の指導に従ってください。 本記事は上記の公開資料で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1989)についてのご相談はこちらから。
