クイックノート

ちょっとした発見・アイデアから知識の発掘を

【R】RFM分析でブログの読者層を分析

ブログを書くからには、
読んだ人の役に立ちたいと思うのは、
当然だと思います。

とは言え、読み物は読む相手の顔が見えないので、
どんな人が読んでくれているか分からず、
どう工夫すれば良いのかを考える取っ掛かりに欠けがちです。

マーケティングの分野では、
顧客を行動別に層分けするRFM分析と呼ばれる手法があります。
主に、ターゲットを絞る際に、
どの顧客に絞るべきかの判断に使われる手法ですが、
ブログの読者ターゲットを想定するためにも使えそうな気がします。

そこで、マーケティングのRFM分析を、
ブログの読者分析に活用してみたいと思います。

RFM分析とは

RFM分析は、

  • Recency(最新購入日)
  • Frequency(購入頻度)
  • Monetary(購入金額)

の頭文字をとったもので、
この三つの軸で顧客グループをランク付けする分析手法です。

簡単に言えば、お得意様を見つけて、
優待などのアクションに繋げるための手法です。

お店の利益を上げるためには、
より多く買い物してくれる顧客を如何に維持できるかが重要になります。

あくまでデータから分かるのは過去のデータなので、
将来も多く買い物してくれそうな顧客を見つける必要があります。

例えば、単純に過去の購入金額が大きかったとしても、
たまたま、大きな買い物をしただけかもしれません。
一回だけの大きな買い物では、
将来もよく買い物してくれるかはわかりませんね。

購入頻度を見れば、頻繁に買い物してくれていて、
一回きりの利用ではないことが分かります。
それでも、過去には頻繁に利用していても、
すでに転居してしまったという場合があるかもしれません。

このように、一つの軸で見るだけではなく、
RFMの三つの軸で見ることで、
将来的にも有望な顧客を見つけ出すのが、
RFM分析です。

ブログ分析への応用

上で説明したように、
RFM分析はマーケティングの手法で、
お店での買い物客を想定した分析手法です。

ブログの読者をお店の来客と考えて、
RFM分析を利用できないでしょうか。

RFM分析に重要なのは、
Recency, Frequency, Monetaryの3つの軸でした。
ブログの場合にこれらの軸が何に該当するかを考えてみましょう。

直感的には下の三つになるでしょうか。

  • Recency : 最後にブログに訪問した日
  • Frequency : ブログの訪問頻度
  • Monetary: 広告収益

Rを使った分析と可視化

それでは、実際にデータを取得して、
分析・可視化を行なっていきます。

必要なライブラリ

以下のRのライブラリを利用します。

library(RGA)
library(stringr)
library(dplyr)

Google Analytics からデータを取得

分析に必要なデータの軸が決まったので、
Google Analayticsからデータを取得しましょう。

APIを利用するため、利用するための準備は、
過去のAPIを使う入門記事参照してください。

API認証

まずは認証を行います。
それぞれAPIを利用する準備を行う際に取得した
認証情報を入力して下さい。

USERNAME = "ユーザー名"
CLIENT_ID = "クライアントID"
CLIENT_SECRET = "クライアントシークレット"

authorize(username = USERNAME,
          client.id = CLIENT_ID,
          client.secret = CLIENT_SECRET)

データの取得

RFMの三つのデータに加えて、
いくつかのユーザーの属性を取得します。

BLOG_URLは分析の対象となるブログのURLを入力します。

BLOG_URL = "ブログのURL"
INTEREST_LEVEL = "interestInMarketCategory"

lp = list_profiles() %>% dplyr::filter(websiteUrl==BLOG_URL)
ga_res = get_ga(profileId = lp$id,
                start.date = Sys.Date()-90,
                end.date = Sys.Date()-3,
                metrics = "ga:sessionsPerUser,ga:adsenseRevenue,ga:users",
                dimensions = paste("ga:",INTEREST_LEVEL,",",
                                   "ga:userAgeBracket,ga:userGender,ga:daysSinceLastSession,ga:userType",
                                   sep=""))

取得するデータを次の表にまとめておきます。

名称 意味
daysSinceLastSession 最後のセッションからの経過日数(Recency)
sessionsPerUser ユーザー一人当たりのセッション数(Frequency)
adsenseRevenue Google Adsenseでの収益(Monetary)
users ユーザー数
userAgeBracket ユーザーの年齢層
userGender ユーザーの性別
userType 新規訪問かリピーターか
interestInMarketCategory ユーザーの購買における興味

