RFM分析を行う方法

RFM分析とは、購買データなどを利用して、顧客ごとに以下の3つのスコアを計算して、顧客を理解したり、セグメントに分けるための分析となります。

  • Recency:どれくらい最近に購入したのか
  • Frequency:どれくらいの頻度で購入しているのか
  • Monetery:どれくらいの金額を購入に費やしているのか

このノートでは購買履歴のデータを利用して、RFM分析を行う方法を紹介します。

利用データ

今回は、以下のように各行が1つの製品に対する注文を表している、スーパーストアの購買履歴データを使っていきます。

各列はそれぞれの注文に関する以下のような情報を表しています。

  • 何が売れたのか
  • どこで売れたのか
  • いつ売れたのか
  • 顧客のセグメント
  • 売上、製品のカテゴリー、など

RFM分析を行うために必要なデータ

RFM分析を行うためには、1行が1注文になっているデータを、1行1顧客に集計して、R(Recency)、F(Frequency)、M(Monetary)、のスコアを計算する必要があります。

そして今回は、ヒートマップというチャートを使って、RFM分析用に作成したデータを可視化していきます。

なお、このノートでは北米(USCA: United States and Canada)マーケットの顧客を対象に、RFM分析を行っていきます。

RFM分析を行うために必要なデータ加工のステップ

以下のステップで、購買履歴のデータを加工していきます。

  1. データ上の最後の日を計算
  2. 購買回数、購買額、購買日、マーケット、最後の日を集計
  3. 購買回数が1回の顧客を取り除き、北米マーケットの顧客のみを残す
  4. Recencyスコア(最後の購買日からデータ上の最後の日までの日数)を計算
  5. 最初の購買日から最後の購買日までの日数を計算
  6. Frequencyスコア(1日あたりの購買回数)を計算
  7. Monetaryスコア(1日あたりの購買総額)を計算

1. データ上の最後の日を計算

RFM分析における「R」であるRecency(どれくらい最近に購入したのか)は、以下の計算で求めることができます。

データ上の最後の日 - 顧客ごとの最後の購買日

そこで、データ上の最後の日の情報が必要となるため、まずはデータ上の最後の日を計算します。

注文日の列ヘッダーメニューから、計算を作成(Mutate)を選択します。

計算を作成(Mutate)のダイアログが表示されたら、最大の値を返す関数であるmax関数を利用して、以下の内容を計算エディタに入力し、実行します。

max(注文日)

このとき、「新しく列を作成」を選択して、任意の列名を設定します。(今回は「最後の日」という列名を設定します。)

最後の日の列を追加することができました。  

2. 購買回数、購買額、購買日、マーケット、最後の日を集計

続いて、顧客ごとに、購買回数、購買額、購買日、マーケット、最後の日を集計していきます。

顧客IDの列ヘッダーメニューから、集計(Summarize)を選択します。

値に「注文日」を追加し、集計関数に「一意な値の数(unique)」を選択します。

今回利用しているデータは1行が1注文になっているため、「(行の数)」を選択することで購買件数が集計できるように思えますが、今回のデータは「各行が1つの製品に対する注文」となっているため、同じ日に複数の異なる製品を注文している場合、同じ日に複数行の注文データが残るため、行の数ではなく、「注文日」の「一意な数」で購買件数を集計します。

次に購買金額を集計するために、値に「売上」を追加して、集計関数に「合計値(sum)」を選択します。

続いて、顧客の最初の購買日を集計するために、値に「注文日」を追加し、集計関数に最初の日(min)を選択します。

最初の購買日の集計できたので、今度は、顧客の最後の購買日を集計するために、再度、値に「注文日」を追加し、集計関数に最後の日(max)を選択します。

また先程のステップで列に追加した、データ上の「最後の日」も追加します。このとき、全ての列には同じ値が入っているので、デフォルトの集計関数である「中央値(median)」のままでもいいのですが、今回は「最後の日(max)」を選択します。

最後に、今回は、北米の顧客に対してRFM分析を行いたいので、値にマーケットを追加し、集計関数に「最頻値(mode)」を選択し、実行します。

