Google Analytics 360 + BigQueryのド基本を学ぶ２

#対象の人
SQL初心者の方、
これから会社などでGoogle Analytics 360 + BigQueryを使っていく事になった人

#目標
直帰率でINNER JOINを学ぶ。
出来上がりはこんな感じのものになります。


<table>
<thead>
<tr>
<th>行</th>
<th>Date</th>
<th>BouceRate</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>2021-01-01</td>
<td>73.0</td>
</tr>
<tr>
<td>2</td>
<td>2021-01-02</td>
<td>72.0</td>
</tr>
<tr>
<td>3</td>
<td>2021-01-03</td>
<td>73.0</td>
</tr>
<tr>
<td>4</td>
<td>2021-01-04</td>
<td>73.0</td>
</tr>
<tr>
<td>5</td>
<td>2021-01-05</td>
<td>73.0</td>
</tr>
<tr>
<td>6</td>
<td>2021-01-06</td>
<td>72.0</td>
</tr>
</tbody>
</table>

直帰率は 直帰数 ÷ セッション数 で出せます。
実はこれ一つのテーブルでは出せなくて
もう一つテーブルを用意する必要があります。
具体的に見ていきましょう

#作業
##1.セッションを出す

```SQL:standardSQL
SELECT
	date AS Date,
	COUNT(DISTINCT CONCAT(fullVisitorId, CAST(visitNumber AS string))) AS Sessions
FROM
  `bigquery-public-data.google_analytics_sample.ga_sessions_*`, UNNEST(hits) AS hits
  --パブリックデータセットの bigquery-public-data:google_analytics_sample を使ってます
WHERE
  _TABLE_SUFFIX BETWEEN '20210101' AND '20210106'
  AND hits.type = 'PAGE'
  AND hits.isEntrance = TRUE
GROUP BY
	Date
ORDER BY
	Date ASC
;
```
###結果

<table>
<thead>
<tr>
<th>行</th>
<th>Date</th>
<th>Sessions</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>2021-01-01</td>
<td>410662</td>
</tr>
<tr>
<td>2</td>
<td>2021-01-02</td>
<td>406283</td>
</tr>
<tr>
<td>3</td>
<td>2021-01-03</td>
<td>408354</td>
</tr>
<tr>
<td>4</td>
<td>2021-01-04</td>
<td>383339</td>
</tr>
<tr>
<td>5</td>
<td>2021-01-05</td>
<td>352970</td>
</tr>
<tr>
<td>6</td>
<td>2021-01-06</td>
<td>308588</td>
</tr>
</tbody>
</table>

これで日別のセッション数が出せました。
直帰率を出すには他に直帰数を出す必要があります。

##2.直帰数を出す

```SQL:standardSQL
SELECT
	date AS Date,
	COUNT(DISTINCT CONCAT(fullVisitorId, CAST(visitNumber AS string))) AS Bounces
FROM
  `bigquery-public-data.google_analytics_sample.ga_sessions_*`, UNNEST(hits) AS hits
  --パブリックデータセットの bigquery-public-data:google_analytics_sample を使ってます
WHERE
  _TABLE_SUFFIX BETWEEN '20210101' AND '20210106'
  AND hits.type = 'PAGE'
  AND totals.pageviews = 1
GROUP BY
	Date
ORDER BY
	Date ASC
;
```

###結果

<table>
<thead>
<tr>
<th>行</th>
<th>Date</th>
<th>Bounces</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>2021-01-01</td>
<td>300153</td>
</tr>
<tr>
<td>2</td>
<td>2021-01-02</td>
<td>294170</td>
</tr>
<tr>
<td>3</td>
<td>2021-01-03</td>
<td>297509</td>
</tr>
<tr>
<td>4</td>
<td>2021-01-04</td>
<td>278443</td>
</tr>
<tr>
<td>5</td>
<td>2021-01-05</td>
<td>256012</td>
</tr>
<tr>
<td>6</td>
<td>2021-01-06</td>
<td>221387</td>
</tr>
</tbody>
</table>

