Media > AI活用ユースケース > カスタマーサポート > フィットネスクラブが成人の会員の来館・契約・支払いの記録から、翌月に退会の届けを出しそうな会員を Python で見込み、店舗ごとの声かけの予定にする

フィットネスクラブが成人の会員の来館・契約・支払いの記録から、翌月に退会の届けを出しそうな会員を Python で見込み、店舗ごとの声かけの予定にする

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

成人の会員の入館の記録、契約とプランの変更、口座振替の結果、スタジオの予約の記録を月末の時点でそろえ、翌月の退会の届けの締め日までに届けを出しそうな会員を Python で見込みます。結果は店舗ごと・スタッフごとの声かけの予定表にします。

サマリー
連携・自動化
Python
対象業界
その他
対象部門
カスタマーサポート/営業
対象業務
集計・分析
主な課題
データ分析に時間がかかる/営業フォローが追いつかない/属人化している
AIで行う処理
予測
主な効果
判断支援/工数削減/機会損失防止
導入難易度
★★★★☆
実装レベル
本格構成
費用感
個別開発(大)
人間の確認
条件付き
現在工数
60h/月
AI導入後
20h/月
想定削減
67%
年間削減
480h
モデル条件による試算値です。実在企業の実績ではありません。

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

導入前(Before)
  1. 月初に、マネージャーが入館の記録を前月分と前々月分で書き出す
  2. 会員ごとの来館の回数を表計算で数え、前々月より減った会員を拾う
  3. 拾った会員を会員の管理システムで開き、プラン・在籍の月数・休会の履歴・口座振替の結果を確かめる
  4. スタジオのレッスンの予約やパーソナルトレーニングの契約を見て、「急ぎ」「今月中」「様子見」を付ける
  5. フロントとトレーナーに割り振り、声かけの一覧として配る
  6. 声をかけた結果を、スタッフが一覧に書き込む
導入後(After)
  1. 自動毎月1日の未明に、会員の管理システム・入館の記録・予約の仕組みの前月末までの書き出しを決まったフォルダに置く(各システムの定時の書き出しの機能を使う)
  2. 自動Python が書き出しを会員番号でつなぎ、会員ごとの特徴を前月末の時点で作る
  3. 自動学習済みのモデルが、会員ごとに翌月10日の締め日までに退会の届けが出る確率を出す
  4. 自動会員ごとに、根拠になった記録の事実を規則で並べる
  5. 自動店舗ごとに確率の高い順に並べ、スタッフごとの上限までを声かけの予定表に載せる
  6. 人マネージャーが予定表の上位と警告を確かめ、順番を入れ替える理由があれば書き込み、スタッフに配る
  7. 人スタッフが来館のときや電話で声をかけ、結果を予定表に残す
各工程の詳しい説明を読む
  1. 月初に、マネージャーが入館の記録を前月分と前々月分で書き出す
  2. 会員ごとの来館の回数を表計算で数え、前々月より減った会員を拾う
  3. 拾った会員を会員の管理システムで開き、プラン・在籍の月数・休会の履歴・口座振替の結果を確かめる
  4. スタジオのレッスンの予約やパーソナルトレーニングの契約を見て、「急ぎ」「今月中」「様子見」を付ける
  5. フロントとトレーナーに割り振り、声かけの一覧として配る
  6. 声をかけた結果を、スタッフが一覧に書き込む

(a)拾い方が店舗ごとに違う。 2番目の「減った」の基準が、店舗によって「前の月より半分以下」だったり「2週間来ていない」だったりします。週に1回のプランの会員と毎日来る会員を同じ基準で見ると、 週1回の会員はいつも「減った」に入り、毎日来ていた会員が週3回に減っても拾われません。

(b)来館の記録だけでは見えない兆しがある。 プランを夜間に下げた、口座振替が1回不能になった、よく出ていたレッスンの予約を続けてキャンセルした。どれも退会の前によく見られる動きですが、 3番目と4番目で管理システムを開くかどうかは、その月のマネージャーの忙しさしだいです。

