1
3

More than 1 year has passed since last update.

GA4のサンプルデータを使ってRFM分析もどきをしてみる

Posted at

RFM分析とは?

RFM分析とは、「最新購入日(Recency)」「購入回数(Frequency)」「購入金額合計(Monetary)」を元にしてユーザーを3次元でグループ化してランク付けを行う分析手法です。ユーザーグループに応じて、マーケティング施策を打っていこうというやつです。

指標名 指標説明
最新購入日(Recency) 最近購入に至ったユーザーほど優良顧客として扱う
購入回数(Frequency) 購入した回数が多いユーザーほど優良顧客として扱う
購入金額合計(Monetary) 購入金額の多いユーザーほど優良顧客として扱う

今回やること

BigQueryのサンプルデータでGA4のEコマースのアクセスログデータセット「ga4_obfuscated_sample_ecommerce」を用いて、各ユーザーランクにどれくらいのユーザーがいるのかを集計する。なお、あまり込み入った分析には踏み込まず、クエリ紹介を目的とする。

注意点

  1. サンプルデータのテーブルは2020-11-01 〜 2021-01-31の3ヶ月分のデータであるため、2021-02-01からみた最新購入日との日数を評価する。

  2. サンプルデータのevent_nameに「purchase」という購入を示すイベントがあるが、このレコードに購入金額を示す「ecommerce.purchase_revenue」が必ずしも入ってるわけではなかった。今回はそれが入っているもののみを購入とみなした。

  3. RFM各指標は5グループに分割し、点数を振る必要があるが、今回は意図的にランク付けするのはやや面倒なので、NTILE関数を用いて各指標点数を分割し点数を付けた。
    ※ランクを定義する場合、例えば最新購入日からの経過日数であれば、14日以内:5点、28日以内:4点、60日以内:3点のように振り分ける。
    ※NTILE関数は例えば最新購入日からの経過日数を昇順で並び替えて、同じユーザー数になるように5等分し、ユーザーを振り分ける関数である。一般にデシル分析でよく用いられる。

クエリ

WITH mst_purchase_log AS (
    SELECT
        PARSE_DATE('%Y%m%d', event_date) AS purchase_date
        , user_pseudo_id AS user_id
        , ecommerce.purchase_revenue AS purchase_revenue
    FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`
    WHERE ecommerce.purchase_revenue IS NOT NULL
)
, mst_user_rfm AS (
    SELECT
        user_id
        , MAX(purchase_date) AS recent_date
        , DATE_DIFF('2021-02-01', MAX(purchase_date), DAY) AS recency
        , COUNT(*) AS frequency
        , SUM(purchase_revenue) AS monetary
    FROM mst_purchase_log
    GROUP BY 1
)
, mst_user_point AS (
    SELECT
        *
        , 6 - NTILE(5) OVER (
            ORDER BY recency
        ) AS recency_point
        , 6 - NTILE(5) OVER (
            ORDER BY frequency DESC
        ) AS frequency_point
        , 6 - NTILE(5) OVER (
            ORDER BY monetary DESC
        ) AS monetary_point
    FROM mst_user_rfm
)
SELECT
    recency_point + frequency_point + monetary_point AS total_point
    , recency_point
    , frequency_point
    , monetary_point
    , COUNT(DISTINCT user_id) AS uu
    , COUNT(DISTINCT user_id) / (SELECT COUNT(DISTINCT user_id) FROM mst_user_point) AS ratio
FROM mst_user_point
GROUP BY 1, 2, 3, 4
ORDER BY 1 DESC, 2 DESC, 3 DESC, 4 DESC

アウトプット

スクリーンショット 2022-09-25 16.35.12.png

結果

ここからの分析は三次元のバブルチャートでマッピング、もしくは適当な2つの指標を組み合わせて2次元で表現して、ユーザーを「優良顧客」「安定顧客」「離反離脱」「非優良顧客」等に分類していきます。
そこで

  • 安定顧客を常連にするには?
  • 常連離脱予兆のあるユーザーを常連に戻すには?
  • 新規離脱予兆のあるユーザーを安定ユーザーにするには?

等々考えて施策を打ってきます。
ですが、今回はサンプルデータですし、そこまで踏み込みません。
分析についての詳細は NECさんのブログ記事に詳しく書かれておりましたので、ぜひご覧ください。

一応、合計ポイントごとのユーザー数の表を乗っけておきます。
スクリーンショット 2022-09-25 16.59.20.png

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3