GA4のページパス別のユーザー数をRで箱ひげ図とジッターとして可視化する

## はじめに

実務でGA4から取得したページパス別のユーザー数をRで箱ひげ図とジッターとして可視化する機会があったため、メモ書きとして残しておくことにします。

## アウトプット

最終的に、GA4から取得したページパス別のユーザー数（サンプルデータ）を以下のような形でRで箱ひげ図とジッターとして可視化することができました。

![boxplot_ga4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2290540/e677cb5f-c657-eac6-8742-79c3531f1772.png)


## 作業手順

1. GA4またはBigQueryでページパス別のユーザー数を取得する
1. 1で取得したデータをRで箱ひげ図とジッターとして可視化する

## ページパス別のユーザー数を取得する

### 前提

本工程で取得した結果は、ツールごとにそれぞれ以下の形式でエクスポートします。

GA4テーブルとしてBigQueryエクスポートしている方は、BigQueryを利用しても問題ございません。

- GA4
  - Google スプレッドシート（CSVも可）
- BigQuery
  - BigQuery テーブル（RからBigQueryに、bigrqueryというライブラリで接続するため）

参考：https://dev.classmethod.jp/articles/bigrquery/

なお、エクスポートしたデータの中身ついて、以下のようなTidyなデータ形式に前処理しておく必要があります。

| date | page_path | uu |
|:-----|:----------|:---|
| 20241001 | hoge | 100 |
| 20241001 | fuga | 200 |
| 20241001 | foo  | 300 |
| 20241002 | hoge | 450 |
| 20241002 | fuga | 300 |
| 20241002 | foo  | 600 |

### GA4

まずは、添付画像のような形でGA4の探索レポートでページパス別のユーザー数を取得します。その後、Google スプレッドシートにエクスポートします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2290540/6c67c77c-2065-b21f-5c59-264fc9763d84.png)

Google スプレッドシートにエクスポートされた結果を確認すると、すでにTidyなデータ形式となっています。（今回は、サンプルデータを使用しています。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2290540/3ddf067f-759c-6231-d6d1-0127f844b4c4.png)

GA4を利用した場合の前処理は以上です。

### BigQuery

BigQueryの場合、事前にエクスポートされたGA4テーブルに対して以下のクエリを実行すれば想定した結果が取得できます。

``` SQL
SELECT
 event_date AS date,
 IFNULL(bqutil.fn_asia_northeast1.url_parse(bqutil.fn_asia_northeast1.get_value("page_location", event_params).string_value, 'PATH'), "/") AS page_path,
 COUNT(DISTINCT user_pseudo_id) AS uu
FROM
 `projectId.datasetId.events_*`
WHERE
  _TABLE_SUFFIX BETWEEN "yyyymmdd" AND "yyyymmdd"
GROUP BY
  event_date,
  page_path
ORDER BY
  date ASC
```

なお、BigQuery Utilsのリージョン部分についてはご自身のGA4テーブルのリージョンに合わせてご利用ください。

添付画像のような形で取得した結果を、BigQuery テーブルとして任意のデータセット配下に保存しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2290540/f62d9cdb-05fe-bc6a-84c1-c5e509f8d93c.png)

BigQueryの場合の前処理は以上です。

## Rで箱ひげ図とジッターとして可視化する

### GA4

以下のようなRスクリプトを実行すれば、先ほどのGoogle スプレッドシートのデータを読み込み、Rで箱ひげ図とジッターとして可視化することができます。

``` r
install.packages('googlesheets4')
install.packages("tidyverse")
install.packages("ggplot2")

library(googlesheets4)
library(tidyverse)
library(ggplot2)

raw_data <- read_sheet("${url}")

box_plot <- ggplot(raw_data) +
  geom_boxplot(aes(x = page_path, y = uu)) +
  geom_jitter(aes(x = page_path, y = uu, color = page_path), width = 0.2)

plot(box_plot)
```

簡単にコードの説明書きを残しておきます。

```library(googlesheets4)```で、Google スプレッドシートの読み込みが可能です。初回のスクリプト実行時は、APIの認証を許可する必要があります。

``` r
raw_data <- read_sheet("${url}")
```

各関数の記述の内容は次の通りです。

- ```geom_boxplot```
    - 箱ひげ図を生成して、引数でx軸、y軸に描画する内容を指定する
- ```geom_jitter```
    - データポイントを分散させて表示する
    - widthで横方向の分散を設定し、データポイントが重ならないようにする

``` r
box_plot <- ggplot(raw_data) +
  geom_boxplot(aes(x = page_path, y = uu)) +
  geom_jitter(aes(x = page_path, y = uu, color = page_path), width = 0.2)

plot(box_plot)
```
 
最終的に、plotした結果は以下の通りです。

![boxplot_ga4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2290540/86f323b1-bba3-7a2b-c0c7-cb9d1b43e33b.png)


### BigQuery

Rのbigrqueryというライブラリを利用すれば、RからBigQueryに直接接続し、BQテーブルとして保存されたデータを取得することが可能です。

Rスクリプトは、以下のような形になります。

``` r
install.packages('bigrquery')
install.packages("tidyverse")
install.packages("ggplot2")

library(bigrquery)
library(tidyverse)
library(ggplot2)

bq_auth()
billing <- "projectId"

sql <- "select * from `projectId.datasetName.tableName`"

tb <- bq_project_query(billing, sql)
raw_data <- bq_table_download(tb)

box_plot <- ggplot(raw_data) +
  geom_boxplot(aes(x = page_path, y = uu)) +
  geom_jitter(aes(x = page_path, y = uu, color = page_path), width = 0.2)

plot(box_plot)
```

前半部分のRからBigQueryに対してクエリを実行する記述の内容は以下の通りです。

- ```bq_auth()```
    - 認証を行う
- ```tb <- bq_project_query(billing, sql)```
    - 引数に請求先のプロジェクトとSQLを持たせて、SQLを実行する
- ```bq_table_download(tb)```
    - SQLの実行結果をテーブルとして変数に格納する

最後に、plotすれば先ほどと同じような箱ひげ図とジッターの完成です。

## おわりに

今回は、サンプルデータを利用したため、あまり面白い箱ひげ図になりませんでした。

ただ、実際のWebサイトのアクセスログを利用すれば、ひげが長いページがあったり、外れ値があったりと新たな発見があるのではないでしょうか。

ジッターのようなLooker Studioにはない可視化の表現が、Rにはあったりするので面白いですね。

どなたかの参考になれば、幸いです。