(c)届けが出てから気づく。 1番目は月初で、一覧が配られるのは5日から7日ごろです。10日の締め日までに声をかけられるのは、その数日だけです。 一覧に載っていた会員が、声をかける前に届けを出していることがあります。

(d)一覧の多い少ないが人手で決まる。 スタッフが話せる人数に合わせて75名ほどに絞っていますが、何を基準に絞ったかは記録に残りません。 翌月にその一覧が当たっていたかを確かめる手段もありません。当たっていたかが分からないので、拾い方を直すきっかけもありません。 マネージャーが替わると拾い方も変わり、店舗の退会の数が増えても、一覧のせいか、ほかの理由かを切り分けられません。

  1. 【自動】 毎月1日の未明に、会員の管理システム・入館の記録・予約の仕組みの前月末までの書き出しを決まったフォルダに置く(各システムの定時の書き出しの機能を使う)
  2. 【自動】 Python が書き出しを会員番号でつなぎ、会員ごとの特徴を前月末の時点で作る
  3. 【自動】 学習済みのモデルが、会員ごとに翌月10日の締め日までに退会の届けが出る確率を出す
  4. 【自動】 会員ごとに、根拠になった記録の事実を規則で並べる
  5. 【自動】 店舗ごとに確率の高い順に並べ、スタッフごとの上限までを声かけの予定表に載せる
  6. 【人】 マネージャーが予定表の上位と警告を確かめ、順番を入れ替える理由があれば書き込み、スタッフに配る
  7. 【人】 スタッフが来館のときや電話で声をかけ、結果を予定表に残す

1番目で月初の未明に動かすのは、締め日までの日数を1日でも多く残すためです。 一覧が1日に配られれば、10日の締め日まで9日あります。

6番目でマネージャーが見るのは、600件すべてではありません。 上位の会員、警告の付いた会員、記録が足りずに確率を出していない会員だけです。残りは予定表で流し見ます。

7番目の結果は、コードで残します。 「話せた」「来館が無く話せていない」「退会の意向を聞いた」のように決まった選択肢にし、翌月の予定表を作るときに読み込みます。 声をかけた会員と、かけていない会員の翌月の届けを比べる材料になります。

02今回想定するシステム構成

構成図
会員の管理システム(契約・プラン・休会・口座振替の結果)
+ 入館のゲートの記録 + レッスンの予約の記録
   │  毎月1日の未明に、前月末までの書き出しを決まったフォルダへ
   ▼【トリガー】書き出しがそろったとき(毎月1回)
Python(pandas)
   ├──▶ 会員番号でつなぎ、前月末の時点で特徴を作る
   ├──▶ 使わない列を読み込みの段階で除く
   ▼
scikit-learn(HistGradientBoostingClassifier+確率の較正)
   │   翌月10日までに退会の届けが出る確率
   ▼
Python ── 理由の事実を規則で並べ、店舗ごと・スタッフごとに上限まで載せる
   ▼
声かけの予定表(店舗ごと)+ 結果の JSON
   ▼
【マネージャーが確かめて、スタッフに配る】
役割想定する製品代替候補
実行環境Python(pandas・scikit-learn の HistGradientBoostingClassifier)R、BigQuery ML
出力先声かけの予定表(店舗ごとのシート)会員の管理システムのタスクの機能
定時実行社内のジョブ管理の仕組みOSのタスクスケジューラ

生成AIは使いません。 この構成で行うのは、記録をそろえること、確率を見込むこと、事実を並べることです。会員の来館の記録を外部の生成AIに渡す場面を、最初から作りません。 理由の文も、テンプレートに事実を差し込むだけで足ります。

会員の管理システムには書き戻しません。 確率をフロントの画面に出すと、受付のたびに会員を数字で見ることになり、会員への接し方が変わるおそれがあります。 予定表は店舗のマネージャーと、声をかけるスタッフだけが見る場所に置きます。

