Media > AI活用ユースケース > 経営企画 > 銭湯・サウナ施設が過去の入館の記録・曜日・天気・催しから Python で日別・時間帯別の来館者数を予測し、スタッフの配置とタオルの準備の数を決める

銭湯・サウナ施設が過去の入館の記録・曜日・天気・催しから Python で日別・時間帯別の来館者数を予測し、スタッフの配置とタオルの準備の数を決める

実装ステータス:構成例 技術的に実現可能な構成として設計したもの。自社未検証

受付の入館の記録と曜日・天気・催しから、施設ごとの翌週の日別・時間帯別の来館者数と館内の人数を幅つきで見込みます。見込みから受付と見回りの人数、タオルと館内着の準備の数の案を作り、店長の確認に回します。

サマリー
連携・自動化
Python
対象業界
その他/宿泊
対象部門
経営企画
対象業務
書類作成/集計・分析
主な課題
人手が足りない/判断に時間がかかる/属人化している
AIで行う処理
予測
主な効果
判断支援/属人化解消/工数削減
導入難易度
★★★★☆
実装レベル
本格構成
費用感
個別開発(大)
人間の確認
条件付き
現在工数
30h/月
AI導入後
9h/月
想定削減
70%
年間削減
252h
モデル条件による試算値です。実在企業の実績ではありません。

01導入前 / 導入後の業務フロー

導入前(Before)
  1. 木曜に、POSから前年の同じ週と直近4週の日ごとの入館の数を書き出す
  2. 翌週の天気予報と、催し・季節の湯・近所の祭りの予定を確かめる
  3. 前年の数に天気と催しの分を足し引きして、日ごとの来館者の見込みを決める
  4. 見込みと前年の時間ごとの入館の形から、受付・見回り・清掃の人数を時間帯ごとに決め、シフトの表を組む
  5. サウナ付き・タオルセット付きの割合を掛けて、日ごとのタオルと館内着の数を決め、リネンの業者に伝える
  6. 前日の夕方、翌日の天気予報が大きく変わっていれば、店長がアルバイトの出勤とタオルの数を直す
  7. 当日、混み方を見て、見回りを足すか、休憩をずらす
導入後(After)
  1. 自動毎週水曜の夜、POSとリストバンドの仕組みから前日までの入館・退館の記録を書き出し、プログラムが読み込む
  2. 自動入館と退館の時刻から、過去の日ごと・30分ごとの館内の人数を作る
  3. 自動翌週の暦・催しの予定・天気の見通しから、施設ごとの日別の来館者数と30分ごとの館内の人数を、真ん中と幅で見込む
  4. 自動配置の決まりの表から、時間帯ごとの受付・見回りの人数の案を作り、券種の割合からタオル・館内着の数の案を作る
  5. 自動催しの初回、天気の大きな変わり目、幅の広い日に印を付ける
  6. 人店長が、印の付いた日の理由を見て、見込みと人数の案を直し、シフトを組む
  7. 【自動/人】 前日の夕方に、翌日の天気の見通しで見込みを作り直し、店長がタオルの数と出勤を直すかを決める
各工程の詳しい説明を読む
  1. 木曜に、POSから前年の同じ週と直近4週の日ごとの入館の数を書き出す
  2. 翌週の天気予報と、催し・季節の湯・近所の祭りの予定を確かめる
  3. 前年の数に天気と催しの分を足し引きして、日ごとの来館者の見込みを決める
  4. 見込みと前年の時間ごとの入館の形から、受付・見回り・清掃の人数を時間帯ごとに決め、シフトの表を組む
  5. サウナ付き・タオルセット付きの割合を掛けて、日ごとのタオルと館内着の数を決め、リネンの業者に伝える
  6. 前日の夕方、翌日の天気予報が大きく変わっていれば、店長がアルバイトの出勤とタオルの数を直す
  7. 当日、混み方を見て、見回りを足すか、休憩をずらす

(a)館内の人数が分からない。 4番目は入館の数の形で人数を決めていますが、混み方を決めるのは、入った後どれだけ長く館内にいるかです。 週末の郊外の施設は滞在が長く、入館の山より後に館内の人数の山が来ます。入館の山に合わせて人を置くと、本当に混む時間に手が足りません。

(b)足し引きが店長によって違う。 雨の日に何割減らすか、ロウリュの催しの日に何割増やすかが、2人の店長で違います。本部が比べようとしても、理由が書かれていないので比べられません。

