📋 このステップで学ぶこと
- RFM分析とは何か
- R・F・Mの計算方法
- スコアリング手法
- セグメント分けの実践
- セグメント別施策の設計
学習時間の目安:3.5時間
🔍 1. RFM分析とは
基本概念
📌 RFMの3つの指標
顧客を3つの軸で評価し、優良顧客を見つける分析手法
R = Recency(最新購買日)
・最後に購入してから何日経ったか
・数値が小さいほど良い(最近購入した)
・例:3日前 > 30日前 > 300日前
F = Frequency(購買頻度)
・過去に何回購入したか
・数値が大きいほど良い(たくさん購入)
・例:10回 > 5回 > 1回
M = Monetary(購買金額)
・過去に合計いくら使ったか
・数値が大きいほど良い(たくさんお金を使った)
・例:100万円 > 10万円 > 1万円
RFM分析の目的
💡 なぜRFM分析をするのか
1. 優良顧客の特定
・R・F・Mすべてが高い顧客 = 最優良顧客
・この顧客を大切にする!
2. 休眠顧客の発見
・Rが悪化している顧客
・離脱する前に対策が必要
3. 施策の最適化
・セグメントごとに異なる施策
・優良顧客 → VIP待遇
・休眠顧客 → カムバックキャンペーン
4. リソースの効率化
・すべての顧客に同じ施策は非効率
・優先順位をつけて注力
RFMの価値
| 指標 |
意味 |
高い場合 |
低い場合 |
| R(Recency) |
最近購入したか |
アクティブ、関心あり |
離脱リスク |
| F(Frequency) |
頻繁に購入するか |
ロイヤル顧客 |
一見客 |
| M(Monetary) |
たくさん購入するか |
高価値顧客 |
低単価顧客 |
📊 2. RFMスコアの計算
スコアリングの基本
📌 5段階スコアリング(一般的)
各指標を1〜5点でスコア化(5点が最良)
R(Recency)のスコア化例:
・0〜30日:5点(最近購入)
・31〜60日:4点
・61〜90日:3点
・91〜180日:2点
・181日以上:1点(かなり昔)
F(Frequency)のスコア化例:
・10回以上:5点
・7〜9回:4点
・4〜6回:3点
・2〜3回:2点
・1回:1点
M(Monetary)のスコア化例:
・100,000円以上:5点
・50,000〜99,999円:4点
・20,000〜49,999円:3点
・10,000〜19,999円:2点
・10,000円未満:1点
Pythonでの実装
# RFM分析の実装
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
# サンプルデータ作成
np.random.seed(42)
# 分析基準日
analysis_date = datetime(2024, 6, 30)
# 顧客データ生成
n_customers = 1000
customer_ids = range(1, n_customers + 1)
data = []
for customer_id in customer_ids:
# 購買回数(1〜20回)
n_purchases = np.random.randint(1, 21)
# 各購買の日付と金額
for _ in range(n_purchases):
days_ago = np.random.randint(1, 366)
purchase_date = analysis_date – timedelta(days=days_ago)
amount = np.random.randint(1000, 100001)
data.append({
‘customer_id’: customer_id,
‘purchase_date’: purchase_date,
‘amount’: amount
})
df = pd.DataFrame(data)
# RFM指標を計算
rfm = df.groupby(‘customer_id’).agg({
‘purchase_date’: lambda x: (analysis_date – x.max()).days, # Recency
‘customer_id’: ‘count’, # Frequency(別名で集計)
‘amount’: ‘sum’ # Monetary
}).reset_index()
# purchase_dateの集計結果をrecencyに名前変更
rfm.columns = [‘customer_id’, ‘recency’, ‘frequency’, ‘monetary’]
print(“【RFMデータのサンプル】”)
print(rfm.head(10))
print(f”\n顧客数: {len(rfm)}人”)
# 出力例
【RFMデータのサンプル】
customer_id recency frequency monetary
0 1 12 11 542310
1 2 45 8 398720
2 3 156 3 85420
3 4 5 15 823450
4 5 89 6 245680
5 6 234 2 42100
6 7 28 12 612340
7 8 178 4 134560
8 9 67 9 478920
9 10 3 18 945230
顧客数: 1000人
スコアリングの実装
# ============================================
# RFMスコアの計算
# ============================================
# 各指標を5段階(1〜5)にスコア化
# 5: 最も良い、1: 最も悪い
def calculate_rfm_scores(rfm_df):
“””
RFMスコアを計算(5段階)
Parameters:
———–
rfm_df : DataFrame – RFMの生データを含むDataFrame
Returns:
——–
DataFrame – スコアが追加されたDataFrame
“””
rfm = rfm_df.copy()
# ============================================
# pd.qcut(): 分位数で等分割(各グループが同じ人数になる)
# ============================================
# q=5: 5分割(20%ずつのグループ)
# labels=[5,4,3,2,1]: 各グループに付けるラベル
#
# なぜqcutを使うか?
# → データの分布に関係なく、各グループが同数になる
# → 例: 1000人なら各スコアに200人ずつ
#
# Recencyは「小さいほど良い」(最近購入 = 良い顧客)
# → ラベルを[5,4,3,2,1]にして、小さい値に高スコア
rfm[‘R_score’] = pd.qcut(rfm[‘recency’], q=5, labels=[5, 4, 3, 2, 1])
# ============================================
# FrequencyとMonetaryのスコアリング
# ============================================
# FrequencyとMonetaryは「大きいほど良い」
# → ラベルを[1,2,3,4,5]にして、大きい値に高スコア
#
# .rank(method=’first’)を使う理由:
# → 同じ値(重複値)があるとqcutがエラーになる場合がある
# → rank()で順位に変換すると、重複値もユニークな順位になる
# → method=’first’: 同じ値は出現順で順位付け
#
# 例: frequency = [5, 5, 3, 3, 7]
# → rank()後 = [3, 4, 1, 2, 5](5が2つあっても別順位)
rfm[‘F_score’] = pd.qcut(rfm[‘frequency’].rank(method=’first’),
q=5, labels=[1, 2, 3, 4, 5])
rfm[‘M_score’] = pd.qcut(rfm[‘monetary’].rank(method=’first’),
q=5, labels=[1, 2, 3, 4, 5])
# ============================================
# スコアを数値に変換
# ============================================
# qcutの結果はカテゴリ型(文字列のような扱い)
# 計算に使うため、整数に変換
rfm[‘R_score’] = rfm[‘R_score’].astype(int)
rfm[‘F_score’] = rfm[‘F_score’].astype(int)
rfm[‘M_score’] = rfm[‘M_score’].astype(int)
# ============================================
# RFMスコア(3桁で表現: 例555)
# ============================================
# 文字列として結合 → “555”のような形式
# セグメント分類やフィルタリングに便利
rfm[‘RFM_score’] = (rfm[‘R_score’].astype(str) +
rfm[‘F_score’].astype(str) +
rfm[‘M_score’].astype(str))
# ============================================
# RFM合計スコア(3〜15点)
# ============================================
# 簡易的なランキングに使用
# 高いほど優良顧客
rfm[‘RFM_total’] = rfm[‘R_score’] + rfm[‘F_score’] + rfm[‘M_score’]
return rfm
# スコア計算実行
rfm_scored = calculate_rfm_scores(rfm)
print(“【RFMスコア計算結果】”)
print(rfm_scored[[‘customer_id’, ‘recency’, ‘frequency’, ‘monetary’,
‘R_score’, ‘F_score’, ‘M_score’, ‘RFM_score’, ‘RFM_total’]].head(10))
print(“\n【スコアの読み方】”)
print(“・R_score: 5=最近購入、1=長期間購入なし”)
print(“・F_score: 5=頻繁に購入、1=購入回数少ない”)
print(“・M_score: 5=高額購入、1=少額購入”)
print(“・RFM_score: 555が最優良、111が最低ランク”)
print(“\n【スコア分布】”)
print(f”R_score平均: {rfm_scored[‘R_score’].mean():.2f}”)
print(f”F_score平均: {rfm_scored[‘F_score’].mean():.2f}”)
print(f”M_score平均: {rfm_scored[‘M_score’].mean():.2f}”)
print(f”RFM合計平均: {rfm_scored[‘RFM_total’].mean():.2f}”)
# 出力例
【RFMスコア計算結果】
customer_id recency frequency monetary R_score F_score M_score RFM_score RFM_total
0 1 12 11 542310 5 4 4 544 13
1 2 45 8 398720 4 3 4 434 11
2 3 156 3 85420 2 2 2 222 6
3 4 5 15 823450 5 5 5 555 15
4 5 89 6 245680 3 3 3 333 9
5 6 234 2 42100 1 1 1 111 3
6 7 28 12 612340 5 4 5 545 14
7 8 178 4 134560 2 2 2 222 6
8 9 67 9 478920 3 4 4 344 11
9 10 3 18 945230 5 5 5 555 15
【スコア分布】
R_score平均: 3.00
F_score平均: 3.00
M_score平均: 3.00
RFM合計平均: 9.00
🎯 3. セグメント分類
セグメントの定義
| セグメント |
R |
F |
M |
特徴 |
| Champions |
高 |
高 |
高 |
最優良顧客、すべて高い |
| Loyal Customers |
中〜高 |
高 |
中〜高 |
継続的に購入するロイヤル顧客 |
| Potential Loyalists |
高 |
中 |
中 |
最近購入、育成すれば優良化 |
| New Customers |
高 |
低 |
低 |
最近初めて購入した新規顧客 |
| At Risk |
低 |
中〜高 |
中〜高 |
過去は優良、最近離脱傾向 |
| Can’t Lose Them |
低 |
高 |
高 |
超優良だったが離脱危機 |
| Lost |
低 |
低 |
低 |
昔1回購入しただけ、離脱済み |
セグメント分類の実装
# セグメント分類
def classify_customer(row):
“””RFMスコアに基づいて顧客をセグメント分類”””
r, f, m = row[‘R_score’], row[‘F_score’], row[‘M_score’]
# Champions(最優良顧客)
if r >= 4 and f >= 4 and m >= 4:
return ‘Champions’
# Loyal Customers(ロイヤル顧客)
elif r >= 3 and f >= 4:
return ‘Loyal Customers’
# Potential Loyalists(優良顧客予備軍)
elif r >= 4 and f >= 2 and f <= 3:
return 'Potential Loyalists'
# New Customers(新規顧客)
elif r >= 4 and f == 1:
return ‘New Customers’
# At Risk(要注意顧客)
elif r <= 2 and f >= 3:
return ‘At Risk’
# Can’t Lose Them(絶対離脱させたくない)
elif r <= 2 and f >= 4 and m >= 4:
return “Can’t Lose Them”
# Lost(離脱顧客)
elif r <= 2 and f <= 2:
return 'Lost'
else:
return 'Others'
# セグメント分類を適用
rfm_scored['segment'] = rfm_scored.apply(classify_customer, axis=1)
print("【セグメント分布】")
segment_counts = rfm_scored['segment'].value_counts()
for segment, count in segment_counts.items():
pct = count / len(rfm_scored) * 100
print(f"{segment}: {count}人 ({pct:.1f}%)")
# セグメント別の平均値
print("\n【セグメント別サマリー】")
segment_summary = rfm_scored.groupby('segment').agg({
'recency': 'mean',
'frequency': 'mean',
'monetary': 'mean',
'customer_id': 'count'
}).round(1)
segment_summary.columns = ['平均Recency', '平均Frequency', '平均Monetary', '顧客数']
segment_summary = segment_summary.sort_values('顧客数', ascending=False)
print(segment_summary)
# 出力例
【セグメント分布】
Others: 312人 (31.2%)
Lost: 198人 (19.8%)
At Risk: 156人 (15.6%)
Champions: 98人 (9.8%)
Potential Loyalists: 89人 (8.9%)
Loyal Customers: 78人 (7.8%)
New Customers: 45人 (4.5%)
Can’t Lose Them: 24人 (2.4%)
【セグメント別サマリー】
平均Recency 平均Frequency 平均Monetary 顧客数
segment
Others 112.3 6.8 312450.5 312
Lost 245.6 1.8 42380.2 198
At Risk 178.4 8.2 389620.1 156
Champions 18.5 14.2 756230.8 98
Potential Loyalists 21.3 4.5 198340.6 89
Loyal Customers 45.2 11.8 523180.4 78
New Customers 15.8 1.0 28450.3 45
Can’t Lose Them 198.2 15.6 824560.2 24
可視化
# セグメント分析の可視化
import matplotlib.pyplot as plt
import numpy as np
def visualize_rfm_segments(rfm_df):
“””RFMセグメントの可視化”””
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# 1. セグメント別顧客数
segment_counts = rfm_df[‘segment’].value_counts()
colors = plt.cm.Set3(np.linspace(0, 1, len(segment_counts)))
axes[0, 0].barh(segment_counts.index, segment_counts.values, color=colors)
axes[0, 0].set_xlabel(‘顧客数’, fontsize=11)
axes[0, 0].set_title(‘セグメント別顧客数’, fontsize=13, fontweight=’bold’)
axes[0, 0].grid(axis=’x’, alpha=0.3)
# 値を表示
for i, (idx, val) in enumerate(segment_counts.items()):
axes[0, 0].text(val + 5, i, f'{val}人’, va=’center’)
# 2. セグメント別売上構成比
segment_revenue = rfm_df.groupby(‘segment’)[‘monetary’].sum()
axes[0, 1].pie(segment_revenue.values, labels=segment_revenue.index,
autopct=’%1.1f%%’, startangle=90, colors=colors)
axes[0, 1].set_title(‘セグメント別売上構成比’, fontsize=13, fontweight=’bold’)
# 3. R-F散布図
scatter = axes[1, 0].scatter(rfm_df[‘recency’], rfm_df[‘frequency’],
c=rfm_df[‘RFM_total’], cmap=’RdYlGn’,
alpha=0.6, s=50)
axes[1, 0].set_xlabel(‘Recency (日)’, fontsize=11)
axes[1, 0].set_ylabel(‘Frequency (回)’, fontsize=11)
axes[1, 0].set_title(‘Recency × Frequency’, fontsize=13, fontweight=’bold’)
axes[1, 0].invert_xaxis()
plt.colorbar(scatter, ax=axes[1, 0], label=’RFM合計スコア’)
axes[1, 0].grid(alpha=0.3)
# 4. RFM平均スコア
rfm_scores = rfm_df[[‘R_score’, ‘F_score’, ‘M_score’]].mean()
bars = axes[1, 1].bar([‘Recency’, ‘Frequency’, ‘Monetary’], rfm_scores.values,
color=[‘coral’, ‘skyblue’, ‘lightgreen’], edgecolor=’black’)
axes[1, 1].set_ylabel(‘平均スコア’, fontsize=11)
axes[1, 1].set_title(‘RFM平均スコア’, fontsize=13, fontweight=’bold’)
axes[1, 1].set_ylim(0, 5)
axes[1, 1].grid(axis=’y’, alpha=0.3)
for bar, val in zip(bars, rfm_scores.values):
axes[1, 1].text(bar.get_x() + bar.get_width()/2, val + 0.1,
f'{val:.2f}’, ha=’center’, fontweight=’bold’)
plt.tight_layout()
plt.savefig(‘rfm_analysis.png’, dpi=150, bbox_inches=’tight’)
plt.show()
print(“→ グラフを保存しました: rfm_analysis.png”)
# 可視化実行
visualize_rfm_segments(rfm_scored)
💡 4. セグメント別施策の設計
セグメント別の推奨施策
🏆 Champions
施策:
・VIP特典、専用サポート
・新商品の先行案内
・アンバサダープログラム
・限定イベントへの招待
目標:維持、さらなるロイヤル化
💎 Loyal Customers
施策:
・ロイヤリティプログラム
・アップセル・クロスセル
・定期購入の提案
・ポイント還元強化
目標:Champions化
🌱 Potential Loyalists
施策:
・リピート購入割引
・会員プログラムへの誘導
・関連商品のレコメンド
・購入頻度を上げる施策
目標:Loyal化
✨ New Customers
施策:
・ウェルカムキャンペーン
・2回目購入の割引
・オンボーディングメール
・使い方ガイド送付
目標:2回目購入促進
⚠️ At Risk
施策:
・「お久しぶり」キャンペーン
・限定クーポン送付
・離脱理由アンケート
・パーソナライズオファー
目標:復活、離脱防止
🚨 Can’t Lose Them
施策:
・特別割引(大幅)
・電話でのフォローアップ
・VIP復活プログラム
・最優先で対応
目標:絶対に離脱させない
施策自動提案の実装
# セグメント別施策の自動提案
def recommend_action(segment):
“””セグメントに応じた施策を提案”””
recommendations = {
‘Champions’: {
‘priority’: ‘★★★★★’,
‘goal’: ‘維持・さらなるロイヤル化’,
‘actions’: [
‘VIP専用サポートの提供’,
‘新商品の先行案内’,
‘アンバサダープログラムへの招待’,
‘限定イベントへの招待’
],
‘budget_ratio’: 0.25
},
‘Loyal Customers’: {
‘priority’: ‘★★★★☆’,
‘goal’: ‘Champions化’,
‘actions’: [
‘ロイヤリティプログラムの強化’,
‘アップセル・クロスセル提案’,
‘定期購入への誘導’,
‘ポイント還元率アップ’
],
‘budget_ratio’: 0.20
},
‘At Risk’: {
‘priority’: ‘★★★★★’,
‘goal’: ‘復活・離脱防止’,
‘actions’: [
‘「お久しぶりです」キャンペーン’,
‘限定クーポン送付(20-30%OFF)’,
‘離脱理由アンケート’,
‘パーソナライズドオファー’
],
‘budget_ratio’: 0.25
},
“Can’t Lose Them”: {
‘priority’: ‘★★★★★’,
‘goal’: ‘絶対に離脱させない’,
‘actions’: [
‘電話でのパーソナルフォロー’,
‘特別割引(40-50%OFF)’,
‘VIP復活プログラム’,
‘経営層からの特別メッセージ’
],
‘budget_ratio’: 0.15
},
‘Potential Loyalists’: {
‘priority’: ‘★★★☆☆’,
‘goal’: ‘Loyal化’,
‘actions’: [
‘リピート購入割引’,
‘会員プログラムへの誘導’,
‘関連商品レコメンド’,
‘購入頻度向上施策’
],
‘budget_ratio’: 0.08
},
‘New Customers’: {
‘priority’: ‘★★★☆☆’,
‘goal’: ‘2回目購入促進’,
‘actions’: [
‘ウェルカムキャンペーン’,
‘2回目購入クーポン’,
‘オンボーディングメール’,
‘使い方ガイド送付’
],
‘budget_ratio’: 0.05
},
‘Lost’: {
‘priority’: ‘★☆☆☆☆’,
‘goal’: ‘低コストでの再獲得試行’,
‘actions’: [
‘一斉メール(低コスト)’,
‘大幅割引クーポン(50%OFF)’,
‘反応があれば個別フォロー’
],
‘budget_ratio’: 0.02
},
‘Others’: {
‘priority’: ‘★★☆☆☆’,
‘goal’: ‘セグメント移動の促進’,
‘actions’: [
‘一般的なキャンペーン案内’,
‘購入履歴に基づくレコメンド’
],
‘budget_ratio’: 0.00
}
}
return recommendations.get(segment, recommendations[‘Others’])
# セグメント別レポート生成
def generate_segment_report(rfm_df):
“””セグメント別のアクションレポートを生成”””
print(“=” * 70)
print(“RFM分析レポート – セグメント別施策提案”)
print(“=” * 70)
segments = rfm_df[‘segment’].value_counts()
for segment, count in segments.items():
rec = recommend_action(segment)
pct = count / len(rfm_df) * 100
print(f”\n【{segment}】”)
print(f” 顧客数: {count}人 ({pct:.1f}%)”)
print(f” 優先度: {rec[‘priority’]}”)
print(f” 目標: {rec[‘goal’]}”)
print(f” 予算配分: {rec[‘budget_ratio’]*100:.0f}%”)
print(f” 推奨施策:”)
for i, action in enumerate(rec[‘actions’], 1):
print(f” {i}. {action}”)
print(“\n” + “=” * 70)
# レポート生成
generate_segment_report(rfm_scored)
# 出力例
======================================================================
RFM分析レポート – セグメント別施策提案
======================================================================
【Others】
顧客数: 312人 (31.2%)
優先度: ★★☆☆☆
目標: セグメント移動の促進
予算配分: 0%
推奨施策:
1. 一般的なキャンペーン案内
2. 購入履歴に基づくレコメンド
【Lost】
顧客数: 198人 (19.8%)
優先度: ★☆☆☆☆
目標: 低コストでの再獲得試行
予算配分: 2%
推奨施策:
1. 一斉メール(低コスト)
2. 大幅割引クーポン(50%OFF)
3. 反応があれば個別フォロー
【At Risk】
顧客数: 156人 (15.6%)
優先度: ★★★★★
目標: 復活・離脱防止
予算配分: 25%
推奨施策:
1. 「お久しぶりです」キャンペーン
2. 限定クーポン送付(20-30%OFF)
3. 離脱理由アンケート
4. パーソナライズドオファー
【Champions】
顧客数: 98人 (9.8%)
優先度: ★★★★★
目標: 維持・さらなるロイヤル化
予算配分: 25%
推奨施策:
1. VIP専用サポートの提供
2. 新商品の先行案内
3. アンバサダープログラムへの招待
4. 限定イベントへの招待
======================================================================
📑 5. Excelでの実装
RFM計算とスコアリング
【Excelでのfm分析】
=== データ準備 ===
A列: customer_id
B列: purchase_date
C列: amount
=== RFM計算(ピボットテーブル)===
1. Recency計算
=TODAY()-MAX(購入日)
2. Frequency計算
=COUNTA(購入日)
3. Monetary計算
=SUM(購買金額)
=== スコアリング(IFS関数)===
【Rスコア】(小さいほど高スコア)
=IFS(
Recency<=30, 5,
Recency<=60, 4,
Recency<=90, 3,
Recency<=180, 2,
TRUE, 1
)
【Fスコア】(大きいほど高スコア)
=IFS(
Frequency>=10, 5,
Frequency>=7, 4,
Frequency>=4, 3,
Frequency>=2, 2,
TRUE, 1
)
【Mスコア】(大きいほど高スコア)
=IFS(
Monetary>=100000, 5,
Monetary>=50000, 4,
Monetary>=20000, 3,
Monetary>=10000, 2,
TRUE, 1
)
=== セグメント分類 ===
=IFS(
AND(R>=4,F>=4,M>=4), “Champions”,
AND(R>=3,F>=4), “Loyal Customers”,
AND(R>=4,F=1), “New Customers”,
AND(R<=2,F>=3), “At Risk”,
AND(R<=2,F<=2), “Lost”,
TRUE, “Others”
)
📝 STEP 25 のまとめ
✅ このステップで学んだこと
1. RFMの3指標
- R(Recency):最新購買日
- F(Frequency):購買頻度
- M(Monetary):購買金額
2. スコアリング
- 各指標を1〜5点で評価
- Rは小さいほど、F・Mは大きいほど高スコア
3. セグメンテーション
- Champions、Loyal、At Riskなどに分類
- 各セグメントの特徴を把握
4. 施策設計
- セグメント別に最適な施策を実施
- リソースを効率的に配分
💡 最も大切なポイント
RFM分析は、顧客の価値を定量化し、効果的な施策を打つための基本ツールです!
RFM分析の価値:
・シンプルで分かりやすい
・すぐに実践できる
・ROIが高い施策につながる
次のSTEP 26では、顧客生涯価値(LTV)の計算方法を学びます!
🎯 次のステップの予告
STEP 26では、「顧客生涯価値(LTV)の計算」を学びます。顧客が生涯でもたらす価値を予測し、獲得コストの適正値を判断する方法を習得しましょう!
📝 練習問題
問題 1
基礎
RFMの3つの指標を、それぞれ説明してください。
【解答】
R = Recency(最新購買日)
・最後に購入してから何日経ったか
・数値が小さいほど良い(最近購入した)
F = Frequency(購買頻度)
・過去に何回購入したか
・数値が大きいほど良い(たくさん購入)
M = Monetary(購買金額)
・過去に合計いくら使ったか
・数値が大きいほど良い(高額顧客)
問題 2
基礎
以下の顧客A、B、Cのうち、最も優良な顧客は誰ですか?
顧客A:R=5日前、F=3回、M=30,000円
顧客B:R=60日前、F=10回、M=200,000円
顧客C:R=10日前、F=15回、M=150,000円
【解答】顧客C
各顧客のRFMスコア化(5段階):
顧客A:R=5点、F=2点、M=2点 → 合計9点
顧客B:R=3点、F=4点、M=5点 → 合計12点
顧客C:R=5点、F=5点、M=4点 → 合計14点(最高)
セグメント:
・顧客C:Champions(すべて高スコア)
・顧客B:At Risk(Rが低下傾向)
・顧客A:New Customer(購入回数が少ない)
問題 3
応用
「At Risk」セグメントの顧客に対して、どのような施策が効果的ですか?3つ挙げてください。
【解答】At Riskへの効果的な施策
1. 「お久しぶりです」キャンペーン
・パーソナライズされたメッセージ
・「ご無沙汰しております」の挨拶から始める
2. 限定クーポン送付(20-30%OFF)
・期間限定の特別割引
・「あなただけの特別オファー」感を出す
3. 離脱理由アンケート
・なぜ最近購入していないかを確認
・回答者には謝礼(ポイント等)を提供
ポイント:
At Riskは過去に優良だった顧客なので、復活の可能性が高い。早急な対応が重要!
問題 4
応用
以下のRFM分析結果で、マーケティング予算をどのセグメントに優先配分すべきですか?
・Champions:50人(5%)
・Loyal Customers:150人(15%)
・At Risk:200人(20%)
・Lost:300人(30%)
・その他:300人(30%)
【解答】推奨する優先配分
優先順位:
1位:At Risk(予算40%)
・200人と大きなボリューム
・過去は優良 → 復帰可能性高い
・今対策しないとLostに転落
2位:Champions + Loyal(予算30%)
・売上の大部分を占める可能性
・維持コスト < 新規獲得コスト
3位:その他から有望者育成(予算20%)
・Potential Loyalistsを抽出して育成
4位:Lost(予算10%)
・復帰可能性が低い
・低コスト施策のみ
考え方:
「全員平等」ではなく「ROIが高いセグメントに集中投資」がRFM分析の真価!
問題 5
実践
以下の顧客データからRFMスコアを計算し、セグメントを判定してください。(分析基準日:2024年6月30日)
| 顧客ID | 最終購入日 | 購入回数 | 累計金額 |
| 1001 | 2024-06-25 | 12回 | ¥180,000 |
| 1002 | 2024-01-15 | 8回 | ¥120,000 |
| 1003 | 2024-06-28 | 1回 | ¥5,000 |
【解答】
RFM計算:
顧客1001:
・R = 5日(6/30 – 6/25)→ Rスコア = 5
・F = 12回 → Fスコア = 5
・M = ¥180,000 → Mスコア = 5
・セグメント:Champions(すべて高スコア)
顧客1002:
・R = 166日(6/30 – 1/15)→ Rスコア = 2
・F = 8回 → Fスコア = 4
・M = ¥120,000 → Mスコア = 5
・セグメント:At Risk(Rが低く、F・Mが高い)
顧客1003:
・R = 2日(6/30 – 6/28)→ Rスコア = 5
・F = 1回 → Fスコア = 1
・M = ¥5,000 → Mスコア = 1
・セグメント:New Customer(Rが高く、F・Mが低い)
施策提案:
・顧客1001:VIP特典、新商品先行案内
・顧客1002:カムバックキャンペーン、限定クーポン(急務!)
・顧客1003:ウェルカムメール、2回目購入割引
❓ よくある質問
Q1: RFMの基準はどう決めれば良いですか?
業種とビジネスモデルに合わせて設定します。
考慮すべき要素:
1. 購買サイクル
・日用品EC:Recency 30日が目安
・家電EC:Recency 180日でも許容
・B2B SaaS:Recency 90日が目安
2. 分布を見る
・自社データの中央値や四分位数で区切る
・パーセンタイルで5分割
実践的アプローチ:
まずは一般的な基準でスタート → データを見ながら調整
Q2: RFMスコアは何段階が良いですか?
5段階が一般的ですが、3段階や4段階でもOKです。
3段階(低、中、高):
・メリット:シンプルで分かりやすい
・向いてる:顧客数が少ない(〜1,000人)
5段階(最もポピュラー):
・メリット:適度な粒度、セグメント分けしやすい
・向いてる:ほとんどのビジネス
10段階(詳細):
・メリット:非常に詳細な分析が可能
・向いてる:大規模EC、金融機関
Q3: RFMとLTVの違いは何ですか?
RFMは「現在の価値」、LTVは「将来の価値」を見ます。
RFM分析:
・過去〜現在のデータ
・顧客の現在の状態を分類
・今すぐ打つべき施策を決める
LTV(顧客生涯価値):
・将来の予測
・顧客が生涯でもたらす価値
・獲得コストの適正値を決める
組み合わせ:
両方を使うと、より戦略的な判断が可能!
Q4: RFM分析はどの頻度で行うべき?
月次が基本、重要な施策前後は随時。
月次分析:
・セグメント間の移動を追跡
・トレンドの把握
・定例レポートに組み込む
四半期分析:
・基準値の見直し
・施策効果の検証
随時分析:
・大型キャンペーン前後
・異常値の検知時
Q5: RFMの各指標の重み付けは必要ですか?
ビジネスによっては重み付けが有効です。
均等重み付け(基本):
・R、F、M同じ重み
・RFM合計 = R + F + M
重み付けが有効なケース:
・サブスクリプション:Recency重視(離脱予兆)
・高単価商材:Monetary重視
・リピート商材:Frequency重視
実践例:
・加重スコア = R×2 + F×1 + M×1
・Recencyを2倍重視
Q6: セグメントの定義をカスタマイズしても良いですか?
はい、自社のビジネスに合わせてカスタマイズすべきです。
カスタマイズのポイント:
・セグメント数は5〜10が扱いやすい
・各セグメントに明確な施策を紐付け
・社内で共通認識を持てる名前に
例:ECサイト向けカスタマイズ
・「ヘビーユーザー」「ライトユーザー」「休眠ユーザー」など
・日本語で分かりやすく
重要:
定義を変えたら、過去との比較ができなくなるので、変更履歴を残す