Google Analyticsには非常に見やすいグラフ等が用意されていますが、詳細な統計を取るのには不向きです。データ自体はCSV形式でダウンロードも可能です、Excel等を使う事もできます。今回は提供されているAPIを使用し、半自動的にグラフ化処理まで行ってみましょう。APIを使うことで取得するデータに自由にフィルターをかけたり、直接Rに読み込ませることが可能となります。

 なお、ドキュメントはこちら。サンプルコードは公式のサンプルから一部書き直しています。また、「RでGoogle Analtyics: 時間帯別グラフ | Google Analytics アクセス解析」を参考にさせて頂きました。

 最初にライブラリをダウンロードして展開しておきましょう。こちらからダウンロードします。作業ディレクトリ、ライブラリのパス、ログイン情報は適宜変更して下さい。設置したら以下を実行。
#ライブラリ読み込み
source("RGoogleAnalytics.R")
source("QueryBuilder.R")
library(lattice)    #levelplot関数に必要

# 1. Create a new Google Analytics API object
ga <- RGoogleAnalytics()

# 2. Authorize the object with your Google Analytics Account Credentials
ga$SetCredentials("username", "password")    #適宜変更してください

# 3. Get the list of different profiles, to help build the query
profiles <- ga$GetProfileData()
print(profiles[1]);
 まずはここまで実行しましょう。ここでprofiles[1]には、google analyticsに登録してあるサイト一覧が入っています(AccountName、ProfileName、TableId)。この中から目的のサイトを探し、TableIdという項目の「ga:xxxxxxxxxx」を以下にはめ込んでデータを取得します。
# 4. Build the Data Export API query
query <- QueryBuilder()
query$Init(start.date = "2011-01-01",
end.date = "2011-01-29",
dimensions = c("ga:date","ga:hour"),
metrics = "ga:visitors",
sort = "ga:date",
table.id = "ga:xxxxxxxxxx")    #tableIDに先程見つけた番号を入れます

#5. Make a request to get the data from the API
ga.data <- ga$GetReportData(query)

#6. Look at the returned data
head(ga.data$data)
 取得したいデータの期間、種類、ソート順位、どのサイトかを指定して、データを取得します。今回は各時刻における訪問者数を取得したので、このようなデータが表示されるはずです。
   ga:date ga:hour ga:visitors
1 20110101      00           2
2 20110101      01           3
3 20110101      02           7
4 20110101      03           3
5 20110101      04           6
6 20110101      05           4

 これを使ってグラフを表示してみましょう。まずはシンプルなplotです。横軸は適当(時刻が入る)で、縦軸に訪問者数を書きます。
plot(ga.data$data[,3],type="l")
plot_visitors

 見やすいグラフにしてみましょう。3つのパラメーター(時刻、日付、訪問者数)を使い、ヒートマップを書きます。
hour = ga.data$data[,2]  #時刻
day  = ga.data$data[,1]  #日付
visitors = ga.data$data[,3]  #訪問者数
levelplot( tapply(visitors,list(hour,day),sum) ,
    col.regions=colorRampPalette(c("white","red")),
    xlab="Hour" , ylab="Date" ,main="Visitors"
)
levelplot_visitors

 次にこのデータをまとめて、曜日毎に集計してみましょう。
# 曜日を定義
wdays <- c("1_Sun.","2_Mon.","3_Tue.","4_Wed.","5_Thu.","6_Fri.","7_Sat.") #表示順を揃えるためindexをつける
# 時刻フォーマットをRで扱える(as.Dateで読み込める形式)に変換する関数
#   参考 http://aoki2.si.gunma-u.ac.jp/R/joseki/redefine.as.Date.html
changeDateFormat <- function(str, format="%04s-%02s-%02s"){
    y = substr(str,1,4)
    m = substr(str,5,6)
    d = substr(str,7,8)
	sprintf(format, y, m, d)
}
#グラフ
levelplot( tapply(visitors,list(hour,wdays[as.numeric(strftime(changeDateFormat(day), "%w"))+1]),sum) ,
    col.regions=colorRampPalette(c("white","red")),
    xlab="Hour" , ylab="Weekday" ,main="Visitors"
)
levelplot_weekdayVisitors


 ここまではこちらの記事を多いに参考にしました。
 何ができるのか、色々やってみましょう。googleから来た人のみをfilterを使って集計してみます。
query$Init(start.date = "2011-01-01",
end.date = "2011-01-31",
dimensions = c("ga:date","ga:hour"),
metrics = "ga:visitors",
filters="ga:source=@google",    #ga:sourceにgoogleを含む、という意味
sort = "ga:date",
table.id = "ga:xxxxxxxxxx")
ga.data <- ga$GetReportData(query)
head(ga.data$data)

 googleから来た人のうち特定の検索キーワードを含むものを列挙してみましょう。filterにセミコロンで区切りながら条件を書けばand検索となります。
query$Init(start.date = "2011-01-01",
end.date = "2011-01-31",
dimensions = c("ga:date","ga:keyword"),
metrics = "ga:visitors",
filters="ga:source=@google;ga:keyword=@ios",    #ga:sourceにgoogleを含み、かつga:keywordにisoを含む
sort = "ga:date",
max.results=100,
table.id = "ga:xxxxxxxxxx")
ga.data <- ga$GetReportData(query)
head(ga.data$data)


 全訪問者のうち、特定のキーワードで来た人の割合を集計してみましょう。(ちょっと強引過ぎる実装ですが、他に思いつきませんでした。なお割合を求めているのに数字が100を超えたのは、数週間分のデータを合計したからです。)
