どの顧客がアクティブで、どの顧客が離れつつあり、どの顧客がすでに離脱したのかを把握できます。
顧客の行動は一人ひとり異なります。頻繁に購入する顧客もいれば、昨年は多額の購入をしたもののその後は戻ってきていない顧客もいます。RFMは、すでに手元にある3つの情報 — 各顧客が最後に購入したのはいつか、どのくらいの頻度で購入するか、どのくらいの金額を使っているか — を使って、これらの顧客を見分けます。この3つの答えによって顧客リストが実行可能なオーディエンスグループに分類され、評価すべき顧客、育成すべき顧客、呼び戻すべき顧客、そしてすでに離れてしまった顧客が明らかになります。
仕組みとしては、RFM AI Signalsはこの分析を顧客プロファイル全体に対して実行し、すべての顧客をChampionsからLost customersまでの業界標準の10セグメントのいずれかに分類します。ランキングは自社の顧客データから算出されるため、「頻繁に購入する顧客」の基準は自社のビジネスによって定義されます。各顧客にはラベルとその根拠となるスコアが付与され、そのままオーディエンスの構築に利用できます。
主なユースケース
- 競合からの働きかけが強まる前に、優良顧客を特定してVIPオファーで還元する
- 離反リスクのある高価値顧客に対して、自動化された再エンゲージメントキャンペーンを実施する
- 優先度の低い顧客をコストの高い有料チャネルから除外し、マーケティング効率を高める
- 顧客ティアに応じてコミュニケーションの頻度を調整する
- RFMスコアをCLTV、プロペンシティ、類似オーディエンスの各モデルの入力特徴量として活用する
特にメリットが大きい方: データサイエンスチームの支援を待たずに、迅速で実行可能な顧客セグメントを必要とするマーケティングアナリスト、CRMマネージャー、ライフサイクルマーケティングチーム。
| 知りたいこと | 使用するソリューション |
|---|---|
| 過去の購買履歴に基づいて、重要な顧客は誰か? | RFM AI Signals (このページ): モデリング不要の記述的セグメント |
| この顧客がXを実行する可能性はどのくらいか? | Propensity Scoring AI Signals: イベントごとのキャリブレーション済み確率 |
| この顧客は将来どれだけの価値をもたらすか? | CLTV AI Signals: 金額の予測とパーセンタイルランク |
| 次にどの商品をレコメンドすべきか? | NBP AI Signals: 商品・サービス・コンテンツのランク付きリスト |
| この顧客にどのアクションを取るべきか? | NBA AI Signals: 候補アクションから学習したユーザーごとのポリシー |
RFMとCLTVのどちらを使うべきか? この2つは、どちらも顧客の価値を扱うため混同されやすい組み合わせです。RFMは記述的で過去を振り返るものです。顧客がすでに行ったことを要約し、他の顧客と相対的に並べます。CLTVは予測的で将来を見るものです。任意に設定した期間における支出を予測します。RFMは「これまで最も優良だった顧客は誰か」を、CLTVは「これから優良になる顧客は誰か」を教えてくれます。トレーニングなしで今すぐセグメントが必要な場合はRFMを、将来価値に基づいて予算を配分する場合はCLTVを選んでください。
これらのシグナルは競合するものではなく、互いを補完します。RFMのクォータイルは、CLTV、プロペンシティ、類似オーディエンスの各モデルにとって有力な入力特徴量になります。
RFMは、Treasure AI ML Batch API上の単一の関数として実行されます。トレーニングと予測が別ステップに分かれていることはありません。rfm が集計済みテーブルを読み込み、顧客基盤全体でクォータイルを算出し、スコアリング結果を1回の実行で書き出します。
入力は顧客ごとに1行、4つの列で構成されます。識別子に加えて、recency、frequency、monetary_value です。RFMはトランザクションの集計を代行しないため、これら3つの指標はあらかじめ算出しておく必要があります。名前を自由に設定できるのは識別子のみで、user_column を使用します。残り3つの名前は固定のため、テーブルを作成するクエリ内でエイリアスを設定してください。完全なスキーマとデータ要件についてはデータ準備を参照してください。
設定が必要なパラメータは2つだけです。 input_table と output_table が必須です。識別子の列名が user でない場合のみ user_column を追加してください。このドキュメントに記載されているそれ以外のパラメータには、すべて実用的なデフォルト値が設定されています。
Treasure AI APIキーは、ワークフロー定義にリテラル値として記述せず、td.apikey という名前のWorkflowシークレットとして保存してください。シークレットとして参照することでキーがバージョン管理に含まれなくなり、チームは機密情報を安全に管理できます。詳細は Treasure コンソール からのワークフローシークレットの設定 を参照してください。
# rfm_workflow.dig
# 入力テーブル内のすべての顧客をスコアリングし、クォータイル、
# RFMスコア、名前付きセグメントを書き出します。
+run_rfm:
http>: https://ml-batch-api.treasuredata.com/v1/runs
method: POST
headers:
- authorization: "TD1 ${secret:td.apikey}"
- X-TD-ML-SESSION-ID: ${session_id}
- X-TD-ML-ATTEMPT-ID: ${attempt_id}
store_content: true
content:
input_table: your_database.rfm_aggregated
output_table: your_database.rfm_output
solution_name: rfm
solution_arguments:
user_column: user
use_sql: true
# mv_threshold: 0.05 # 金額の下限を設定する場合はコメントを解除します
+print_response:
echo>: "RFM job submitted. Response: ${http.last_content}"
# ジョブが完了するまでポーリングします。ジョブの実行中、APIはHTTP 408を返します。
# Treasure WorkflowはHTTP 200を受け取るまでリトライします。
+poll_status:
http>: https://ml-batch-api.treasuredata.com/v1/runs/${JSON.parse(http.last_content)['id']}/status
method: GET
headers:
- authorization: "TD1 ${secret:td.apikey}"想定される出力: your_database.rfm_output に顧客ごとに1行が出力され、入力した3つの指標に加えて r_quartile、f_quartile、m_quartile、rfm_quartile、rfm_score、rfm_segment が含まれます。
user recency frequency monetary_value r_quartile f_quartile m_quartile rfm_quartile rfm_score rfm_segment
61612 3181 4 4115 3 1 4 R3F1M4 2.6667 Promising
39408 3290 9 4893 2 4 4 R2F4M4 3.3333 Cannot lose them
21495 3326 6 2770 1 2 3 R1F2M3 2.0 High Value Sleepingこのワークフローの作成とスケジュール設定については、Treasure Workflowを使ってみるを参照してください。
RFM AI Signalsは2種類の入力を受け取ります。指定する集計済みテーブルと、渡すパラメータです。どちらも以下のデータ準備とワークフローパラメータで説明します。
rfm は3つの各軸ですべての顧客をランク付けし、そのランクをスコアとラベルに統合して、1回の実行で結果を書き出します。
顧客ごとに1行の集計済み顧客テーブルです。CLTVとは異なり、RFMはトランザクションの集計を代行しません。recency、frequency、monetary valueを算出済みの状態で用意する必要があります。
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
user | VARCHAR | はい | 一意の顧客識別子。user_column で列名を変更できる唯一の列です。 |
recency | INTEGER | はい | 顧客の直近のトランザクションからの経過日数。値が小さいほど最近の購入を意味します。列名は固定です。 |
frequency | INTEGER | はい | 分析期間内のトランザクション数。列名は固定です。 |
monetary_value | DOUBLE | はい | 分析期間内の総支出額。自社が記録している通貨または単位で指定します。列名は固定です。 |
行の例:
user recency frequency monetary_value
61612 3181 4 4115
39408 3290 9 4893
21495 3326 6 2770
45110 3818 2 133- 欠損値は自動的に処理されません。 実行前に
recency、frequency、monetary_valueのnullを削除するか補完してください。これは、欠損値を代わりに補完していた従来のAutoMLノートブックとは異なる点です。 - 負の値やゼロはスコアリングを破綻させます。 返品、取り消し、プロモーションクレジットは事前にクレンジングしてください。
- 列名を変更できるのは
userのみです。 他の3つの列名は固定のため、集計済みテーブルを作成するクエリ内でエイリアスを設定してください。 - 12か月以上の履歴を確保してください。 期間が短いとrecencyのシグナルが圧縮され、顧客が同じクォータイルに集中してしまいます。
| パラメータ | 型 | デフォルト | 必須 | 説明 |
|---|---|---|---|---|
input_table | string | — | はい | dbname.table_name 形式のソース集計済みテーブル。 |
output_table | string | — | はい | dbname.table_name 形式の、スコアリング結果の出力先テーブル。 |
output_mode | string | append | いいえ | 出力テーブルへの結果の書き込み方法。指定できる値: append (既存のテーブルに行を追加)、replace (テーブルを切り詰めて書き直し)。 |
user_column | string | user | いいえ | 入力テーブル内の顧客識別子の列名。 |
use_sql | boolean | false | いいえ | 計算をPythonではなくTrinoで実行します。おおよそ1,000万行を超える場合に強く推奨されます。実行モードを参照してください。 |
use_hive | boolean | false | いいえ | 計算をHiveで実行します。use_sql: true と併せて設定する必要があります。実行モードを参照してください。 |
mv_threshold | float | — | いいえ | 金額の下限。この値を下回る顧客は、相対的なランクにかかわらず金額クォータイル1に割り当てられます。金額のしきい値を参照してください。 |
audience_name | string | — | いいえ | マスターセグメントと、RFM分類ごとの子セグメントを作成します。 |
顧客ごとに1行が出力されます。入力した3つの指標はそのまま引き継がれ、その後にスコアリング列が続きます。
| フィールド | 型 | 説明 |
|---|---|---|
user | STRING | 入力から引き継がれた顧客識別子。 |
recency | LONG | 入力から引き継がれます。 |
frequency | LONG | 入力から引き継がれます。 |
monetary_value | DOUBLE | 入力から引き継がれます。 |
r_quartile | LONG | recencyのクォータイル(1〜4)。値が大きいほど最近の購入を意味します。 |
f_quartile | LONG | frequencyのクォータイル(1〜4)。値が大きいほど購入頻度が高いことを意味します。 |
m_quartile | LONG | monetaryのクォータイル(1〜4)。値が大きいほど支出額が多いことを意味します。 |
rfm_quartile | STRING | 3つのクォータイルをラベルとしてエンコードした文字列(例: R3F1M4)。 |
rfm_score | DOUBLE | 3つのクォータイルの平均値 (r + f + m) / 3。1.0から4.0の範囲を取ります。 |
rfm_segment | STRING | 名前付きセグメント(例: Champions)。セグメントの定義を参照してください。 |
行の例:
user recency frequency monetary_value r_quartile f_quartile m_quartile rfm_quartile rfm_score rfm_segment
61612 3181 4 4115 3 1 4 R3F1M4 2.6667 Promising
39408 3290 9 4893 2 4 4 R2F4M4 3.3333 Cannot lose them
21495 3326 6 2770 1 2 3 R1F2M3 2.0 High Value Sleeping
45110 3818 2 133 1 1 1 R1F1M1 1.0 Lost customers出力の活用方法。 このテーブルを顧客テーブルに結合すると、rfm_segment、rfm_score、rfm_quartile がマスターセグメントのルールで利用可能な属性になります。これらから直接オーディエンスを構築できます。VIPオーディエンスは rfm_segment = 'Champions'、ウィンバックオーディエンスは rfm_segment IN ('Cannot lose them', 'High Value Sleeping')、抑制リストは rfm_score < 1.5 のように定義します。ワークフローで audience_name を設定すると、マスターセグメントとセグメントごとの子セグメントを自動的に作成できます。これらのセグメントは、標準のCDPアクティベーションワークフローを通じて下流のアクティベーション先に連携でき、Journey、トリガー、パーソナライゼーションにも利用できます。
各軸は、スコアリング対象の顧客基盤全体でクォータイルにランク付けされます。クォータイル4が上位25%、クォータイル1が下位25%です。recencyはランク付けの前に反転されるため、最近購入した顧客はrecencyの生の数値が小さくても r_quartile 4を獲得します。
3つのクォータイルは2通りの方法で統合されます。rfm_quartile はそれらを R3F1M4 のようなラベルに連結したもので、正確なパターンマッチングに役立ちます。rfm_score はそれらを平均した (r + f + m) / 3 で、1.0から4.0までの単一の数値となり、ランキングやしきい値の設定に使えます。
セグメントは、このクォータイルのパターンから割り当てられます。クォータイルは自社の顧客基盤に対する相対値であるため、どの実行でも各クォータイルにおおよそ4分の1ずつの顧客が入ります。ただしセグメントの構成比は固定ではなく、データ内で3つの軸がどのように相関しているかによって変わります。
| セグメント | クォータイルのパターン | 意味と推奨アクション |
|---|---|---|
| Champions | R4F4M4 | 最近購入し、頻繁に購入し、最も多く支出している顧客です。最も価値の高い顧客層です。競合に先んじて還元しましょう。 |
| Loyal Customers | R4F4M3, R4F3M4, R4F3M3, R3F4M4, R3F4M3, R3F3M4, R3F3M3 | 継続的にアクティブで価値の高い顧客です。プロモーションへの反応が良好です。 |
| Potential Loyalists | R4F4M2, R4F3M2, R4F2M4, R4F2M3, R4F2M2, R3F4M2, R3F3M2, R3F2M4, R3F2M3, R3F2M2 | 最近購入し、複数回の購入実績と一定の支出がある顧客です。Loyalへの育成を目指しましょう。 |
| Promising | R4F4M1, R4F3M1, R4F2M1, R4F1M4, R4F1M3, R4F1M2, R3F4M1, R3F3M1, R3F2M1, R3F1M4, R3F1M3, R3F1M2 | recencyは高いものの、これまでのところ頻度や支出は低めの顧客です。購入習慣の定着を促しましょう。 |
| New Customers | R4F1M1, R3F1M1 | 最近購入したものの、購入は1回のみの顧客です。2回目の購入に注力しましょう。 |
| Cannot lose them | R2F4M4, R2F4M3, R2F3M4, R2F3M3, R2F2M4, R2F2M3, R2F1M4, R2F1M3 | 高額かつ頻繁な購入をしていたものの、それがかなり以前である顧客です。再エンゲージメントの優先度が高い高価値層です。 |
| Need Attention | R2F4M2, R2F3M2, R2F2M2 | かつてPotential Loyalistsだったものの、エンゲージメントが低下している顧客です。離反する前に介入しましょう。 |
| Hibernating | R2F4M1, R2F3M1, R2F2M1, R2F1M2, R2F1M1 | recency、頻度、支出のいずれも低い顧客です。再エンゲージメントのROIは低めです。 |
| High Value Sleeping | R1F4M4, R1F4M3, R1F4M2, R1F3M4, R1F3M3, R1F3M2, R1F2M4, R1F2M3, R1F2M2, R1F1M4, R1F1M3 | かつてPotential Loyalistsだったものの、活動が止まっている顧客です。的を絞った再活性化の価値があります。 |
| Lost customers | R1F4M1, R1F3M1, R1F2M1, R1F1M2, R1F1M1 | 3つの軸すべてで最も低いスコアの顧客です。再エンゲージメントの優先度は最も低くなります。 |
2つのセグメントは、オーディエンスとしてよりも診断指標として注視する価値があります。
Cannot lose themとHigh Value Sleeping は、リテンション投資の効果が最も大きい層です。どちらもかつて価値が高く、購入が止まってしまった顧客を表しており、最も回復可能な形の離反にあたります。
Lost customersセグメントが極端に大きい場合、それはビジネス上の問題ではなくデータの問題を示していることがほとんどです。まずrecency列の最大値を確認してください。想定よりはるかに大きい場合、入力テーブルが古くなっており、全員がrecencyの低い方向に偏っています。データが最新であれば、そのセグメントは実態を反映しており、獲得の質や一度きりの購入比率の高さを示しています。
RFM AI Signalsは、計算を3つの方法で実行できます。デフォルトはPythonで、小〜中規模の顧客基盤には十分です。
| モード | 設定方法 | 使用する場面 |
|---|---|---|
| Python | デフォルト。設定不要 | 行動データがおおよそ1,000万行未満の場合。 |
| Trino | use_sql: true | おおよそ1,000万行を超える場合。大規模データで大幅に高速であり、Pythonのメモリ制限を回避できます。 |
| Hive | use_sql: true かつ use_hive: true | 環境上の制約でTrinoではなくHiveが必要な場合。use_hive のみを設定しても効果はありません。 |
出力スキーマは3つのモードで同一のため、モードを切り替えても安全であり、下流の変更は不要です。
mv_threshold は支出額の下限を設定します。monetary_value がこの値を下回る顧客は、相対的なランクにかかわらず金額クォータイル1に割り当てられます。
これが重要なのは、クォータイルが相対値だからです。無料プランの登録者や低額の単発注文など、支出がごくわずかな顧客が顧客基盤の大きな割合を占めている場合、それらの顧客も下位のクォータイルを埋めて境界値を押し下げ、本当に価値のある顧客を区別できる範囲を圧縮してしまいます。下限を設定すると、そうした少額層をクォータイル1に固定でき、残り3つのクォータイルを実際に差のある顧客に割り当てられます。
monetary_value と同じ単位で設定してください。デフォルト値はありません。設定しない場合、すべての顧客が純粋に相対的にランク付けされます。
どのようなデータが必要ですか? 顧客ごとに1行で、recency、frequency、monetary_value の3つの指標を算出済みの集計テーブルが必要です。12か月以上の履歴を確保してください。
しきい値の設定やトレーニングは必要ですか? 不要です。クォータイルは実行のたびに自社の顧客基盤から算出されるため、区切り値はご自身のデータから決まります。
モデルはどのくらいの頻度で再実行すべきですか? 購買サイクルに合わせてください。離反のシグナルが早く現れるEコマースや小売では週次が適しています。旅行や自動車など購入頻度の低いカテゴリでは月次で十分です。入力データが古いと全員が非アクティブに見えてしまうため、スケジュールは見た目以上に重要です。
欠損値はどう扱われますか? 現時点でRFM AI Signalsは欠損値を補完しないため、実行前にnullを削除するか補完してください。
入力の列名は変更できますか? 変更できるのは user のみで、user_column を使用します。recency、frequency、monetary_value の名前は現時点では固定のため、集計済みテーブルを作成するクエリ内でエイリアスを設定してください。
顧客が1回しか購入しない場合でもRFMを使えますか? 実行自体は可能ですが、全員が同じ値の場合frequencyの軸は情報を持たないため、実質的に2次元のスコアになります。行動エンゲージメント指標での補完を検討するか、特定の成果に対するPropensity Scoringの使用を検討してください。
Lost customersに分類される顧客が非常に多いのはなぜですか? まずデータの鮮度を確認してください。recency列の最大値を確認し、想定よりはるかに大きい場合は入力テーブルが古くなっています。データが最新であれば、そのセグメントは実態であり、獲得の質や一度きりの購入比率の高さを反映しています。構成比の読み方を参照してください。
use_sql: true はいつ有効にすべきですか? 行動データがおおよそ1,000万行を超える場合です。実行モードを参照してください。
use_hive は何をしますか? 計算をTrinoではなくHiveで実行します。use_sql: true と併せて設定する必要があります。環境上の制約でHiveが必要な場合にのみ使用してください。
RFMは顧客が次に何をするかを予測できますか? できません。RFMは記述的な手法であり、すでに起きたことを要約します。将来を見る用途には、将来価値であればCLTV AI Signalsを、特定の成果であればPropensity Scoringを使用してください。
クォータイルは実行間で比較できますか? できません。クォータイルはその実行でスコアリングされた顧客基盤に対する相対値のため、周囲の母集団が変化すれば、顧客自身の行動が変わらなくてもクォータイルが変わることがあります。セグメントを経時比較する際はこの点に留意し、絶対的な指標が必要な場合は生の recency、frequency、monetary_value を使用してください。
RFMはサブスクリプションに適していますか? 適していません。定額プランのように顧客間で金額が実質的に一定の場合、monetaryの軸は識別力を失い、RFMはrecencyとfrequencyの2軸に縮退します。多くの場合、解約に対するPropensity Scoringの方が適しています。
セグメントをキャンペーンツールでアクティベートするにはどうすればよいですか? 出力テーブルの rfm_segment、rfm_score、rfm_quartile からオーディエンスを構築します。ワークフローで audience_name を設定すると、マスターセグメントと分類ごとの子セグメントを自動的に作成できます。これらのセグメントは、標準のCDPアクティベーションワークフローを通じて下流のアクティベーション先に連携されます。
| 用語 | 定義 |
|---|---|
| Recency | 顧客の直近のトランザクションからの経過日数。値が小さいほど最近の購入を意味し、ランク付けの前に反転されるため、最近購入した顧客が高いクォータイルを獲得します。 |
| Frequency | 分析期間内のトランザクション数。 |
| Monetary value | 分析期間内の総支出額。自社が記録している単位で表されます。 |
| クォータイル | 単一の軸でランク付けした、同数の4つのグループのうちの1つ。クォータイル4が上位25%です。 |
rfm_score | 3つのクォータイルランクの平均値。1.0から4.0の範囲を取ります。 |
rfm_quartile | 3つのクォータイルすべてをエンコードしたラベル(例: R3F1M4)。マスターセグメントの属性としても利用できます。 |
rfm_segment | クォータイルのパターンから割り当てられる、ChampionsやHibernatingなどの名前付きビジネスカテゴリ。 |
mv_threshold | 金額の下限。これを下回る顧客は、相対的なランクにかかわらず金額クォータイル1に割り当てられます。 |
use_sql | 計算をPythonではなくTrinoで実行するパラメータ。大規模データセットの処理を高速化します。 |
| ウィンバックキャンペーン | Cannot lose themなど、かつて価値が高かったが現在は非アクティブなセグメントを対象とする再エンゲージメント施策。 |
| マスターセグメント | スコアリングされたすべての顧客を保持するTreasure AI CDPの構成要素。子セグメントはRFM分類でフィルタリングされたサブセットです。 |
| PrecisionML | RFM AI Signalsを支える本番ML基盤。AI Signalsスイート全体で共有されています。 |