1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【BigQuery_1】GA4データ分析のための基本理解

Last updated at Posted at 2022-09-02

前提

以下記事を90%参考にしているので、より詳しく知りたい方はこちらを確認ください。
当記事は、以下記事を補足したり、付け足したりしたものとご理解ください。

基本的なクエリ

表示回数

ページビューイベントの発火回数のカウントで抽出。
COUNTはNULLを含まないという性質があるため、COUNTへCASE式をネストさせ、THENでカウントさせるフィールドを指定。
フィールドは何でも良い。DISTINCTしてなければ「行数のカウント」とほぼ同じため。

DISTINCTさせたuser_pseudo_idのCOUNTだと、「page_viewを発火させたユーザー数」になるため注意。

ちなみに指標に対して「〇〇した条件」を付与したい場合、COUNT関数へCASE式を入れて条件指定する方法がログ分析では一般的とされている

SELECT
 COUNT(
  CASE
   WHEN event_name = 'page_view' THEN user_pseudo_id
   ELSE NULL
  END) AS pageviews
FROM `PROJECT.analytics_XXXX.events_*`
WHERE _TABLE_SUFFIX BETWEEN 'YYYYMMDD' AND 'YYYYMMDD'

セッション

セッションIDは「ga_session_id」となる。

しかし「ga_sessions_id」というフィールドは用意されてない。
「event_params」フィールドの下層にネストされた 「key」フィールドの値として入力されている
BigQueryでは、下記2つの表のように格納されている。

event_name event_params.key event_params.value.int_value event_params.value.int_value
page_view page_location https://~.com NULL
- page_title トップページ NULL
- ga_session_id NULL 111111.555555
フィールド名 - -
▼ event_params - -
- key
- ▼ value
- string_value
- int_value

また、「ga_session_id」はユーザーごとに複数紐づいてるIDなので、ユーザーIDである「user_pseudo_id」と結合させる。
このユーザーIDとセッションIDを結合させた値のユニークカウントを「セッション数」と定義する

結合にはCONCATを利用するが、CONCATA関数は結合する両方のフィールドのデータ型がSTRING型でなければならない。
そのため、INTEGER型である「ga_session_id」をSTRING型に変換するための、CAST関数を利用している。
データ型についてはこちら

SELECT
 COUNT(DISTINCT 
  CONCAT(user_pseudo_id,
         '-',
         CAST(
          (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS string))) AS sessions
FROM `PROJECT.analytics_XXXX.events_*`
WHERE _TABLE_SUFFIX BETWEEN 'YYYYMMDD' AND 'YYYYMMDD'

ユーザ

「user_pseudo_id」のユニークカウント。
Google公式ヘルプでは、下記のように記載されている。

ユーザーの仮の ID(アプリ インスタンス ID など)

GA4で「UserID機能」を導入している場合は、「user_id」フィールドを利用。

setUserId API によって設定されるユーザー ID。

それぞれのフィールドについてはこちら

SELECT
 COUNT(
  DISTINCT user_pseudo_id) AS users
FROM `PROJECT.analytics_XXXX.events_*`
WHERE _TABLE_SUFFIX BETWEEN 'YYYYMMDD' AND 'YYYYMMDD'

CVの基本的なクエリ

「event_cv」は、purchaseイベントの発火をカウントさせた(=イベント数)CV件数。
「user_cv」は、purchaseイベントが発火したユーザーIDを重複を除いてカウントさせた(=ユーザーイベント数)CV件数。
「session_cv」は、purchaseイベントが発火したセッションIDを重複を除いてカウントさせた(=セッションイベント数)CV件数。

「session_cv」がやや複雑だが、上記セッション数のカウントと同じようにユーザーIDとセッションIDを結合させたIDと定義している。

SELECT
  COUNT(event_name) AS event_cv,
  COUNT(DISTINCT CASE WHEN event_name = 'purchase' THEN user_pseudo_id ELSE NULL END) AS user_cv,
  COUNT(DISTINCT CASE WHEN event_name = 'purchase' THEN CONCAT(user_pseudo_id, CAST((SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS STRING)) ELSE NULL END) AS session_cv,
FROM `PROJECT.analytics_XXXX.events_*`
WHERE event_name = 'purchase'

ネストされた「event_params」を抽出する方法

GA4データはネストされたフィールドが多く存在するため、UNNESTが必須。
UNNESTを知らない方はこちらを必読

ページURL別に表示回数を抽出したい場合、GA4ではディメンションにページURLを、指標に表示回数をドラック&ドロップすれば済む。
しかし、BigQueryでは、ページURL(page_location)というパラメータはネストされているため、UNNESTでネスト型を解除する必要がある。

パラメータとその値が格納されているフィールド

下記表にて説明する。下層にあるフィールドを「event_params.key」とピリオドをつけて表現。
page_locationというパラメータであれば、そのパラメータ名と値は以下フィールドで表示される。

string_valueフィールドは「STRING型」の値が入り、int_valueフィールドは「INTEGER型」の値が入る。
page_loctionは文字列でSTRING型であるため、string_valueに値が格納され、int_valueはNULLになっている。

フィールド名 - -
▼ event_params - -
- key
- ▼ value
- string_value
- int_value

ページURL別の表示回数

手順
1. 格納されているpage_locationを抽出するクエリを作成
2. 手順1のクエリをサブクエリとしてSELECT句へ追加
3. 手順2のクエリにてpage_viewイベントのカウントを行い抽出

1. 格納されているpage_locationを抽出するクエリを作成

描画イメージ

string_value
1 https://XXXX.com/
2 https://XXXX.com/price/
SELECT
  value.string_value
FROM `PROJECT.analytics_XXXX.events_*`,
UNNEST(event_params)
WHERE key = 'page_location' AND event_name = 'page_view'

2. 手順1のクエリをサブクエリとしてSELECT句へ追加

手順1のクエリをサブクエリとした際の構文は以下。
()で囲む。この構文を一つのカラムとして、SELECT句の中に設置する。

(SELECT
  value.string_value
FROM `PROJECT.analytics_XXXX.events_*`,
UNNEST(event_params)
WHERE key = 'page_location' AND event_name = 'page_view')

3. 手順2のカラムをGROUP BYしpage_viewイベントをカウント

サブクエリのFROM句にテーブル名が入力されていないが、このサブクエリはメインクエリであるFROMを参照する点、FROM句はUNNESTを参照としている点から入力していない。

SELECT
-- 表示回数を抽出するクエリ ※本ページの上部「表示回数」を参照
  COUNT(
   CASE
    WHEN event_name = 'page_view' THEN user_pseudo_id
    ELSE NULL
   END) AS pageviews,
-- 手順1のクエリをサブクエリとしてSELECT句へ追加
  (SELECT
    value.string_value
   FROM UNNEST(event_params)
   WHERE key = 'page_location' AND event_name = 'page_view') AS pages
FROM `PROJECT.analytics_XXXX.events_*`
GROUP BY pages
ORDER BY pageviews DESC

最後に

以下2つの応用で、多くのGA4データの抽出は可能。

COUNT( CASE WHEN 条件 THEN カウントさせる値(user_pseudo_idなど) ELSE NULL END) 
(SELECT 値(value.string_valueなど) FROM UNNEST(event_params) WHERE key = '目的のパラメータ(page_location)' 

次は以下必読

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?