読者です 読者をやめる 読者になる 読者になる

廿TT

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

(R + Google アナリティクス)期間比較して特に増減の大きいトラフィックソースを図示する

状況設定

f:id:abrahamcow:20150127181413p:plain

  • 2015年1月に前月比でセッション(訪問数)が増加した。
  • そして「なんで増加したのか簡単に報告して」と依頼された。

こういうときに役立ちそうな可視化を紹介します。

RGoogleAnalytics でデータ取得

詳しくは、

を参照。

まずはオーサライズ。

library("RGoogleAnalytics")
query <- QueryBuilder()
access_token <- query$authorize()

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

クエリはこんな感じ。

ga <- RGoogleAnalytics()
ga.profiles <- ga$GetProfileData(access_token)

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

datfol <- ga$GetReportData(query)

query$Init(start.date = "2014-12-01",
           end.date = "2014-12-31",
           dimensions = "ga:sourceMedium",
           metrics = "ga:sessions",
           sort = "-ga:sessions", #降順
           #filters="",
           #segment=""
           #max.results = ,
           table.id = paste("ga:",ga.profiles$id[1],sep="",collapse=","),
           access_token=access_token)

datpre <- ga$GetReportData(query)

以上でデータがとれました。
こんな感じ。

> head(datfol)
               sourceMedium sessions
1          google / organic     3498
2 b.hatena.ne.jp / referral     2121
3           t.co / referral     2008
4         (direct) / (none)     1674
5           yahoo / organic     1049
6     gunosy.com / referral      877

集計

次に、注目している期間と比較対象期間の差分を集計しましょう。
関数化しておきました。

compareTable <- function(datpre,datfol){
key <- unique(c(datpre[,1],datfol[,1]))
len <- length(key)
preSS <- numeric(len)
folSS <- preSS

for(i in 1:len){
  flags <- key[i] == datpre[,1]
  if(any(flags)){
    preSS[i] <- datpre[flags,2]
  }else{
    preSS[i] <- 0
  }
}

#preSS

for(i in 1:len){
  flags <- key[i] == datfol[,1]
  if(any(flags)){
    folSS[i] <- datfol[flags,2]
  }else{
    folSS[i] <- 0
  }
}

#length(folSS[folSS!=0])

datMerged <- data.frame(key=as.character(key),previous=preSS,following=folSS)

datMerged$difference <- datMerged[,3] - datMerged[,2]
change <- sum(datMerged$difference)
datMerged$contribution <- datMerged$difference/change

datMerged <- datMerged[order(abs(datMerged$contribution),decreasing=TRUE),]

return(datMerged)
}

これで

datMerged <- compareTable(datpre,datfol)

とやると、期間比較表が作成されます。

> head(datMerged)
                         key previous following difference contribution
8  b.hatena.ne.jp / referral       38      2121       2083   0.22221037
4            t.co / referral      149      2008       1859   0.19831449
3          (direct) / (none)      221      1674       1453   0.15500320
69     gunosy.com / referral        0       877        877   0.09355665
1           google / organic     3069      3498        429   0.04576488
41   hatena.ne.jp / referral        2       424        422   0.04501814

"following" が注目している期間、"previous" が比較対象期間、"difference" が差分、"contribution" が寄与率(増加に締める割合)です。

絶対値で見て変化の大きい順にソートされています。

図示(ドットチャート)

絶対値で見て変化の大きい順にソートされているので、この表の上位30件を図示することにします。

library(ggplot2)
library(scales)

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

p <-ggplot(datMerged[1:30,],aes(y=reorder(key,contribution), x=contribution))+
  geom_point(aes(colour=medium), size=3)+
  scale_x_continuous(labels = percent)+
  labs(x="寄与率",y="", title="参照元/メデイア(2015年1月度前月比較)")
sum(datMerged[1:30,5])
p + geom_vline(xintercept=0, linetype="dotted")

f:id:abrahamcow:20150127011642p:plain

前月比較で特に変動の大きい「参照元/メデイア」がわかるでしょう。

前月比での増加には水色の点、referral(参照)の寄与が大きく、特にはてなブックマークツイッター( t.co はツイッター短縮URLです)で拡散されたようです。