このとき、集計関数に「最頻値(mode)」を利用することで、仮に複数の拠点での注文履歴があったとして、一番注文が多かったマーケットをその顧客が属するマーケットとして扱うことが可能になります。

これで、必要な情報を集計することができました。

続いて、列名を分かりやすい内容に変更します。

任意の列ヘッダーメニューから、列名を変更を選択します。

ダイアログが表示されたら、各々の列名を以下に変更し、実行します。

  • 注文日_unq -> 購買回数
  • 注文日_min -> 最初の購買日
  • 注文日_max -> 最後の購買日

これで1行を1顧客のデータに集計して、分かりやすい列名に変更することができました。

サマリビューに移動して顧客IDの一意な値の数を確認すると、行数と一致していることからも1行が1顧客のデータに集計することができていることが分かります。

3. 購買回数が1回の顧客を取り除き、北米マーケットの顧客のみを残す

RFM分析では継続して取引のある顧客に注目したいので、購買回数が1回の顧客は除きます。

購買回数の列ヘッダーメニューからフィルタ、より大きいを選択します。

値に1を選択し実行します。

購買回数が1回しかない顧客を取り除くことができました。

購買回数の最小値が「2」になっていることから、購買回数が1回の顧客を取り除くことができていることが確認できます。

また今回のRFM分析は、USCA(北米)の顧客を対象に行いたいので、マーケットの列ヘッダーメニューから、フィルタ、等しいを選択します。

値に「USCA」を選択し、実行します。

これで、北米のマーケットで2回以上購入している顧客のデータだけを残すことができました。

4. Recencyスコア(最後の購買日からデータ上の最後の日までの日数)を計算

続いて、Recencyスコアを計算します。

Recencyスコアは以下にて計算することができるので、「最後の日」の列ヘッダーメニューから、計算を作成(Mutate)を選択します。

データ上の最後の日 - 顧客ごとの最後の購買日

計算を作成(Mutate)ダイアログが表示されたら、計算エディタに以下の内容をタイプし、実行します。

このとき、「新しく列を作成」を選択して、列名をRecencyに設定します。

最後の日 - 最後の購買日

Recencyの計算結果がdifftimeと呼ばれるデータ型で返ってきますので、数値データとして扱えるように、数値型のデータに変換します。

「Recency」の列ヘッダーメニューからデータタイプを変換、Numeric(数値)タイプを変換、日を選択し、実行します。

「Recency」スコアを計算することができました。

5. 最初の購買日から最後の購買日までの日数を計算

購買回数や売上の集計結果をそのままFrequencyスコアやMonetaryスコアとして使えればいいのですが、数年に渡ってこのスーパーを利用している顧客もいれば、最近利用を始めた顧客もいるはずです。

長いことそのスーパーを利用していれば、購買回数や購買金額が大きくなるのは当たり前のことですので、一日あたりの購買回数や購買金額を計算して、顧客の継続期間に左右されない指標として、FrequencyスコアやRecencyスコアを求めていきたいとういことがあります。

そこで、顧客ごとの最後の購買日から最初の購買日を引いて、顧客の利用期間を計算していきます。

「最後の購買日」の列ヘッダーメニューから、計算を作成(Mutate)を選択します。

計算を作成(Mutate)ダイアログが表示されたら、計算エディタに以下の内容をタイプし、実行します。

このとき、「新しく列を作成」を選択して、任意の列名を設定します。(今回は「顧客期間」という列名を設定します)

最後の購買日 - 最初の購買日

続いて「顧客期間」の列ヘッダーメニューから、データタイプを変換、Numeric(数値)タイプを変換、日を選択し、実行します。

FrequencyスコアとMonetaryスコアを計算するために必要な顧客期間の準備ができました。

6. Frequencyスコア(1日あたりの購買回数)を計算

いよいよFrequencyのスコアの計算です。

購買回数の列ヘッダーメニューから、計算を作成(Mutate)を選択します。

