既存顧客の解約の兆しを利用状況と問い合わせから拾って、フォローの順番を決める
製品の利用ログ、問い合わせ履歴、請求の状況を入力に、顧客ごとの解約の確率を出し、問い合わせ本文から読み取れる不満の中身を添えて、フォローする順番の案を作ります。
- 利用ツール
- ChatGPT/Claude/Gemini/Google Apps Script/Google Vertex AI/Python
- 対象業界
- EC/IT・SaaS/その他/人材/教育
- 対象部門
- カスタマーサポート/営業
- 対象業務
- 分類・仕分け/集計・分析
- 主な課題
- データ分析に時間がかかる/営業フォローが追いつかない/属人化している
- AIで行う処理
- 予測
- 主な効果
- 判断支援/工数削減/機会損失防止
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- 月初に、担当している80社の一覧を開く
- 管理画面で各社のログイン数とアクティブなユーザー数を見る
- 問い合わせ管理システムで、直近の問い合わせを確認する
- 請求システムで、支払いの遅れがないかを見る
- 「なんとなく心配な先」をメモする
- 上位から順に連絡を取る。月末までに回りきれないことが多い
- 結果を顧客管理システムに記録する
- 自動毎週、利用ログ・問い合わせ・請求のデータを集計テーブルに集める
- 自動過去2年の解約実績で学習したモデルが、顧客ごとの解約確率を出す
- 自動直近90日の問い合わせ本文を読み、不満や検討の兆しを区分ごとに拾う
- 自動契約金額、更新日までの日数、解約確率を掛け合わせて順番をつける
- 自動各社について「なぜ上位に来たか」を、数値の変化と引用で説明する
- 人担当者が上位から順に中身を見て、連絡するかを決める
- 人連絡し、状況を記録する
- 自動記録が次回の学習データになる
各工程の詳しい説明を読む
- 月初に、担当している80社の一覧を開く
- 管理画面で各社のログイン数とアクティブなユーザー数を見る
- 問い合わせ管理システムで、直近の問い合わせを確認する
- 請求システムで、支払いの遅れがないかを見る
- 「なんとなく心配な先」をメモする
- 上位から順に連絡を取る。月末までに回りきれないことが多い
- 結果を顧客管理システムに記録する
問題は4つあります。
(a)「なんとなく」の精度が人によって違う。 ベテランはログイン数の落ち方を見ただけで気づきますが、新任は気づきません。気づける人に案件が集まります。
(b)気づいたときには遅い。 ログイン数が半分になってから連絡しても、社内ではもう別の製品の検討が始まっています。年間契約なので、更新の60日前を過ぎると打つ手がありません。
(c)問い合わせ本文が読まれない。 「この機能は使いにくい」という一文が、解約の3か月前に書かれていることがあります。問い合わせは解決したかどうかで管理されており、中身は読み返されません。
(d)400社を平等に見ている。 契約金額が10倍違う顧客に、同じ9分をかけています。
- 【自動】 毎週、利用ログ・問い合わせ・請求のデータを集計テーブルに集める
- 【自動】 過去2年の解約実績で学習したモデルが、顧客ごとの解約確率を出す
- 【自動】 直近90日の問い合わせ本文を読み、不満や検討の兆しを区分ごとに拾う
- 【自動】 契約金額、更新日までの日数、解約確率を掛け合わせて順番をつける
- 【自動】 各社について「なぜ上位に来たか」を、数値の変化と引用で説明する
- 【人】 担当者が上位から順に中身を見て、連絡するかを決める
- 【人】 連絡し、状況を記録する
- 【自動】 記録が次回の学習データになる
自動化されるのは「集める」「数える」「読む」「並べる」「説明する」です。誰に何をするかは人が決めます。
02今回想定するシステム構成
製品の利用ログ / 問い合わせ管理 / 請求システム │ 日次で取り込み ▼ BigQuery(顧客ごとの特徴量テーブル) │ ▼【トリガー】毎週月曜のスケジュールクエリ │ ├──▶ BigQuery ML(LOGISTIC_REG) │ └─ 解約確率を出す(ML.PREDICT) │ ├──▶ Claude API ── 問い合わせ本文から兆しの区分けと引用 │ ├──▶ Python ── 契約金額・更新日との掛け合わせ、順位づけ │ └──▶ フォローリストを出力 │ ▼ 担当者の画面 ──【人が連絡先と打ち手を決める】 │ ▼ 顧客管理システムへ記録(次回の学習データ)
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 生成AI | Claude API | OpenAI API、Gemini API |
| 実行環境 | Python | Google Apps Script |
| 処理エンジン | BigQuery ML | Vertex AI、scikit-learn |
| 集計 | BigQuery | データウェアハウス製品 |
| 連携 | 顧客管理システム | 各社のCRM |
カスタマーサクセスのSaaSに解約予兆の機能があるなら、まずそちらを見てください。 自前で組む価値があるのは、自社製品の利用ログを特徴量に使いたい場合です。どの機能をどれだけ使っているかは、汎用のツールでは取れません。
03どうやって実装するのか
処理の起点を決める
毎週月曜のスケジュールクエリで動かします。
日次にしないのは、解約の兆しが日単位では動かないためです。週次で十分で、費用も抑えられます。ただし「更新日まで残り90日を切った顧客」だけは別枠で毎日見ます。 年間契約では、この期間を逃すと打つ手がなくなります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 利用ログ | ログイン数、アクティブユーザー数、主要機能の利用回数(週次) | 製品のログ基盤 |
| 問い合わせ | 件数、種類、解決までの日数、本文 | 問い合わせ管理システム |
| 請求 | 支払いの遅れ、プラン変更、席数の増減 | 請求システム |
| 契約 | 契約金額、契約開始日、更新日、契約形態 | 顧客管理システム |
| 担当者の記録 | 過去の面談メモ、対応履歴 | 顧客管理システム |
| 解約実績 | 過去2年の解約と、その時期 | 顧客管理システム |
データの取得方法を決める
特徴量の作り方が、この構成のいちばん重要な部分です。 現在の値ではなく、変化を特徴量にします。
| 特徴量の型 | 例 |
|---|---|
| 直近の水準 | 直近4週のログイン数の平均 |
| 変化率 | 直近4週 ÷ その前の12週 |
| 使われなくなった機能の数 | 3か月前は使っていて、いまは0回の機能の数 |
| 席数の変化 | 契約席数に対する実際のアクティブユーザーの比率と、その推移 |
| 問い合わせの質 | 「使い方が分からない」系と「不具合」系の比率の変化 |
| 支払いの遅れ | 直近12か月の遅延回数 |
「ログイン数が少ない」は、もともと少ない顧客では兆しになりません。 その顧客にとっての平常値からどれだけ落ちたかを見てください。
AIへ渡す前に整形する
- 契約期間の短い顧客を分ける … 契約から6か月未満の顧客は、立ち上がりの途中なので同じモデルで扱えません。別に分けます
- 解約ラベルの定義 … 「解約の申し出をした日」を基準にします。契約終了日を基準にすると、申し出から数か月後になり、予測が手遅れになります
- クラスの不均衡への対処 … 400社のうち年間の解約は40社です。学習データは偏ります。BigQuery ML の
auto_class_weightsをTRUEにすると、クラスの頻度に反比例する重みが計算され、偏りの影響を軽くできます - 問い合わせ本文の切り出し … 署名、定型の案内文、引用を落とします。落とさないと、どの顧客も同じ文面に見えます
AIに処理させる
予測モデルと生成AIで役割を分けます。
予測モデル(BigQuery ML)にさせること: 解約の確率を数値で出すこと。model_type = 'LOGISTIC_REG' でロジスティック回帰モデルを作り、input_label_cols に解約フラグの列を指定します。ML.PREDICT は予測されたラベルの列と、各クラスの確率の列を返します。確率の数値を生成AIに出させないでください。 根拠が説明できず、精度も測れません。
生成AIにさせること:
| 処理 | 内容 |
|---|---|
| 問い合わせ本文の兆し抽出 | 「他社の製品を検討している」「担当者が変わった」といった記述を拾う |
| 兆しの区分け | 機能への不満、価格、サポートへの不満、社内の体制変更、といった区分に分ける |
| 上位に来た理由の説明 | 数値の変化と問い合わせの引用を合わせて、2〜3行で説明する |
| 確かめるべきことの提案 | 担当者が最初に聞くとよい質問を出す |
指示内容を固定する
あなたはカスタマーサクセス担当を支援する分析担当者です。
この顧客の直近90日の問い合わせを読み、解約につながりうる兆しを拾ってください。
【厳守事項】
- 解約の確率や点数を書かないでください。
数値はモデルが出したものを使います。
- 兆しを挙げるときは、問い合わせ本文からそのまま引用してください。
引用のない兆しは出さないでください。
- 「解約しそうだ」と断定しないでください。
「〜という記述がある」と事実だけを書いてください。
- 問い合わせが3件以下の場合は、「材料が少ない」と明記してください。
- 担当者個人の評価(対応が悪かった等)を書かないでください。
問い合わせの内容だけを見てください。
【顧客の基本情報】
{account_info}
【利用状況の変化】
{usage_trend}
【直近90日の問い合わせ】
{tickets}
【前回までの担当者の記録】
{past_notes}
「解約の確率を書かない」の1行が重要です。 生成AIに確率を出させると、モデルが出した数値と食い違う2つの数字が画面に並びます。担当者はどちらを信じてよいか分からなくなります。
出力形式を固定する
Claude API の structured outputs でJSONスキーマを指定します。
{
"account_id": "",
"account_name": "",
"churn_probability": 0,
"rank": 0,
"contract_value": 0,
"days_to_renewal": 0,
"usage_change": {
"login_ratio": 0,
"unused_features": 0
},
"signals": [
{
"category": "機能への不満 | 価格 | サポート | 社内体制の変更 | 他社検討 | その他",
"quote": "",
"ticket_date": ""
}
],
"evidence_thin": false,
"why_ranked": "",
"questions_to_ask": [],
"needs_review": []
}
churn_probability はモデルの出力をそのまま入れます。生成AIには渡すだけで、書き換えさせません。
システムへ連携する
出力先は3通りあります。
| 方式 | 内容 |
|---|---|
| フォローリスト | 担当者ごとに、優先順位つきの一覧を出す。いちばん重要 |
| CRMへの書き戻し | 顧客レコードに解約確率と兆しを書く。担当者が普段見る画面に出る |
| 通知 | 更新日90日前を切った高リスクの顧客だけ、チャットへ流す |
解約を止めるための施策(値引きの提案、上位プランへの案内など)を自動で送らないでください。 兆しの読み違いで見当違いの連絡が届くと、かえって関係を損ないます。
人が確認する
上位に並んだ顧客は、全件、人が中身を見てから連絡します。
理由は、モデルが出すのは確率であって理由ではないためです。ログイン数が落ちた理由が「担当者の産休」であることもあります。数値だけを見て「解約しそうな顧客」として扱うと、失礼な連絡になります。
確認を速くするための設計が重要です。
- 一覧で、確率・契約金額・更新日までの日数を横並びで出す
why_rankedを一覧の行に直接表示する(詳細画面を開かせない)- 問い合わせの引用は、原文へのリンクつきで出す
evidence_thin: true(問い合わせが少ない)の顧客は、別のグループにまとめる
下位の顧客を一覧から消さないでください。 「見なくてよい」ではなく「順番があとになる」だけです。
例外に対処する
| 起きること | 対応 |
|---|---|
| 契約から6か月未満の顧客 | 別のモデル、または別の基準で扱う。立ち上がり中は利用が不安定 |
| 解約実績が少なくモデルが作れない | 予測をやめ、ルール(ログイン数の変化率など)で並べる。無理に学習させない |
| 問い合わせが0件の顧客 | evidence_thin: true にする。問い合わせがないことは、良い兆しとは限らない |
| 季節性のある利用 | 前年同期と比べる特徴量を足す。前月比だけだと季節変動を兆しと誤る |
| 大口顧客が常に上位に来る | 契約金額と確率を掛けているため。確率だけで並べたリストも併せて出す |
| 担当者の交代で記録が途切れる | 記録がない期間を「不明」として扱う。0にしない |
| モデルの精度が落ちてきた | ML.EVALUATE の指標(precision、recall、accuracy、f1_score、log_loss、roc_auc)を毎月記録し、下がったら学習し直す |
| 予測が当たらない顧客層がある | 業種やプラン別に精度を見る。特定の層だけ外れているなら、その層を分ける |
記録を残す
この業務では、予測が当たったかどうかの記録が仕組みの寿命を決めます。
- 週次の予測結果(全社ぶん)
- 生成AIが拾った兆しと引用
- 担当者が連絡したかどうかと、その結果
- 実際に解約した顧客と、その時点の予測順位
- モデルの評価指標の推移
「予測上位だったが連絡しなかった顧客がどうなったか」を必ず残してください。 これがないと、仕組みが効いているのか、担当者の頑張りなのかが分かりません。
問い合わせ本文には顧客の担当者個人の言葉が入ります。閲覧権限を絞り、保存期間を決めてください。
04実装レベルの3段階
最小構成でも効果が出ます。 ルールだけのリストでも、400社を平等に見るよりは順番がつきます。予測モデルは、ルールで拾えないパターンを足すためのものです。
05工数削減シミュレーション
導入後 400件 × 3分 ÷ 60 = 20 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 継続課金の顧客が300社以上あり、製品の利用ログが取れること。過去2年ぶんの解約実績が記録されていること。
- 顧客が50社以下で、担当者が全社の状況を把握している場合。利用ログが取れない売り切り型の商材。解約実績が20件未満で、学習させるデータがない場合。
07最小構成で試す方法
- 過去1年で解約した顧客20社を選ぶ
- 解約の申し出があった日の3か月前の時点で、利用ログと問い合わせを切り出す
- 生成AIの画面に、その時点のデータを貼って兆しを拾わせる
- 同時に、解約しなかった顧客20社についても同じことをする
- 解約した20社と、しなかった20社で、兆しの出方に差があるかを見る
5つめが検証の本体です。 解約した顧客に兆しが出ても、しなかった顧客にも同じだけ出るなら、その兆しは使えません。
判断の目安は次のとおりです。
| 解約した20社と、しなかった20社の差 | 判断 |
|---|---|
| はっきり差がある | 予測モデルを作る価値がある |
| 少し差がある | 特徴量を見直す。変化率と未使用機能の数を足してみる |
| 差がない | 公開されている行動だけでは読めない。担当者の面談記録を入力に加えることを検討する |
予測モデルを作る前に、ルールだけの版を先に作ってください。 「直近4週のログイン数が、その前の12週の半分以下」という1行の条件だけで、かなりの数の解約が拾えることがあります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 解約ラベルを契約終了日で作り、予測が手遅れになる | 申し出日を基準にする |
| クラスが偏ってモデルが「全員が継続」と答える | auto_class_weights を有効にする。指標は accuracy でなく recall と roc_auc を見る |
| 絶対値で見て、もともと利用の少ない顧客ばかり上位に来る | 顧客ごとの平常値からの変化率を使う |
| 生成AIが解約確率を勝手に出す | プロンプトで禁じる。必須 |
| 大口顧客ばかり上位に来て、中小の兆しを見落とす | 確率だけで並べたリストも併せて出す |
| 季節変動を兆しと誤る | 前年同期との比較を特徴量に足す |
| モデルを作って放置し、精度が落ちる | ML.EVALUATE の指標を毎月記録する |
| 「解約しそうな顧客リスト」として社内に出回る | 呼び方を「フォローの順番」にする。表現が扱いを決める |
| 予測に基づく連絡が顧客に不快感を与える | 兆しの中身を必ず読んでから連絡する。数値だけで連絡しない |
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 顧客の利用状況、問い合わせ本文、契約金額。顧客企業の内部事情と、担当者個人の言葉が含まれます。
- 顧客に説明できる状態にする … 利用ログを解約予測に使うことが、利用規約とプライバシーポリシーの範囲に収まるかを確認してください。顧客に説明できない使い方はしないでください
- 個人名を渡さない … 予測にも兆しの抽出にも、問い合わせをした個人の氏名は不要です。渡す前に伏せます
- 担当者個人の評価に使わない … 「担当者Aの顧客は解約率が高い」という使い方をすると、記録が正直に書かれなくなり、仕組み全体が壊れます
- 外部AIへの入力可否 … 問い合わせ本文には顧客の業務内容が書かれています。自社の情報管理規程と、顧客との契約を確認してください
- 学習利用 … 入力を学習に使わないことが契約で保証されるサービスを選びます
- 自動実行してよい範囲 … 予測と順位づけまでです。顧客への連絡、値引きの提案、プランの変更を自動化しないでください
- アクセス権限 … 解約確率の一覧を、カスタマーサクセス部と営業部の担当範囲に限定します
誤りが起きた場合のリスクは、見当違いの連絡による関係の悪化と、見落としによる解約です。予測と実績を残し、後から検証できる状態にしてください。
10まず何から始めるか
1週目:解約ラベルを作る
過去2年の解約について、「申し出があった日」を一覧にします。これが記録されていないなら、まずそこからです。 契約終了日しかない場合は、担当者の記憶を頼りに遡って埋めます。
2週目:ルール1行で並べてみる
「直近4週のログイン数が、その前の12週の半分以下」という条件だけで顧客を並べ、過去に解約した顧客が上位に来るかを見ます。来るなら、予測モデルを作る前にこれを運用に入れてください。
3〜4週目:兆しの抽出を試す
解約した20社と、しなかった20社の問い合わせを生成AIに読ませ、兆しの出方に差があるかを見ます。この結果で、本格構成へ進むかを決めます。
2か月目以降: 差が確認できたら、BigQuery ML で予測モデルを作ります。並行して、予測が当たったかどうかを記録する仕組みを先に作ってください。あとから足すと、最初の数か月ぶんのデータが失われます。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
BigQuery ML で model_type = 'LOGISTIC_REG' を指定してロジスティック回帰モデルを作れること。input_label_cols でラベル列を指定すること。auto_class_weights を TRUE にするとクラスの頻度に反比例する重みが計算され、データの偏りの影響を軽くできること。ML.EVALUATE が precision / recall / accuracy / f1_score / log_loss / roc_auc を返すこと。ML.PREDICT が予測ラベルの列と各クラスの確率の列を返すこと | Google Cloud: ロジスティック回帰による予測 | 2026-09-17 |
| BigQuery ML のモデルを SQL の CREATE MODEL 文で作成できること | Google Cloud: BigQuery ML で SQL を使用して ML モデルを作成する | 2026-09-17 |
Claude API の structured outputs でJSONスキーマを指定でき、enum で値を決まった集合に限定できること | Claude Docs: Structured outputs | 2026-09-17 |
利用ログを解約予測に使うことが、自社の利用規約とプライバシーポリシーの範囲に収まるかは、法務と個人情報保護の担当部門に確認してください。 予測の精度は、自社のデータで測らないと分かりません。他社の数値は当てになりません。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0111)についてのご相談はこちらから。
