TableauでGA4データを可視化してみた

こんにちは。データアナリストの卵、渡辺です。デジタルマーケティングエージェンシーにて、GA4を中心としたWebサイト分析業務に従事しております。

GA4データの可視化をするためのBIツールとしては、無料かつ、Google関連サービスとの接続がしやすいLooker Studioを用いるケースが多いと思います。しかし、グラフ描画の自由度や利用できるコネクタの種類についてはTableauのほうが優れているため、今回TableauでのGA4データの可視化を行ってみました。

結論としては、記事執筆時点では**TableauのGA4コネクタでデータの可視化を行うのは難しく、BigQueryを経由したデータのつなぎ込みが必要**と考えています。

## GA4データのつなぎこみ方法：2023/8/25時点ではBigQuery経由が現実的

GA4のデータをつなぎこむ基本的な方法は、TableauのGA4コネクタを使うか、BigQueryを経由するかの2択です。

BigQueryを経由したほうが自由度の高いデータマートを作ることができますが、**SQLを用いたデータマートの整形が必要**なので、コネクタを使いたい方が多いでしょう。しかし、残念ながら2023/8/25時点ではTableauのGA4コネクタは不安定な印象があります。

### TableauのGA4コネクタ

どのような点が不安定であったか、使ってみた感想を記録しておこうと思います。

まずTableau Desktopを開いてみると、「Google Analytics 4」というコネクタがあります。もし見つからない場合は、検索窓に「Google」などと入れると、追加のコネクタとしてインストールできると思います。

![tableaudp_コネクタ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536634/b826588a-81a9-39a7-f566-0fddaa38ebea.png)

しかし、これを使おうとしてみると、
![tableaudp_コネクタエラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536634/a56d4e14-1fb0-40e7-e9ad-2aa633e3b000.png)

このようなエラーとなり、接続できませんでした。このエラーコードはTableauのサポートコミュニティでも該当するアンサーがなく、私だけかと思っていたのですが、ググった感じ、同様のエラーが出ている方もいました。

Tableau DesktopのGA4コネクタの動作は、接続の時点からかなり不安定なようです。

一方、**Tableau Cloudからは接続でき**、GA4アカウントの権限があるGoogleアカウントを認証すると、このような画面になります。

![コネクタ接続.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536634/597e13f9-4205-0f61-e95e-0404f4d17784.png)

以下を順に選んでいきます。

1）連携するアカウント
2）データの日付範囲
3）ディメンションとメトリクス（指標）

#### データの日付範囲
日付範囲は柔軟に選ぶことができます。絶対指定、開始日だけ指定、相対指定の3種類です。

![日付選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536634/04591dc2-af08-6c64-c014-2a90a3fbc5bd.png)

#### ディメンションとメトリクス（指標）
まず制限としてはディメンションは9まで、メトリクス（指標）は10まで、とのこと。使用可能なディメンションはかなり幅広く用意されており、よく使われるものはすべて用意されているように思えます。

**ディメンション**
| 大分類| 何についてのディメンションか | 項目例 |
|:-----------|:------------|:------------|
| Attribution| ユーザーがコンバージョンを達成するまでにたどった経路| ・Default channel group <br>・Source <br>・Medium|
| Demographics| ユーザーの属性     | ・Age <br>・Gender       |
| Ecommerce     | Eコマースの情報       | ・Item category <br>・Item ID   
| Event        | イベント          | ・Event name <br>・Is conversion 
| Event-scoped Custiom Dimension  | イベントスコープで設定した任意のカスタムディメンション       | -     | 
| Geography   | 地理的情報   | ・City <br>・Country   |
| Other      | 分類できないイベントパラメータ     | ・Link URL <br>・Percent scrolled <br>・Video URL       |
| Page / Screen   | ページ（スクリーン）     | ・Content Group <br>・Page location<br>・Landing page      |
| Platform / Device      | プラットフォームやデバイス      | ・Device category<br>・App version       |
| Time       | 日付     | ・Date<br>・Date + hour(YYYYMMDDHH)<br>・Year month          |
| Traffic Source     | 流入経路      | ・First user default channel group<br>・Session default channel group<br>・Session source / medium
| User   | ユーザー情報  | ・Audience ID<br>・New / returning    |
| User Lifetime      | ユーザーごとのライフタイム | ・First session date |