#まず、普通に訪問者を取得する
query$Init(start.date = "2011-01-01",
end.date = "2011-01-31",
dimensions = c("ga:date","ga:hour"),
metrics = "ga:visitors",
sort = "ga:date",
table.id = "ga:xxxxxxxxxx")
ga.data <- ga$GetReportData(query)

#必要パラメーターを記録
hour = ga.data$data[,2]  #時刻
day  = ga.data$data[,1]  #日付
visitors = ga.data$data[,3]  #訪問者数

#次に、特定キーワードで検索して来た人を取得する。filter機能を使います。
query$Init(start.date = "2011-01-01",
end.date = "2011-01-31",
dimensions = c("ga:date","ga:hour"),
metrics = "ga:visitors",
filters="ga:keyword=@ios",
max.results=10000,
table.id = "ga:xxxxxxxxxx")
ga.data <- ga$GetReportData(query)

#必要パラメーターを記録
keywordVisitors = ga.data$data[,3]  #訪問者数

#訪問者における該当キーワード訪問者の比率を計算
keywordVisitorsPercent = keywordVisitors/visitors*100

#曜日単位で集計してグラフ表示
wdays <- c("1_Sun.","2_Mon.","3_Tue.","4_Wed.","5_Thu.","6_Fri.","7_Sat.")
changeDateFormat <- function(str, format="%04s-%02s-%02s")
{
    y = substr(str,1,4)
    m = substr(str,5,6)
    d = substr(str,7,8)
	sprintf(format, y, m, d)
}
levelplot( tapply(keywordVisitorsPercent,list(hour,wdays[as.numeric(strftime(changeDateFormat(day), "%w"))+1]),sum) ,
col.regions=colorRampPalette(c("white","red")),
xlab="Hour" , ylab="Weekday" ,main="keywordVisitors/visitors"
)  
levelplot_weekdayVisitors_byKeyword
曜日による違いはあまり見えません。また、木曜昼間に何かあったようです。


 アクセス元がPCとモバイルとで滞在時間がどのように違うのか見てみましょう。モバイルかどうかの判定はga:isMobileにて取得できます。
query$Init(start.date = "2011-01-01",
end.date = "2011-03-31",
dimensions = c("ga:visitLength","ga:isMobile"),
metrics = "ga:visitors",
table.id = "ga:xxxxxxxxxx")
ga.data <- ga$GetReportData(query)
head(ga.data$data)

boxplot(
    as.numeric(ga.data$data[ ga.data$data[,2]=="Yes" , ][,1]) ,
    as.numeric(ga.data$data[ ga.data$data[,2]=="No"  , ][,1]) ,
    xlab="Mobile , PC",ylab="visitLength",main="visitLength (Mobile vs PC)"
)
boxplot_PC_vs_Mobile

 全体の様子も見てみましょう。
#densityを計算
density_isMobile_No  = density(as.numeric(ga.data$data[ ga.data$data[,2]=="No" , ][,1]))
density_isMobile_Yes = density(as.numeric(ga.data$data[ ga.data$data[,2]=="Yes" , ][,1]))
#最大値を見つけておく
xlim = c(0,max(density_isMobile_No$x,density_isMobile_Yes$x))
ylim = c(0,max(density_isMobile_No$yo,density_isMobile_Yes$y))
#グラフ描画
plot(
    density_isMobile_No,
    xlim=xlim, ylim=ylim,
    xlab="ga:visitLength",ylab="density",main="",col=2
)
par(new=T)
plot(
    density_isMobile_Yes,
    xlim=xlim, ylim=ylim,
    xlab="ga:visitLength",ylab="density",main="",col=3
)
legend( xlim[2]/4*3,ylim[2]/4*3 , c("PC","Mobile") , col=c(2,3) , lty=c(1,1) )
density_Pc_vs_Mobile
想像通りPCの方が滞在時間が長い事がよくわかります。


■まとめ
・RからAPIを比較的簡単に使うことができる
・APIを使うことで、google analyticsから様々なデータを引っ張ることができる
・google analytics apiのfilterが強力そう
・Rのlevelplotによるグラフ描画が凄い

■コメント
・今回書いた事は、githubのgistにもまとめました。R_Google_Analyrics_Sample.R — Gist
・データフレーム的な扱いをするにはどうするのかわからない(ga.data$data$ga:visitorsみたいにしたい)
・ggplot2が使えると楽しそう
・取得できる最大件数は1万件。なのでフィルターで上手く処理しておかないといけない
・Google AnalyticsのAPIにはJavascriptphp向けのライブラリもありますし、こういったものを使ったアプリ(例えばQuicklyticsとか)も存在します。このように何かサービス化するのも面白そう。

■資料
・かなり参考にさせて頂きました。こちらで書かれていたライブラリがなぜか使えなかったので、google側が用意したRライブラリを使って今回の記事を書きました。
RでGoogle Analtyics: 時間帯別グラフ | Google Analytics アクセス解析
・公式のサンプルコード
GettingStarted - r-google-analytics - Getting Started with the RGoogleAnalytics package - Google Analytics For The R Statistical Programming Language - Google Project Hosting
・APIのパラメーターについて、Data Feed URIを作ることができる。非常にわかりやすい。
Google Analytics Tools - Query Explorer
・どんなパラメーターを取得できるのか
Dimensions & Metrics Reference - Google Analytics — Google Developers
・Google Analytics Core Reporting API全体についてのドキュメント
What Is The Core Reporting API - Overview - Google Analytics — Google Developers