直帰数(Bounces)は出し方はセッションと同じです。
fullVisitorId(ユニークユーザーID)とvisitNumber(ユーザーのセッション数)を文字列にしたものを
CONCATします。
ただ条件が違います。
条件を指定するWHERE句の「AND totals.pageviews = 1」。
totals.pageviewsというのはセッション中の合計ページビュー数の事です。
これが1つまり1ページしか見てない状態が直帰になります。

COUNT(DISTINCT CONCAT(fullVisitorId, CAST(visitNumber AS string)))というのは、
条件に「AND totals.pageviews = 1」にするかどうかでセッションになり直帰数にもなるので
同一テーブル内でこの2つをだせないという問題が生じます。

そこで2つのテーブルを連結させてしまうという手段を使います。

##3.直帰率を出す

```SQL:standardSQL
SELECT
	CONCAT(SUBSTR(Date_t1, 0, 4), '-', SUBSTR(Date_t1, 5, 2), '-', SUBSTR(Date_t1, 7, 2)) AS Date,
	round(Bounces/Sessions * 100,0) AS BounceRate
FROM
(
--Sessions
SELECT
	date AS Date_t1,
	COUNT(DISTINCT CONCAT(fullVisitorId, CAST(visitNumber AS string))) AS Sessions
FROM
	`bigquery-public-data.google_analytics_sample.ga_sessions_*`, UNNEST(hits) AS hits
  --パブリックデータセットの bigquery-public-data:google_analytics_sample を使ってます
WHERE
	_TABLE_SUFFIX BETWEEN '20210101' AND '20210106'
	AND hits.type = 'PAGE'
	AND hits.isEntrance = TRUE
GROUP BY
	Date
)
INNER JOIN
(
--Bounces
SELECT
	date AS Date_t2,
	COUNT(DISTINCT CONCAT(fullVisitorId, CAST(visitNumber AS string))) AS Bounces
FROM
	`bigquery-public-data.google_analytics_sample.ga_sessions_*`, UNNEST(hits) AS hits
  --パブリックデータセットの bigquery-public-data:google_analytics_sample を使ってます
WHERE
	_TABLE_SUFFIX BETWEEN '20210101' AND '20210106'
	AND hits.type = 'PAGE'
	AND totals.pageviews = 1
GROUP BY
	Date
)
ON
	Date_t1 = Date_t2
ORDER BY
	Date ASC
;

```
###結果

<table>
<thead>
<tr>
<th>行</th>
<th>Date</th>
<th>BouceRate</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>2021-01-01</td>
<td>73.0</td>
</tr>
<tr>
<td>2</td>
<td>2021-01-02</td>
<td>72.0</td>
</tr>
<tr>
<td>3</td>
<td>2021-01-03</td>
<td>73.0</td>
</tr>
<tr>
<td>4</td>
<td>2021-01-04</td>
<td>73.0</td>
</tr>
<tr>
<td>5</td>
<td>2021-01-05</td>
<td>73.0</td>
</tr>
<tr>
<td>6</td>
<td>2021-01-06</td>
<td>72.0</td>
</tr>
</tbody>
</table>

INNER JOINとは内部結合。
2つのテーブルをそれぞれ結合の対象となるカラムを指定し、データを結合するものです。

ご覧のようにFROM句に2つのテーブルが存在します。
それをINNER JOINで結合するという形になります。

```SQL:構文

テーブル1 
INNER JOIN 
テーブル2 
ON 
結合の対象となるカラム
```

結合の対象となるカラムはそれぞれのカラムに同じ値が格納されているもの今回ならDate_t1 = Date_t2を使用します。

セッションが含まれるテーブルと直帰数の含まれるテーブルを紐づけて1つのテーブルにすることにより同じテーブル内にセッションと直帰数の2つが含まれている状態を作り出す事により同一テーブル内からセッションと直帰数を取得できるようになるというイメージで考えればわかりやすいかと思います。

結合は覚えておくと
例えば天気のデータ(日付、晴れ、雲り、雨、雪などが入ったデータ)と
お店の売上のデータ(日付、売上金額などが入ったデータ)を持っているとして
2つを同じ値の日付で結合すれば天気と売上の関係などを分析できるようになるなど、
別個のデータを繋げて使うときなどに便利です。