(c)タオルが余る日と足りない日が出る。 多めに頼めば洗濯の費用がかさみ、少なめに頼めば週末の夕方に足りなくなって、受付で「タオルの貸し出しを止めています」と言う日があります。

(d)店長が休めない。 見込みの作り方が頭の中にあるので、木曜にシフトを組めるのは店長だけです。店長が休む週は、前の週のシフトをほぼ写して済ませています。

  1. 【自動】 毎週水曜の夜、POSとリストバンドの仕組みから前日までの入館・退館の記録を書き出し、プログラムが読み込む
  2. 【自動】 入館と退館の時刻から、過去の日ごと・30分ごとの館内の人数を作る
  3. 【自動】 翌週の暦・催しの予定・天気の見通しから、施設ごとの日別の来館者数と30分ごとの館内の人数を、真ん中と幅で見込む
  4. 【自動】 配置の決まりの表から、時間帯ごとの受付・見回りの人数の案を作り、券種の割合からタオル・館内着の数の案を作る
  5. 【自動】 催しの初回、天気の大きな変わり目、幅の広い日に印を付ける
  6. 【人】 店長が、印の付いた日の理由を見て、見込みと人数の案を直し、シフトを組む
  7. 【自動/人】 前日の夕方に、翌日の天気の見通しで見込みを作り直し、店長がタオルの数と出勤を直すかを決める

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どうやって実装するのか

Step1

処理の起点を決める

毎週水曜の22時、閉館の後に動かします。 店長が木曜にシフトを組む前に、翌週の見込みと人数の案ができている状態にします。リネンの業者に翌週の枚数を伝える期限にも間に合います。 期限は契約している業者に確かめて、時刻を合わせます。

毎日17時に、翌日分だけ作り直します。 翌日の天気の見通しが水曜の時点から変わっていれば、見込みと人数の案を出し直し、水曜の案との差を店長に知らせます。 決めたシフトを書き換えるのではなく、差を並べて出します。

POSの書き出しが届かない、または前日の入館の数が0のときは、動かしません。 書き出しの失敗を「来館者が0人の日」として学ばせないためです。店長に知らせ、POSの保守の会社に書き出しのやり直しを頼みます。

Step2

入力データを集める

データ中身取得元
入館の記録入館の時刻、券種(入浴のみ・サウナ付き・タオルセット付き・回数券・会員)、人数POSの書き出し
退館の記録リストバンドの返却の時刻(入館の記録と結ぶ番号つき)リストバンドの仕組みの書き出し
催しの予定ロウリュの催し、季節の湯、近所の祭り、メディアの紹介、料金の変更の日運営本部の予定表
暦祝日、年末年始、大型連休、近くの学校の長期休み内閣府の祝日の表と自社の暦の表
過去の天気日ごとの降水量、最高気温・最低気温気象庁の過去の気象データ・ダウンロード
天気の見通し翌週の日ごとの天気・最高気温・最低気温・降水の確率契約している気象会社の配信、または店長の入力
休業・設備の止まり臨時の休業、サウナ室や浴槽の点検で止めた日と時間施設の日報

質を決めるのは、催しの予定表です。 ロウリュの催しの日や季節の湯の日は、夕方の入館が跳ねます。催しの日を普通の日として学ばせると、普通の日の見込みが多めに、催しの日の見込みが少なめにずれます。 過去2年の催しを、日付と種類の一覧にします。

休業と設備の止まりの記録も欠かせません。 サウナ室の点検で半日止めた日は、サウナ付きの入館が減ります。止めた日と時間を印にして、学ばせる記録から外すか、項目として入れます。

Step3

データの取得方法を決める

POSからは、前日までの入館の記録を、決まった列の並びで毎日書き出す設定を作ります。リストバンドの仕組みからは、返却の時刻と、入館の記録と結ぶ番号を書き出します。会員の番号や氏名は書き出しません。

取るものどこから何に使うか
入館の時刻と券種POSの書き出し日別の来館者数、券種の割合
退館の時刻リストバンドの仕組み滞在の時間、館内の人数
催し・休業の日運営本部の予定表と施設の日報催しの項目、外す日の印
祝日内閣府のCSV暦の項目
過去の天気気象庁のCSV天気の項目(過去)
天気の見通し気象会社の配信か店長の入力天気の項目(翌週)

過去の天気は、最初に2年分をまとめて取り、その後は毎週1週間分を足します。 地点は、施設にいちばん近いアメダスの地点にします。見込みの資料には「出典:気象庁ホームページ」と、加工したことを書いておきます。

