フィットネスクラブが成人の会員の来館・契約・支払いの記録から、翌月に退会の届けを出しそうな会員を Python で見込み、店舗ごとの声かけの予定にする
成人の会員の入館の記録、契約とプランの変更、口座振替の結果、スタジオの予約の記録を月末の時点でそろえ、翌月の退会の届けの締め日までに届けを出しそうな会員を Python で見込みます。結果は店舗ごと・スタッフごとの声かけの予定表にします。
- 連携・自動化
- Python
- 対象業界
- その他
- 対象部門
- カスタマーサポート/営業
- 対象業務
- 集計・分析
- 主な課題
- データ分析に時間がかかる/営業フォローが追いつかない/属人化している
- AIで行う処理
- 予測
- 主な効果
- 判断支援/工数削減/機会損失防止
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 月初に、マネージャーが入館の記録を前月分と前々月分で書き出す
- 会員ごとの来館の回数を表計算で数え、前々月より減った会員を拾う
- 拾った会員を会員の管理システムで開き、プラン・在籍の月数・休会の履歴・口座振替の結果を確かめる
- スタジオのレッスンの予約やパーソナルトレーニングの契約を見て、「急ぎ」「今月中」「様子見」を付ける
- フロントとトレーナーに割り振り、声かけの一覧として配る
- 声をかけた結果を、スタッフが一覧に書き込む
- 自動毎月1日の未明に、会員の管理システム・入館の記録・予約の仕組みの前月末までの書き出しを決まったフォルダに置く(各システムの定時の書き出しの機能を使う)
- 自動Python が書き出しを会員番号でつなぎ、会員ごとの特徴を前月末の時点で作る
- 自動学習済みのモデルが、会員ごとに翌月10日の締め日までに退会の届けが出る確率を出す
- 自動会員ごとに、根拠になった記録の事実を規則で並べる
- 自動店舗ごとに確率の高い順に並べ、スタッフごとの上限までを声かけの予定表に載せる
- 人マネージャーが予定表の上位と警告を確かめ、順番を入れ替える理由があれば書き込み、スタッフに配る
- 人スタッフが来館のときや電話で声をかけ、結果を予定表に残す
各工程の詳しい説明を読む
- 月初に、マネージャーが入館の記録を前月分と前々月分で書き出す
- 会員ごとの来館の回数を表計算で数え、前々月より減った会員を拾う
- 拾った会員を会員の管理システムで開き、プラン・在籍の月数・休会の履歴・口座振替の結果を確かめる
- スタジオのレッスンの予約やパーソナルトレーニングの契約を見て、「急ぎ」「今月中」「様子見」を付ける
- フロントとトレーナーに割り振り、声かけの一覧として配る
- 声をかけた結果を、スタッフが一覧に書き込む
(a)拾い方が店舗ごとに違う。 2番目の「減った」の基準が、店舗によって「前の月より半分以下」だったり「2週間来ていない」だったりします。週に1回のプランの会員と毎日来る会員を同じ基準で見ると、 週1回の会員はいつも「減った」に入り、毎日来ていた会員が週3回に減っても拾われません。
(b)来館の記録だけでは見えない兆しがある。 プランを夜間に下げた、口座振替が1回不能になった、よく出ていたレッスンの予約を続けてキャンセルした。どれも退会の前によく見られる動きですが、 3番目と4番目で管理システムを開くかどうかは、その月のマネージャーの忙しさしだいです。
(c)届けが出てから気づく。 1番目は月初で、一覧が配られるのは5日から7日ごろです。10日の締め日までに声をかけられるのは、その数日だけです。 一覧に載っていた会員が、声をかける前に届けを出していることがあります。
(d)一覧の多い少ないが人手で決まる。 スタッフが話せる人数に合わせて75名ほどに絞っていますが、何を基準に絞ったかは記録に残りません。 翌月にその一覧が当たっていたかを確かめる手段もありません。当たっていたかが分からないので、拾い方を直すきっかけもありません。 マネージャーが替わると拾い方も変わり、店舗の退会の数が増えても、一覧のせいか、ほかの理由かを切り分けられません。
- 【自動】 毎月1日の未明に、会員の管理システム・入館の記録・予約の仕組みの前月末までの書き出しを決まったフォルダに置く(各システムの定時の書き出しの機能を使う)
- 【自動】 Python が書き出しを会員番号でつなぎ、会員ごとの特徴を前月末の時点で作る
- 【自動】 学習済みのモデルが、会員ごとに翌月10日の締め日までに退会の届けが出る確率を出す
- 【自動】 会員ごとに、根拠になった記録の事実を規則で並べる
- 【自動】 店舗ごとに確率の高い順に並べ、スタッフごとの上限までを声かけの予定表に載せる
- 【人】 マネージャーが予定表の上位と警告を確かめ、順番を入れ替える理由があれば書き込み、スタッフに配る
- 【人】 スタッフが来館のときや電話で声をかけ、結果を予定表に残す
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どうやって実装するのか
処理の起点を決める
毎月1日の未明に、3つのシステムの書き出しが決まったフォルダにそろった時点で動かします。 書き出しが終わったら各システムの側で「そろった」の印のファイルを置き、ジョブ管理の仕組みが15分ごとにその印を見に行きます。印が3つそろわないまま動かすと、ある店舗の入館の記録だけが欠けた一覧ができます。
見込む先は「前月末の時点で在籍している会員が、翌月10日の締め日までに退会の届けを出すか」です。 休会の届けは別に数えます。休会は退会の手前にあることが多い一方で、けがや出張で一時的に休む会員もいます。 休会を的に入れると、声をかける理由の違う会員が混ざるので、休会の届けは特徴の側に「過去の休会の回数」として入れます。
週の単位ではなく月の単位で動かします。 締め日が月に1回なので、月の途中で確率を出し直しても、声をかけるべき会員の顔ぶれはほとんど変わりません。 来館が途切れた会員を週ごとに拾う使い方は、第9章の本格構成の先で考えます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 入館の記録 | 会員番号、店舗、入館の日時、退館の日時 | 入館のゲートの記録 |
| 契約の記録 | 会員番号、所属の店舗、プラン、入会日、プランの変更の日付と前後のプラン、休会の届けの日付と期間、月会費、料金の改定の適用日 | 会員の管理システム |
| 退会の記録 | 退会の届けの日付、退会の月 | 会員の管理システム |
| 支払いの記録 | 口座振替の月、結果(済・不能)、不能の理由のコード | 会員の管理システム |
| 予約の記録 | レッスンの予約の日付、出席・当日の取消・無断の欠席、パーソナルトレーニングの契約の有無と残りの回数 | レッスンの予約の仕組み |
| 声かけの結果 | 声をかけた日、スタッフ、結果のコード | 前月までの声かけの予定表 |
質を決めるのは、入館の記録の会員番号のそろい方です。 会員証を忘れてフロントで入館の手続きをした日の記録が別の番号で残っていると、その会員は来館が減ったように見えます。 フロントで入館の手続きをしたときの記録のしかたを、最初に店舗でそろえます。
入れない列を、表で決めておきます。
| 入れない列 | 理由 |
|---|---|
| 入会のときの健康の申告書の内容 | 持病やけがの記録が含まれることがある |
| 体組成の測定の記録 | 体の状態の記録で、退会の見込みに使う理由が説明しにくい |
| 年齢・性別 | 声かけの順番を属性で変える理由にしない |
| 声かけの結果の自由記述 | 体調や家庭の事情が書かれていることがある |
1行目を外すのが、いちばん大事な判断です。 健康の申告書は、運動を安全に行うために預かっているものです。それを退会の見込みに使うことは、会員が申告したときの目的から外れます。
データの取得方法を決める
3つのシステムの画面から自動で取ってくる仕組みは作りません。各システムの定時の書き出しの機能で、決まったフォルダに置いてもらいます。 書き出しの機能が無いシステムなら、マネージャーの1人が月初に画面から書き出します。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 入館の日時 | 入館の記録 | 直近4週・その前の4週の来館の回数、最後の来館からの日数、来館の曜日と時間帯の変化 |
| プランの変更・休会 | 契約の記録 | プランを下げてからの日数、過去の休会の回数 |
| 口座振替の結果 | 支払いの記録 | 直近3か月の不能の回数、最後の不能からの日数 |
| 予約の出欠 | 予約の記録 | 直近4週の当日の取消・無断の欠席の割合 |
| 退会の届けの日付 | 退会の記録 | 学習用の正解 |
| 声かけの結果 | 前月の予定表 | 声をかけた会員の印(学習と効果の測り方に使う) |
来館の回数は、その会員のいつもの回数と比べます。 店舗ごとの一律の基準ではなく、直近4週の回数を、その会員の直近26週の4週あたりの回数で割った比を特徴にします。週1回のプランの会員が週1回来ていれば比は1に近く、毎日来ていた会員が週3回に減れば比は小さくなります。第3章の(a)を、ここで解きます。
学習用の正解から、引っ越しなどで届けの理由がはっきりしている退会を外しません。 理由は届けを受けた後にしか分からず、月末の時点では区別がつかないからです。 見込む先は、理由を問わず「届けが出るか」です。
AIへ渡す前に整形する
- つなぐ … 会員番号で3つの書き出しをつなぎます。つながらない入館の記録の件数を店舗ごとに残します
- 対象を絞る … 前月末の時点で在籍している会員だけにします。休会中の会員、すでに退会の届けを出している会員、入会から1か月未満の会員は除きます
- 時点をそろえる … 特徴はすべて「前月末の時点」で作ります。月末より後の入館や予約を混ぜると、学習のときに答えを見てしまいます
- 特徴を作る … 直近4週の来館の回数といつもの回数の比、最後の来館からの日数、来館の時間帯の変化、在籍の月数、プランを下げてからの日数、過去の休会の回数、口座振替の不能の回数、予約の当日の取消・無断の欠席の割合、パーソナルトレーニングの残りの回数、料金の改定の適用からの月数、プラン、店舗
- 入れない列を落とす … 入力データの表で決めた4つの列を、読み込みの段階で読まないようにします
- 退会の相談の記録を外す … フロントで「退会したい」と相談された記録は、届けの手前の出来事そのものなので、特徴に入れません
6番目を外さないと、学習のときだけよく当たるモデルになります。 相談の記録はほぼ届けとセットで残り、モデルはそれだけを見て確率を上げます。 本番で予定表を作る時点で、相談をしている会員はもう声をかける段階を過ぎています。
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月の口座振替が不能」 |
| させないこと | 理由 |
|---|---|
| 声をかけるかの決定 | 声をかけるかと時期はマネージャーとスタッフが決める |
| 引き留めの特典の提案 | 会員の事情を聞いてからスタッフが決める |
| 確率の会員への開示 | 会員を評価した数字として受け取られる |
| 健康の状態の推し量り | 入れない列から推し量れる特徴を足さない |
指示内容を固定する
この構成は生成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か月未満の会員は記録が短く、確率が当てになりにくいからです。 一方で、この時期の退会は多いので、確率と別の欄で、入会の後の案内が済んでいるかをスタッフが確かめます。
出力形式を固定する
予定表は表で出し、同じ内容を 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 の欄は、スタッフが結果のコードを入れる場所です。 「話せた」「来館なし」「退会の意向を聞いた」などのコードにし、自由記述を書かせません。 翌月、この欄を読み込んで効果の測り方に使います。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 決まったフォルダ | 読み取り | 3つのシステムの書き出しと「そろった」の印 |
| 声かけの予定表 | 書き込み | 店舗ごとのシート。スタッフごとの欄 |
| 前月の予定表 | 読み取り | 声かけの結果のコード |
| 会員の管理システム | 書き込まない | 確率を書き戻さない |
会員の管理システムへは書き込みません。 確率をシステムに入れると、次の月にその確率がまた記録として書き出され、 モデルが自分の出した数字を学ぶことになります。
スタッフが見られるのは、自分の店舗の予定表だけにします。 本部の担当は全店の store_summary だけを見ます。
人が確認する
- 書き出しの警告 … つながらない入館の記録が多い店舗、そろわなかったシステムがあれば、予定表を配る前に原因を確かめます
- 確率の上位10名 … 理由の事実が管理システムの記録と合っているかを確かめます
- 「新規」の欄 … 入会の後の案内が済んでいるかを確かめます
- 「記録不足」の会員 … 会員証の番号の取り違えがないかを確かめます
マネージャーは、配る前に順番を入れ替えてかまいません。 「けがで休んでいると本人から聞いている」のように、記録に無い事情を知っていることがあります。 入れ替えたときは理由のコードを予定表の欄に入れます。
目標は、600件をならして1件2分です。 上の4つに入る会員だけを管理システムで開き、残りは予定表の確率と理由を流し見ます。
例外に対処する
| 起きること | 対応 |
|---|---|
| 書き出しがそろわないシステムがある | 予定表を作らず、本部に知らせる。翌朝そろったら動かし直す |
| ある店舗の入館の記録がつながらない件数が多い | その店舗だけ「記録の確認中」として配らない |
| 入館のゲートが故障していた日がある | 故障の日を除いて回数を数え、その店舗の予定表に「ゲート停止日あり」と付ける |
| 確率の分布が前月と大きく違う | 予定表は出すが「分布の変化あり」と付け、上位を全件見る |
| 会員から連絡を控えるよう申し出がある | 管理システムの連絡停止の印を見て予定表から外す |
| 新しい店舗が開いた | 学習の記録がそろうまで、その店舗の会員は規則の理由だけで並べる |
| 料金の改定を適用した月 | 予定表は出すが「改定月」と付ける。学習に無い規模の改定なら、確率より規則の理由を重く見る |
最後の行の料金の改定は、退会が増える月です。 過去の改定と同じ程度の改定なら、モデルは「改定の適用からの月数」で学んでいますが、初めての大きな改定では、過去の記録に答えがありません。 そうした月は、マネージャーが規則の理由の欄を中心に順番を見直します。
3行目は、見落とすと店舗全体が「来館が減った」になります。 ゲートの停止は店舗では知られていても、記録には残りません。停止の日を本部に知らせる決まりを、店舗の運用に入れます。
記録を残す
- 月ごとの3つの書き出しの件数、つながらなかった記録の件数
- モデルの版、学習・検証・較正に使った月、確かめた結果(上位の会員のうち実際に届けを出した割合)
- 予定表の JSON の全文と、配った日時
- マネージャーが順番を入れ替えた記録と、その理由のコード
- スタッフの声かけの結果のコード
- 予定表を見た人と日時
4つ目の入れ替えの記録が、モデルの見落としを知る材料になります。 同じ理由で入れ替えが続くなら、その事情を表す記録を足せないかを考えます。
04実装レベルの3段階
半自動化だけでも、第4章の①と②の大半は無くなります。 4つの画面を行き来していた確認が、予定表の1行の理由の事実で済むからです。残るのは順番の粗さで、規則では同じ条件に当たる会員が多く、上位の多くを人が見直すことになります。 本格構成で、見直す件数が上位と警告と例外だけになります。 本記事の想定はこの段階です。確率があると、同じ「来館が減った」に当たる会員のなかでも、プランを下げた会員や予約の取消が続く会員が上に来て、 スタッフの限られた人数を先に向けられます。 本格構成の先には、来館が途切れた会員を週ごとに拾う使い方があります。 ただし締め日は月に1回なので、週ごとの一覧は「今週来ていない常連の会員に、次に来たときに声をかける」程度の使い方になります。月の予定表が回ってから考えれば十分です。 段階を飛ばさないでください。 半自動化を3か月回すと、会員番号のつながらない店舗やゲートの停止の届け漏れが先に見えます。そこを直さずにモデルを作ると、記録の欠けを学んだモデルになります。
05工数削減シミュレーション
導入後 600件 × 2分 ÷ 60 = 20 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 成人の会員が数千名から1万名以上いる、複数の店舗を持つ総合型・ジム型のフィットネスクラブ。入館のゲートや会員証の読み取りで来館の記録が残り、会員の管理システムから契約・プラン・休会・口座振替の結果を月ごとに書き出せる場合。店舗のマネージャーが毎月、来館の減った会員を記録から拾って声かけの一覧を作っているが、店舗ごとに拾い方が違い、退会の届けが出てから気づくことが多い場合。
- 会員が数百名で、スタッフが会員の顔と来館の様子をほぼ覚えている小さなスタジオ。入館の記録が残らない、または会員の管理システムから書き出せない場合。子どもの水泳・体操などのスクールの会員。なお、退会を思いとどまってもらうか、どんな提案をするかの判断と、退会の申し出の受け付けは、この構成では代替できません。
07最小構成で試す方法
- 1年前の9月末の時点の、3つのシステムの記録を1店舗分用意する
- 第7章の理由の表の5つの条件を、表計算の式で当てはめ、当てはまる数で会員を並べる
- その翌月10日までに実際に退会の届けを出した会員が、並べた上位のどこにいたかを数える
- 同じ時期にその店舗のマネージャーが作った声かけの一覧と、どちらが多く当てていたかを比べる
- 当たらなかった退会の会員について、記録のどこに兆しがあったかを見る
モデルを作る前に、規則だけで並べてみます。 いつもの回数と比べた来館の比が効くかどうかが、この構成の最初の関門です。
| 出てきた内容 | 判断 |
|---|---|
| 規則の上位に、届けを出した会員が多く入っていた | モデルの学習に進む |
| 入館の記録の会員番号がそろっていない | フロントでの入館の手続きの記録をそろえるのが先 |
| 来館の比よりプランの変更の条件で当たる会員が多い | 契約の記録が効いている。プランを下げた会員への声かけを先に始める |
2行目が出ることは珍しくありません。 会員証を忘れた日の入館を別の番号で記録していると、よく来ている会員ほど来館が少なく見えます。 失敗ではなく、マネージャーの一覧がこれまで外れていた理由の1つが分かったということです。フロントの手続きをそろえた後の1か月分で、同じ数え方をやり直してください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 週1回のプランの会員がいつも上位に来る | 来館の回数をその会員のいつもの回数と比べる |
| 学習のときだけよく当たる | 退会の相談の記録が混ざっている。特徴は月末の時点で切る |
| 1つの月が学習と確かめにまたがる | 行の位置ではなく月の境目で分ける |
| 早めに止める見張りが古い月を混ぜる | 直近の月を X_val・y_val として渡す |
| 確率が実際の割合より高く出る | class_weight を付けず、較正で合わせる |
| 予約をしない会員が低く出る | 欠けた値のまま渡し、0で埋めない |
| ゲートの停止で店舗全体の来館が減る | 停止の日を本部に知らせ、その日を除いて数える |
| 確率が翌月の記録に入る | 管理システムに書き戻さない |
| 会員に「AIが退会しそうと判定した」と伝わる | 確率は社内の順番づけのため。会員への説明に使わない |
| 声かけで特典を出しすぎる | 特典の出し方は本部が決め、予定表に特典の欄を作らない |
上の2行が、最初に当たる失敗です。 どちらも「いつもと比べて減ったか」「届けの前に分かることか」を、記録の作り方で守れているかの問題です。
下の3行は、運用が始まってから効いてきます。 声をかけるたびに会費の割引や無料の回数券を出していると、退会の届けを出しかけた会員ほど得をすることになり、ほかの会員との公平が崩れます。特典を出すかどうかは本部の決まりに任せ、予定表は話す相手の順番だけを示します。予定表は会員を見張るための名簿でもありません。スタッフの研修で、声をかけるときに確率や予定表のことを口にしないことを最初に伝えます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 会員の氏名と会員番号、所属の店舗とプラン、来館の日時、休会と退会の届け、口座振替の結果、レッスンの予約と出欠です。来館の日時は、会員の生活の時間帯が分かる記録です。
- 健康の情報を読まない … 健康の申告書と体組成の記録は、運動を安全に行うために預かっているものです。読み込みの段階で除き、退会の見込みには使いません
- 利用の目的の範囲で使う … 会員の記録を、サービスの案内や継続の案内に使うことが、入会のときに示した個人情報の利用の目的に入っているかを確かめます
- 外部へ出さない … この構成は社内のフォルダと Python の中で完結し、生成AIや外部のサービスに記録を渡しません
- 見られる人を絞る … スタッフは自分の店舗の予定表、本部は店舗ごとの集計だけです
- 退会を妨げない … 予定表は声かけの順番であって、退会の届けを受け付けないための名簿ではありません。会員が退会を決めているなら、決まりのとおりに手続きを案内します
- 成人の会員に限る … 子どものスクールの会員は対象から外します。保護者の判断で決まる契約で、来館の記録の意味も違います
誤りが起きた場合のリスクは、声をかけるべき会員を予定表から落とすことと、退会を決めた会員にしつこく声をかけることの2つです。 前者は記録の欠けから、後者は連絡停止の印の見落としと、声かけの決まりの不足から起きます。どちらも、モデルの精度ではなく記録の整備と運用の決まりで防ぎます。
10まず何から始めるか
1週目:記録をつなぐ
3つのシステムの書き出しを1店舗分取り、会員番号でつながらない記録の数を数えます。フロントでの入館の手続きの記録のしかたを、ここでそろえます。 あわせて、読まない列の一覧を確定させます。
2週目:規則だけで並べてみる
第8章のとおり、1年前の9月末の時点の記録で5つの条件を当て、会員を並べます。翌月10日までの実際の届けと突き合わせ、当時の一覧と比べます。
3週目:全店舗の記録をそろえる
残りの7店舗の書き出しを取り、ゲートの停止の日と、会員番号のつながらない記録を店舗ごとに洗い出します。ここで見つかった欠けを直すのが、モデルより先の仕事です。
4週目:半自動化の予定表を1つの店舗に配る
Python で書き出しをつなぎ、規則の予定表を作って、1つの店舗のマネージャーに配ります。マネージャーが入れ替えた順番と、その理由のコードを毎月残します。
2か月目以降: 2年分の記録でモデルを学ばせ、月の境目で確かめ、較正します。規則の予定表と並べて2か月配り、上位の会員の実際の届けを比べます。 スタッフ1名あたりの上限と、効果の測り方を決めた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
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: HistGradientBoostingClassifier | 2026-10-29 |
学習済みの分類器を FrozenEstimator で包んで CalibratedClassifierCV で較正でき、較正の記録を学習の記録と重ねないこと。sigmoid が順番を保つこと。isotonic はおよそ1,000件を超えると sigmoid と同等以上だが同じ値を生むことがあること | scikit-learn: Probability calibration | 2026-10-29 |
TimeSeriesSplit が時間の順に並んだ記録を分け、分け目ごとの成績を比べるには記録が等しい間隔で並んでいる必要があること。未来の記録で学んで過去の記録を確かめることを避けるための分け方であること | scikit-learn: TimeSeriesSplit | 2026-10-29 |
退会・休会の届けの締め日と手続きは、各クラブの会則に合わせて決めてください。 会員の記録をどの目的に使えるかは、入会のときに示した利用の目的と、自社の個人情報の取扱いの決まりに沿って確かめてください。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-2380)についてのご相談はこちらから。