> sum(datMerged[1:30,5])
[1] 0.9642629

上位30件の寄与率の和は96.4%くらいですから、これだけで変動の95%以上が説明できます。

さらに深堀

referral(参照)の影響が大きいことがわかって、その上でさらに細かく参照元のURLまで知りたい場合はこうやります。

query$Init(start.date = "2015-01-01",
           end.date = "2015-01-31",
           dimensions = "ga:fullReferrer",
           metrics = "ga:sessions",
           sort = "-ga:sessions", #降順
           #filters="",
           segment="gaid::-8",
           #max.results = ,
           table.id = paste("ga:",ga.profiles$id[1],sep="",collapse=","),
           access_token=access_token)

datfol2 <- ga$GetReportData(query)

query$Init(start.date = "2014-12-01",
           end.date = "2014-12-31",
           dimensions = "ga:fullReferrer",
           metrics = "ga:sessions",
           sort = "-ga:sessions", #降順
           #filters="",
           segment="gaid::-8", #参照サイト経由のトラフィックに絞る
           #max.results = ,
           table.id = paste("ga:",ga.profiles$id[1],sep="",collapse=","),
           access_token=access_token)

datpre2 <- ga$GetReportData(query)

datMerged2 <- compareTable(datpre2,datfol2)
head(datMerged2)

ggplot(datMerged2[1:30,],aes(y=reorder(key,contribution), x=contribution))+
  geom_point(size=3)+
  scale_x_continuous(labels = percent)+
  labs(x="寄与率",y="",title="参照元URL(2015年1月度前月比較)") +
  geom_vline(xintercept=0, linetype="dotted")

f:id:abrahamcow:20150127012603p:plain

また、Organic (自然検索)の増加が気になる場合は、自然検索経由のキーワードやランディングページを出してやればいいでしょう。

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

datfol3<- ga$GetReportData(query)

query$Init(start.date = "2014-12-01",
           end.date = "2014-12-31",
           dimensions = "ga:landingPagePath",
           metrics = "ga:sessions",
           sort = "-ga:sessions", #降順
           #filters="",
           segment="gaid::-5", #自然検索経由のトラフィックに絞る
           #max.results = ,
           table.id = paste("ga:",ga.profiles$id[1],sep="",collapse=","),
           access_token=access_token)

datpre3 <- ga$GetReportData(query)

datMerged3 <- compareTable(datpre3,datfol3)


ggplot(datMerged3[1:30,],aes(y=reorder(key,contribution), x=contribution))+
  geom_point(size=3)+
  scale_x_continuous(labels = percent)+
  labs(x="寄与率",y="",title="自然検索経由LP(2015年1月度前月比較)") +
  geom_vline(xintercept=0, linetype="dotted")

f:id:abrahamcow:20150127015845p:plain

特に増加が顕著だったLP(ランディングページ)は、
http://abrahamcow.hatenablog.com/entry/2013/03/21/223717
です。

修論シーズンでニーズが高まったものと思われます。

エクセルに書き出す

このような表をエクセルに書き出す場合はこうやります。

library(xlsx)
#setwd("~/Desktop")
write.xlsx(datMerged, file="GAトラフィックソース(2015年1月度前月比較).xlsx",
           sheetName="参照元メデイア", row.names=FALSE)

条件付き書式設定で色を付けてやると見やすくなるでしょう。

f:id:abrahamcow:20150127020507p:plain

f:id:abrahamcow:20150127020534p:plain

基本的には赤や青のカラースケールをおすすすめします。

緑と赤のカラースケールはおすすすめしません。赤緑色弱の方は人口の中に無視できない割合で存在しますので、せっかく作った表が伝わりにくくなるリスクが増します。

関連エントリ


(R + Google アナリティクス)ウォーターフォールチャート - 廿TT

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

本記事の趣旨とはぜんぜん関係ないけど、いま大島弓子の『ダリアの帯』という漫画をちょっとずつ読んでいます。

ダリアの帯 (白泉社文庫)

ダリアの帯 (白泉社文庫)

おもしろいので買ってください。