Media > AI活用ユースケース > カスタマーサポート > 既存顧客の解約の兆しを利用状況と問い合わせから拾って、フォローの順番を決める

既存顧客の解約の兆しを利用状況と問い合わせから拾って、フォローの順番を決める

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

製品の利用ログ、問い合わせ履歴、請求の状況を入力に、顧客ごとの解約の確率を出し、問い合わせ本文から読み取れる不満の中身を添えて、フォローする順番の案を作ります。

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

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

導入前(Before)
  1. 月初に、担当している80社の一覧を開く
  2. 管理画面で各社のログイン数とアクティブなユーザー数を見る
  3. 問い合わせ管理システムで、直近の問い合わせを確認する
  4. 請求システムで、支払いの遅れがないかを見る
  5. 「なんとなく心配な先」をメモする
  6. 上位から順に連絡を取る。月末までに回りきれないことが多い
  7. 結果を顧客管理システムに記録する
導入後(After)
  1. 自動毎週、利用ログ・問い合わせ・請求のデータを集計テーブルに集める
  2. 自動過去2年の解約実績で学習したモデルが、顧客ごとの解約確率を出す
  3. 自動直近90日の問い合わせ本文を読み、不満や検討の兆しを区分ごとに拾う
  4. 自動契約金額、更新日までの日数、解約確率を掛け合わせて順番をつける
  5. 自動各社について「なぜ上位に来たか」を、数値の変化と引用で説明する
  6. 担当者が上位から順に中身を見て、連絡するかを決める
  7. 連絡し、状況を記録する
  8. 自動記録が次回の学習データになる
各工程の詳しい説明を読む
  1. 月初に、担当している80社の一覧を開く
  2. 管理画面で各社のログイン数とアクティブなユーザー数を見る
  3. 問い合わせ管理システムで、直近の問い合わせを確認する
  4. 請求システムで、支払いの遅れがないかを見る
  5. 「なんとなく心配な先」をメモする
  6. 上位から順に連絡を取る。月末までに回りきれないことが多い
  7. 結果を顧客管理システムに記録する

問題は4つあります。

(a)「なんとなく」の精度が人によって違う。 ベテランはログイン数の落ち方を見ただけで気づきますが、新任は気づきません。気づける人に案件が集まります。

(b)気づいたときには遅い。 ログイン数が半分になってから連絡しても、社内ではもう別の製品の検討が始まっています。年間契約なので、更新の60日前を過ぎると打つ手がありません。

(c)問い合わせ本文が読まれない。 「この機能は使いにくい」という一文が、解約の3か月前に書かれていることがあります。問い合わせは解決したかどうかで管理されており、中身は読み返されません。

(d)400社を平等に見ている。 契約金額が10倍違う顧客に、同じ9分をかけています。

  1. 【自動】 毎週、利用ログ・問い合わせ・請求のデータを集計テーブルに集める
  2. 【自動】 過去2年の解約実績で学習したモデルが、顧客ごとの解約確率を出す
  3. 【自動】 直近90日の問い合わせ本文を読み、不満や検討の兆しを区分ごとに拾う
  4. 【自動】 契約金額、更新日までの日数、解約確率を掛け合わせて順番をつける
  5. 【自動】 各社について「なぜ上位に来たか」を、数値の変化と引用で説明する
  6. 【人】 担当者が上位から順に中身を見て、連絡するかを決める
  7. 【人】 連絡し、状況を記録する
  8. 【自動】 記録が次回の学習データになる

自動化されるのは「集める」「数える」「読む」「並べる」「説明する」です。誰に何をするかは人が決めます。

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

構成図
製品の利用ログ / 問い合わせ管理 / 請求システム
   │ 日次で取り込み
   ▼
BigQuery(顧客ごとの特徴量テーブル)
   │
   ▼【トリガー】毎週月曜のスケジュールクエリ
   │
   ├──▶ BigQuery ML(LOGISTIC_REG)
   │       └─ 解約確率を出す(ML.PREDICT)
   │
   ├──▶ Claude API ── 問い合わせ本文から兆しの区分けと引用
   │
   ├──▶ Python ── 契約金額・更新日との掛け合わせ、順位づけ
   │
   └──▶ フォローリストを出力
   │
   ▼
担当者の画面 ──【人が連絡先と打ち手を決める】
   │
   ▼
