R
GoogleAnalytics

Rを使ったGoogle Analyticsデータの解析にはRGAパッケージがお手軽

RでGoogleのアクセス解析サービスGoogle Analyticsのデータを解析するための手法やパッケージには、 {RGoogleAnalytics}パッケージなどをはじめとしていくつかあって、特に{RGoogleAnalytics}についてはこちらの記事に詳しいですが、{RGoogleAnalytics}パッケージはなんとなく複雑な感じです。

そんな中で最近、{RGA}パッケージというGoogle Analytics APIのラッパーパッケージが新たにCRANに登録されたのでお試しがてら紹介します。慣れの問題もありますが、既存の{RGoogleAnalytics}よりも使いやすい印象です。

また、{RGA}の特徴として、通常のレポート APIに加えてリアルタイムレポート APIや試していませんがAnalytics Multi-Channel Funnels data APIもサポートしています

まずは今回利用するパッケージを読み込んでおきましょう。

library(RGA)
library(ggthemes)
library(ggplot2)
library(munsell)
library(dplyr)

🔰 基本的な使い方

GitHubのREADMEに書いてありますが、まずは認証をとるところから始めます。ここはREADMEに詳しく書いてある通りに進めればできるはずです。

# ブラウザが立ち上がり認証を求められる
authorize()

次のコードで解析の対象にするidを取得します。

df_prof_list <- list_profiles() %>% 
  dplyr::filter(website.url == "http://qiita.com")
# この値がget_ga()関数などに渡すprofile.idとなる
df_prof_list$id

{RGA}パッケージではAPIの種類に応じて関数を用意しています。

  1. get_ga()... 主要レポート API
  2. get_realtime()... リアルタイムレポート API
  3. get_mcf()... Analytics Multi-Channel Funnels data API

get_ga()関数はCore Reporting APIからデータを取得する関数で、Google Analyticsの主要な機能をカバーしています。関数内の引数を指定して詳細なデータを得ることが可能です。主要な関数として次のものがあります。

  • profile.id... アクセス解析の対象にするID
  • start.date, end.date... 対象にする日付。開始時点と終了時点を指定します。YYYY-MM-DD形式で日付を与えますがtoday30daysAgoといった相対的な指定も可能です。
  • metrics, dimensions... パラメータと詳細はAPIのガイドページをご覧ください。

トラッキングの開始時点からのアクセス解析をしたいがトラッキング開始日を忘れた...というときにはfirstdate()で調べられます。

firstdate(profile.id = df_prof_list$id)

[1] "2014-06-08 JST"

このほかにもデータの並び替え基準を定めるsortや対象の範囲を抽出するfiltersなどの引数があります。

📈 ユーザートラッキング

まずはget_ga()関数を使ってGoogle Analyticsの基本的なデータを取得してみましょう。Qiitaでもアカウントに紐付けたGoogle Analyticsが利用できるので、以下では私の投稿した記事のデータを例にします

👀 ページビュー数