Frequencyスコアは1日あたりの購買回数となるため、計算を作成(Mutate)ダイアログが表示されたら、計算エディタに以下の内容をタイプし、実行します。

このとき、「新しく列を作成」を選択して、Frequencyという列名を設定します。

購買回数 / 顧客期間

Frequencyスコアの計算ができました。

7. Monetaryスコア(1日あたりの購買総額)を計算

続いてMonetaryのスコアの計算です。

売上の列ヘッダーメニューから、計算を作成(Mutate)を選択します。

Monetaryスコアは1日あたりの購買金額(売上)となるため、計算を作成(Mutate)ダイアログが表示されたら、計算エディタに以下の内容をタイプし、実行します。

このとき、「新しく列を作成」を選択して、Monetaryという列名を設定します。

売上 / 顧客期間

Monetaryスコアの計算ができました。

ヒートマップで計算結果を可視化する

RFMの各スコアの計算ができたので、あとはチャートで可視化をしていきます。

チャートビューに移動して、チャートタイプにヒートマップを選択します。

X軸に「Recency」、Y軸に「Monetary」を選択します。

すると、上記のように数値型のデータは、数値の小さいものから順に「等幅」でグループに分けられ、カテゴリー化されます。(デフォルトでは5つのグループが作成されます)

なお、等幅とは、同じ幅で5つのグループに分けることを指しており、中のメンバー数はグループによって異なります。

等幅の場合、幅が均等に分かれるため、どのようなRecencyのグループに顧客が集中しているかを理解することには適していますが、一方で、極端にRecencyスコアが大きい顧客がいた場合、各グループの幅が影響を受けてしまい、ほとんどの顧客が値の小さいグループに分けられてしまうといったことが起こりえます。

そこで、そういったときには「等頻度」でグループに分けることが有効です。

等頻度の場合、グループの中のメンバーの数が同じになるように分けるため、幅はグループによって異なりますが、一部の顧客の大きなRecencyスコアの影響を受けることなく、顧客をグループに分けることが可能です。

そのため、今回はRecencyスコアとMonetaryスコアを等頻度でカテゴリーに分けていきます。

X軸のカテゴリーの設定をクリックします。

タイプに等頻度、カテゴリーの数は初期値、ラベルに「Very New, New, Neutral, Old, Very Old」とカンマ区切りでの5つのカテゴリのラベルを設定し、適用します。

なお、Recencyの値が小さいということは、最後に買った日からの日が浅いということなので、Very Newからラベルが始まっています。

Recencyスコアを等頻度で5つのグループに分け、各グループにラベルを付けることができました。

続いて、Y軸のMonetaryスコアも同様に等頻度で5つのグループに分けていきます。

Y軸のカテゴリーの設定をクリックします。

タイプに等頻度、カテゴリーの数は初期値、ラベルに「Very Low, Low, Neutral, High, Very High」とカンマ区切りでの5つのカテゴリのラベルを設定し、適用します。

Monetaryスコアを等頻度で5つのグループに分け、各グループにラベルを付けることができまし た。

更新されたヒートマップを確認すると、RecencyがVery OldでMonetaryがVery Highの顧客が最も多いことが分かります。

ただし、X軸のRecencyは時間の経過を含んだ情報のため、左が「古く」て右が「最近」となるように、並び順を変えた方が、どのセグメントに顧客が集中しているかを直感的に分かりやすいということがあります。

そこでRecencyのカテゴリの並び順を反転させていきます。

X軸メニューからX軸の並び順を選択します。

軸の並び順に右から左を選択し、適用します。

しばらく購買がない「古い」顧客を左に並べ、「新しい」顧客を右側に並べることができました。

購買額が多い顧客は最近注文していないことが直感的に分かります。

なお、このセグメントに属する顧客の詳細を確認したいときには、そのセグメント上にマウスカーソルを移動させて、ダブルクリックをします。

するとポップアップが表示されるので、「詳細」をクリックします。

「詳細」をクリックすると、そのセグメントに属する顧客の情報をテーブル形式で確認することができます。

このデータは様々な形式でエクスポートして、利用することが可能です。