回数券と月の会員の入館も、券種として分けて書き出します。 会員は天気が悪くても来る常連が多く、入浴のみの一般の客とは天気への反応が違います。 券種ごとの数を残しておけば、雨の日に減るのはどの客かが分かり、タオルを渡す券種の割合の動きも読めます。

天気の見通しを店長の入力で済ませる場合は、入力の欄を決めておきます。 「晴れ・曇り・雨・雪」の4つと、最高気温の数字だけを入れてもらいます。自由な文で書くと、プログラムが読めません。

Step4

AIへ渡す前に整形する

  1. 入館と退館を結ぶ … リストバンドの番号で入館と退館を組にし、滞在の時間を出します。退館の記録が無いもの(返却の読み取りの失敗)は、別に数えます
  2. 滞在の時間を補う … 退館が無いものは、同じ施設・同じ曜日の種類・同じ券種の滞在の時間の真ん中で補い、補ったことを印にします
  3. 館内の人数を作る … 30分ごとに、その時刻に入館済みで退館前の人を数えます
  4. 異常の日を外す … 臨時の休業、設備の止まり、POSの障害の日を印にします
  5. 日別に束ねる … 日ごとの来館者数と、券種ごとの数、30分ごとの館内の人数を作ります
  6. 項目を作る … 曜日、祝日、連休の何日目か、年末年始、催しの種類、季節の湯、降水量、最高気温、最低気温、前年の同じ週の来館者数、給料日の後の週末の印
  7. 割合を作る … 直近8週の曜日の種類ごとに、サウナ付き・タオルセット付きの割合と、館内着を渡す割合を作ります

3番目を正しく作るのが、この構成の土台です。 入館の時刻だけで人を置くと、第3章の(a)のように山の時刻がずれます。郊外の施設では、入館の山から2時間ほど遅れて館内の人数の山が来ることが、記録を作って初めて分かります。

2番目の補いを「閉館まで館内にいた」にしないでください。 返却の読み取りに失敗した人を閉館まで数えると、夜の館内の人数が多めに出て、夜の見回りを厚くしすぎます。 補ったものの割合は毎日数え、増えたら読み取りの機械を確かめます。

Step5

AIに処理させる

させるのは、施設ごとに「翌週の日別の来館者数」と「30分ごとの館内の人数」を、真ん中と幅で見込むことだけです。 配置の人数、タオル・館内着の数、印付けは、決まった計算で行います。

見込むもの使うもの判断できないときの扱い
日別の来館者数(真ん中)過去の来館者数、曜日、祝日、連休、催し、季節の湯、天気、前年の同じ週催しの種類が初めてなら new_event
30分ごとの館内の人数(真ん中・上側・下側)同上+時刻上側が館内の受け入れの目安を超えたら crowd
日別の券種ごとの数来館者数 × 直近8週の券種の割合(決まった計算)割合が前月から大きく動いたら mix_shift

真ん中はポアソン損失、幅は分位点の損失で、別々のモデルにします。 平日の朝のように館内の人数が数人の時間帯があり、二乗の誤差で学ばせると、少ない時間帯でマイナスの見込みが出ることがあります。 タオルの数には上側(quantile=0.9)を、人の配置には真ん中と上側の両方を使います。

させないこと理由
シフトの確定と、誰を入れるかの決定働く人の都合と慣れは店長が見る
入館の制限・料金の変更客への約束に関わる。運営本部が決める
衛生の管理(浴槽の水の入れ替え・消毒の頻度)公衆浴場の衛生の決まりと保健所の指導に沿って決める
催しの効き目の推測初めての催しは記録が無い。店長の見立てを並べる
天気の見通しの補正見通しをそのまま使い、勝手に足し引きしない

3行目を必ず守ってください。 来館者が少ない見込みの日でも、浴槽の水や設備の衛生の手入れの回数を減らす判断に、見込みを使ってはいけません。 衛生の管理は、施設の決まりと保健所の指導で決まり、来館者の数で緩めるものではありません。

Step6

指示内容を固定する

この構成は生成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日の混む日に見回りが足りません。

Step7

出力形式を固定する

施設・日ごとに、次の形の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 で店長の直しが残ることです。 「この催しは前回より客が多い」と店長が直した理由が残れば、次の同じ催しのときに、その記録が学ばせる記録になります。

Step8

システムへ連携する