モデルに HistGradientBoostingClassifier を選ぶのは、欠けた値をそのまま扱えるからです。 公式の説明では、学ばせるときに分かれ目ごとに欠けた値を左右どちらへ送るかを学ぶとされています。レッスンの予約をしない会員は、予約に関する特徴がすべて欠けます。 0で埋めると「予約をしない会員」と「予約を全部取り消した会員」の区別が消えます。プランと店舗はカテゴリの型の列にし、categorical_features の既定の "from_dtype" でそのまま渡します。

03どうやって実装するのか

Step1

処理の起点を決める

毎月1日の未明に、3つのシステムの書き出しが決まったフォルダにそろった時点で動かします。 書き出しが終わったら各システムの側で「そろった」の印のファイルを置き、ジョブ管理の仕組みが15分ごとにその印を見に行きます。印が3つそろわないまま動かすと、ある店舗の入館の記録だけが欠けた一覧ができます。

見込む先は「前月末の時点で在籍している会員が、翌月10日の締め日までに退会の届けを出すか」です。 休会の届けは別に数えます。休会は退会の手前にあることが多い一方で、けがや出張で一時的に休む会員もいます。 休会を的に入れると、声をかける理由の違う会員が混ざるので、休会の届けは特徴の側に「過去の休会の回数」として入れます。

週の単位ではなく月の単位で動かします。 締め日が月に1回なので、月の途中で確率を出し直しても、声をかけるべき会員の顔ぶれはほとんど変わりません。 来館が途切れた会員を週ごとに拾う使い方は、第9章の本格構成の先で考えます。

Step2

入力データを集める

データ中身取得元
入館の記録会員番号、店舗、入館の日時、退館の日時入館のゲートの記録
契約の記録会員番号、所属の店舗、プラン、入会日、プランの変更の日付と前後のプラン、休会の届けの日付と期間、月会費、料金の改定の適用日会員の管理システム
退会の記録退会の届けの日付、退会の月会員の管理システム
支払いの記録口座振替の月、結果(済・不能)、不能の理由のコード会員の管理システム
予約の記録レッスンの予約の日付、出席・当日の取消・無断の欠席、パーソナルトレーニングの契約の有無と残りの回数レッスンの予約の仕組み
声かけの結果声をかけた日、スタッフ、結果のコード前月までの声かけの予定表

質を決めるのは、入館の記録の会員番号のそろい方です。 会員証を忘れてフロントで入館の手続きをした日の記録が別の番号で残っていると、その会員は来館が減ったように見えます。 フロントで入館の手続きをしたときの記録のしかたを、最初に店舗でそろえます。

入れない列を、表で決めておきます。

入れない列理由
入会のときの健康の申告書の内容持病やけがの記録が含まれることがある
体組成の測定の記録体の状態の記録で、退会の見込みに使う理由が説明しにくい
年齢・性別声かけの順番を属性で変える理由にしない
声かけの結果の自由記述体調や家庭の事情が書かれていることがある

1行目を外すのが、いちばん大事な判断です。 健康の申告書は、運動を安全に行うために預かっているものです。それを退会の見込みに使うことは、会員が申告したときの目的から外れます。

Step3

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

3つのシステムの画面から自動で取ってくる仕組みは作りません。各システムの定時の書き出しの機能で、決まったフォルダに置いてもらいます。 書き出しの機能が無いシステムなら、マネージャーの1人が月初に画面から書き出します。

取るものどこから何に使うか
入館の日時入館の記録直近4週・その前の4週の来館の回数、最後の来館からの日数、来館の曜日と時間帯の変化
プランの変更・休会契約の記録プランを下げてからの日数、過去の休会の回数
口座振替の結果支払いの記録直近3か月の不能の回数、最後の不能からの日数
予約の出欠予約の記録直近4週の当日の取消・無断の欠席の割合
退会の届けの日付退会の記録学習用の正解
声かけの結果前月の予定表声をかけた会員の印(学習と効果の測り方に使う)

来館の回数は、その会員のいつもの回数と比べます。 店舗ごとの一律の基準ではなく、直近4週の回数を、その会員の直近26週の4週あたりの回数で割った比を特徴にします。週1回のプランの会員が週1回来ていれば比は1に近く、毎日来ていた会員が週3回に減れば比は小さくなります。第3章の(a)を、ここで解きます。

