GA4

【詳解】session_engaged パラメーター

GA4からBigQueryにエクスポートされるイベントのパラメータであるsession_engagedについての検証メモ

session_engagedパラメーターとは

session_engagedパラメーターとは、ユーザーのセッション行動に対して、「エンゲージメント セッション」が発生したか否かのフラグを格納している。エンゲージメント セッションは以下のいずれかを満たせばエンゲージメント セッションと判定される。

  1. 10 秒を超えて継続したセッション
  2. コンバージョン イベントが発生した
  3. 2 回以上のページビューまたはスクリーンビューが発生した

参照:エンゲージメント セッション -アナリティクス ヘルプ

そのため、session_engagedパラメータ値を集計することで、エンゲージメント セッションの定義から集計ロジックを組まずとも、エンゲージメント セッションの集計が可能になる。

session_engagedパラメーター値

基本的にはsession_engagedのパラメータ値はsession_startイベントに紐づいたsession_engagedを確認すればよい。session_engagedはエンゲージメント セッションを判定するフラグであるため、セッションの起点であるsession_startイベントのsession_engagedのパラメータ値を集計することでエンゲージのあったセッション数が求められる。逆にいえば、session_startイベント以外のsession_engagedのパラメータ値を集計しても正しい集計結果とはならない。

session_engagedパラメーターの型

session_engaged値の型はイベントによって異なり、session_startイベントのみINT型の数値で格納され、それ以外はSTRING型で格納される。それぞれエンゲージメント セッションであれば「1」となり、そうでなければ「0」となる。なお、検証結果の範囲内ではsession_startイベント以外のイベントの全てに必ずsession_engagedパラメータ値が付くとは限らない結果となった。

エンゲージメント セッションNOT エンゲージメント
session_start イベント1(INT型)0(STRING型)
それ以外のイベント1(STRING型)0(STRING型)

検証クエリ

CREATE TEMP FUNCTION date_from() RETURNS STRING AS ('20240401');  -- 開始日
CREATE TEMP FUNCTION date_to() RETURNS STRING AS ('20240930');    -- 終了日
CREATE TEMP FUNCTION parameter_name() RETURNS STRING AS ('session_engaged');  -- パラメータ名
--CREATE TEMP FUNCTION event_name_list() RETURNS ARRAY<STRING> AS (['session_start']); -- 単一のイベントを検証
CREATE TEMP FUNCTION event_name_list() RETURNS ARRAY<STRING> AS (['session_start', 'page_view', 'click', 'first_visit', 'scroll', 'user_engagement']);  -- 複数イベント名を検証
--CREATE TEMP FUNCTION event_name_list() RETURNS ARRAY<STRING> AS (['']);  -- 空欄指定で全イベント抽出

WITH
  parameter_types AS (
    SELECT
      event_name,
      param.key AS parameter_name,
      param.value.int_value AS int_value,
      param.value.float_value AS float_value,
      param.value.double_value AS double_value,
      param.value.string_value AS string_value,
      CASE 
        WHEN param.value.int_value IS NOT NULL THEN 'int_value'
        WHEN param.value.float_value IS NOT NULL THEN 'float_value'
        WHEN param.value.double_value IS NOT NULL THEN 'double_value'
        WHEN param.value.string_value IS NOT NULL THEN 'string_value'
        ELSE 'unknown'
      END AS parameter_type,
      COUNT(*) AS parameter_count
    FROM
      `<project>.<dataset>.events_*`,
      UNNEST(event_params) AS param
    WHERE
      _TABLE_SUFFIX BETWEEN date_from() AND date_to()
      AND (ARRAY_LENGTH(event_name_list()) = 1 AND event_name_list()[OFFSET(0)] = '' OR event_name IN UNNEST(event_name_list()))
    GROUP BY
      event_name,
      parameter_name,
      int_value,
      float_value,
      double_value,
      string_value,
      parameter_type
)

SELECT
  event_name,
  parameter_name,
  parameter_type, 
  int_value,
  float_value,
  double_value,
  string_value,
  parameter_count
FROM
  parameter_types
WHERE
  parameter_name = parameter_name()
ORDER BY
  event_name,
  parameter_name;

エンゲージのあったセッション数を集計するクエリ

CREATE TEMP FUNCTION date_from() RETURNS STRING AS ('20240401');

WITH
  CNT_EngagementSession AS (
    SELECT
      ymd,
      COUNT(ssid) AS _eng_ss
    FROM (
      SELECT
        ymd,
        CONCAT(user_pseudo_id, '-', CAST(ga_session_id AS STRING)) AS ssid
      FROM (
        SELECT
          PARSE_DATE("%Y%m%d", event_date) AS ymd,
          user_pseudo_id,
          (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS ga_session_id
        FROM
          `<project>.<dataset>.events_*`  
        WHERE
            _TABLE_SUFFIX BETWEEN date_from() AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
          AND
            (SELECT COALESCE(value.string_value, SAFE_CAST(value.int_value AS STRING)) FROM UNNEST(event_params) WHERE key = 'session_engaged') = '1'
          AND
            event_name = 'session_start'
      )
      GROUP BY
        ymd,
        ssid
    )
    GROUP BY
      ymd
  )

SELECT
  *
FROM
  CNT_EngagementSession
ORDER BY
  ymd ASC

クエリ解説

session_startイベントのsession_engagedパラメータ値はINT型であり、他のイベントはINT型を取らないため、集計する際はINT型のsession_engagedパラメータ値のみ集計すれば、イベント名で条件指定を行わなくても結果は同じになる。またSTRING値をINT型にCASTする必要もないが将来的に型変更が行われる可能性があるため、このような記述にしてある。

関連記事

【GA4 SQL】ページ単位のエンゲージメント分析

【GA4 SQL】再帰CTEで同一ページを除いた「2ページ目」を取得 BigQuery WITH RECURSIVE

【GA4SQL】ページ/セッションをGA4で確認する方法

PAGE TOP