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


RでGoogleのアクセス解析サービスGoogle Analyticsのデータを解析するための手法やパッケージには、 [**`{RGoogleAnalytics}`**](https://github.com/Tatvic/RGoogleAnalytics)パッケージなどをはじめとしていくつかあって、特に**`{RGoogleAnalytics}`**については[こちらの記事](http://abrahamcow.hatenablog.com/entry/2015/01/02/215112)に詳しいですが、**`{RGoogleAnalytics}`**パッケージはなんとなく複雑な感じです。

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

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

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

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

### 🔰 基本的な使い方

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

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

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

``` r
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](https://developers.google.com/analytics/devguides/reporting/core/v3/common-queries)からデータを取得する関数で、Google Analyticsの主要な機能をカバーしています。関数内の引数を指定して詳細なデータを得ることが可能です。主要な関数として次のものがあります。

-   profile.id... アクセス解析の対象にするID
-   start.date, end.date... 対象にする日付。開始時点と終了時点を指定します。YYYY-MM-DD形式で日付を与えますが`today`や`30daysAgo`といった相対的な指定も可能です。
-   metrics, dimensions... パラメータと詳細は[APIのガイドページ](https://developers.google.com/analytics/devguides/reporting/core/dimsmets)をご覧ください。

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

``` r
firstdate(profile.id = df_prof_list$id)
```

[1] "2014-06-08 JST"

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

### 📈 ユーザートラッキング

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

#### 👀 ページビュー数

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

``` r
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}`**パッケージで取得したデータを図にしてみました。

``` r
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](https://qiita-image-store.s3.amazonaws.com/0/19462/aea4342d-08c6-d0f2-ac7b-b992f8ffd8db.png)


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

#### 🌍 地域別のアクセス

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

``` r
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

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

``` r
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
# 地域別のアクセスを可視化するための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](https://qiita-image-store.s3.amazonaws.com/0/19462/7530037d-ea0d-d188-66ea-f2cc5a96368e.png)


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

現在限定的に試験提供されているリアルタイムトラッキングも対象にできます。リアルタイムトラッキングのデータを取得するには[Real Time Reporting API](https://developers.google.com/analytics/devguides/reporting/realtime/dimsmets/)を利用する必要があるので、今度は`get_realtime()`関数を使います。基本的な使い方は`get_ga()`と同じで、取得したい*metrics*と*dimensions*を渡します。

``` r
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にも細かい利用方法が書かれていますので一度ご覧ください。

### 📚 参考

* [R から API で Google アナリティクスのデータを読むこめるパッケージ, RGoogleAnalytics のクエリ作成方法 - 廿TT](http://abrahamcow.hatenablog.com/entry/2015/01/02/215112)
* [Google Analytics Data Mining with R](http://www.slideshare.net/Tatvic/google-analytics-data-mining-with-r)
* [各プログラム言語毎のGoogle Analytics API(R,python,Excel) - "Diary" インターネットさんへの恩返し](http://azwoo.hatenablog.com/entry/2015/03/31/170647)
* [World Map Panel Plots with ggplot2 2.0 & ggalt | rud.is](http://rud.is/b/2015/12/28/world-map-panel-plots-with-ggplot2-2-0-ggalt/)
* [Faceted “World Population by Income” Choropleths in ggplot | rud.is](http://rud.is/b/2015/07/09/faceted-world-population-by-income-choropleths-in-ggplot/)
* [Rで解析：マンセル・カラー・システムに触れてみませんか？「munsell」パッケージの紹介](https://www.karada-good.net/analyticsr/r-246/)