美容室の来店記録から顧客ごとの来店間隔と次の来店予定日を予測し、来店が途切れそうな顧客への連絡リストを作る
美容室の来店記録から、顧客ごとに次の来店までの日数を見込みます。いつもの間隔を過ぎても予約の無い顧客を「途切れそうな度合い」で並べ、連絡の同意と手段を確かめた連絡リストにして、2週間ごとにスタイリストへ渡します。
- 連携・自動化
- Python
- 対象業界
- その他/小売
- 対象部門
- マーケティング
- 対象業務
- 台帳・マスタ管理/集計・分析
- 主な課題
- データ分析に時間がかかる/営業フォローが追いつかない/属人化している
- AIで行う処理
- 予測
- 主な効果
- 判断支援/工数削減/機会損失防止
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- スタイリストが、予約・顧客管理の仕組みで自分の顧客の一覧を出し、前回の来店日の古い順に並べる
- 上から順にカルテを開き、前回のメニューと、過去の来店の間隔を見る
- いつもの間隔を過ぎていて、次の予約が無い顧客に印を付ける
- 印を付けた顧客のメール配信の同意を確かめる
- 同意のある顧客にはメールの文面を書いて送り、同意の無い顧客は電話するか次の来店まで待つ
- 連絡した顧客と日付を、手元のメモに残す
- 自動2週間ごとの月曜の朝、予約・顧客管理の仕組みから顧客・来店・予約・配信の同意を書き出す
- 自動Python が、顧客ごとの来店の間隔と、前回の来店からの経過日数を作る
- 自動生存時間分析のモデルで、顧客ごとに次の来店までの日数の分布を見込む
- 自動いまの経過日数から、「この先30日に来店する見込み」と「次の来店の目安の日」を出す
- 自動次の予約が入っている顧客、18歳未満の顧客、連絡を断った顧客を除く
- 自動途切れそうな度合いの高い順に並べ、メール配信の同意の有無で「メールの案」と「来店時・電話」に分ける
- 人スタイリストがリストを見て、連絡する顧客と手段を決める
- 人ひな形に一言を足してメールを送るか、電話する
- 人連絡した顧客に印を付ける(リストの列に入れる)
- 自動次の回に、連絡した顧客がその後予約したかを突き合わせて記録する
各工程の詳しい説明を読む
- スタイリストが、予約・顧客管理の仕組みで自分の顧客の一覧を出し、前回の来店日の古い順に並べる
- 上から順にカルテを開き、前回のメニューと、過去の来店の間隔を見る
- いつもの間隔を過ぎていて、次の予約が無い顧客に印を付ける
- 印を付けた顧客のメール配信の同意を確かめる
- 同意のある顧客にはメールの文面を書いて送り、同意の無い顧客は電話するか次の来店まで待つ
- 連絡した顧客と日付を、手元のメモに残す
(a)見分けがカルテを開かないとできない。 前回の来店日だけでは、その顧客にとって遅れているのかが分かりません。2番目でカルテを1人ずつ開くので、上から20〜30人見たところで時間切れになります。 その下にいる顧客は、連絡されないまま次の2週間を迎えます。
(b)連絡の時期が人によって違う。 あるスタイリストはいつもの間隔の1週間後に連絡し、別のスタイリストは1か月後に連絡します。早すぎれば押しつけに聞こえ、遅すぎれば他の店に移った後です。
(c)同意の確かめが漏れる。 4番目は忙しい日ほど飛ばされます。メール配信の同意の無い顧客にお誘いのメールを送ってしまうと、苦情だけでなく、法令の上の問題にもなりえます。
(d)連絡の結果が残らない。 6番目のメモはスタイリストの手元にあり、連絡した顧客が戻ってきたかを、店舗も本部も確かめられません。 どの時期の連絡が効くのかが、いつまでも分かりません。スタイリストが辞めると、メモごと顧客の様子も分からなくなります。
- 【自動】 2週間ごとの月曜の朝、予約・顧客管理の仕組みから顧客・来店・予約・配信の同意を書き出す
- 【自動】 Python が、顧客ごとの来店の間隔と、前回の来店からの経過日数を作る
- 【自動】 生存時間分析のモデルで、顧客ごとに次の来店までの日数の分布を見込む
- 【自動】 いまの経過日数から、「この先30日に来店する見込み」と「次の来店の目安の日」を出す
- 【自動】 次の予約が入っている顧客、18歳未満の顧客、連絡を断った顧客を除く
- 【自動】 途切れそうな度合いの高い順に並べ、メール配信の同意の有無で「メールの案」と「来店時・電話」に分ける
- 【人】 スタイリストがリストを見て、連絡する顧客と手段を決める
- 【人】 ひな形に一言を足してメールを送るか、電話する
- 【人】 連絡した顧客に印を付ける(リストの列に入れる)
- 【自動】 次の回に、連絡した顧客がその後予約したかを突き合わせて記録する
7番目が、この設計の分かれ目です。 リストは途切れそうな順に並びますが、引っ越した、体調を崩した、前回の仕上がりに不満を言っていた、といった事情はスタイリストしか知りません。 不満のあった顧客にお誘いのメールを送るより、先に電話でお詫びするほうがよいこともあります。
5番目で18歳未満の顧客を除くのは、連絡の相手を保護者と決めているからです。 学生の顧客へのお誘いは、この仕組みでは扱わず、店舗の判断に残します。
02今回想定するシステム構成
予約・顧客管理の仕組み(顧客、来店、メニュー、担当、予約、配信の同意) │ 2週間ごとの月曜の朝に書き出し ▼【トリガー】定時実行 Python(pandas) ├──▶ 顧客ごとの来店の間隔と、前回からの経過日数を作る ├──▶ まだ来店の無い間隔を「打ち切り」として残す ▼ lifelines(WeibullAFTFitter) │ 顧客ごとの次の来店までの日数の分布 ▼ Python ── いまの経過日数での条件付きの見込み/除外の規則/同意の確認/並べ替え ▼ スタイリストごとの連絡リスト(店舗の共有フォルダ) ▼ 【スタイリストが選んで連絡し、印を付ける】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(pandas・lifelines の WeibullAFTFitter) | R(survival パッケージ)、scikit-survival |
| データの取得元 | 予約・顧客管理の仕組みの書き出し | 予約・顧客管理の仕組みのAPI(提供されている場合) |
| リストの出力先 | 店舗の共有フォルダの表(スタイリスト別のシート) | 予約・顧客管理の仕組みの顧客の絞り込みの機能 |
| 定時実行 | 社内のジョブ管理の仕組み | OSのタスクスケジューラ |
生成AIは使いません。 メールの文面は店舗のひな形とスタイリストの一言で足り、顧客の氏名や来店の記録を外部の生成AIに渡す場面を最初から作りません。
予約・顧客管理の仕組みには書き込みません。 メールの送信も、いまと同じく仕組みの配信の機能からスタイリストが行います。リストから自動でメールを送る経路を作らないことで、同意の確かめを人の目にも通します。
モデルに lifelines の WeibullAFTFitter を選ぶのは、まだ来店していない記録をそのまま扱えるからです。 公式の説明では、fit() に duration_col と event_col を渡し、event の列は「起きたら1、打ち切りなら0」とされています。前回の来店から今日までまだ来ていない顧客は、event を0にして、経過日数を duration にします。
WeibullAFTFitter は、特徴が来店までの日数を伸び縮みさせる形のモデルです。 係数を「中央の日数が何倍になるか」として読めるので、「カラーの顧客はカットだけの顧客より間隔が長い」を、本部の販促の担当が数字で説明できます。 代わりに CoxPHFitter を使うこともでき、こちらは係数を危険度の比として読みます。
03どうやって実装するのか
処理の起点を決める
2週間ごとの月曜の朝6時の定時実行を起点にします。 スタイリストが連絡するのは週の前半の空き時間が多く、月曜の開店前にリストがそろっていれば、その週のうちに連絡できます。 毎日作る形にはしません。毎日リストが変わると、昨日連絡しようとした顧客が今日は下にいる、ということが起きます。
リストは、作った日の翌日から2週間使います。 その間に予約が入った顧客は、スタイリストが予約の画面で気づけば足ります。リストを途中で作り直さないのは、連絡の印を付けている途中で並びが変わると、どこまで連絡したかが分からなくなるからです。
モデルの学び直しは3か月に1回です。 来店の間隔は季節で変わりますが、2週間ごとに学び直すほどは変わりません。学び直したら、前のモデルと比べて次の来店の時期の当たり方が悪くなっていないかを確かめてから入れ替えます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 顧客 | 顧客番号、担当のスタイリスト、店舗、初めての来店日、生年月の年代の区分 | 予約・顧客管理の仕組み |
| 来店 | 来店日、メニュー(カット・カラー・パーマ・縮毛矯正・トリートメント)、指名の有無 | 予約・顧客管理の仕組み |
| 予約 | 次の予約の有無と日付 | 予約・顧客管理の仕組み |
| 配信の同意 | メール配信の同意の有無と日付、配信の停止の申し出 | 予約・顧客管理の仕組み |
| 連絡の記録 | 前回までのリストで連絡した日と手段 | 前回のリスト |
| 除外の一覧 | 連絡を断った顧客、転居などで連絡しない顧客 | 店舗が作る表 |
質を決めるのは、来店ごとのメニューと、配信の同意の記録です。 メニューが無いと、カラーで3か月ごとに来る顧客と、カットだけで6週ごとに来る顧客を分けられません。配信の同意の記録が無いと、メールの案を出せる顧客がいなくなります。 同意を記録していない店舗は、まず来店時に同意を取って記録するところから始めます。
年代の区分は、18歳未満かどうかを決めるためだけに使います。 モデルの特徴には入れません。年代で来店の間隔を見込むと、同じ間隔の顧客でも年代で連絡の順が変わってしまいます。
データの取得方法を決める
予約・顧客管理の仕組みの書き出しの機能で、顧客・来店・予約・配信の同意をそれぞれ書き出します。 書き出しの項目は製品ごとに違うので、最初に列を決めて固定し、毎回の処理の最初に、列の名前と数が決めたとおりかを照らします。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 来店日とメニュー | 来店の書き出し | 来店の間隔と、間隔ごとの特徴 |
| 次の予約 | 予約の書き出し | すでに予約のある顧客の除外 |
| 配信の同意と停止 | 顧客の書き出し | メールの案に載せてよいかの確認 |
| 担当のスタイリスト | 顧客の書き出し | スタイリスト別のリストへの振り分け |
| 前回のリストの連絡の印 | 店舗の共有フォルダ | 連絡の結果の突き合わせ |
学ばせる記録は、「来店から次の来店まで」の1区間を1行にします。 顧客が5回来店していれば、4つの区間は event が1、最後の来店から今日までの1つの区間は event が0です。最後の区間を捨てると、来なくなった顧客の手がかりがすべて消えます。
AIへ渡す前に整形する
- 区間の組み立て … 顧客ごとに来店日を並べ、区間の始まりの来店日、日数、event を作ります
- 区間の特徴 … 始まりの来店のメニュー(カラーを含むか、縮毛矯正を含むか)、指名の有無、その顧客のそれまでの来店回数、それまでの間隔の中央の値を列にします
- 同じ日の来店のまとめ … 同じ日に2回の会計があるもの(カットの後にトリートメントを足した等)は1回の来店にします
- 短すぎる区間の扱い … 7日以内の再来店は、直しの来店として区間から外し、前の来店に含めます
- 初めての顧客の扱い … 来店が1回だけの顧客は、それまでの間隔の列を欠けた値にします
- 担当の変更 … スタイリストが辞めた・異動した顧客は、いまの担当に付け替えます。担当のいない顧客は店長のリストに入れます
区間の1行は、次のような形にします。1行が「ある顧客の、ある来店から次の来店まで(またはまだ来ていない今日まで)」です。
{
"customer_no": "C-0458812",
"store": "store_03",
"interval_start": "2026-07-25",
"duration_days": 86,
"event": 0,
"menu_color": true,
"menu_perm": false,
"menu_straightening": false,
"nominated": true,
"visit_count_before": 7,
"log_median_interval_before": 4.143
}
この行は、前回の来店から86日たってまだ来ていない顧客の、最後の区間です。 event が0なので「少なくとも86日」として学ばせます。log_median_interval_before は、それまでの6つの間隔の中央の値(63日)の対数です。customer_no は突き合わせのための列で、特徴には入れません。
4番目を外すと、間隔が短く見えます。 仕上がりの直しで1週間後に来た記録が区間に入ると、「この顧客は7日ごとに来る」と読まれ、翌週には途切れそうな顧客として並んでしまいます。
2番目の「それまでの間隔の中央の値」は、その区間より前の来店だけから作ります。 区間の後の来店まで使うと、未来の情報で学ぶことになります。
AIに処理させる
させるのは、顧客ごとに「次の来店までの日数の分布」を見込むことだけです。 途切れそうな度合いへの直し方、除外、並べ替えは、Python の側の決まった規則で行います。
| 見るもの | 扱い方 | 判断できないときの扱い |
|---|---|---|
| 前回のメニュー | カラー・パーマ・縮毛矯正を含むかの印 | メニューが無ければカットだけとする |
| 指名の有無 | 印 | - |
| それまでの来店回数 | 数 | - |
| それまでの間隔の中央の値 | 日数(対数) | 初めての顧客は欠けた値(規則で別に扱う) |
| 店舗 | 印 | - |
途切れそうな度合いは、いまの経過日数を条件にして出します。 lifelines の predict_survival_function と predict_median には conditional_after という引数があり、「すでに s 日来ていない」顧客について、その先の見込みを出せます。 公式の説明では、条件付きの生存は S(t)/S(s) で計算され、予測した中央の値に s を足したものが全体の日数になるとされています。
s = 前回の来店からの経過日数
次の30日に来店する見込み p30 = 1 − S(s+30) / S(s)
次の来店の目安の日 = 前回の来店日 + s + predict_median(conditional_after=s)
途切れそうな度合い = 1 − p30(ただし s が その顧客の中央の間隔 未満なら 0)
「中央の間隔未満なら0」を入れるのは、まだいつもの時期が来ていない顧客を並べないためです。 6週ごとに来る顧客が前回から4週なら、来ていないのは当たり前です。
処理の骨組みは、次のようになります。
from lifelines import WeibullAFTFitter
aft = WeibullAFTFitter()
aft.fit(intervals[FEATURES + ["duration_days", "event"]],
duration_col="duration_days", event_col="event")
current = last_intervals[last_intervals["event"] == 0] # まだ来ていない顧客
s = current["duration_days"]
median_after = aft.predict_median(current[FEATURES], conditional_after=s)
surv = aft.predict_survival_function(current[FEATURES], times=[30],
conditional_after=s)
current["p_return_30d"] = 1 - surv.loc[30].values
学び直しのたびに、メニューの係数の向きを確かめます。 カラーや縮毛矯正の印で間隔が長くなる向きになっていなければ、メニューの記録の付け方か、区間の組み立てに誤りがあります。 係数を見て「おかしい」と気づけるのが、日数の伸び縮みで読めるモデルを選んだ理由の1つです。
来店が1回だけの顧客は、モデルではなく規則で扱います。 初めての来店から次が来るかは、2回目以降の顧客と傾向が大きく違います。初回から45日たって予約の無い顧客を、別の枠「2回目のお誘い」として並べます。 45日は店舗で決める値です。
| させないこと | 理由 |
|---|---|
| 連絡するかどうかの決定 | 顧客の事情はスタイリストしか知らない |
| メールの文面の作成 | ひな形とスタイリストの一言で足りる |
| 割引などの条件の付与 | 店舗と本部が決める |
| 同意の無い顧客へのメールの案 | 同意を確かめた顧客だけに出す |
| 年代・性別による並べ替え | 見込みは来店の記録とメニューだけで行う |
4行目は、規則で必ず守ります。 リストの「メールの案」の欄は、同意が有りで停止の申し出が無い顧客にだけ作り、同意の無い顧客は「来店時・電話」の欄にしか出しません。
指示内容を固定する
この構成は生成AIを使わないため、プロンプトはありません。 代わりに、学習・計算・リストの作成を決める設定を、ひとつのファイルにまとめます。
【見込む先】
duration: 来店から次の来店までの日数(まだ来ていなければ今日までの日数)
event: 次の来店があれば 1、まだ無ければ 0
学習期間: 直近36か月の来店
モデル: WeibullAFTFitter
特徴: カラーの印、パーマの印、縮毛矯正の印、指名の印、来店回数、
それまでの間隔の中央の値(対数)、店舗
入れ替えの条件: 検証の期間で、次の来店の中央の見込みの絶対誤差が前より小さいこと
【リストから除く顧客】
- 次の予約が入っている
- 18歳未満(年代の区分で判定。不明なら除く)
- 連絡を断った、転居した(除外の一覧)
- 直近30日以内にこのリストで連絡した
- 最後の来店から365日を超えた(休眠の顧客として別の一覧へ)
【並べ方】
途切れそうな度合いの高い順。1回のリストは1人のスタイリストあたり最大30人
初回だけの顧客: 初回から45日以上、予約なしを「2回目のお誘い」の枠へ(最大10人)
【連絡の手段の振り分け】
メールの案: 配信の同意あり、かつ停止の申し出なし
来店時・電話: 上記以外(メールの案は出さない)
「直近30日以内に連絡した顧客を除く」が大事です。 2週間ごとにリストを作るので、除かないと同じ顧客に2週続けてお誘いが届きます。連絡は控えめにするほうが、顧客との関係を損ねません。
365日を超えた顧客を別の一覧にするのは、連絡の意味が違うからです。 1年来ていない顧客へのお誘いは、いつもの間隔の顧客への声かけではなく、本部の販促として文面と時期を決めるものです。
出力形式を固定する
リストは表で出し、同じ内容を JSON でも残します。 表はスタイリストが読むため、JSON は次の回の突き合わせのためです。
{
"run_at": "2026-10-19T06:00:00+09:00",
"stylist_id": "S-014",
"store": "store_03",
"candidates": [
{
"customer_no": "C-0458812",
"last_visit": "2026-07-25",
"last_menu": "cut_color",
"days_since": 86,
"typical_interval_days": 63,
"expected_next_visit": "2026-10-28",
"p_return_30d": 0.0,
"lapse_score": 0.0,
"channel": "email_draft | in_person_or_phone",
"segment": "regular | second_visit"
}
],
"excluded_counts": { "has_booking": 0, "minor": 0, "opted_out": 0, "contacted_recently": 0 },
"model_version": ""
}
1つ目の理由は、customer_no だけで顧客を指せることです。 リストに電話番号やメールアドレスを書かず、スタイリストは顧客番号から予約・顧客管理の仕組みを開いて連絡します。
2つ目は、excluded_counts で除いた数が分かることです。 「同意が無くて除いた顧客が多い店舗」が分かれば、来店時に同意を取る声かけが足りていないことが見えます。
| 列 | スタイリストが見ること |
|---|---|
typical_interval_days と days_since | いつもの間隔からどれだけ過ぎているか |
expected_next_visit | 目安の日。過ぎていなければ連絡を急がない |
channel | メールの案か、来店時・電話か |
segment | いつもの顧客か、2回目のお誘いか |
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 予約・顧客管理の仕組み | データの書き出し(読み取りのみ) | 顧客、来店、予約、配信の同意 |
| 店舗の共有フォルダ | 表の書き出し | スタイリスト別のリスト |
| 除外の一覧 | 表の読み取り | 連絡を断った顧客など |
| 予約・顧客管理の仕組みの配信の機能 | 連携しない | スタイリストがいつもの画面から送る |
スタイリストが付けた「連絡した」の印は、次の回の処理で読み取ります。 印と日付があれば30日の除外に使い、その後に予約が入ったかを突き合わせて、連絡の結果として記録します。
人が確認する
- 上から10人を見る … 顧客の事情(転居、体調、前回の不満)を思い出し、連絡しない顧客を外します
- 手段を確かめる … 「メールの案」の顧客でも、電話のほうがよい顧客は電話にします。逆に「来店時・電話」の顧客にメールを送ることはしません
- 連絡して印を付ける … 連絡した顧客の列に日付を入れます
- 外した理由を書く … 転居や連絡を断った顧客は、店舗の除外の一覧に足します
2番目の後半を省かないでください。 同意の無い顧客にメールを送れないようにしているのは、リストの側だけです。スタイリストが仕組みの画面から手で送れば、送れてしまいます。
目標は、80件をならして1件9分です。 リストの上から読み、事情のある顧客を外して印を付けるだけなので、カルテを1人ずつ開いていたときより短く終わります。
店長は、店舗の全スタイリストのリストの件数だけを見ます。 顧客1人ずつの見込みは担当のスタイリストだけが見れば足り、店長が見るのは、連絡の印がほとんど付かないスタイリストがいないか、除外の件数が急に増えていないかです。
例外に対処する
| 起きること | 対応 |
|---|---|
| 書き出しが届かない・列が違う | リストを作らず、販促の担当に知らせる |
| 配信の同意の列が空の顧客 | 同意なしとして扱い、メールの案を出さない |
| 年代の区分が無い顧客 | 18歳未満の可能性があるとして除く |
| 担当のスタイリストがいない | 店長のリストに入れる |
| 来店の記録が極端に多い(家族を1つの顧客番号で登録) | 一覧に「記録の確認」と出し、店舗で分けてもらう |
| 学び直したモデルが前より当たらない | 入れ替えず、前のモデルを使い続けて知らせる |
| 店舗の改装・休業で来店が止まった期間がある | その期間をまたぐ区間は学ばせる記録から外し、リストにも「休業明け」と出す |
| モデルの計算が収束しない | 前のモデルの見込みを使い、販促の担当に知らせる |
2行目と3行目を「出さない」側に倒しているのは、誤りの向きを決めるためです。 同意が分からない顧客にメールを送る誤りは、送らない誤りよりはるかに重いからです。
記録を残す
- 書き出しと、組み立てた区間の一覧
- 顧客ごとの見込み(目安の日、p30、途切れそうな度合い)と、使ったモデルの版
- リストに載せた顧客と、除いた理由の件数
- スタイリストが連絡した顧客、日付、手段
- その後の予約と来店の有無
- 設定ファイルの変更の履歴(除外の規則、45日、最大の人数)
4つ目と5つ目を並べて残すのが、この構成の振り返りの土台です。 3か月分たまると、いつもの間隔からどれくらい過ぎた時点の連絡がいちばん戻ってくるかが、メニューごとに見えてきます。
04実装レベルの3段階
最小構成では、来店が2回以下の顧客が並びません。 新しい顧客ほど次が来るかが分からず、いちばん声をかけたい顧客が抜け落ちます。 確かめるための段階です。 半自動化で、1件30分が15分程度になります。 同意の確認と除外は無くなりますが、並べ方が中央の値の倍率だけなので、スタイリストがカルテを開いて見直す作業が残ります。本格構成で9分になり、この段階が本記事の想定です。 差が大きいのは、メニューと来店回数の違いを、モデルが間隔の見込みに入れるからです。 段階を飛ばさないでください。 半自動化のリストを2か月使うと、同意の無い顧客の多い店舗と、除外の一覧の漏れが先に分かります。
05工数削減シミュレーション
導入後 80件 × 9分 ÷ 60 = 12 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 数店舗から数十店舗の美容室で、顧客と来店の記録を予約・顧客管理の仕組みに持ち、スタイリストが自分の顧客に来店のお誘いの連絡をしている場合。カット・カラー・縮毛矯正などメニューによって来店の間隔が違い、誰に連絡するかをスタイリストがカルテを1人ずつ見て決めている場合。メールの配信の同意を顧客ごとに記録している場合。
- 1店舗で顧客が数百人程度で、スタイリストが顧客の来店の時期を覚えていられる場合。予約の大半が初めての客で、2回目以降の来店がほとんど無い店。来店の記録が紙のカルテだけの場合(先に記録のデータ化から始めます)。なお、連絡するかどうか、何を伝えるか、割引などの条件を付けるかの判断は、この構成では代替できません。
07最小構成で試す方法
- 予約・顧客管理の仕組みから、1店舗の過去2年分の来店の記録を書き出す(顧客番号、来店日、メニュー、担当)
- 表計算で、顧客ごとに来店の間隔の中央の値を出す(来店が3回以上の顧客だけ)
- 今日の時点で、前回からの経過日数が中央の値の1.5倍を超え、予約の無い顧客を抜き出す
- 抜き出した顧客を、スタイリスト2名に見てもらい、「声をかけたい顧客か」を印で付けてもらう
- 印の付いた割合と、スタイリストがいつも連絡していた顧客との重なりを見る
2名・1店舗は必ずやってください。 モデルを作る前に、「その顧客にとっての遅れ」で並べることに意味があるかを確かめます。 書き出した記録は、氏名と連絡先の列を外してから開いてください。
| 出てきた内容 | 判断 |
|---|---|
| スタイリストが見落としていた顧客が多く出る | モデルに進む。 カルテを開かないと見えない顧客がいる |
| いつもの連絡の対象とほぼ同じ | 並べ方の価値は小さい。同意の確認と除外の自動化だけで始める |
| メニューの記録が無く間隔が分けられない | 会計の記録の付け方が先。 メニューを残すところから始める |
3回以上の顧客に絞るのは、表計算で中央の値を出せるのがその顧客だけだからです。 2回以下の顧客と来なくなった顧客を扱えるのが、モデルにする理由です。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 来店の間隔を短く見積もる | まだ来ていない区間を打ち切りとして残す。 来た区間だけで平均しない |
| いつもの時期が来ていない顧客が並ぶ | 経過日数を条件にした見込みを使い、中央の間隔未満は0にする |
| 直しの来店で間隔が短く見える | 7日以内の再来店は前の来店に含める |
| 未来の来店で特徴を作る | それまでの間隔はその区間より前の来店だけから作る |
| 初めての顧客が並ばない | モデルではなく「2回目のお誘い」の規則で扱う |
| 同じ顧客に2週続けて連絡する | 直近30日以内に連絡した顧客を除く |
| 同意の無い顧客にメールの案が出る | 同意が空なら同意なしとして扱う |
| 18歳未満の顧客に連絡が届く | 年代が不明な顧客も除く |
| 家族を1つの顧客番号で登録している | 来店の多すぎる顧客を一覧に出し、店舗で分ける |
| 連絡の結果が残らない | リストに印の列を作り、次の回に突き合わせる |
上の3行が、この構成の失敗のほとんどです。 どれも「間隔の数字は出るが、その顧客の遅れを表していない」という形で起きます。打ち切り、条件付き、直しの来店の3つを押さえてあるかで、リストが使えるかが決まります。
6行目から8行目は、顧客との関係に直接ひびきます。 連絡の回数、同意、未成年の扱いは、1件の誤りでも苦情になります。 並べ方の精度よりも先に、規則として守ってください。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 顧客の来店日、メニュー、担当、予約、メール配信の同意、年代の区分です。予約・顧客管理の仕組みには、顧客の氏名・電話番号・メールアドレスも入っています。
- 連絡先をリストに載せない … リストは顧客番号でつなぎ、氏名・電話番号・メールアドレスは載せません。 連絡はスタイリストが仕組みの画面から行います
- 広告や宣伝のメールは同意のある顧客にだけ送る … 特定電子メール法は、取引関係にある者などの例外を除き、あらかじめ送信に同意した相手にだけ広告・宣伝のメールの送信を認める方式(オプトイン)をとり、同意の記録の保存と、送信者の名称・送信の停止を受け付ける連絡先の表示を求めています。この構成では例外に頼らず、同意を記録した顧客にだけメールの案を出します。 停止の申し出は、次の回のリストから必ず外します
- 来店の記録を連絡に使うことを、利用目的として示しておく … 来店の記録から次の来店の時期を見込んでお知らせを送ることが、顧客に示した個人情報の利用目的に含まれているかを確かめます
- 18歳未満の顧客を扱わない … 年代の区分で除き、不明な顧客も除きます。 学生の顧客への連絡は、保護者との取り決めに沿って店舗が判断します
- 年代・性別で並べない … 見込みは来店の記録とメニューだけで行い、同じ遅れ方の顧客を属性で扱い分けません
- 生成AIに顧客の記録を渡さない … この構成は生成AIを使いません。文面を作るために顧客の一覧をチャットのAIに貼り付けることも、運用の決まりで禁じます
誤りが起きた場合のリスクは、同意の無い顧客にメールを送ることと、連絡が多すぎて顧客の気持ちが離れることの2つです。 前者は法令の上の問題、後者は来店そのものを減らします。だから例外の扱いは、迷ったら送らない側に倒しています。
10まず何から始めるか
1週目:同意の記録を確かめる
予約・顧客管理の仕組みで、メール配信の同意が顧客ごとに記録されているか、停止の申し出がどこに残るかを確かめます。同意の記録の無い店舗は、この週から来店時に同意を取って記録し始めます。
2週目:1店舗で試す
1店舗の2年分の来店の記録で、3回以上の顧客の間隔の中央の値を出し、遅れている顧客をスタイリスト2名に見てもらいます。見落としていた顧客がどれくらい出るかを見ます。
3週目:規則を決める
18歳未満と年代不明の除外、30日以内の再連絡の除外、365日を超えた顧客の扱い、2回目のお誘いの45日を、本部と店長で決めます。 除外の一覧の置き場所と、連絡した印の付け方も決めます。
4週目:区間を組み立てる
Python で、来店の記録を区間に組み立て、打ち切りを付ける処理を作ります。この時点ではモデルを作らず、区間の数と打ち切りの数が来店の記録と合うかだけを確かめます。
2か月目: 半自動化のリストを2週間ごとに出し、スタイリストは従来どおり選びながら印を付けます。3か月目以降: 生存時間分析のモデルを入れて条件付きの見込みで並べ、連絡の後に予約が入ったかを毎回突き合わせます。いつもの間隔からどれくらい過ぎた時点の連絡が戻ってくるかをメニューごとに3か月分確かめ、最大の人数と除外の規則を見直した時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
CoxPHFitter と WeibullAFTFitter の違い(AFT の係数が生存時間の中央の値などへの効き目として読めること)。fit() に duration_col と event_col を渡し、event が「起きたら1、打ち切りなら0」であること。predict_survival_function と predict_median の conditional_after で、すでに s まで生存した対象の条件付きの見込みを S(t)/S(s) で出し、全体の日数が予測の中央の値に s を足したものになること | lifelines: Survival Regression | 2026-10-14 |
| 特定電子メール法が、取引関係以外では事前に同意した相手にだけ広告・宣伝のメールの送信を認める方式(オプトイン)をとり(平成20年12月1日施行の改正)、同意の記録の保存、送信の停止の求めへの対応、送信者の名称と停止を受け付ける連絡先の表示を求めていること | 総務省: 特定電子メールの送信の適正化等に関する法律 | 2026-10-14 |
連絡するかどうか、文面、割引などの条件は、店舗と本部で決めてください。 メール配信の同意の取り方と表示の詳細は、総務省の資料と自社の顧問の専門家に確かめてください。本記事は上記の公式情報で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1537)についてのご相談はこちらから。