顧客管理システムへ記録(次回の学習データ)
役割想定する製品代替候補
生成AIClaude APIOpenAI API、Gemini API
実行環境PythonGoogle Apps Script
処理エンジンBigQuery MLVertex AI、scikit-learn
集計BigQueryデータウェアハウス製品
連携顧客管理システム各社のCRM

カスタマーサクセスのSaaSに解約予兆の機能があるなら、まずそちらを見てください。 自前で組む価値があるのは、自社製品の利用ログを特徴量に使いたい場合です。どの機能をどれだけ使っているかは、汎用のツールでは取れません。

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

Step1

処理の起点を決める

毎週月曜のスケジュールクエリで動かします。

日次にしないのは、解約の兆しが日単位では動かないためです。週次で十分で、費用も抑えられます。ただし「更新日まで残り90日を切った顧客」だけは別枠で毎日見ます。 年間契約では、この期間を逃すと打つ手がなくなります。

Step2

入力データを集める

データ中身取得元
利用ログログイン数、アクティブユーザー数、主要機能の利用回数(週次)製品のログ基盤
問い合わせ件数、種類、解決までの日数、本文問い合わせ管理システム
請求支払いの遅れ、プラン変更、席数の増減請求システム
契約契約金額、契約開始日、更新日、契約形態顧客管理システム
担当者の記録過去の面談メモ、対応履歴顧客管理システム
解約実績過去2年の解約と、その時期顧客管理システム
Step3

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

特徴量の作り方が、この構成のいちばん重要な部分です。 現在の値ではなく、変化を特徴量にします。

特徴量の型
直近の水準直近4週のログイン数の平均
変化率直近4週 ÷ その前の12週
使われなくなった機能の数3か月前は使っていて、いまは0回の機能の数
席数の変化契約席数に対する実際のアクティブユーザーの比率と、その推移
問い合わせの質「使い方が分からない」系と「不具合」系の比率の変化
支払いの遅れ直近12か月の遅延回数

「ログイン数が少ない」は、もともと少ない顧客では兆しになりません。 その顧客にとっての平常値からどれだけ落ちたかを見てください。

Step4

AIへ渡す前に整形する

  1. 契約期間の短い顧客を分ける … 契約から6か月未満の顧客は、立ち上がりの途中なので同じモデルで扱えません。別に分けます
  2. 解約ラベルの定義 … 「解約の申し出をした日」を基準にします。契約終了日を基準にすると、申し出から数か月後になり、予測が手遅れになります
  3. クラスの不均衡への対処 … 400社のうち年間の解約は40社です。学習データは偏ります。BigQuery ML の auto_class_weightsTRUE にすると、クラスの頻度に反比例する重みが計算され、偏りの影響を軽くできます
  4. 問い合わせ本文の切り出し … 署名、定型の案内文、引用を落とします。落とさないと、どの顧客も同じ文面に見えます
Step5

AIに処理させる

予測モデルと生成AIで役割を分けます。

予測モデル(BigQuery ML)にさせること: 解約の確率を数値で出すこと。model_type = 'LOGISTIC_REG' でロジスティック回帰モデルを作り、input_label_cols に解約フラグの列を指定します。ML.PREDICT は予測されたラベルの列と、各クラスの確率の列を返します。確率の数値を生成AIに出させないでください。 根拠が説明できず、精度も測れません。

生成AIにさせること:

処理内容
問い合わせ本文の兆し抽出「他社の製品を検討している」「担当者が変わった」といった記述を拾う
兆しの区分け機能への不満、価格、サポートへの不満、社内の体制変更、といった区分に分ける
上位に来た理由の説明数値の変化と問い合わせの引用を合わせて、2〜3行で説明する
確かめるべきことの提案担当者が最初に聞くとよい質問を出す
Step6

指示内容を固定する

あなたはカスタマーサクセス担当を支援する分析担当者です。
この顧客の直近90日の問い合わせを読み、解約につながりうる兆しを拾ってください。

【厳守事項】
- 解約の確率や点数を書かないでください。
  数値はモデルが出したものを使います。
- 兆しを挙げるときは、問い合わせ本文からそのまま引用してください。
  引用のない兆しは出さないでください。
- 「解約しそうだ」と断定しないでください。
  「〜という記述がある」と事実だけを書いてください。
- 問い合わせが3件以下の場合は、「材料が少ない」と明記してください。
- 担当者個人の評価(対応が悪かった等)を書かないでください。
  問い合わせの内容だけを見てください。

【顧客の基本情報】
{account_info}

【利用状況の変化】
{usage_trend}

【直近90日の問い合わせ】
{tickets}

