トレジャーデータ(Treasure Data)公式ブログ

トレジャーデータ(Treasure Data)公式ブログです。

トレジャーデータで実践:RFM分析(前編)

はじめに

トレジャーデータはクラウドでデータマネージメントサービスを提供しています。

EC や POS、Web サービス、Game など、購買行動を伴う一連の行動ログは活用意義のある大変貴重なものとして古くから分析が行われて来ました。

その中でも有名な手法である RFM 分析は

  • R(Recency:直近購買日)= いつ買ったか
  • F(Frequency:一定期間内の購買回数)= どのくらいの頻度で
  • M(Monetary:一定期間内の購買金額)= いくら使っているか

の3つの切り口から2つを選び、その2軸に基づいて顧客をグループに分け、そのグループ毎に目立った特徴を見ていく手法です。一般にRFM分析と呼ばれているのは、この前者:グルーピングを指す事が多いようです。

本記事でもRFMに基づいたグルーピングをご紹介していきます。トレジャーデータでのRFM分析は、非常に柔軟な設定のもとで簡単に行えるのが特徴です。

f:id:doryokujin:20150521115117j:plain

↑ 「RF Matrix」:R(y軸)とF(x軸)のクロステーブルは、これらの値の組み合わせにおいて何人がそこに該当するかが、各々のセルの値となって一覧で見ることができるようになっています。

RFM 分析に必要なデータセット

RFMに必要ないわゆる発注実績ログは、本ブログでもお馴染みの sales_slip テーブルです。

項目名(抜粋) サンプル1 サンプル2
  time 1379880709 1337749470
  member_id 2026429 1931260
  goods_id 583266 109601
  category  Automotive and Industrial  Automotive and Industrial
  sub_category  Industrial Supplies  Lab and Scientific
  ship_date  2013-09-27  2021-01-03
  amount 1 1
  price 277 300

Recency

Recency は「昨日」「今日」といったある基準日に対して、各ユーザーの最終購入日が何日(何週間)前なのかについて集計をとったものです。

Web サービスやゲームのようなアクティビティの高いサービスでは日単位で集計しますが、ECのような買い物周期の長いものは週単位で集計することが多いようです。ここでは2013-11-31を基準日とした1年分のデータでの各ユーザーのRecencyを日単位、週単位で集計しています。

term_dayterm_weekcnt
0 0 545
1 0 825
2 0 864
3 0 1093

さらに任意の間隔を記述すれば、よりわかりやすいユーザーのグルーピングが可能です。

 今回の結果では、実に60%以上のユーザーが半年前から購入アクティビティが無かった事がわかりますね。

Frequency

Recency は直近購入という最新のアクティビティを示すものですが、それまでにどれくらい活発に購入しているかという頻度に関するアクティビティは見えません。Frequencyは特定の期間内で各ユーザーが何回購入しているのかの頻度を軸に、グルーピングを行います。

2013-11-31を基準日とした1年分のデータでの各ユーザーのFrequencyを日単位、週単位で集計しています。

freqcnt
286 1
185 1
181 1

 

しかし、このままではfreqの値の粒度が細かすぎて、グラフが見にくくなってしまいます。

custom_freqcnt
101 85
100 563
50 1440
30 2260
20 6406
10 10729
5 36928
1 63359

 

↑このように参照する側にとってわかりやすい区切りを行えば、色々なことが簡単に見えてきます。年間の頻度で見て1回のみ購入しているユーザーが50%以上とかなりを占めていますね。一方で12回以上(≃月に1回)のユーザーも20%近くいることがわかりますね。

Monetary

Monetary は特定の期間内で各ユーザーが合計いくら購入しているのかの総額を軸にグルーピングします。Monetary を1円毎に集計しては、先ほどの Frequency より取り得る値の粒度が細かすぎて見にくくなっています。ここでは既にカスタマイズした区分で集計することから始めましょう。

 

購入総額といった区分のしやすいものは、Case文でマニュアルで分けていくといった形が最適ですが、仮想ポイント総額など取り得る値が0〜100万というような広いレンジにある場合にはマニュアルでは大変ですので、自動的に区分を作ってくれる魔法のクエリを使います。

おおざっぱな区切り

xcnt
0 403
1000000 121319
2000000 37
3000000 4
4000000 4
6000000 1
83000000 1
より細かい区切り

xcnt
0 403
1000 7112
2000 8378
3000 9565
4000 6465
5000 5668
... ...

 

さて次回は個々に紹介したR、F、Mを組み合わせて見ていくことにします。