つなぎ先方式内容
受付の券売機・POS毎日の書き出しの受け取り入館の時刻と券種
リストバンドの仕組み毎日の書き出しの受け取り返却の時刻と入館の記録と結ぶ番号
運営本部の予定表表の読み込み催し・季節の湯・休業の日
内閣府の祝日の表・気象庁のCSVファイルの読み込み祝日、過去の天気
見込みの表共有フォルダへの書き出し見込み、人数の案、タオルの数の案、印
店長への通知社内の連絡の場印の付いた日と、翌日分の作り直しの差

シフトの表へは、書き込みません。 人数の案は見込みの表に並べ、店長がシフトの表に自分で写して、誰を入れるかを決めます。 リネンの業者への枚数の連絡も、店長が確かめてから送ります。

通知には、来館者の数そのものを流しません。 流すのは「印の付いた日」と「見込みの表の場所」だけにし、施設の売上に関わる数字が連絡の場の外へ写される経路を作りません。

Step9

人が確認する

店長が見るのは、毎週の人数の案と、印の付いた日の理由です。 印の無い日は、人数の案を流し見てシフトに写します。全日を前の方法で足し引きし直す運用にすると、第10章の9.0時間には収まりません。

  1. crowd を先に見る … 館内の人数の上側が受け入れの目安に近い日です。見回りを足すか、催しの時間をずらすかを決めます
  2. new_event を見る … 初めての催しの日です。店長の見立てを並べ、どちらで組むかを決めます
  3. weather と mix_shift を見る … 天気の変わり目と券種の割合の動きです。タオルの数を直すかを決めます
  4. 直したら理由を書く … manager_override に値と理由を残します

2番目で、見込みより店長の見立てを採る日があって構いません。 見込みは過去2年の記録の範囲で出した数で、初めての催しやメディアの紹介の効き目は知りません。 直した理由を残せば、次の同じ催しのときには記録になります。

本部の担当は、月に1回、2施設の見込みの外れ方を並べます。 同じ向きに外れる日の型(雨の土曜、給料日の後の金曜など)が見えたら、項目に足すか、店長の足し引きの決まりとして書き残します。 これが、店長の頭の中にあった見込み方の引き継ぎになります。

Step10

例外に対処する

起きること対応
POSの書き出しが届かない、前日の入館が0見込みを出さず、店長に知らせる
退館の記録の欠けが多い滞在の時間で補い、補った割合を表に出す。多ければ読み取りの機械を確かめる
臨時の休業・設備の止まりその日を学ばせる記録から外し、翌週の見込みに印を付ける
テレビ・SNSで紹介された紹介の日の印を付け、翌週から2週間は店長の見立てを並べる
料金を変えた変えた日から項目を立て、3か月は mix_shift の線を下げる
台風・大雪の予報見込みを参考にとどめ、営業時間の判断は運営本部が行う
近所の競合の施設が開業・休業した運営本部の予定表に入れ、翌月から項目として足す
天気の見通しが届かない平年並みの天気で見込み、weather を付けて店長に確かめてもらう

上から4行目は、年に何度か起きます。 紹介の直後は、ふだん来ない客が一度に来て、記録の傾向が当てはまりません。この期間は見込みを人の配置の下限として使い、上側の判断は店長に任せます。 紹介の効き目の記録が数回たまれば、催しの種類の1つとして項目にできます。

Step11

記録を残す

  • 読み込んだ入館・退館の記録の件数と、補った滞在の時間の割合
  • 施設・日ごとの来館者数と30分ごとの館内の人数の見込み(真ん中・上側・下側)
  • 人数の案、タオル・館内着の数の案、印
  • 店長が直した値と理由(manager_override)
  • 実際の来館者数・館内の人数、タオルの使った枚数と余り・不足
  • モデルの版、学ばせた期間、配置の決まりの表の値

5つ目のタオルの余りと不足は、毎週数えます。 上側で頼んでいるのに足りない日が続くなら、タオルを渡す券種の割合が変わっています。余りが続くなら、予備の割合を下げられます。 洗濯の費用を話し合う材料にもなります。

04実装レベルの3段階

最小構成:表計算で1施設の入館の数と天気・催しの関係を見て、1日分の館内の人数を数える / 来館者の動き方と、館内の人数の山の把握
半自動化:上記+Python で2施設の館内の人数を毎日作り、翌週の日別の来館者数と30分ごとの館内の人数を見込む / 2施設の翌週の見込みと幅
本格構成:上記+配置の人数とタオルの数の案、印付け、翌日分の作り直し / 人数とタオルの案づくりの全体と、見るべき日の知らせ