学習用の正解から、引っ越しなどで届けの理由がはっきりしている退会を外しません。 理由は届けを受けた後にしか分からず、月末の時点では区別がつかないからです。 見込む先は、理由を問わず「届けが出るか」です。

Step4

AIへ渡す前に整形する

  1. つなぐ … 会員番号で3つの書き出しをつなぎます。つながらない入館の記録の件数を店舗ごとに残します
  2. 対象を絞る … 前月末の時点で在籍している会員だけにします。休会中の会員、すでに退会の届けを出している会員、入会から1か月未満の会員は除きます
  3. 時点をそろえる … 特徴はすべて「前月末の時点」で作ります。月末より後の入館や予約を混ぜると、学習のときに答えを見てしまいます
  4. 特徴を作る … 直近4週の来館の回数といつもの回数の比、最後の来館からの日数、来館の時間帯の変化、在籍の月数、プランを下げてからの日数、過去の休会の回数、口座振替の不能の回数、予約の当日の取消・無断の欠席の割合、パーソナルトレーニングの残りの回数、料金の改定の適用からの月数、プラン、店舗
  5. 入れない列を落とす … 入力データの表で決めた4つの列を、読み込みの段階で読まないようにします
  6. 退会の相談の記録を外す … フロントで「退会したい」と相談された記録は、届けの手前の出来事そのものなので、特徴に入れません

6番目を外さないと、学習のときだけよく当たるモデルになります。 相談の記録はほぼ届けとセットで残り、モデルはそれだけを見て確率を上げます。 本番で予定表を作る時点で、相談をしている会員はもう声をかける段階を過ぎています。

Step5

AIに処理させる

させるのは、会員ごとに「翌月10日の締め日までに退会の届けが出る確率」を出すことだけです。 学習には、過去2年分の毎月末の時点の特徴と、その翌月10日までの結果を使います。

させることやり方
確率を出すHistGradientBoostingClassifier の predict_proba
学ばせ方月の境目で分け、古い月で学ばせ、新しい月で確かめる
早めに止める見張り直近の月を検証用として fit に X_val・y_val で渡す
確率を実際の割合に合わせる学習済みのモデルを FrozenEstimator で包み、CalibratedClassifierCV で較正する

2行目の分け方は、TimeSeriesSplit をそのまま使いません。 公式の説明では、TimeSeriesSplit は時間の順に並んだ記録を行の位置で分けるもので、分け目ごとの成績を比べられるようにするには、記録が等しい間隔で並んでいる必要があるとされています。この記録は「会員×月」の行で、月ごとの会員の数が違います。行の位置で分けると、1つの月が学習と確かめの両方にまたがります。 月の番号で行を束ね、月の境目で分けます。考え方は同じで、未来の月で学んで過去の月を確かめることを避けます。

3行目は、既定のままにしないでください。 公式の説明では、early_stopping の既定は 'auto' で、学習の件数が1万件を超えるか、X_val と y_val を fit に渡すと有効になります。 渡さないと学習の記録の一部が取り分けられて見張りに使われ、月の新旧が混ざった記録で止めどきを決めることになります。

退会は会員の数パーセントなので、class_weight は使いません。 公式の説明では 'balanced' を指定すると件数の少ない側の重みが自動で上がりますが、確率そのものが実際の割合からずれます。 この構成では確率をスタッフの人数の見積もりに使うので、重みは付けずに較正で合わせます。較正は公式の説明のとおり、学習に使った記録と重ならない月で行い、順番を保つために sigmoid を選びます。

理由の事実は、モデルではなく規則で並べます。

理由の種類記録の条件予定表に書く文
来館が減った直近4週の回数がいつもの半分以下「直近4週の来館 2回(いつもは4週で8回ほど)」
来館が途切れた最後の来館から21日以上「最後の来館から24日」
プランを下げた直近3か月にプランを下げた「8月に全日から夜間に変更」
予約の取消が増えた直近4週の予約の半分以上が当日の取消・無断の欠席「直近4週の予約 6件のうち取消 4件」
支払いが止まった直近3か月に口座振替の不能「9月の口座振替が不能」
させないこと理由
声をかけるかの決定声をかけるかと時期はマネージャーとスタッフが決める
引き留めの特典の提案会員の事情を聞いてからスタッフが決める
確率の会員への開示会員を評価した数字として受け取られる
健康の状態の推し量り入れない列から推し量れる特徴を足さない
Step6

