これで無理なら諦めて!世界一やさしいデータ分析教室

オーブンソースデータなどWeb上から入手できるデータを用いて、RとPython両方使って分析した結果を書いていきます

【Shiny100本ノック No.1】RユーザーならGoogle のQuery Explorerは自分で作るべし!

記念すべきShiny100本ノックの第1弾です。

Shinyの記事を100本書いたら、どこかの誰かが書籍化の話しを持ってきてくれると信じています。
本当に書籍化が実現するのか、15本ぐらい書いた時点で挫折してしまうのか、皆さんお楽しみにしていてください。

Shinyについて何も知らない!
という方は
qiita.com
こちらが大変分かりやすかったので、一読をお願いします。

こちらのチュートリアルのレッスン4まで読んでいただければ十分かと思います!

Query Explorerとは?

今回はGoogle が提供しているサービスのQuery Explorerの機能をShinyを使って実現してみたいと思います。
Query Explorerとは、皆大好きGoogle アナリティクスのデータをAPI経由で簡単に取得できるツールです。
https://ga-dev-tools.appspot.com/query-explorer/

というよりもGoogle アナリティクスAPIの動作確認を手軽にできちゃう、というツールと説明した方が正しいかもしれません。

もしGoogle アナリティクスのアカウントがある方は、Query Explorerを試しに使ってみてください。とても便利なツールです。

しかーし!
このぐらいの機能であればShinyを使って実現したくなりません??

そんな方のために、ShinyからGoogle アナリティクスのデータをAPI経由で取得してみる、ということを一緒に勉強していきましょう。
(今回はGoogle アナリティクスのAPIに関してある程度、使った経験がある方でないとつまらないかもしれません…)

事前準備

まず、ライブラリですが、今回は「googleAnalyticsR」 というものを使います。
以前に調べたところ、RからGoogle アナリティクスのAPIを叩くのには、「rga」というライブラリが有名でした。
しかし最近Google アナリティクスの開発者が、rgaなど複数のライブラリを参考にしてR用に作ったライブラリを公開したので、今回そちらを使っていきます。

まだインストールが完了していない場合は以下コンソールで実行しておきましょう。

install.packages("shiny", dependencies = TRUE)
install.packages("googleAnalyticsR", dependencies = TRUE)
install.packages("googleAuthR", dependencies = TRUE)
install.packages("listviewer", dependencies = TRUE)

次に、Google 関連のAPIを使うためには

  • クライアントID
  • クライアントシークレット

という2つを「Google Developer Console」にて取得する必要があります。
このあたりは既に経験済みの方も多いかもしれませんが、説明してきます。

APIを有効化

https://console.developers.google.comにアクセスしましょう。

その後、以下のように新規プロジェクトを作成します。プロジェクト名は適当でOKです!
f:id:Np-Ur:20170802124401p:plain

次に、使用したいAPIを有効化します。
f:id:Np-Ur:20170802124546p:plain
f:id:Np-Ur:20170802124551p:plain

これにてAPIを有効化できたので、RからAPIを叩くために必要な、クライアントIDとクライアントシークレットを取得する手順に移ります。

クライアントIDとクライアントシークレット

左の認証情報作成から、OauthクライアントIDを選択しましょう。
f:id:Np-Ur:20170802124711p:plain

次に同意画面を設定してくださいとの表示されるのでクリックし入力しましょう。
f:id:Np-Ur:20170802125212p:plain

ユーザーに表示するサービス名という箇所だけ入力すればとりあえずOKです。
f:id:Np-Ur:20170802125300p:plain

その後、承認済みのリダイレクト URIに「http://127.0.0.1:1221」を入力し、作成をクリックすると、以下のような画面が表示されます。
f:id:Np-Ur:20170802125442p:plain

この

  • クライアントID
  • クライアントシークレット

をメモっておきましょう。

Shinyコード

Shinyのコードですが、先程のgoogleAnalyticsRライブラリのGithubページにサンプルが書いてあったので参考にしました。

ui.R
gist.github.com
server.R
gist.github.com

このserver.Rの8行目と9行目に先ほど作った、クライアントIDとクライアントシークレットをコピペしてください。
あとはそのまま実行すれば動くはずです。次段落でコード解説を簡単にするので、まずは実行して動きを確認してみましょう。

実行するとこんな感じ
f:id:Np-Ur:20170802130427p:plain

もし、Google連携する際に404エラーが出た際は、なぜかShinyを立ち上げたローカル環境のポートが反映されていない可能性があります。その場合一度Shinyを閉じて、再度実行すると反映することが多いです。お試しください。

是非実際にShinyコードを実行して、
様々なmetricsやdimension、日付を選択してデータを取得してみてください!

metricsやdimensionについて、あまり分からない方は
ummmummm.hatenablog.com
こちらがまとまっていて分かり易いのでご覧ください。

色々柔軟にデータを取得して、「へー便利!」となっていただければ幸いです!!
もし何か不具合が生じたらご連絡いただけると助かります!!

コード解説

簡単にですが、コード解説をしていきたいと思います。

まず、ui.Rについて。今回は

  • Google アカウント連携
  • metricsとdimensionを指定してデータを取得、また指定したmetrics同士を組み合わせ計算した結果を表示
  • metricsとdimensionを指定して、また2期間でデータを取得

という3つの機能があり、1ページで表現するのは難しいため、navbarPageというヘッダー部分にナビゲーションバーを作る関数を用いています。

navbarPageについては、以下でまとめているのでご覧ください。
www.randpy.tokyo

Google アカウント連携

まず1つ目のタブである

について説明します。

このui.Rコードと対応しているserver.Rコードは以下の箇所です。