最小構成では、毎週の見込みは減りません。 1施設の1日分を数えるのに半日かかります。確かめるための段階です。 半自動化で、前年の数を書き出して足し引きを決める時間はほぼ無くなります。 ただし、人数とタオルの数への換算は手で残ります。本格構成で、店長が見るのは人数の案と印の付いた日だけになり、この段階が本記事の想定です。 差が大きいのは、30分ごとに人数を決める作業が、毎週の手作業だからです。 段階を飛ばさないでください。 半自動化の見込みを夏と冬の一巡まで並べると、外れやすい天気と催しの型が先に分かります。季節を一度見てから本格構成に進むほうが、印の空振りが減ります。

05工数削減シミュレーション

前提値(モデル条件)
対象人数
2 名
月間件数
60 件
1件あたり現在時間
30 分
1件あたり導入後時間
9 分
現在  60件 × 30分 ÷ 60 = 30 時間/月
導入後 60件 × 9分 ÷ 60 = 9 時間/月
月間削減時間
21h
削減率
70%
年間削減時間
252h
年間金額換算(時間単価2,500円)
63万円
モデル条件による試算であり、実際の効果は業務内容・運用方法によって異なります。

自社条件で導入効果を整理したい方へ

このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。

AI活用について相談する

06向いている企業・向いていない企業

向いている
  1. 銭湯・サウナ施設・日帰りの温浴施設を2〜5か所運営し、受付の券売機やPOSから入館の時刻と券種を書き出せる会社。翌週のシフトとタオル・館内着の準備の数を、店長が前年の同じ時期と天気予報を見た勘で決めていて、店長によって余り方・足りなさが違う場合。ロッカーの鍵やリストバンドで退館の時刻も記録している施設では、館内の人数まで見込める。旅館・ホテルの日帰り入浴の受付にも使える。
向いていない
  1. 1施設で来館者が1日100人に満たず、店長が毎日の様子を見て足りる場合。入館の記録が日ごとの合計しか残っていない場合。イベントやテレビの紹介で来館者が大きく振れることが多く、過去の記録の傾向が当てにならない開業から1年未満の施設。なお、シフトの確定、入館の制限、衛生の管理の判断は、この構成では代替できません。

07最小構成で試す方法

  1. POSから、1施設の過去1年の入館の記録を書き出す
  2. 表計算で、曜日ごとに日別の入館の数を並べ、祝日・催しの日に色を付ける
  3. 気象庁の過去の気象データ・ダウンロードから、同じ期間の降水量と最高気温をCSVで取り、入館の数と並べる
  4. リストバンドの記録があれば、入館と退館を結んで、土曜1日分の30分ごとの館内の人数を手で数える
  5. 前年の同じ週の数を「翌週の見込み」とした場合の外れ方を、週ごとに数える

4番目を、1日分でいいので必ず作ってください。 入館の山と館内の人数の山がどれだけずれるかが分かると、いまのシフトの人の置き方が合っているかを、数字で確かめられます。

出てきた内容判断
天気と催しで入館の数がはっきり動き、館内の人数の山がずれるPython で HistGradientBoostingRegressor の見込みに進む
リストバンドの退館の記録が欠けていて、館内の人数が作れない読み取りの機械と返却の手順を直すのが先
前年の同じ週で十分に当たる館内の人数の形だけを作り、来館者数は前年の値で足りる

2行目が出ることは珍しくありません。 失敗ではなく、混む時間に人が足りなかった理由が1つ分かったということです。 返却の読み取りを直してから、もう一度1日分を数えてください。

08実装時につまずきやすいポイント

問題対策
入館の山に合わせて人を置く入館と退館から館内の人数を作り、その山に合わせる
退館の記録の欠けを閉館まで館内にいたと扱う同じ条件の滞在の時間の真ん中で補い、割合を数える
催しの日を普通の日として学ばせる催しの予定表で種類の項目を作る
休業・設備の止まりの日を学ばせる日報で印を付けて外す
書き出しの失敗を来館者0人の日として学ばせる0の日は動かさず、書き出しを確かめる
二乗の誤差で学ばせ、少ない時間帯がマイナスに振れる真ん中は loss="poisson" で学ばせる
真ん中でタオルを頼み、週末に足りない上側(quantile=0.9)で数を出す
配置の決まりをプログラムに書き込む施設ごとの表に置き、店長が直す
見込みが少ない日に衛生の手入れを減らす減らさない。 衛生の管理は見込みと切り離す
祝日の表の翌年分を入れ忘れる年に1回、内閣府のCSVを差し替える

