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

廿TT

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

(R + Google アナリティクス)ピボットテーブル感覚で探索的アクセス解析

R Google アナリティクス グラフ

課題設定

f:id:abrahamcow:20150807024106p:plain

「当サイトでは、セッションは増加傾向にあるものの、リピーターが若干伸び悩み、ユーザーの定着に課題を感じている」ということにします。

この課題をより具体的に把握するために、品質管理の七つ道具の一つ、層別を使います。

層別(スライシング)

層別のためのツールとして、あんちべ『データ解析の実務プロセス入門』ではエクセルのピボットテーブル機能が紹介されています。

R では plyr、dplyr、ggplot2 などのパッケージ群がこれに相当します。

これらのパッケージは Web 上にいろいろ情報がありますが、ぼくは下記のページを参考にしました。

まずはデータ抽出。

RGoogleAnalytics では 7 つまでセグメントを切れるので、多めにデータを出しておきます。

データ抽出時のクエリはこんな感じです。

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

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

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

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

query$Init(start.date = "2015-07-01",
           end.date = "2015-07-31",
           dimensions = "ga:sessionCount,ga:channelGrouping,ga:source,ga:referralPath", 
           metrics = "ga:sessions",
           sort = "-ga:sessions",
           table.id = paste("ga:",ga.profiles$id[1],sep="",collapse=","),
           max.result=10000,
           #segment = "", 
           access_token=access_token)

datChannel <- ga$GetReportData(query)

ディメンションとして取得した数字は文字列型で入ってるので、数値型に直しておきます。

datChannel$sessionCount <- as.numeric(datChannel$sessionCount)

パッケージをまとめてロード。

library(plyr)
library(dplyr)
library(pipeR)
library(ggplot2)
library(scales)

グラフの背景を白にセット。文字は大きめにしておきます。

theme_set(theme_bw(15))

リピートの回数(sessionCount)を軸に切り分けて、流入経路(channelGrouping)別セッション数の積み上げ棒グラフを書いてみます。

大体の場合、異なるユーザー層ですべての経路(チャネル)からの訪問が均等ということはありません

datChannel %>>% #データを左から右にわたす
  mutate(userType=ifelse(sessionCount >= 2,"2+",sessionCount)) %>% 
  #sessionCount 2 以上を切り分け
  ddply(.(channelGrouping,userType),summarize,sessions=sum(sessions)) %>>%
  #channelGrouping, userType という複数の因子ごとの集計
  ggplot() + 
  #プロット
  geom_bar(aes(x=userType,y=sessions,fill=channelGrouping),stat="identity")
  #積み上げ棒グラフ

f:id:abrahamcow:20150807020040p:plain

これだと傾向の違いはわかりにくいです。

sessionCount 3 以上を切り分けてみます。

数字の 2 を 3 に変えるだけです。

datChannel %>>%
  mutate(userType=ifelse(sessionCount >= 3,"3+",sessionCount)) %>%
  ddply(.(channelGrouping,userType),summarize,sessions=sum(sessions)) %>>%
  ggplot() + geom_bar(aes(x=userType,y=sessions,fill=channelGrouping),stat="identity")

f:id:abrahamcow:20150807020450p:plain

続けて sessionCount 4 以上を切り分け。

datChannel %>>%
  mutate(userType=ifelse(sessionCount >= 4,"4+",sessionCount)) %>%
  ddply(.(channelGrouping,userType),summarize,sessions=sum(sessions)) %>>%
  ggplot() + geom_bar(aes(x=userType,y=sessions,fill=channelGrouping),stat="identity")

f:id:abrahamcow:20150807020600p:plain

sessionCount 4 以上の棒グラフはちょっとピンク色が多いように見えます。

帯グラフにしてみます。

p1 <- datChannel %>>%
  mutate(userType=ifelse(sessionCount >= 4,"4+",sessionCount)) %>%
  ddply(.(channelGrouping,userType),summarize,sessions=sum(sessions)) %>>%
  ggplot() 

p1 + 
  geom_bar(aes(x=userType,y=sessions,fill=channelGrouping),stat="identity",position="fill")

f:id:abrahamcow:20150807020800p:plain

どうやら、sessionCount 4 以上のユーザーはソーシャル経由の訪問が多そうです。

でももうちょっと細かい数字がみたいなあ、と思ったら、このようにヒートマップ(色付きテーブル)にしてみましょう。

p1 + geom_tile(aes(x=userType,y=channelGrouping,fill=sessions)) +
  geom_text(aes(x=userType,y=channelGrouping,label=sessions)) +
  scale_fill_gradient(low = "white", high = "cornflowerblue")

f:id:abrahamcow:20150807021035p:plain

あるいは、ひとにみせる用に軸や凡例を日本語にしたいなあとおもったらこんな感じです。

p2 <- 
  p1 + 
  geom_bar(aes(x=userType,y=sessions,fill=channelGrouping),stat="identity",position="fill")

p2 +scale_y_continuous(label=percent) +
  labs(x="リピートの回数",y="セッション",fill="チャネル") +
  theme_bw(15,"HiraKakuPro-W3")

f:id:abrahamcow:20150807021301p:plain

こんな風にちょっとコマンドを入れ替えるだけで、いろいろな集計や図示ができるところがピボットテーブル、ピボットグラフ感覚だと思うのですがいかがでしょうか。

詳細化(ドリルダウン)

粒度の粗い集計を行って狙いを定めてから、細かい内訳を見ていくと、最初から細かい内訳をみるより効率的です。

リピーターはソーシャル経由の訪問が多そうなことがわかったので、さらにその内訳をみてみます。

datChannel %>>%
  filter(sessionCount>=4 & channelGrouping == "Social") %>>%
  #sessionCount 4 以上 かつ channelGrouping が Social のデータのみを取り出し
  ddply(.(source),summarize,sessions=sum(sessions))%>%
  #source ごとに合算
  ggplot(aes(reorder(source,sessions),sessions))+
  geom_bar(stat="identity") + 
  coord_flip()

f:id:abrahamcow:20150807021807p:plain

sessionCount 4 以上のヘビーユーザーははてなブックマークツイッターからの訪問が多いようです。

ユーザーの定着にはソーシャルブックマーク系のサービスが重要な役割を果たしていることがわかりました。

実際にユーザーが参照した URL まで掘り下げて csv に書き出すこともできます。

out <- filter(datChannel,sessionCount>=4 & channelGrouping == "Social" &
                (source == "t.co" |source ==  "b.hatena.ne.jp"))

out %>>% 
  mutate(URL=paste0("http:/",source,referralPath)) %>>%
  select(URL,sessions) %>>%
  ddply(.(URL,sessions),summarize,sessions=sum(sessions)) %>>%
  arrange(desc(sessions)) %>>%
  write.csv(file="~/Desktop/social.csv")

f:id:abrahamcow:20150807023942p:plain

この表を見ながらブックマークされやすい記事を考えたりできます。

流入経路以外にもいろいろな切り口があると思うので、いろいろ試して頂ければ幸いです。

参考文献

データ解析の実務プロセス入門

データ解析の実務プロセス入門

関連エントリ

abrahamcow.hatenablog.com