【GoogleAnalytics】サイト滞在時間別にセッション数を集計する

## はじめに＆完成予想図
### この記事のミソ
普段指標として使っている"滞在時間"や"セッションあたりのページビュー数"、"合計イベント数"などをディメンションっぽく使い、縦軸も横軸もGoogleAnalytics内の"指標"のデータを用いて集計する方法を紹介します。
また、上記を再現するためにセグメントを複数（20~30とか、かなりの数）作る必要がありますが、セグメントを一括で作成する方法も紹介します。

### 完成予想図
たとえば、滞在時間（分）ごとのグラフであればこんな感じです。
![スクリーンショット 2018-10-09 19.44.40.png](https://qiita-image-store.s3.amazonaws.com/0/207239/6810d2b8-f3c4-c10d-303b-d248b4b90646.png)




## やりたいこと
ある日「滞在時間1分以内は○人（全体の●%）、2分以内は△人（全体の▲%）...っていうデータ出せないのかな？」と議論になりました。
セッションごとの滞在時間は、ローデータでは秒単位ではあるものの、GAに入っているはずです。

当初「ディメンションを複数かければ期間中のセッションをすべてユニーク行にできそうなので、そこから滞在時間だけ拾うか〜」と考えました。
上記のイメージは、GAの画面でいうとこんな感じ。セッションがすべて1なため平均滞在時間=滞在時間です
（直帰ばかりのため、滞在時間がほとんど0ですね）。
![スクリーンショット 2018-10-10 10.32.55.png](https://qiita-image-store.s3.amazonaws.com/0/207239/2835a208-9f4e-230a-c226-2cfcf43f1c3b.png)

分析対象のGAには、運良くミリ秒のカスタムディメンションが入っていました。
が、セッション数がかなり多いサイトであるため、プライマリディメンションにミリ秒を入れると、表示期間を"1日"まで短くしてもエクスポート上限を楽に超えてしまい、かなりの行数を分析対象に含められませんでした。
どうもサクッと行かなそうです。


<br>
分析する前に、そもそもどうデータを用意すればいいのか。悩みどころは、以下の3点でした。

### 1.「滞在時間」というディメンションがない
滞在時間がディメンションでセットされていれば、セッションを全行出す〜といった必要はありません。
「リピートの回数や間隔」レポートでいう「セッション数」のように、「滞在時間」がディメンションになっていれば、ニーズにピッタリのレポートが表示されるはずです。
が、滞在時間はディメンションになっていません。イメージはまさにこのレポート画面なのに...
![スクリーンショット 2018-10-09 19.52.16.png](https://qiita-image-store.s3.amazonaws.com/0/207239/8a747e2d-f60e-1011-a3f4-970434aa415c.png)

### 2.セグメントをたくさん作る必要がある
プリセットのディメンションやレポート画面でうまく解決できなさそうなときは、セグメントを工夫します。
セグメントの画面を見ると、「ページ滞在時間」が条件に入れられそうです。こんな感じにしていくとどうでしょう。
![スクリーンショット 2018-10-09 19.56.54.png](https://qiita-image-store.s3.amazonaws.com/0/207239/359a350c-5206-506d-00de-10402093b3d8.png)

これでセッションの滞在時間ごとに、セッション数を数えられそうです。
しかし、完成予想図のように「滞在1分」から「滞在30分以上」までこのセグメントをポチポチ作っていくのはかなりハードです。
「その程度の作業なら、一分で一個くらい作れるでしょ！」とかそういう問題ではありません。
ただ、この線でまとめていくしかなさそうです。


### 3.セグメントを使うと、93日しかデータを扱えない
前項の通りセグメントを使って滞在時間ごとのセッション数を数えておくイメージで進めていくことにしますが、GAの仕様上、セグメントを使ったデータの集計期間は最長93日です。

- 季節トレンドが見たい
- 93日ではセッション数が足らずデータに信頼性がなさそう
- 2ヶ月前にバズった
- 直近の1ヶ月で広告を増やした（≒だから直帰=滞在0秒のトラフィックが多い）

このような理由で、期間を長めにとって把握しておきたいというニーズはもっともです。
今回も1年（365日）でデータを取得したいと思います。なので、各セグメント最長93日のデータを、合計して365日にあなるように4回にわけてエクスポートする必要がありそうです。


## いよいよデータを出す
「え、セグメント30個作って、それぞれ365日（≒93日x4回）画面に出すの...？」
そんなことはありません。
このような作業繰り返し系タスクは、<a href="https://chrome.google.com/webstore/detail/google-analytics/fefimfimnhjjkomigakinmjileehfopp?hl=ja" target="_blank">スプレッドシートアドオン</a>を使って、一気に実行したいと思います。

### Report Configurationの設定
アドオンの使い方の解説は他の記事にお任せしたいと思いますが、まずはこのように設定します。
とりあえずこの時点では、StartDateからEndDateまでの日数が93日を超えないよう気をつけるくらいで大丈夫です。
![スクリーンショット 2018-10-11 14.11.17.png](https://qiita-image-store.s3.amazonaws.com/0/207239/39235605-1853-5257-0dc3-9ce11d766868.png)

10行目のSegmentsは以下のように指定します。


まずはGAで、セグメントを作ります。
![スクリーンショット 2018-10-11 15.29.29.png](https://qiita-image-store.s3.amazonaws.com/0/207239/6d6166ed-9a8c-05bb-a273-104c41bf8ac2.png)

次に、QueryExplorerにアクセス。
segment の欄で、上で作ったセグメント名を検索すると、結果のサジェストが現れます
（ここではセグメントのIDを知りたいだけなので、RunQueryする必要はありません）。
![スクリーンショット 2018-10-11 14.25.34.png](https://qiita-image-store.s3.amazonaws.com/0/207239/25a11c2c-58eb-e775-3e24-191d669f7fa2.png)

サジェストされた結果を選択するとセグメントのIDが取得できます。
![スクリーンショット 2018-10-11 14.27.06.png](https://qiita-image-store.s3.amazonaws.com/0/207239/17afd786-a686-e691-162a-09c4958483c4.png)

それをReport Configurationに入れて、計算を回します。
![スクリーンショット 2018-10-11 14.29.05.png](https://qiita-image-store.s3.amazonaws.com/0/207239/9b1f77d3-bda0-fb29-b1d6-63565ae6a259.png)

無事、9セッション（涙）が再現できました（2018.9.1 〜　2018.9.30の結果）。
![スクリーンショット 2018-10-11 14.31.25.png](https://qiita-image-store.s3.amazonaws.com/0/207239/098ebd30-f06a-97e7-620c-be7033a2b125.png)


### セグメントを量産する
上記のやり方しか知らないと、どうしてもいちいちGAでセグメントを作る必要があります。
そこで、セグメントをReportConfiguration内で量産してみます。

またQueryExplorerです。今度はSegmentの下にある箱にチェックを入れます。
![スクリーンショット 2018-10-11 14.35.15.png](https://qiita-image-store.s3.amazonaws.com/0/207239/e365faa0-9348-6ad0-a561-1443ec3a70f0.png)

すると、セグメントはIDでなく、セグメントの条件がそのまま表示されます。
```sessions::condition::ga:timeOnPage>60;ga:timeOnPage<=120
```


こういうことになりそうですね。この要領で、30分まで量産します。
![スクリーンショット 2018-10-11 14.40.21.png](https://qiita-image-store.s3.amazonaws.com/0/207239/a9cc8dc0-d773-f72b-26a2-9e25d9b6e30d.png)

こうなりました（セッション数の9は手入力）。
![スクリーンショット 2018-10-11 14.43.03.png](https://qiita-image-store.s3.amazonaws.com/0/207239/2585a75b-d840-375a-7ab0-d2fdc652b7f1.png)

小ネタレベルですが、こんな感じに関数を作り、そのセルを下にコピーしていくのが早いのではないでしょうか。
![スクリーンショット 2018-10-11 14.43.53.png](https://qiita-image-store.s3.amazonaws.com/0/207239/84bb7680-1436-ea2f-1d23-1de98c1b0de2.png)


ここまでできたらReportConfigurationの画面に戻ります。
上で作ったA列のセグメント名とB列のセグメント条件を、ReportConfigurationの10行目に貼り付けます。
エクセルでいう「行と列を入れ替えて貼り付け」でもいいですが、スプレッドシートでこの操作をするなら```=TRANSPOSE()```が便利です。
![スクリーンショット 2018-10-11 14.48.50.png](https://qiita-image-store.s3.amazonaws.com/0/207239/0327f8fe-77c6-24e3-b24b-a5b760dce761.png)

ここで、しれっと指標に```ga:bounces（直帰数）```を入れました。
B列の「1分以内」で抽出できるセッション数には、直帰のセッション（timeOnPageが0）が含まれます。
のちのち直帰のセッションを集計対象に入れるか入れないかはこのときよく考えていなかったものの、入れる入れないどちらにも対応できるように拾っておきます。
C列以降のga:bouncesは0になるはずです（コピペしただけなので、本当はMetricsの欄に入れる必要は特にありません）。

ここまで設定できたら、RunQueryを押しましょう。

## データを集計する
それぞれのデータが、各シートに返ってきています。
スプレッドシートアドオンでは、1行につき1シート、データを作って返してくれます。
今回は、「1分以内〜31分より多い」の31シートに分けてデータを取得しました。
![スクリーンショット 2018-10-11 15.04.50.png](https://qiita-image-store.s3.amazonaws.com/0/207239/96375e77-8415-edf6-39c4-73976970bd58.png)

今回、各シートから拾ってくるデータは一セルだけなので、ポチポチせずとも```=INDIRECT()```で取れそうです。
シート名も```=TRANSPOSE()```で指定した甲斐がありました。
![スクリーンショット 2018-10-11 15.08.34.png](https://qiita-image-store.s3.amazonaws.com/0/207239/4f035824-3e73-928c-3927-fdab024c8774.png)

念の為C列のSUMをGAの画面と見比べます。
セグメントを「すべてのユーザー」としたときのセッション数とC列の合計が一致すれば、セッションを取り漏らさずにどれかの行に入れられたということになります。

これで、集計できるデータが整いました。
キャプチャ例では9.1〜9.30を抽出期間に指定しましたが、抽出期間を3ヶ月とおいて、4回に分けてクエリを動かせば、丸一年のデータも比較的楽に取得できます。

あとは、これをグラフにして終わりです
（残念ながら、例に用いた私のブログのデータでは、直帰ばかりでなにがなんだかわかりませんでした）。
![スクリーンショット 2018-10-11 15.21.25.png](https://qiita-image-store.s3.amazonaws.com/0/207239/a4ba18ad-e470-0a92-5752-fa0b38af5fd3.png)




## この手法の延長
セグメント設定で使える指標でさえあれば、どんな指標でもこのような集計ができると思います。

あくまで例ですが、ECサイトであれば
- 横軸に「セッション内で見た商品の数（=仮に、目標1の完了数）」
- 縦軸に「商品購入数（=eコマースのコンバージョン）」
を入れて集計すれば、『商品を買ってくれたユーザーのうち●%は商品ページを▲ページ見ている』といった示唆が得られるかもしれません。

メディアサイトであれば、今回紹介した図表をセッションあたりのPVごとに作れば、一つのセッションでたくさん記事を読む人とそうでない人の、サイト内の行動（熟読しているかどうかetc）の差が見られるかもしれません。

さらに、ローデータを抽出する際に「ユーザータイプ」「デバイスカテゴリ」「チャネル」「ランディングページ」「2ページ目」なんかを条件に含めておけば、ユーザーの種別を細かく切った上で、それぞれのデバイスやチャネルに該当するユーザーの行動、ランディングページのパフォーマンスなどを知ることができそうです。

## さいごに
以前Web担フォーラムさまの記事でも読んだ気がしますが、GAはやはりセグメントを使ってなんぼだと思いました。

CoreReportingAPIでディメンションを複数使ってデータをこねくり回すのもいいですが、ヒット/セッションのディメンションの使い分けが難しかったり、データ行数が増えてしまったり、思い通りのデータを出すのに試行錯誤が必要です。

一方で、セグメント使ってデータを細かく分けるためには、逐一GAの画面でセグメントを作る必要がありました。
セグメントの保存や設定確認のためにいちいち通信しなければいけないのは鬱陶しかったり、保守性・更新性がよくなかったり...というのがイヤで敬遠していました。

ただ、今回紹介したような方法で、セグメントを量産できるのであれば話は別です。
今回は"指標"をセグメント条件に用いましたが、当然ディメンションも条件に使えます。
サイト内の行動を知る上で、「ページ」「第●階層」は特に条件に使いたいディメンションです。

このような、複雑で手の混んだレポートをできるだけ楽に正確に取得できるようにしていきたいですね。


### ※追記 GA上級者の方に質問です...
セグメントの指定は、これしかやりようがないんでしょうか？
もっと簡単に指定する方法をご存知の方がいらっしゃれば、コメントくださると嬉しいです...！