RFM分析とは?機械学習で実現する高精度な顧客セグメンテーション完全ガイド
RFM分析の基本概念
RFM分析は、顧客の購買行動を「Recency(最新性)」「Frequency(頻度)」「Monetary(金額)」の3つの指標で分析する手法です。マーケティングにおける顧客セグメンテーションの基本的なフレームワークとして、多くの企業で活用されています。
RFMの3つの指標
- Recency(最新性): 最後に購入してからの経過日数
- Frequency(頻度): 一定期間内での購入回数
- Monetary(金額): 一定期間内での購入金額の合計
従来のRFM分析の限界と機械学習の活用
従来のRFM分析では、各指標を5段階などに分割して顧客をグループ化していましたが、この方法には以下の課題がありました:
- 閾値の設定が主観的になりがち
- 顧客の複雑な行動パターンを捉えきれない
- 時系列変化への対応が困難
機械学習を活用することで、これらの課題を解決し、より精度の高い顧客分析が可能になります。
機械学習を用いたRFM分析の実装方法
1. データ準備とRFM値の算出
import pandas as pd
import numpy as np
from datetime import datetime
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import seaborn as sns
# サンプルデータの作成
data = {
'customer_id': range(1, 1001),
'last_purchase_date': pd.date_range('2023-01-01', periods=1000, freq='D'),
'purchase_frequency': np.random.randint(1, 50, 1000),
'total_amount': np.random.randint(1000, 100000, 1000)
}
df = pd.DataFrame(data)
# RFM値の計算
reference_date = datetime(2023, 12, 31)
df['recency'] = (reference_date - df['last_purchase_date']).dt.days
df['frequency'] = df['purchase_frequency']
df['monetary'] = df['total_amount']
# RFMデータの抽出
rfm_data = df[['recency', 'frequency', 'monetary']]
2. K-meansクラスタリングによる顧客セグメンテーション
# データの標準化
scaler = StandardScaler()
rfm_scaled = scaler.fit_transform(rfm_data)
# 最適なクラスタ数の決定(エルボー法)
sse = []
for k in range(1, 11):
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans.fit(rfm_scaled)
sse.append(kmeans.inertia_)
# K-meansクラスタリングの実行
optimal_clusters = 5
kmeans = KMeans(n_clusters=optimal_clusters, random_state=42)
df['cluster'] = kmeans.fit_predict(rfm_scaled)
3. 階層クラスタリングによる代替手法
from scipy.cluster.hierarchy import dendrogram, linkage
from sklearn.cluster import AgglomerativeClustering
# 階層クラスタリングの実行
hierarchical = AgglomerativeClustering(n_clusters=5)
df['hierarchical_cluster'] = hierarchical.fit_predict(rfm_scaled)
# デンドログラムの可視化
linkage_matrix = linkage(rfm_scaled, method='ward')
dendrogram(linkage_matrix)
plt.title('階層クラスタリング デンドログラム')
plt.show()
高度な機械学習手法の適用
ガウシアン混合モデル(GMM)による柔軟なクラスタリング
from sklearn.mixture import GaussianMixture
# GMMの実行
gmm = GaussianMixture(n_components=5, random_state=42)
df['gmm_cluster'] = gmm.fit_predict(rfm_scaled)
# 各クラスタの確率を取得
cluster_probs = gmm.predict_proba(rfm_scaled)
df['max_prob'] = np.max(cluster_probs, axis=1)
DBSCAN による密度ベースクラスタリング
from sklearn.cluster import DBSCAN
# DBSCANの実行
dbscan = DBSCAN(eps=0.5, min_samples=10)
df['dbscan_cluster'] = dbscan.fit_predict(rfm_scaled)
# ノイズポイント(外れ値)の確認
noise_points = df[df['dbscan_cluster'] == -1]
print(f"ノイズポイント数: {len(noise_points)}")
顧客価値予測モデルの構築
ランダムフォレストによる顧客価値予測
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
# 特徴量とターゲットの設定
X = df[['recency', 'frequency']]
y = df['monetary']
# 学習・テストデータの分割
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# ランダムフォレストモデルの学習
rf_model = RandomForestRegressor(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
# 予測と評価
y_pred = rf_model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"MSE: {mse:.2f}")
print(f"R²スコア: {r2:.3f}")
時系列分析の組み込み
LSTMによる顧客行動の時系列予測
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
from sklearn.preprocessing import MinMaxScaler
# 時系列データの準備(簡略版)
def create_sequences(data, seq_length):
sequences = []
for i in range(len(data) - seq_length):
sequences.append(data[i:i+seq_length])
return np.array(sequences)
# データの正規化
scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(df[['monetary']].values)
# LSTMモデルの構築
model = Sequential([
LSTM(50, return_sequences=True, input_shape=(10, 1)),
LSTM(50),
Dense(1)
])
model.compile(optimizer='adam', loss='mse')
結果の可視化と解釈
クラスタの特徴分析
# クラスタごとの統計情報
cluster_summary = df.groupby('cluster').agg({
'recency': ['mean', 'std'],
'frequency': ['mean', 'std'],
'monetary': ['mean', 'std'],
'customer_id': 'count'
}).round(2)
print("クラスタ別統計情報:")
print(cluster_summary)
# 3D散布図による可視化
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')
colors = ['red', 'blue', 'green', 'orange', 'purple']
for i in range(optimal_clusters):
cluster_data = df[df['cluster'] == i]
ax.scatter(cluster_data['recency'],
cluster_data['frequency'],
cluster_data['monetary'],
c=colors[i], label=f'Cluster {i}', s=50)
ax.set_xlabel('Recency')
ax.set_ylabel('Frequency')
ax.set_zlabel('Monetary')
ax.legend()
plt.title('RFMクラスタリング結果')
plt.show()
ビジネス活用のための顧客セグメント命名
# クラスタの命名とビジネス戦略の提案
def assign_segment_names(df):
segments = []
for _, row in df.iterrows():
if row['recency'] < 30 and row['monetary'] > 50000:
segments.append('VIP顧客')
elif row['recency'] < 60 and row['frequency'] > 20:
segments.append('ロイヤル顧客')
elif row['recency'] > 180:
segments.append('離脱リスク顧客')
elif row['monetary'] < 10000:
segments.append('新規・低価値顧客')
else:
segments.append('一般顧客')
return segments
df['segment_name'] = assign_segment_names(df)
パフォーマンス評価指標
シルエット分析による クラスタ品質評価
from sklearn.metrics import silhouette_score, silhouette_samples
# シルエットスコアの計算
silhouette_avg = silhouette_score(rfm_scaled, df['cluster'])
print(f"平均シルエットスコア: {silhouette_avg:.3f}")
# 各クラスタのシルエット分析
sample_silhouette_values = silhouette_samples(rfm_scaled, df['cluster'])
# 可視化
fig, ax = plt.subplots(figsize=(10, 6))
y_lower = 10
for i in range(optimal_clusters):
cluster_silhouette_values = sample_silhouette_values[df['cluster'] == i]
cluster_silhouette_values.sort()
size_cluster_i = cluster_silhouette_values.shape[0]
y_upper = y_lower + size_cluster_i
color = colors[i]
ax.fill_betweenx(np.arange(y_lower, y_upper),
0, cluster_silhouette_values,
facecolor=color, alpha=0.7)
y_lower = y_upper + 10
ax.axvline(x=silhouette_avg, color="red", linestyle="--")
ax.set_xlabel('シルエット係数値')
ax.set_ylabel('クラスタラベル')
plt.title('各クラスタのシルエット分析')
plt.show()
実装時の注意点とベストプラクティス
データ前処理のポイント
- 外れ値の処理: IQRまたはZ-scoreを用いた外れ値除去
- 欠損値の対応: 適切な補間方法の選択
- スケーリング: StandardScalerまたはMinMaxScalerの使用
# 外れ値除去の例
def remove_outliers_iqr(df, columns):
for column in columns:
Q1 = df[column].quantile(0.25)
Q3 = df[column].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
df = df[(df[column] >= lower_bound) & (df[column] <= upper_bound)]
return df
# 外れ値の除去
clean_df = remove_outliers_iqr(df.copy(), ['recency', 'frequency', 'monetary'])
モデルの検証と改善
from sklearn.model_selection import cross_val_score
# クロスバリデーションによる評価
def evaluate_clustering_stability(X, n_clusters, n_trials=10):
scores = []
for i in range(n_trials):
kmeans = KMeans(n_clusters=n_clusters, random_state=i)
labels = kmeans.fit_predict(X)
score = silhouette_score(X, labels)
scores.append(score)
return np.mean(scores), np.std(scores)
# 安定性評価
mean_score, std_score = evaluate_clustering_stability(rfm_scaled, 5)
print(f"平均シルエットスコア: {mean_score:.3f} ± {std_score:.3f}")
まとめ
機械学習を活用したRFM分析により、従来の手法では捉えきれない複雑な顧客行動パターンを分析できます。K-means、階層クラスタリング、GMMなど複数の手法を組み合わせることで、より精度の高い顧客セグメンテーションが実現できます。
重要なポイントは以下の通りです:
- 適切なデータ前処理とスケーリング
- 複数のクラスタリング手法の比較検証
- ビジネス観点でのセグメント解釈
- 継続的なモデル改善とパフォーマンス監視
これらの手法を組み合わせることで、データ駆動型のマーケティング戦略の立案が可能になり、ROIの向上につながります。
■テックジム「AIエンジニア養成コース」
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<オンライン無料>ゼロから始めるPython爆速講座