ユーザーの興味については、
別の分類interestAffinityCategory,interestOtherCategoryもあるので、 目的に応じてINTEREST_LEVELを設定します。

取得データの可視化

取得したデータを可視化しましょう。
RFMの3つの変数について、
3次元プロットするのが良さそうです。

利便性を考えて、
マウスオーバーした時に詳細なユーザーの属性を表示したり、
色で大まかな興味を表せるようにしておくことにします。

詳細データを作る

RFM分析で3次元にプロットした後、
ランクの大きいユーザーにフォーカスを当てて、
どのようなアクションを取るべきかを考えます。

そのためには、ユーザーがどのようなユーザーであるかを
知る必要があります。

そこで、取得してきたユーザーの属性情報を、
後でグラフ上に表示できるようにテキスト化しておきます。

make_details = function(ga_res){
  apply(ga_res,1,function(x){
    paste(mapply(function(a,b){paste(a,b,sep=" = ")},names(x),x),collapse = "\n")
  })
}

上の関数は、取得したデータから、
それぞれの詳細データをテキストに変換する関数です。

大きなカテゴリーを抽出する

取得したデータには、
ユーザーの興味が細かくカテゴリー分けされています。

f:id:u874072e:20190827165317p:plain
興味のカテゴリー分けの一部

このカテゴリーをもとにグラフを色分けすると、
ユーザーの興味が視覚的に捉えられそうですが、
あまり細かいカテゴリーだと、
グラフが煩雑になりそうです。

そこで、最も大きなカテゴリーで大別して、
大まかに色分けするのが良さそうです。

tier1_cat = function(str_cats){
  tmp = str_cats %>% stringr::str_match(pattern="^(.+?)(/|$)")
  return(tmp[,2])
}

上の関数は、カテゴリーを表現する文字列から、
一番大きいカテゴリーを抽出する関数です。

3次元にプロットする

いよいよ3次元にプロットして可視化します。

下の関数では、x,y,z軸にRFMのそれぞれを指定して、
バブルの大きさでその点のユーザー数、
バブルの色でカテゴリーを表現するグラフを描画します。

RFM分析では主にリピーターに焦点を当てたいので、
include_newで新規客を含めるかどうかを設定できるようにしています。

plotly_3Dbubble = function(ga_res,include_new = F){
  if(!include_new){
    ga_res = ga_res %>% dplyr::filter(userType == "Returning Visitor")
  }

  details = make_details(ga_res)
  max_users = max(ga_res$users)
  cats = tier1_cat(ga_res[[INTEREST_LEVEL]])
  
  p = plot_ly(ga_res,x=~-as.numeric(daysSinceLastSession),
              y=~sessionsPerUser,
              z=~adsenseRevenue, mode="markers",
              color=~cats,
              colors=c("red","green","blue"),
              marker = list(size=~users/max_users*50),
              text=details,hoverinfo=text) %>% 
    layout(scene=list(
            xaxis=list(title="recency"),
            yaxis=list(title="frequency"),
             zaxis=list(title="monetory")))
  p
}

plotly_3Dbubble(ga_res,include_new = F)

実際に描画されるグラフは下のようになります。

f:id:u874072e:20190828101625p:plain
RFMの三次元プロット

plotlyはグラフをインタラクティブに拡大縮小できるので、
見たいところを中心にズームすると良いでしょう。

また、バブルにマウスカーソルを合わせると、
ユーザーグループの詳細が表示されます。

f:id:u874072e:20190828085724p:plain
マウスカーソルを合わせて詳細表示

グラフの読み方

RFM分析では三つの軸でユーザーをランク分けします。
recencyもfrequencyもmonetaryもどれも高いのは、
最良のユーザーということになります。

上のグラフでは、手前の右上の領域が最良ユーザーの集まりになりますが、
グラフをみて分かるように手前右上はほぼ空洞です。

frequencyが他に比べて高いユーザーもいるにはいますが、
その数は少なくmonetaryも低い傾向にあります。
広告ではなくブログを読みに来てくれているユーザーという感じがしますね。

monetaryの大きいユーザーの集まりは、
ITに興味のあるユーザーが多そうです。
また、年齢は20代や30代であるなどが、
詳細に見ていくことでわかります。

まとめ

マーケティング分野の分析手法RFM分析で、
ブログの読者層の分析・可視化を行いました。

ブログのテーマ分析の結果と、
読者の興味がマッチしているか、
どんな記事が足りてないかを考えるきっかけとして利用できそうです。

プライバシーポリシー