ここでは、ShinyとGoogleアナリティクスを連携する機能を実装しています。

ui.Rの9行目で

googleAuthUI("Google_login")

で"Google_login"というidが紐づいた、server.Rの15行目

token <- callModule(googleAuth, "Google_login")

が実行されます。これにより、googleAuthRライブラリ内のgoogleAuthという関数を呼び出され、「本当にこのアプリケーションとGoogleアナリティクスのアカウントを連携してもよいですか?」という認証プロセスに入ります。

この辺りはgoogleAuthRライブラリ内に、Shiny用の関数が用意されているのでそのまま使えばよいのでとても楽ですね!
この"Google_login"という箇所はui.Rとserver.Rで一致していれば、好きに変えてもらってもOkです。

ui.Rの10行目

authDropdownUI("viewId_select")

とserver.Rの24行目

selected_id <- callModule(authDropdown, "viewId_select", ga.table = ga_accounts)

が対応し、先ほど連携したGoogleアナリティクスアカウントの中で、データを取得したいビューを選択することができます。

はい、これもライブラリで用意された関数を用いているだけです。もう全部がそんな感じです笑 ライブラリが手厚くて手厚くて……。

metricsとdimensionによるデータ取得、metrics同士の掛け合わせ計算

次に2つ目のタブ部分の実装について説明します。
前述しましたが、ここではGoogleアナリティクスのmetricsとdimensionを指定したデータ取得、そしてmetircs同士を組み合わせて計算した結果を出力します。

この「metircs同士を組み合わせて計算」という箇所が想像つきにくいかかもしれませんので軽く説明します。

metricsには無い指標だけど、一発でこんなデータが欲しい!ということがよくあると思います。
例えば、直帰数(そのページに着地後、他ページへ遷移せず離脱した数)を取得する「ga:bounces」というmetricsはあるけど、遷移数(セッション数 - 直帰数を計算したもの)も見たい!というケースです。

まあ、簡単な計算なのですぐ求まりますが、楽できるにこしたことはありません。
そんなとき、最初から「ga:sessions - ga:bounces」というmetrics同士の計算を指定してあげれば一発で値を取得できます。

他にも

  • 直帰率(ga:bounceRate)を求める指標はあるけど、遷移率を一発で求めたい
  • ページビュー/セッション(ga:pageviewsPerSession)を求める指標はあるけど、ページビュー/ユーザー(1ユーザーあたりのページビュー数)を一発で求めたい

などなど、パッと思いつくだけでも色々あります。

Google アナリティクスAPIのv4から(たしかv3ではできなかったはず…)このmetrics同士の組み合わせ計算の結果を取得できるようになりました。

そのあたりはui.Rの14行目から21行目で書いています。

14~17行目では、自作したmetricsの組み合わせに名前を付ける処理です。その後18-20行目では、metricsの組み合わせを入力してもらう処理です。

それ以外にも以下の部分で、通常のmetricsの入力欄と、どんなdimensionをかけるかを入力する欄を用意しています。

ここで登場する「multi_selectUI」というのはserver.R部分での以下の「multi_select」を呼んでいる部分と対応しています。「dimensions_calc」や「metrics_calc」というIDで対応関係を示しています。(このID名は好きに変えてもらって大丈夫です!)

multi_selectはgoogleAnalyticsRライブラリ内のshiny用の関数で、typeにはDIMENSIONかMETRICのどちらかを入れることができます。これによりユーザー自身が手入力しなくても、メトリクスやディメンションをプルダウンから選択することができるようになります。便利ですねー…。

そして入力した値をもとに、server.R内の以下部分でGoogleアナリティクスからデータを取得します。

APIで取得できるようにデータを整形して、with_shiny()という箇所でデータを取りに行き、calc_dataに値を格納しています。

このデータ取得部分もgoogleAnalyticsRライブラリ内のgoogle_analytics_4という関数を呼び出しています。リクエストの送り方は、他でGoogleアナリティクスAPIを使ったことがある方はお馴染みかと思います。

ここまでの実装をおさらいすると、

  • ui.Rで何をinputするか指定する
  • server.rにてinputされた内容をもとにGoogleアナリティクスAPIを叩いてデータを取得

というところまで完了しました。残りは

  • server.Rで取得したGoogleアナリティクスのデータをui.Rに渡してoutputする

という実装です。まあ、この流れはShinyでよくあることですね。

output部分はまずserver.Rにて何をui.Rに渡すか指定する必要があります。

これに対応する、ui.R部分は

このようになります。

output部分は簡単ですね。


このような流れで、メトリクスとディメンションを指定したGoogleアナリティクスのデータ取得をShinyにて実装することができました。

また2期間を選択したデータ取得に関しては、ui.Rの以下、

server.Rの以下、

で実装しています。

ほぼ同一のコードなので、解説は不要かと思うので皆さんそれぞれ確認してみてください!(解説するの面倒だし

応用例

Google アナリティクスの情報を社内の人やクライアントに共有したい、という場面は多いでしょう。
そんなときお手製のShinyツールで共有するのはとても便利ですね!格好いいし笑

しかし、Rといえばやはり多彩なグラフによる可視化ですよね……
次回の【Shiny100本ノック】 では、今回API経由で取得したGoogle アナリティクスのデータをグラフ化するところまでやってみたいと思います。

ちなみにGoogle は「Google Data Studio」というAPI経由で取得したデータの可視化ツールを無料で提供しています。
ということで、今回Query Explorerの機能は実現したので、次回はGoogle Data Studioの機能を実現するところをやってみましょう!
(このあたりのサンプルコードはまだ無いので、次回は完全オリジナルとなります)
www.randpy.tokyo