指示内容を固定する

この構成は生成AIを使わないため、プロンプトはありません。 代わりに、学習と予定表の作り方を決める設定を、ひとつのファイルにまとめます。

【見込む先】
target: 翌月10日(退会の届けの締め日)までに退会の届けが出る(休会の届けは 0)
as_of: 前月末
population: 前月末に在籍。休会中・届け済み・入会1か月未満は除く

【読まない列(読み込みの段階で除く)】
- 健康の申告書の内容、体組成の測定の記録
- 年齢、性別
- 声かけの結果の自由記述
- フロントでの退会の相談の記録

【モデル】
estimator: HistGradientBoostingClassifier(categorical_features="from_dtype")
class_weight: 指定しない(確率を較正で合わせる)
split: 月の境目で分ける(行の位置で分けない)
validation: 直近2か月の月末時点を X_val / y_val として fit に渡す
calibration: CalibratedClassifierCV(FrozenEstimator(model), method="sigmoid")
             較正用は学習・検証と重ならない月
学習期間: 直近24か月の月末時点

【予定表】
- 店舗ごとに確率の高い順に並べる
- フロント・トレーナー1名あたり最大10名、店舗あたり最大75名
- 入会から3か月未満の会員は、確率にかかわらず「新規」の欄に別に載せる
- 入館の記録がつながらない会員は、確率を出さず「記録不足」

【理由の文】
- 第7章の理由の表の5つの条件だけを使う
- 当てはまる条件が無い会員は「記録上の目立った変化なし(モデルの確率のみ)」と書く

「新規」の欄を分けるのは、入会から3か月未満の会員は記録が短く、確率が当てになりにくいからです。 一方で、この時期の退会は多いので、確率と別の欄で、入会の後の案内が済んでいるかをスタッフが確かめます。

Step7

出力形式を固定する

予定表は表で出し、同じ内容を JSON でも残します。 表はスタッフが読むため、JSON は翌月の振り返りのためです。

{
  "as_of": "2026-09-30",
  "model_version": "churn-2026-09",
  "store": "駅前店",
  "staff_id": "F-03",
  "members": [
    {
      "member_no": "",
      "plan": "全日",
      "probability": 0.24,
      "rank_in_store": 3,
      "reasons": [
        "直近4週の来館 2回(いつもは4週で8回ほど)",
        "直近4週の予約 6件のうち取消 4件"
      ],
      "flags": ["new_member | insufficient_records | none"],
      "contact_result": ""
    }
  ],
  "store_summary": { "listed": 75, "expected_cancellations_in_list": 11.4 }
}

expected_cancellations_in_list は、予定表に載せた会員の確率の合計です。 較正をしているので、「この75名のうち11名前後が届けを出す見込み」と読めます。マネージャーはこの数で、スタッフの割り振りが足りているかを見ます。

contact_result の欄は、スタッフが結果のコードを入れる場所です。 「話せた」「来館なし」「退会の意向を聞いた」などのコードにし、自由記述を書かせません。 翌月、この欄を読み込んで効果の測り方に使います。

Step8

システムへ連携する

つなぎ先方式内容
決まったフォルダ読み取り3つのシステムの書き出しと「そろった」の印
声かけの予定表書き込み店舗ごとのシート。スタッフごとの欄
前月の予定表読み取り声かけの結果のコード
会員の管理システム書き込まない確率を書き戻さない

会員の管理システムへは書き込みません。 確率をシステムに入れると、次の月にその確率がまた記録として書き出され、 モデルが自分の出した数字を学ぶことになります。

スタッフが見られるのは、自分の店舗の予定表だけにします。 本部の担当は全店の store_summary だけを見ます。

Step9