**メトリクス**
| 大分類| 何についての指標か | 項目例 |
|:-----------|:------------|:------------|
| Ecommerce|Eコマース| ・Ecommerce purchases<br>・Transactions
| Event| イベント | ・Conversions<br>・Event count<br>・Event count per user<br>・Events per session|
| Event-scoped Custom Metric     | カスタムイベント | -
| Event        | イベント          | ・Event name <br>・Is conversion 
| Event-scoped Custiom Dimension  | イベントスコープで設定した任意のカスタムディメンション       | -     | 
| Other | 分類できないもの  | ・Ads clicks<br>・Ads cost<br>・Cart-to-view rate<br>・Organic google search average position|
| Page / Screen   | ページ（スクリーン）     | ・Views<br>・Views per session<br>・Views per user |
| Publisher | パブリッシャー広告 | ・Ad unit exposure |
| Revenue| 購入| ・Average purchase revenue<br>・Total revenue |
| Session | セッション | ・Average session duration<br>・Bounce rate<br>・Engaged Sessions<br>・Sessions
| User   | ユーザー  | ・Active users<br>・New users<br>・Total users

今回は以下ディメンションとメトリクスを選びました。
![ディメンションとメトリクス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536634/244271ae-05eb-dc67-0e6e-4f67a7e12b5e.png)

**選択したディメンション**
1. Date
2. YearMonth
3. Event name
4. Landing page
5. Page path
6. Page title
7. Session default channel group
8. Session source / medium
9. Device category

**選択したメトリクス**

1. Views
2. Views per session
3. Average session duration
4. Bounce rate
5. Sessions
6. Total Users

特に問題なく接続が完了し、データソースが表示されました。

![データソース表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536634/8f868c9d-c4dd-32d2-7a8c-e101e90b0a0a.png)

ここから「Sheet1」に移動しようとすると、「データの抽出」が開始されます。しかし、2分ほど抽出のローディングが進むと、このようなエラーが返ってきてしまいました。

![抽出エラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536634/e8dd1fa2-af8c-529c-3dbb-b15d1f15d6ab.png)

![抽出エラー詳細.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536634/92245403-6ee8-65fb-b2e9-7b6fc099c738.png)

>エラー
value - Exception changing string '(not set)' to integer - Error parsing number
Unable to create extract