【前回までの担当者の記録】
{past_notes}

「解約の確率を書かない」の1行が重要です。 生成AIに確率を出させると、モデルが出した数値と食い違う2つの数字が画面に並びます。担当者はどちらを信じてよいか分からなくなります。

Step7

出力形式を固定する

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には渡すだけで、書き換えさせません。

Step8

システムへ連携する

出力先は3通りあります。

方式内容
フォローリスト担当者ごとに、優先順位つきの一覧を出す。いちばん重要
CRMへの書き戻し顧客レコードに解約確率と兆しを書く。担当者が普段見る画面に出る
通知更新日90日前を切った高リスクの顧客だけ、チャットへ流す

解約を止めるための施策(値引きの提案、上位プランへの案内など)を自動で送らないでください。 兆しの読み違いで見当違いの連絡が届くと、かえって関係を損ないます。

Step9

人が確認する

上位に並んだ顧客は、全件、人が中身を見てから連絡します。

理由は、モデルが出すのは確率であって理由ではないためです。ログイン数が落ちた理由が「担当者の産休」であることもあります。数値だけを見て「解約しそうな顧客」として扱うと、失礼な連絡になります。

確認を速くするための設計が重要です。

  • 一覧で、確率・契約金額・更新日までの日数を横並びで出す
  • why_ranked を一覧の行に直接表示する(詳細画面を開かせない)
  • 問い合わせの引用は、原文へのリンクつきで出す
  • evidence_thin: true(問い合わせが少ない)の顧客は、別のグループにまとめる

下位の顧客を一覧から消さないでください。 「見なくてよい」ではなく「順番があとになる」だけです。

Step10

例外に対処する

起きること対応
契約から6か月未満の顧客別のモデル、または別の基準で扱う。立ち上がり中は利用が不安定
解約実績が少なくモデルが作れない予測をやめ、ルール(ログイン数の変化率など)で並べる。無理に学習させない
問い合わせが0件の顧客evidence_thin: true にする。問い合わせがないことは、良い兆しとは限らない
季節性のある利用前年同期と比べる特徴量を足す。前月比だけだと季節変動を兆しと誤る
大口顧客が常に上位に来る契約金額と確率を掛けているため。確率だけで並べたリストも併せて出す
担当者の交代で記録が途切れる記録がない期間を「不明」として扱う。0にしない
モデルの精度が落ちてきたML.EVALUATE の指標(precision、recall、accuracy、f1_score、log_loss、roc_auc)を毎月記録し、下がったら学習し直す
予測が当たらない顧客層がある業種やプラン別に精度を見る。特定の層だけ外れているなら、その層を分ける
Step11

記録を残す

この業務では、予測が当たったかどうかの記録が仕組みの寿命を決めます。

  • 週次の予測結果(全社ぶん)
  • 生成AIが拾った兆しと引用
  • 担当者が連絡したかどうかと、その結果
  • 実際に解約した顧客と、その時点の予測順位
  • モデルの評価指標の推移

「予測上位だったが連絡しなかった顧客がどうなったか」を必ず残してください。 これがないと、仕組みが効いているのか、担当者の頑張りなのかが分かりません。

問い合わせ本文には顧客の担当者個人の言葉が入ります。閲覧権限を絞り、保存期間を決めてください。

04実装レベルの3段階

最小構成:ルールだけで並べたリストを、月1回SQLで出す / 並べ替えのみ
半自動化:上記+問い合わせ本文の兆し抽出を生成AIで行う / 並べ替えと兆しの説明
本格構成:上記+予測モデル+契約金額との掛け合わせ+CRMへの書き戻し / 連絡の判断以外

最小構成でも効果が出ます。 ルールだけのリストでも、400社を平等に見るよりは順番がつきます。予測モデルは、ルールで拾えないパターンを足すためのものです。

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

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

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

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

AI活用について相談する

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

向いている
  1. 継続課金の顧客が300社以上あり、製品の利用ログが取れること。過去2年ぶんの解約実績が記録されていること。
向いていない
  1. 顧客が50社以下で、担当者が全社の状況を把握している場合。利用ログが取れない売り切り型の商材。解約実績が20件未満で、学習させるデータがない場合。

07最小構成で試す方法

  1. 過去1年で解約した顧客20社を選ぶ
  2. 解約の申し出があった日の3か月前の時点で、利用ログと問い合わせを切り出す
  3. 生成AIの画面に、その時点のデータを貼って兆しを拾わせる
  4. 同時に、解約しなかった顧客20社についても同じことをする
  5. 解約した20社と、しなかった20社で、兆しの出方に差があるかを見る