人が確認する

  1. 書き出しの警告 … つながらない入館の記録が多い店舗、そろわなかったシステムがあれば、予定表を配る前に原因を確かめます
  2. 確率の上位10名 … 理由の事実が管理システムの記録と合っているかを確かめます
  3. 「新規」の欄 … 入会の後の案内が済んでいるかを確かめます
  4. 「記録不足」の会員 … 会員証の番号の取り違えがないかを確かめます

マネージャーは、配る前に順番を入れ替えてかまいません。 「けがで休んでいると本人から聞いている」のように、記録に無い事情を知っていることがあります。 入れ替えたときは理由のコードを予定表の欄に入れます。

目標は、600件をならして1件2分です。 上の4つに入る会員だけを管理システムで開き、残りは予定表の確率と理由を流し見ます。

Step10

例外に対処する

起きること対応
書き出しがそろわないシステムがある予定表を作らず、本部に知らせる。翌朝そろったら動かし直す
ある店舗の入館の記録がつながらない件数が多いその店舗だけ「記録の確認中」として配らない
入館のゲートが故障していた日がある故障の日を除いて回数を数え、その店舗の予定表に「ゲート停止日あり」と付ける
確率の分布が前月と大きく違う予定表は出すが「分布の変化あり」と付け、上位を全件見る
会員から連絡を控えるよう申し出がある管理システムの連絡停止の印を見て予定表から外す
新しい店舗が開いた学習の記録がそろうまで、その店舗の会員は規則の理由だけで並べる
料金の改定を適用した月予定表は出すが「改定月」と付ける。学習に無い規模の改定なら、確率より規則の理由を重く見る

最後の行の料金の改定は、退会が増える月です。 過去の改定と同じ程度の改定なら、モデルは「改定の適用からの月数」で学んでいますが、初めての大きな改定では、過去の記録に答えがありません。 そうした月は、マネージャーが規則の理由の欄を中心に順番を見直します。

3行目は、見落とすと店舗全体が「来館が減った」になります。 ゲートの停止は店舗では知られていても、記録には残りません。停止の日を本部に知らせる決まりを、店舗の運用に入れます。

Step11

記録を残す

  • 月ごとの3つの書き出しの件数、つながらなかった記録の件数
  • モデルの版、学習・検証・較正に使った月、確かめた結果(上位の会員のうち実際に届けを出した割合)
  • 予定表の JSON の全文と、配った日時
  • マネージャーが順番を入れ替えた記録と、その理由のコード
  • スタッフの声かけの結果のコード
  • 予定表を見た人と日時

4つ目の入れ替えの記録が、モデルの見落としを知る材料になります。 同じ理由で入れ替えが続くなら、その事情を表す記録を足せないかを考えます。

04実装レベルの3段階

最小構成:過去の記録を書き出し、表計算の式で5つの条件を当てて並べる / 理由の条件の当てはめ
半自動化:上記+Python で毎月の書き出しをつなぎ、規則の予定表を店舗ごとに作る / つなぎ込み・特徴・予定表の作成
本格構成:上記+学習済みのモデルで確率を出して較正し、スタッフごとの上限を付けて配る / 見込み・順番・理由の予定表の全体

半自動化だけでも、第4章の①と②の大半は無くなります。 4つの画面を行き来していた確認が、予定表の1行の理由の事実で済むからです。残るのは順番の粗さで、規則では同じ条件に当たる会員が多く、上位の多くを人が見直すことになります。 本格構成で、見直す件数が上位と警告と例外だけになります。 本記事の想定はこの段階です。確率があると、同じ「来館が減った」に当たる会員のなかでも、プランを下げた会員や予約の取消が続く会員が上に来て、 スタッフの限られた人数を先に向けられます。 本格構成の先には、来館が途切れた会員を週ごとに拾う使い方があります。 ただし締め日は月に1回なので、週ごとの一覧は「今週来ていない常連の会員に、次に来たときに声をかける」程度の使い方になります。月の予定表が回ってから考えれば十分です。 段階を飛ばさないでください。 半自動化を3か月回すと、会員番号のつながらない店舗やゲートの停止の届け漏れが先に見えます。そこを直さずにモデルを作ると、記録の欠けを学んだモデルになります。

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

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

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

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

