廿TT

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

Google アナリティクス:マルチチャネルレポートの図示(アトリビューション分析)

googleAnalyticsR を使ってコンバージョン経路レポートを集計する関数を書いた。

pathanal.R · GitHub

内部で dplyr を使っています。

アトリビューション分析というのは明確な定義のある用語ではないと思うけど、直接コンバージョンのあったセッションだけでなく、コンバージョンに至るまでに経てきた流入経路や接触した広告も評価してやろう、というようなニュアンスで使われる。

Google アナリティクスではチャネルの間接的な効果を評価するモデルがいろいろ提供されているアトリビューション モデルの概要 - アナリティクス ヘルプ

ただ、個人的には各チャネルの貢献度を完全に定量的に評価するのはあまり好みでない。

その理由の一つは、Google アナリティクスではコンバージョンに至ったユーザーの通ってきたチャネルはわかっても、コンバージョンしなかったユーザーの通ってきたチャネルはわからないという点。

ある媒体に接触することとコンバージョンとの連関は、コンバージョンしたユーザーとコンバージョンしなかったユーザーをくらべてみないとわからないはずだと思う。

また、あるチャネルの貢献度が高く見積もられたとして、そのチャネルを遮断したらその分コンバージョンが減る、とは必ずしも言えない。各チャネルにはある程度冗長性があるはずなので、そのチャネルを遮断したらその分、他のチャネルからのコンバージョンが増えるだけかもしれない。

だから今回は、定性的な解釈を重視したいと思う。

ケーススタディ

実際のデータを用いて集計してみる。

library(dplyr)
library(tidyr)
library(ggplot2)
library(googleAnalyticsR)
library(igraph)
ga_auth()
account_list <- ga_account_list()
ga_id <- account_list$viewId[3]
mcf_gadata <- google_analytics(id = ga_id,
                               start="2017-01-01", end="2017-05-31",
                               metrics = c("totalConversions"),
                               filters = c("mcf:conversionGoalNumber==003"),
                               dimensions = c("basicChannelGroupingPath","conversionGoalNumber","timeLagInDaysHistogram"),
                               type="mcf")

source("https://gist.githubusercontent.com/abikoushi/e3b1a1bd47395405ea46db31afae55ba/raw/9cae73995ab4de1b39565184dbee4d19b73ef409/pathanal.R")

out <-pathanal(mcf_gadata, dimension = "basicChannelGroupingPath")

ggplot(out$trans_mat,aes(x=to,y=from,fill=trans_prob))+
  geom_tile()+
  geom_text(aes(label=paste(round(trans_prob*100),"%")))+
  scale_fill_continuous(low="white",high="cornflowerblue")

こんなふうにやると、out には次のようなテーブルが入る。

f:id:abrahamcow:20170614221641p:plain

この表(trans_mat)は各経路から次に経路が続く場合に、どれに遷移するかの割合を示していて、行方向に合計してやると100%になる。

例えば、「オーガニック検索 > ダイレクト」というのは、検索経由で来たユーザーが次のセッションでは直接訪問していると解釈できるので、ある種の勝ちパターンと推測できます。

out の中身を詳しくみてみる。

> out
$unique_node
[1] "Direct"         "Referral"       "Organic Search" "Social Network"

$trans_mat
# A tibble: 13 × 3
             from             to trans_prob
            <chr>          <chr>      <dbl>
1          Direct         Direct 0.91803279
2          Direct Organic Search 0.01639344
3          Direct       Referral 0.03278689
4          Direct Social Network 0.03278689
5  Organic Search         Direct 0.91666667
6  Organic Search       Referral 0.04166667
7  Organic Search Social Network 0.04166667
8        Referral         Direct 0.66666667
9        Referral Organic Search 0.16666667
10       Referral       Referral 0.16666667
11 Social Network         Direct 0.30769231
12 Social Network       Referral 0.07692308
13 Social Network Social Network 0.61538462

$null_node
# A tibble: 0 × 2
# ... with 2 variables: node <chr>, freq <dbl>

$harvest
# A tibble: 4 × 2
            node harv_prob
           <chr>     <dbl>
1         Direct 0.5040650
2 Organic Search 0.8834951
3       Referral 0.3333333
4 Social Network 0.5357143

$firsttouch
# A tibble: 4 × 2
            node first_prob
           <chr>      <dbl>
1         Direct 0.14122137
2 Organic Search 0.77862595
3       Referral 0.01526718
4 Social Network 0.06488550

unique_node はユニークな経路の名前、null_node は他の経路とつながりを持たない、自分だけ単独で存在している経路(今回はなし)、harvest はその経路からコンバージョンに直接至る割合で大きいほど効率がよいと解釈できる。firsttouch はその経路が経路の起点となった割合で、合計すると1になる。そのサイトがどのチャネルに大きく依存しているかを相対的に知ることができる指標です。

これらを組み合わせるとたとえば次のような図も書ける。

g <-graph(rbind(out$trans_mat$from,out$trans_mat$to))
g <- g + vertex(out$null_node$node)
E(g)$color <- "grey50"
E(g)$width <- out$trans_mat$trans_prob*6
V(g)$size <- out$harvest$harv_prob*100
V(g)$label.cex <- 1.5
cols_p = colorRampPalette(c("white","lightpink"))
V(g)$color <- cols_p(nrow(out$firsttouch))[order(out$firsttouch$first_prob)]
plot(g,edge.curved=TRUE,vertex.label.color = "black",
     vertex.label.font=2)

丸の大きさが harvest に、色の濃さが firsttouch に対応している。

f:id:abrahamcow:20170614223713p:plain

見るべきポイントはさっき述べたようなダイレクトへの遷移があるかどうかと、自分自身へのびるパスががあるかだと思う。

この場合、オーガニックからオーガニックへのパスがないのが気になる。

サイトを認知しての同じ経路からの再訪問というのがブランド認知の一つの指標になると思う。

そこを行くとソーシャルネットワークは同じソーシャルネットからの再訪でコンバージョンを獲得していて、これはほぼ全面的にデータ解析・統計・機械学習のRSS (@datasci_blogs) | Twitter のおかげですね。

シミュレーション

一応、コンバージョン経路のレポートをシミュレートする関数も書いた。

trans_prob <-rdirichlet(4,rep(0.5,4))
harv_prob <-c(0.7,0.6,0.4,0.2)
first_prob <-as.numeric(rdirichlet(1,rep(1,4)))
n=1000
K=4
res <-simpath(100,4,trans_prob,harv_prob,first_prob)
> head(res)
# A tibble: 6 × 2
               path totalConversions
              <chr>            <int>
1                 1                8
2     1 > 3 > 4 > 4                1
3                 2               23
4             2 > 1                8
5         2 > 1 > 3                1
6 2 > 1 > 4 > 1 > 2                1

経路やセグメントを詳細化していくと有効なデータは少なくなっていくので、シミュレーションしてみて、計算した割合と設定したした確率が安定して同じくらいの数字になるか確かめるのもいいと思う。

アマゾンアフィリエイトのコーナー

Rグラフィックスクックブック ―ggplot2によるグラフ作成のレシピ集

Rグラフィックスクックブック ―ggplot2によるグラフ作成のレシピ集