廿TT

譬如水怙牛過窓櫺 頭角四蹄都過了 因甚麼尾巴過不得

R でアトリビューション分析。Google アナリティクスの「コンバージョン経路」レポートを視覚化。

アトリビューション分析とは

バズワードです。明確な定義はありません。

広告の直接効果だけでなく、間接的な効果も含めて分析しようみたいな意味です。

コンバージョン経路

Google アナリティクスの管理画面を開いて「コンバージョン」→「マルチチャネル」→「コンバージョン経路」を選ぶと、こんなレポートが表示されます。

f:id:abrahamcow:20150210133522p:plain

例えば、「オーガニック検索 > ノーリファラー」は、最終的にコンバージョン(成果)に至ったセッションはノーリファラーだったけれども、その直前のセッションはオーガニック検索だった、という意味です。

こういうのを見るのが最近はやってます。ユーザーのセッション遍歴は「カスタマージャーニー」とか呼ばれます。

R で集計

どのチャネル(訪問経路)がコンバージョンにどの程度寄与しているのか、「コンバージョン経路」のレポートから集計してみます。

データは Analytics すべてのウェブサイトのデータ コンバージョン経路 20141101-20150131.csv · GitHub に置いておきます。

考えうる一番単純な方法は、「オーガニック検索 > ノーリファラー」でコンバージョンが 1 件あったら、その経路にコンバージョンを 1 割り振る、「オーガニック検索 > ノーリファラー > ノーリファラー」でコンバージョンが 1 件あったら「オーガニック検索 > ノーリファラー」と「ノーリファラー > ノーリファラー」にコンバージョンを 0.5 件ずつ割り振る……以下同様というやり方です。

長い経路を分解するようにして、あるセッションとその直前のセッションだけを見ていきます。
(つまり単純マルコフ過程を仮定しています。)

R で集計すると以下のようになります。

dat1 <- read.csv("~/Downloads/Analytics\ すべてのウェブサイトのデータ\ コンバージョン経路\ 20141101-20150131.csv",
                 skip=6,stringsAsFactors =FALSE)
tmp <-strsplit(dat1[,1]," > ")
unq <-unique(unlist(tmp))
len <-length(unq)
mat<- matrix(0,nrow=len,ncol=len)
dim1 <- dim(dat1)[1]
lenv <- sapply(tmp,length)
for(j in 1:dim1){
  i=2
  while(i <= lenv[j]){
    mat[tmp[[j]][i-1] == unq,tmp[[j]][i] == unq] <- 
      mat[tmp[[j]][i-1] == unq,tmp[[j]][i] == unq] + dat1[j,2]/(lenv[j]-1)
    i=i+1
  }
}

あまりきれいなコードとはいえませんが、これでコンバージョン経路の遷移行列が集計されました。

> mat
          [,1]      [,2]      [,3]      [,4]     [,5]
[1,] 19.381818 34.914273  7.674675  1.616667 1.328623
[2,]  4.857455 56.328912  9.290152  2.541667 1.101477
[3,]  4.115152 21.365152 26.473485  6.033333 4.408359
[4,]  2.116667 11.235256  9.041667 10.208333 0.000000
[5,]  3.221480  5.004056  1.965909  1.000000 4.775433
> sum(mat)
[1] 250

計 250 件のコンバージョンが経路ごとに集計されています。

色付きテーブル(ヒートマップ)

この行列に色をつけて視覚化してみます。

df1 <- cbind(paste(1:len,unq),as.data.frame((mat/sum(mat))*100))
colnames(df1) <- c("channel",paste(1:len,unq))
df1
library(tidyr)
library(dplyr)

df2 <- df1 %>% gather(variable, value, -channel)

theme_set(theme_bw(15,"HiraKakuPro-W3"))

library(ggplot2)
ggplot(df2, aes(y = variable,x= channel)) +
  geom_tile(aes(fill = value))+
  geom_text(aes(label = paste(round(value,2),"%",sep=""))) +
  scale_fill_gradient(low = "white", high = "cornflowerblue") +
  labs(x="",y="",fill="遷移率(%)")

f:id:abrahamcow:20150210135635p:plain

見方はこんな感じ。左から右に見ていきます。

f:id:abrahamcow:20150210201536p:plain

縦軸は直前のチャネル、横軸がコンバージョンに寄与したセッションのチャネルです。

これはなんの役にたつか

どの施策にどの程度のリソースを配分するかの目安に使えます。

もっと言うと、自分のやったことの正当化に使えます。

例えば、「オーガニック検索 > ノーリファラー」というのは、検索経由で来たユーザーが次のセッションでは直接訪問してコンバージョンに至ったと解釈できますから、検索を通じてサイトを認知させた、一種の勝ちパターンと推測できます。

「ほら、弊社のSEO対策がなかったら御社のこのコンバージョンはなかったんですよ」という具合です。

さらなる視覚化

有向グラフ

library(igraph)
g <- graph.adjacency(mat)
#nihongo() mac ユーザーは日本語のフォントを指定
old = par(mar = c(0, 0, 0, 0)) #余白を消してる
plot(g)
par(old) #余白を元に戻す

f:id:abrahamcow:20150210135619p:plain

ここで、"1 オーガニック検索"、"2 ノーリファラー"、"3 ソーシャル ネットワーク"、"4 参照元サイト"、"5 (使用できません)" です。

アーチダイアグラム

library(devtools)
# install arcdiagram
install_github('arcdiagram', username='gastonstat')
# load arcdiagram
library(arcdiagram)
old = par(mar = c(10, 4, 0.5, 2)) #図の余白を調整
#arcplot(as.matrix(df2[,1:2]))
g = graph.edgelist(as.matrix(df2[,1:2]), directed = TRUE)
#plot(g)
E(g)$weight = df2[,3]
arcplot(as.matrix(df2[,1:2]), lwd.arcs = 2 * E(g)$weight)
par(old) #余白を元に戻す

f:id:abrahamcow:20150210135608p:plain

線の太さがコンバージョン数に対応します。

共起関係のある経路どうしを比較するにはアーチダイアグラムが良さそうですね。

参考:http://gastonsanchez.com/software/arcdiagram_introduction.pdf

RGA パッケージについて

RGA パッケージを使うと API でマルチチャネルレポートのデータを引っ張ってこれます。

library(RGA)

authorize(client.id = "***", 
          client.secret = "***")

ga_data <- get_mcf(list_profiles()$id[1],
                   start.date = "2014-11-01",
                   end.date = "2015-01-31",
                   metrics = "mcf:totalConversions",
                   dimensions ="mcf:sourcePath")

でもまだ慣れてなくて使いづらい。今回は管理画面からダウンロードしました。

参考:http://cran.r-project.org/web/packages/RGA/RGA.pdf