AI活用について相談する

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

向いている
  1. 成人の会員が数千名から1万名以上いる、複数の店舗を持つ総合型・ジム型のフィットネスクラブ。入館のゲートや会員証の読み取りで来館の記録が残り、会員の管理システムから契約・プラン・休会・口座振替の結果を月ごとに書き出せる場合。店舗のマネージャーが毎月、来館の減った会員を記録から拾って声かけの一覧を作っているが、店舗ごとに拾い方が違い、退会の届けが出てから気づくことが多い場合。
向いていない
  1. 会員が数百名で、スタッフが会員の顔と来館の様子をほぼ覚えている小さなスタジオ。入館の記録が残らない、または会員の管理システムから書き出せない場合。子どもの水泳・体操などのスクールの会員。なお、退会を思いとどまってもらうか、どんな提案をするかの判断と、退会の申し出の受け付けは、この構成では代替できません。

07最小構成で試す方法

  1. 1年前の9月末の時点の、3つのシステムの記録を1店舗分用意する
  2. 第7章の理由の表の5つの条件を、表計算の式で当てはめ、当てはまる数で会員を並べる
  3. その翌月10日までに実際に退会の届けを出した会員が、並べた上位のどこにいたかを数える
  4. 同じ時期にその店舗のマネージャーが作った声かけの一覧と、どちらが多く当てていたかを比べる
  5. 当たらなかった退会の会員について、記録のどこに兆しがあったかを見る

モデルを作る前に、規則だけで並べてみます。 いつもの回数と比べた来館の比が効くかどうかが、この構成の最初の関門です。

出てきた内容判断
規則の上位に、届けを出した会員が多く入っていたモデルの学習に進む
入館の記録の会員番号がそろっていないフロントでの入館の手続きの記録をそろえるのが先
来館の比よりプランの変更の条件で当たる会員が多い契約の記録が効いている。プランを下げた会員への声かけを先に始める

2行目が出ることは珍しくありません。 会員証を忘れた日の入館を別の番号で記録していると、よく来ている会員ほど来館が少なく見えます。 失敗ではなく、マネージャーの一覧がこれまで外れていた理由の1つが分かったということです。フロントの手続きをそろえた後の1か月分で、同じ数え方をやり直してください。

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

問題対策
週1回のプランの会員がいつも上位に来る来館の回数をその会員のいつもの回数と比べる
学習のときだけよく当たる退会の相談の記録が混ざっている。特徴は月末の時点で切る
1つの月が学習と確かめにまたがる行の位置ではなく月の境目で分ける
早めに止める見張りが古い月を混ぜる直近の月を X_val・y_val として渡す
確率が実際の割合より高く出るclass_weight を付けず、較正で合わせる
予約をしない会員が低く出る欠けた値のまま渡し、0で埋めない
ゲートの停止で店舗全体の来館が減る停止の日を本部に知らせ、その日を除いて数える
確率が翌月の記録に入る管理システムに書き戻さない
会員に「AIが退会しそうと判定した」と伝わる確率は社内の順番づけのため。会員への説明に使わない
声かけで特典を出しすぎる特典の出し方は本部が決め、予定表に特典の欄を作らない

上の2行が、最初に当たる失敗です。 どちらも「いつもと比べて減ったか」「届けの前に分かることか」を、記録の作り方で守れているかの問題です。

下の3行は、運用が始まってから効いてきます。 声をかけるたびに会費の割引や無料の回数券を出していると、退会の届けを出しかけた会員ほど得をすることになり、ほかの会員との公平が崩れます。特典を出すかどうかは本部の決まりに任せ、予定表は話す相手の順番だけを示します。予定表は会員を見張るための名簿でもありません。スタッフの研修で、声をかけるときに確率や予定表のことを口にしないことを最初に伝えます。

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

