はじめに:GA4データ分析における72時間更新
Google Analytics 4(GA4)は、Googleが提供する最新のウェブ分析プラットフォームです。
GA4では、イベントベースのデータモデルを採用し、より柔軟で詳細なデータ収集が可能になりました。また、BigQueryへのエクスポート機能により、生のイベントデータを自由に分析できるようになりました。
しかし、GA4のBigQueryエクスポートには、データのFIXに最大72時間かかるという仕様があります。正確にはGoogle公式のドキュメントに以下の記述があります。
日次エクスポートのテーブル(events_YYYYMMDD)は、その日のイベントがすべて収集された後に作成されます。アナリティクスでは、テーブルの日付から最大 72 時間日次テーブルが更新されます。その際、テーブルの日付でタイムスタンプが付いたイベント(例: Measurement Protocol または Firebase SDK から遅れて送信されるイベント バンドル)が使用されます。たとえば、テーブルの日付が 20220101 の場合、20220101 のタイムスタンプが付いたイベントを使用して、20220104 までテーブルが更新されます。
引用元:https://support.google.com/analytics/answer/9358801?hl=ja
つまり、BigQueryに保存されたGA4のイベントデータを利用したデータマート作成やBIツールによる可視化を自動化する場合、上記の仕様を考慮した実装が必要になります。
本ブログではGoogle BigQueryのパイプライン作成ツールであるDataformを利用した実装を解説します。
差分更新と完全更新
まずデータを取り込む際に大きく2つの方針があります。「①データを完全に更新する方法」と「②データを差分更新する方法」です。以下それぞれのメリットとデメリットを記載します。
①完全更新
既存のデータをすべて削除し、新しいデータで完全に置き換える方法。
メリット
- 常に最新のデータ状態を保てる
- データの整合性を確保しやすい
- 処理が比較的シンプル
デメリット
- データ量が多いほど処理に時間がかかる
→BigQueryの場合課金額が多くなる - システムへの負荷が高い
②差分更新
既存のデータに変更があった部分のみを更新する方法。
メリット
- データ量が多いほど処理時間を短縮できる
- システムへの負荷を軽減できる
- 既存のデータを保持できる
デメリット
- 処理が複雑になる場合がある
- データの整合性を保つための工夫が必要
GA4のイベントデータはサイズが大きいので、完全更新ではなく差分更新を行うことがベターです。
BigQueryデータフォームによる解決策:72時間差分更新
次に差分更新についてですが、通常の日次差分更新(最新の1日分のデータを追加する方法)では、以下のような不都合が発生します。
データの欠損
- 72 時間更新の仕様により、日次テーブルが作成された後もデータが追加される可能性があります。
- 差分更新のタイミングによっては、まだテーブルに追加されていないイベントデータが取り込まれない可能性があります。
- 例えば、1月1日に発生したイベントが1月4日に送信された場合、1月2日や1月3日に差分更新を行うと、このイベントデータが欠損する可能性があります。
集計の不整合
- 上記のデータの欠損により、日次集計値が正確でなくなる可能性があります。
- 特に、日次で集計処理を行う場合、後日更新される可能性を考慮する必要があります。
リアルタイム性の低下
- データの欠損、集計の不整合を顧慮してFIXのみを利用すると当然、ダッシュボー ドなどで可視化できるデータは3日前のデータが最新となり、リアルタイム性が求められる分析ニーズには答えられない。
これらの課題を解決するためにはデータ更新の度に毎回3日分のデータのみをリフレッシュする必要があります。
72時間差分更新の実装手順
3日差分更新のプロセスは以下のとおりです。
- 1. 差分更新の基準となる日時 (
event_timestamp_update_point
) を決定する。 - 2. 宛先テーブルから、
event_timestamp_update_point
以降の日付のデータを削除する。 - 3. GA4 のイベントデータテーブルから、
event_timestamp_update_point
から現在までの日付の、指定されたイベントのデータを取得する。 - 4. 取得したデータを宛先テーブルに挿入する。
以下は実装例です。
config {
type: "incremental"
description: "event_データから必要な項目を抽出し差分更新を行う",
schema: "schemaName"
}
-- テーブル作成の前にデータ更新日の設定と、宛先テーブルから更新対象データの削除を行う
pre_operations {
DECLARE
--event_timestamp_update_point:データ更新を行う日付、宛先テーブルに格納されている最新日付の3日前とする
event_timestamp_update_point DEFAULT (
${
when(incremental(),
`SELECT date_sub( max(event_timestamp), interval 3 day) FROM ${self()}`,
`SELECT timestamp("2023-08-01")`)
}
);
--event_timestamp_update_pointに核のされている日付以降のデータを宛先テーブルから削除する
DELETE FROM ${self()} WHERE event_date >= date(event_timestamp_update_point);
}
-- 宛先テーブルに最新の3日間のデータをアペンドする。3日前のデータについてはFIXデータとして次回のクエリ実行時は保持、2日前、前日データは速報データとして削除、削除後に最新データがアペンドされる
SELECT
TIMESTAMP_MICROS(event_timestamp) AS event_timestamp,
DATE(TIMESTAMP_MICROS(event_timestamp), 'Asia/Tokyo') AS event_date,
DATE(TIMESTAMP_MICROS(user_first_touch_timestamp), 'Asia/Tokyo') AS first_visit_date,
user_pseudo_id,
event_name,
event_params,
device,
geo
FROM ${dataform.projectConfig.vars.ga4dataset}.`events_*`
--event_timestamp_update_pointに核のされている日付以降のデータをGA4のイベントデータから取得する
_TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', event_timestamp_update_point) AND FORMAT_DATE('%Y%m%d',CURRENT_DATE('Asia/Tokyo'))
AND event_name IN (
'first_visit',
'page_view',
'session_start'
)
まとめ
Google Analytics 4(GA4)は、高度なデータ分析を可能にする強力なツールですが、BigQueryエクスポートにおける72時間更新という仕様が分析を妨げる要因となっています。
本稿では、GA4データを効率的に活用するための解決策として、Dataformを用いた72時間差分更新の手法を解説しました。
この手法を利用すれば、データの鮮度を維持しつつ、BigQueryのクエリ処理負荷を軽減し、コスト削減にも貢献します。本ブログが皆さまの手助けになれば幸いです。また、BigQueryの運用でお悩みのことがあればぜひ弊社までお問い合わせください。