どうやら(not set）という値がエラーを引き起こしているようです。とはいえ、抽出を作る前の段階でこのエラーが出てきているので、計算フィールドを作ってこのエラーを回避することはできそうにありません。

一つ一つディメンションやメトリクスを外していったところ、どうやら Session Source Medium がこのエラーを引き起こしているようでした。現状対処法がない（カスタマーサポートに問い合わせ中）ので、Session Source Medium は外して再度トライしてみます。

すると、無事抽出の作成が完了しました。ただし、成功するまでに3回のサーバーエラーで失敗したので、コネクタの挙動は不安定と言わざるを得ないです。おそらくデータが重いのかなと思います。

#### データの妥当性検証
まずはデータがしっかり出ているか確認したいので、GA4の探索で同じレポートを作って検証してみました。

![日別ディメンションあり検証.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536634/dc748e9a-49a1-6663-5ca2-6b00422abeb4.png)

**パッと見ておわかりいただける通り、数値が合いません。** 
どちらも8月24日にややトラフィックが跳ねている傾向は一致していますが、全体的にTableauはトラフィックが少なすぎます。

さらに、抽出期間は2021年7月1日〜にしていたのですが、なぜかTableauでは2022年8月15日からしか表示されませんでした。

ディメンションを年月にしてみましたが、やはり数字は合いません。

![月別ディメンションあり検証2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536634/e5b4dab9-ca1b-e6e0-c8fe-d1a8e1cf0a91.png)

Tableau側でどのように集計されてこの数値になっているのかはわかりませんが、今回ディメンションを9つ登録しているので、ディメンションによってなにか算出が狂っているのかもしれません。

そこで、DateとYear Month以外のディメンションをすべて除外して比較してみました。ディメンションを落とすと、抽出期間として設定した2021年7月1日から表示されました。

下記画像は先程の比較と期間をあわせています。

![日別ディメンションなし検証1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536634/cdb9c43d-4da7-c463-d312-23809861a0b2.png)

今回は数値がしっかり合いました。**やはりディメンションがメトリクス（指標）の集計に影響を及ぼしているようです** 。影響を受けずに集計できるディメンションもあるのかもしれませんが、一つ一つ加えてもよいディメンションを探していくのにも手間がかかりますね。

ディメンションを年月にすると、若干差は生まれましたが、集計方法の差として許容できる範囲に見えます。

![月別ディメンションなし検証2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536634/f82880eb-76a0-6a49-df78-3144bba59164.png)

このように、TableauのGA4コネクタは、

- 動作が不安定
- ディメンションを追加すると数値が狂う

上記2点から、まだ安定的に使えるものではないと思います。

### BigQueryのつなぎ込み
コネクタを使う方法以外に検討できるのが、BigQueryからのつなぎ込みです。BigQueryはGoogleのクラウド側データベースで、GA4からGAデータのBigQueryエクスポートが無料（※BigQueryの利用料はかかります）になっています。

GA4からBigQueryにデータをエクスポートをして、それをTableauに接続することができます。

BigQueryのコネクタは、以下2種類あります。

- Google BigQuery
- Google BigQuery(JDBC)

![BigQueryコネクタ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536634/893d47c6-3a5a-a0b2-4f67-50d2bb5393d1.png)

前者は通常のコネクタ、後者はエンタープライズ向けの高速コネクタで、次のような特長があるようです。

- データ抽出が高速化
- 一時的なステージングテーブルの名前を指定可能
- 異なるBigQueryプロジェクトからのテーブルを結合できる
    - 1つのテーブルに接続したら、Tableauデータペインのユーザーインターフェイスを使用して、別のプロジェクトに移動し、データモデルにテーブルを追加することができる

https://www.tableau.com/blog/fast-and-flexible-access-data-tableaus-google-bigquery-jdbc-connector

JDBCのほうを利用する際はコネクタ接続時に請求先プロジェクトの選択が必要なので、おそらくコネクタ利用にお金がかかるような仕様かと思います（パフォーマンスが良いので当然ですが）。

#### Tableauに接続するGA4データ

Googleアカウントでのログインをして、BIツール接続用に作ったマート層を接続します。なお、GA4からBigQueryエクスポートの設定をしたテーブルを、そのままTableauにつなぎこむことはできません。

**GA4からエクスポートされたローデータのテーブルは、レコードがネストされた状態（入れ子）であるため**です。

▼event_params.keyという列に複数の値が入っている
![ネストされたデータ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536634/e4c0b3ad-661c-2c4e-022c-0f2c00ff5188.png)

これをそのまま読み込もうとすると、エラーになります。
![ネストデータによるエラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536634/6d3e0322-d746-0781-20e8-baaf31a8733c.png)

したがって、Tableauに限らずBIツールでGA4のエクスポートデータを可視化したい場合は、SQLを用いてデータを整える必要があります。PVやセッションを集計する程度であれば、Tableau上でカスタムSQLを書いてしまう方法もあるのですが、GA4のデータはあくまでイベントをリスト化しただけのデータなので、ランディングページや参照元メディアなどをしっかりと可視化したい場合はBigQuery上にマート層を作ることをおすすめします。

マート層を作るのはGA4の仕様を深く理解していないと難しいため、専門の会社に頼むとよいでしょう。

今回はイベントデータのマートを作成し、接続しました。2021年4月頃からデータが溜まっており、レコード数は1,200万行程度です。

![データセット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536634/30326593-4489-54fd-5a46-7cdacd9290b4.png)

Tableau Desktopからの接続だとデータが重すぎるのか、Tableau Desktopが固まるケースが多々あったので、Tableau Cloudから抽出を作成してみました。

高速化が期待できるJDBCを利用しましたが、それでも抽出を作成するのに15分ほどかかり、挙動はかなり重かったです。なので、今回は2022年7月1日から2023年7月31日の1年間に絞りました（データは850万行ほどに）。

長期間のデータを接続したい場合は、Tableau用にレコード数をおさえたデータマートを作るか、あらかじめある程度集計した状態のテーブルを読み込むなどする必要がありそうです。

こちらのデータでGA4の探索画面との数値を比較してみると、以下の通りでほぼ同等の数値が出ていることがわかります。

![Bigqueryと探索の比較.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536634/62dd4a05-2d12-dd05-69f7-336a2a66a35d.png)

[Googleの公式ヘルプ](https://support.google.com/analytics/answer/9191807?hl=ja&sjid=17692320453030338129-AP)には「**BigQuery の計算結果と、標準レポート、カスタム レポート、データ探索ツール、Looker Studio の計算結果にはわずかな差異が生じることがあります。**」と記載されています。「元データからより正確な結果を取得したい場合は、BigQuery で結果を確認してください。」という記載もあり、BigQuery以外の画面から見られるセッションなどはあくまでデータをもとに[効率的な計算方法](https://developers.google.com/analytics/blog/2022/hll?hl=ja)が適用されたもののようです。

若干数値の乖離幅が大きい箇所はありますが、一旦はBigQuery由来の値を正としてTableauで簡単なグラフを描画してみました。

**時系列グラフ**
![月次アクセスグラフ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536634/0c963b52-8431-7df4-8c46-ffe61cc2746c.png)

**閲覧コンテンツ傾向**
![閲覧コンテンツ傾向.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536634/07af7c0c-3d41-6fe9-2386-1c37b6b6fbe9.png)

## Tableauを使ってみた感想

普段Google系のサービスのデータを扱うことが多いので、使うBIツールはもっぱらLooker Studioでした。

Tableauに本格的に触ってみて、とにかくTableauはカスタマイズ性がすばらしいという印象を受けました。今回は私のTableauスキルがまだまだなこともあり、シンプルなダッシュボードしか作れていないですが、レイアウトやグラフのビジュアルなどをかなり操作できます。このあたりはおいおいまだ勉強していこうと思います。

Looker Studioだと基本的なグラフは用意されているものの、一定の値より上回っている指標の色を変える、というような動的なデザインはできません。Tableauのほうがビジュアル面での自由度が優れています。

また、予測機能もTableauの大きな強みですね。時系列データに対して重み付けをして需要を予測する「指数平滑法」が適用されており、信頼度の高い予測と言えると思います。

さらに、Tableau GPTというAIソリューションをリリースするというニュースも発表されています。これはTableauで可視化したデータに対し、インサイトをTableau側から提示してくれる機能のようで、活用できればかなりデータを解釈するヒントとして役立てられると思います。Tableau GPTとTableau Pulse は24年春に一般提供される予定とのこと。

https://www.tableau.com/blog/tableau-pulse-and-tableau-gpt

データ分析も自動化がキーになってくるなかで、Tableauの予測機能や今後実装予定のTableau GPTをどれだけ有効活用できるかはデータドリブンな意思決定のキーになってきそうです。

Tableau GPTが提供開始されたら、また使ってみてまとめようと思います。