5つめが検証の本体です。 解約した顧客に兆しが出ても、しなかった顧客にも同じだけ出るなら、その兆しは使えません。

判断の目安は次のとおりです。

解約した20社と、しなかった20社の差判断
はっきり差がある予測モデルを作る価値がある
少し差がある特徴量を見直す。変化率と未使用機能の数を足してみる
差がない公開されている行動だけでは読めない。担当者の面談記録を入力に加えることを検討する

予測モデルを作る前に、ルールだけの版を先に作ってください。 「直近4週のログイン数が、その前の12週の半分以下」という1行の条件だけで、かなりの数の解約が拾えることがあります。

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

問題対策
解約ラベルを契約終了日で作り、予測が手遅れになる申し出日を基準にする
クラスが偏ってモデルが「全員が継続」と答えるauto_class_weights を有効にする。指標は accuracy でなく recall と roc_auc を見る
絶対値で見て、もともと利用の少ない顧客ばかり上位に来る顧客ごとの平常値からの変化率を使う
生成AIが解約確率を勝手に出すプロンプトで禁じる。必須
大口顧客ばかり上位に来て、中小の兆しを見落とす確率だけで並べたリストも併せて出す
季節変動を兆しと誤る前年同期との比較を特徴量に足す
モデルを作って放置し、精度が落ちるML.EVALUATE の指標を毎月記録する
「解約しそうな顧客リスト」として社内に出回る呼び方を「フォローの順番」にする。表現が扱いを決める
予測に基づく連絡が顧客に不快感を与える兆しの中身を必ず読んでから連絡する。数値だけで連絡しない

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

この構成で扱うデータ: 顧客の利用状況、問い合わせ本文、契約金額。顧客企業の内部事情と、担当者個人の言葉が含まれます。

  1. 顧客に説明できる状態にする … 利用ログを解約予測に使うことが、利用規約とプライバシーポリシーの範囲に収まるかを確認してください。顧客に説明できない使い方はしないでください
  2. 個人名を渡さない … 予測にも兆しの抽出にも、問い合わせをした個人の氏名は不要です。渡す前に伏せます
  3. 担当者個人の評価に使わない … 「担当者Aの顧客は解約率が高い」という使い方をすると、記録が正直に書かれなくなり、仕組み全体が壊れます
  4. 外部AIへの入力可否 … 問い合わせ本文には顧客の業務内容が書かれています。自社の情報管理規程と、顧客との契約を確認してください
  5. 学習利用 … 入力を学習に使わないことが契約で保証されるサービスを選びます
  6. 自動実行してよい範囲 … 予測と順位づけまでです。顧客への連絡、値引きの提案、プランの変更を自動化しないでください
  7. アクセス権限 … 解約確率の一覧を、カスタマーサクセス部と営業部の担当範囲に限定します

誤りが起きた場合のリスクは、見当違いの連絡による関係の悪化と、見落としによる解約です。予測と実績を残し、後から検証できる状態にしてください。

10まず何から始めるか

1週目:解約ラベルを作る

過去2年の解約について、「申し出があった日」を一覧にします。これが記録されていないなら、まずそこからです。 契約終了日しかない場合は、担当者の記憶を頼りに遡って埋めます。

2週目:ルール1行で並べてみる

「直近4週のログイン数が、その前の12週の半分以下」という条件だけで顧客を並べ、過去に解約した顧客が上位に来るかを見ます。来るなら、予測モデルを作る前にこれを運用に入れてください。

3〜4週目:兆しの抽出を試す

解約した20社と、しなかった20社の問い合わせを生成AIに読ませ、兆しの出方に差があるかを見ます。この結果で、本格構成へ進むかを決めます。

2か月目以降: 差が確認できたら、BigQuery ML で予測モデルを作ります。並行して、予測が当たったかどうかを記録する仕組みを先に作ってください。あとから足すと、最初の数か月ぶんのデータが失われます。


11関連ユースケース

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

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

技術仕様確認日:2026-09-17/最終更新:2026-09-17
確認した内容情報源確認日
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 outputs2026-09-17

利用ログを解約予測に使うことが、自社の利用規約とプライバシーポリシーの範囲に収まるかは、法務と個人情報保護の担当部門に確認してください。 予測の精度は、自社のデータで測らないと分かりません。他社の数値は当てになりません。

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

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

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

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