私のアカウントのページ (http://qiita.com/uri) 以下のディレクトリにおける去年一年間のページビュー数上位10ページを取得した結果です。

get_ga(profile.id = df_prof_list$id,
       start.date = "2015-01-01", 
       end.date   = "2015-12-31",
       metrics    = "ga:pageviews",
       dimensions = "ga:pageTitle, ga:pagePath",
       sort       = "-ga:pageviews") %>% 
  dplyr::filter(grepl("^/uri", page.path)) %>% 
  head(10) %>% 
  dplyr::mutate(page.path  = paste0("http://qiita.com", page.path),
                page.title = gsub(" - Qiita", "", page.title)) %>%
  knitr::kable(format = "markdown")
page.title page.path pageviews
データ解析その前に: 分布型の確認と正規性の検定 #rstatsj http://qiita.com/uri/items/e656f90e9dda342c54bb 8708
このRパッケージがすごい2014 http://qiita.com/uri/items/ce711ee6da76a1e11ca5 2308
Rプログラミングのための第一歩(未完) http://qiita.com/uri/items/1245441ab179c6ee76f9 1848
一歩進んだRとの付き合い方 http://qiita.com/uri/items/83804c9eb4a3cb9c6811 1762
GitHub - これから研究を始める大学学部生や院生はDr.Elgを利用しよう http://qiita.com/uri/items/8eb4324f4c09f15e4b5b 1644
RStudioを使ったPDF文書の作成(for RStudio 0.98.932+) http://qiita.com/uri/items/d9e50e8e5a37217a3f5d 1623
R - 連番になっている複数のファイルを読み込む http://qiita.com/uri/items/e162302ce8a38b009660 1447
2014年版RStudioを使った文書作成法 http://qiita.com/uri/items/5cce4431ad0d96b96689 1410
R - 学会発表のためのggplot2の設定めも http://qiita.com/uri/items/615653e83642d7e475de 1323
RStudio 0.99の変更点と最近のRコードの書き方 http://qiita.com/uri/items/a60f28d437c773010daf 1152

🚶 セッション数

月ごとのセッション数を求めます。{ggplot2}パッケージで取得したデータを図にしてみました。

get_ga(profile.id = df_prof_list$id, 
       start.date = "2015-01-01", 
       end.date   = "2015-12-31",
       metrics    = "ga:sessions",
       dimensions = "ga:month") %>% 
  dplyr::mutate(month = lubridate::month(month, label = TRUE, abbr = TRUE)) %>% 
    # ここまででデータの取得。以下可視化のためのコード
  ggplot(aes(month, sessions, group = 1)) +
  geom_line() +
  geom_point(size = 2, colour = "magenta")

google_analytics_rga_fig1.png

12月はアドベントカレンダーの影響もあってか、セッション数が伸びました↗️。順調順調 😄

🌍 地域別のアクセス

これを見るのが好きです。どの地域、国の人が見てくれているのかがわかります。

library(rworldmap)
df_session_country <- get_ga(profile.id = df_prof_list$id,
       start.date = "2015-01-01", 
       end.date   = "2015-12-31",
       metrics    = "ga:sessions",
       dimensions = "ga:country")
df_session_country %>% dplyr::group_size()

[1] 104

多いのか少ないのかわかりませんが、いろいろな国からのアクセスがあるみたいです。

df_session_country %>% dplyr::arrange(-sessions) %>% 
  head(10) %>% 
  knitr::kable(format = "markdown")

上位10の国の表です。当然ながら日本の方が多くなっていました。

country sessions
Japan 29347
United States 1614
(not set) 904
China 261
Germany 156
United Kingdom 151
Russia 127
South Korea 102
Netherlands 97
France 81
# 地域別のアクセスを可視化するためのRコード
df_session_country %<>% dplyr::mutate(sessions_c = cut(df_session_country$sessions, 
                                                       breaks = c(0, 10, 50, 100, 250, 500, 1000, 10000, 30000),
                                                       labels = c("0 - 10", "10 - 50", "50 - 100", "100 - 250",
                                                                  "250 - 500", "500 - 1000", "1000 - 10000",
                                                                  "10000 - 30000")))
sessions_pal <- munsell::hue_slice("10RP") %$% data %>% dplyr::filter(grepl("6/", name)) %>% dplyr::arrange(chroma) %$% hex
map_world <- map_data("world") %>% 
  .[.$region != "Antarctica",] 

gg <- ggplot()
gg <- gg + geom_map(data = map_world, 
                    map = map_world,
                    aes(x = long, y = lat, map_id = region),
                    color = "white", 
                    fill = "#7f7f7f", 
                    size = 0.05, 
                    alpha = 0.2)
gg <- gg + geom_map(data = df_session_country,
              map  = map_world,
              aes(map_id = country, fill = sessions_c))
gg <- gg + scale_fill_manual(values = sessions_pal)
gg <- gg + guides(fill = guide_legend(override.aes = list(colour = NA)))
gg <- gg + coord_equal() + theme_map()
gg <- gg + theme(legend.position = "bottom")
print(gg)

google_analytics_rga_fig2.png

⏰ リアルタイムトラッキング

現在限定的に試験提供されているリアルタイムトラッキングも対象にできます。リアルタイムトラッキングのデータを取得するにはReal Time Reporting APIを利用する必要があるので、今度はget_realtime()関数を使います。基本的な使い方はget_ga()と同じで、取得したいmetricsdimensionsを渡します。

get_realtime(profile.id = df_prof_list$id,
             metrics    = "rt:activeUsers",
             dimensions = "rt:region, rt:browser, rt:operatingSystem")

region browser operating.system active.users
1 Aichi Prefecture Safari iOS 1
2 Hokkaido Chrome Windows 1
3 New York Firefox Linux 1

新年早々、誰でしょうか... (もしかして羽鳥?)

その他、APIのドキュメントを見る限り条件抽出などの細かい指定もできそうなので良いです。公式のvignettesにも細かい利用方法が書かれていますので一度ご覧ください。

📚 参考