廿TT

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

(R + Google アナリティクス)何ページ目でセッションから離脱するか。残存率の可視化。

生存曲線による残存率の可視化

ランディングページ(LP)を評価する際は、直帰率が低く抑えられているかをチェックすることがよく行われます。

Google アナリティクスの管理画面から LP ごとの直帰率を見てみます。

f:id:abrahamcow:20150223171727p:plain

です。

直帰率だけを見ると両ページの回遊傾向はほぼ同等、ほんの少しだけ前者が勝っています。

ここで直帰率という指標が、もともとのデータを「直帰」「直帰でない」という情報に要約したものであることに注意します。

実際には「直帰」、「1ページ進んだ先で離脱」、「2ページ進んだ先で離脱」、……と様々なセッションがあります。

その様子を図に示します。縦軸の残存率は離脱率の反対語です。

f:id:abrahamcow:20150223173710p:plain

この階段上のグラフは生存曲線と呼ばれます。これを見ると、
http://abrahamcow.hatenablog.com/entry/2015/02/10/201256
にランディングした場合のほうが右に裾が長く、ユーザーの回遊傾向が強いことが伺えます。

f:id:abrahamcow:20150223181038p:plain

これは直帰率だけに注目していると見逃してしまう傾向です。

以下にこの図の書き方を記載します。

R のコード

RGoogleAnalytics でデータ抽出

アカウントのオーサライ
library("RGoogleAnalytics")
query <- QueryBuilder()
access_token <- query$authorize()

ここでアクセストークンをコピペ。

詳しくは RGoogleAnalytics をいじっている - 廿TT を参照。

データ抽出時のクエリ
ga <- RGoogleAnalytics()
ga.profiles <- ga$GetProfileData(access_token)

query$Init(start.date = "2015-02-01",
           end.date = "2015-02-22",
           dimensions = "ga:landingPagePath,ga:pageDepth",
           metrics = "ga:sessions",
           sort = "-ga:sessions",
           #filters="",
           #segment=""
           #max.results =,
           table.id = paste("ga:",ga.profiles$id[1],sep="",collapse=","),
           access_token=access_token)

LPPD <- ga$GetReportData(query) #データ取得完了

データ抽出時のクエリについては必要に応じて
R から API で Google アナリティクスのデータを読むこめるパッケージ, RGoogleAnalytics のクエリ作成方法 - 廿TT
を参照してください。

データ下処理と集計とプロット

LPPD$pageDepth <- as.numeric(LPPD$pageDepth)

LPnames <- c("/entry/2015/02/10/201256", "/entry/2014/02/06/003147")
#注目したい LP のパスを入れる

len <- length(LPnames)

out <- numeric()
for(i in 1:len){
  tmp <-subset(LPPD, landingPagePath ==LPnames[i])
  t1 <- rep(tmp$pageDepth,tmp$sessions)
  out <- rbind(out,data.frame(LPnames[i],t1))
}

colnames(out) <- c("LP","time")

library(survival)
sf1 <- survfit(Surv(time)~LP,data=out)

#nihongo() mac ユーザーは日本語のフォントを指定
cols=c("tomato", "royalblue") #グラフの色
plot(sf1,col=cols, xaxt="n",yaxt="n",lwd=3,xlab="訪問時のページ数", ylab="残存率(%)")
axis(1, at=0:14, lab=0:14)
axis(2, at=pretty(c(0,1)), lab=pretty(c(0,1)) * 100, las=TRUE)
legend("topright",legend=LPnames, col=cols, lty=1,bty = "n", lwd=3)

LP のパスと、グラフの色のところだけ変えてやれば 3 つ以上の LP の比較も可能です。

おまけ:ログランク検定

ログランク検定は「両者の生存曲線に差がない」という帰無仮説を検定する手法です。

実務上は仮説検定とかやらなくても、目視で比べて問題ないと思いますが、R では以下のようにするとログランク検定ができます。

> survdiff(Surv(time)~LP,data=out)
Call:
survdiff(formula = Surv(time) ~ LP, data = out)

                              N Observed Expected (O-E)^2/E (O-E)^2/V
LP=/entry/2015/02/10/201256 528      528      536     0.108         2
LP=/entry/2014/02/06/003147 198      198      190     0.305         2

 Chisq= 2  on 1 degrees of freedom, p= 0.157 

p 値は 0.157 です。
(5%水準で有意になってくれたらおもしろかったんですが)

参考文献

Cox比例ハザードモデル (医学統計学シリーズ)

Cox比例ハザードモデル (医学統計学シリーズ)

エンジニアのための データ可視化[実践]入門 ~D3.jsによるWebの可視化 (Software Design plus)

エンジニアのための データ可視化[実践]入門 ~D3.jsによるWebの可視化 (Software Design plus)