上の2行が、この構成の外れのほとんどです。 どちらも「館内に何人いるか」を正しく数えられているかの問題で、モデルを凝らすより、リストバンドの返却の読み取りをそろえるほうが効きます。

下から2行目は、外れではなく使い方の失敗です。 「空いている日は浴槽の手入れを減らしたい」という声が出ても、見込みは人の配置とタオルのためのもので、衛生の判断には使いません。 最初から決めておいてください。

09セキュリティ・AIガバナンス上の注意点

この構成で扱うデータ: 入館・退館の時刻、券種、催しの予定、天気、シフトの人数です。会員の番号や氏名は書き出しませんが、入館と退館の時刻の並びは、少ない時間帯では誰が来たかを推し量れる情報になりえます。

  1. 会員の番号・氏名を書き出さない … POSとリストバンドの書き出しには、券種と時刻と結ぶための番号だけを入れます。会員の名簿とは結びません
  2. 結ぶ番号は日ごとに使い捨てる … リストバンドの番号はその日の入館と退館を結ぶためだけに使い、日をまたいで同じ人をたどれる形にしません
  3. 見られる人を絞る … 見込みの表と元の記録は、店長と運営本部の担当に限ります
  4. 外部の生成AIのサービスに入館の記録を貼り付けない … 見込みは社内の環境で動かします
  5. 気象庁のデータの利用の条件を守る … 出典を記載し、加工したことを書き、国が作ったかのように見せない
  6. 衛生と安全の判断に見込みを使わない … 浴槽の水の手入れ、入館の制限、具合の悪い客への対応は、施設の決まりと保健所の指導に沿って人が決めます

誤りが起きた場合のリスクは、混む日を少なく見込んで見回りとタオルが足りなくなることと、空く日を多く見込んで人とタオルを余らせることの2つです。 前者は館内の人数ではなく入館の数で人を置くと起き、後者は催しの日を普通の日として学ばせると起きます。前者は客の安全に関わるので、見回りは上側で置きます。

10まず何から始めるか

1週目:催しと休業の一覧を作る

過去2年の催し(ロウリュ・季節の湯・近所の祭り・メディアの紹介)と、臨時の休業・設備の止まりの日を、日付と種類の一覧にします。この一覧が無いと、どのモデルも普通の日と催しの日を分けられません。

2週目:1日分の館内の人数を数える

第8章の手順で、1施設の土曜1日分の30分ごとの館内の人数を数え、入館の山とのずれを確かめます。あわせて、退館の記録の欠けが何割あるかを数えます。

3週目:配置の決まりを決める

店長と一緒に、受付1人がさばける入館の数と、見回り1人が受け持つ館内の人数を、施設ごと・季節ごとに決めて表にします。ここが決まらないと、人数の案が出せません。

4週目:Python で館内の人数を毎日作る

2施設の入館・退館の記録から、30分ごとの館内の人数を毎日作るところまで組みます。この時点では見込みを出さず、前年の同じ週との比べだけを店長に見せます。

2か月目以降: HistGradientBoostingRegressor の見込み、人数とタオルの数の案、印付けを足します。見込みと実際の来館者数・タオルの余りを毎週並べて外れ方を数え、 1件30分が何分になったかを実測します。店長が休む週も、本部の担当が見込みの表と印を見てシフトを組めるようになった時点で、この構成は完成です。


11関連ユースケース

12この仕組みを理解するための記事

13技術仕様の確認日・参考情報

技術仕様確認日:2026-10-27/最終更新:2026-10-27
確認した内容情報源確認日
loss に poisson・quantile を選べ、poisson は目的の値が0以上である必要があること。quantile は分位点(ピンボール)損失で、0から1の値で分位点を指定すること。欠けた値(NaN)をそのまま扱えること。categorical_features の既定が from_dtype であることscikit-learn: HistGradientBoostingRegressor2026-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 Regressors2026-10-27

配置の決まり(1人がさばける数・受け持つ人数)と、タオルの予備の割合は、各施設の店長と運営本部で決めてください。衛生の管理は、公衆浴場の衛生の決まりと保健所の指導に従ってください。 本記事は上記の公開資料で確認できた範囲だけを扱っています。

実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。

自社の業務に使えるAI活用候補を整理します

このユースケース(UC-1989)についてのご相談はこちらから。

AI活用について相談する
目次