この構成で扱うデータ: 会員の氏名と会員番号、所属の店舗とプラン、来館の日時、休会と退会の届け、口座振替の結果、レッスンの予約と出欠です。来館の日時は、会員の生活の時間帯が分かる記録です。

  1. 健康の情報を読まない … 健康の申告書と体組成の記録は、運動を安全に行うために預かっているものです。読み込みの段階で除き、退会の見込みには使いません
  2. 利用の目的の範囲で使う … 会員の記録を、サービスの案内や継続の案内に使うことが、入会のときに示した個人情報の利用の目的に入っているかを確かめます
  3. 外部へ出さない … この構成は社内のフォルダと Python の中で完結し、生成AIや外部のサービスに記録を渡しません
  4. 見られる人を絞る … スタッフは自分の店舗の予定表、本部は店舗ごとの集計だけです
  5. 退会を妨げない … 予定表は声かけの順番であって、退会の届けを受け付けないための名簿ではありません。会員が退会を決めているなら、決まりのとおりに手続きを案内します
  6. 成人の会員に限る … 子どものスクールの会員は対象から外します。保護者の判断で決まる契約で、来館の記録の意味も違います

誤りが起きた場合のリスクは、声をかけるべき会員を予定表から落とすことと、退会を決めた会員にしつこく声をかけることの2つです。 前者は記録の欠けから、後者は連絡停止の印の見落としと、声かけの決まりの不足から起きます。どちらも、モデルの精度ではなく記録の整備と運用の決まりで防ぎます。

10まず何から始めるか

1週目:記録をつなぐ

3つのシステムの書き出しを1店舗分取り、会員番号でつながらない記録の数を数えます。フロントでの入館の手続きの記録のしかたを、ここでそろえます。 あわせて、読まない列の一覧を確定させます。

2週目:規則だけで並べてみる

第8章のとおり、1年前の9月末の時点の記録で5つの条件を当て、会員を並べます。翌月10日までの実際の届けと突き合わせ、当時の一覧と比べます。

3週目:全店舗の記録をそろえる

残りの7店舗の書き出しを取り、ゲートの停止の日と、会員番号のつながらない記録を店舗ごとに洗い出します。ここで見つかった欠けを直すのが、モデルより先の仕事です。

4週目:半自動化の予定表を1つの店舗に配る

Python で書き出しをつなぎ、規則の予定表を作って、1つの店舗のマネージャーに配ります。マネージャーが入れ替えた順番と、その理由のコードを毎月残します。

2か月目以降: 2年分の記録でモデルを学ばせ、月の境目で確かめ、較正します。規則の予定表と並べて2か月配り、上位の会員の実際の届けを比べます。 スタッフ1名あたりの上限と、効果の測り方を決めた時点で、この構成は完成です。


11関連ユースケース

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

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

技術仕様確認日:2026-10-29/最終更新:2026-11-02
確認した内容情報源確認日
HistGradientBoostingClassifier が欠けた値をそのまま扱い、学習時に分かれ目ごとに欠けた値を左右どちらへ送るかを学ぶこと。categorical_features の既定が "from_dtype" であること。early_stopping の既定が 'auto' で、件数が1万件を超えるか X_val・y_val を fit に渡したときに有効になること。class_weight="balanced" で件数の少ない側の重みが上がること。predict_proba で確率を返すこと(scikit-learn 1.9.1)scikit-learn: HistGradientBoostingClassifier2026-10-29
学習済みの分類器を FrozenEstimator で包んで CalibratedClassifierCV で較正でき、較正の記録を学習の記録と重ねないこと。sigmoid が順番を保つこと。isotonic はおよそ1,000件を超えると sigmoid と同等以上だが同じ値を生むことがあることscikit-learn: Probability calibration2026-10-29
TimeSeriesSplit が時間の順に並んだ記録を分け、分け目ごとの成績を比べるには記録が等しい間隔で並んでいる必要があること。未来の記録で学んで過去の記録を確かめることを避けるための分け方であることscikit-learn: TimeSeriesSplit2026-10-29

退会・休会の届けの締め日と手続きは、各クラブの会則に合わせて決めてください。 会員の記録をどの目的に使えるかは、入会のときに示した利用の目的と、自社の個人情報の取扱いの決まりに沿って確かめてください。

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

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

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

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