[BigQuery] AI.KEY_DRIVERS:GA4セッション数 増加の主要因分析

Google CloudのBigQueryにおけるAI.KEY_DRIVERS関数は、特定の数値指標に大きな変化をもたらした主要なデータセグメントを特定するためのツールとなります。

この関数は、対象となる興味のあるデータセットと比較用の参照データセットを対比させることで、統計的に有意な差を生んでいる要因を自動的に抽出します。従来のモデル作成を必要とする手法よりも簡略化された構文で記述でき、不要な情報の自動削除や高速な実行が可能です。

要因のセグメントとしては最大12個の次元を指定して、売上や利用数などの合算可能な指標の変動理由を多角的に分析することができます。具体例として、売上金額の増加に最も貢献している商品や店舗の特定など、ビジネス上の変化を引き起こした重要な要因を迅速に特定する際に活用されます。

AI.KEY_DRIVERS 構文

AI.KEY_DRIVERS(
    { TABLE TABLE_NAME | (QUERY_STATEMENT) },
    metric_col => 'METRIC_COL',
    dimension_cols => DIMENSION_COLS,
    interest_label_col => 'INTEREST_LABEL_COL'
    [, min_apriori_support => MIN_APRIORI_SUPPORT]
    [, top_k => TOP_K]
    [, enable_pruning => ENABLE_PRUNING]
)

【必須引数】

  • 第一引数 (`TABLE TABLE_NAME` または `(QUERY_STATEMENT)`) 
    • 分析対象のデータソースを指定します。テーブル名を指定する場合は `TABLE テーブル名` 、サブクエリを使用する場合は括弧で囲んで `(SELECT …)` のように記述します
  • metric_col (STRING型)
    • 変化を分析したい数値メトリクスの列名を文字列で指定します(例: ‘sales’` や `’SUM(sales)’)。合計可能な(加算可能な)数値列である必要があります。
  • dimension_cols  (ARRAY<STRING>型)
    • 要因分析の軸とするディメンション列名の配列を指定します(例: [‘state’, ‘city’])。
    • 列のデータ型は `INT64`、`BOOL`、`STRING` のいずれかで、1〜12個の列を指定できます。
  • interest_label_col (STRING型)
    • 行が分析対象(関心群/TRUE)か比較対象(参照群/FALSE)かを示す `BOOL` 型列の列名を指定します。

【任意引数】

  • min_apriori_support (FLOAT64型)
    • 出力に含めるセグメントの最小アプリオリ・サポート閾値(0〜1の範囲)を指定します。全体に占める割合が小さすぎるセグメントを除外します。デフォルト値は `0.1`(10%)です。
  • top_k (INT64型)
    • アプリオリ・サポート値が高い上位 `K` 個(1〜1,000,000)のインサイトのみを出力します。
    • `min_apriori_support` と `top_k` を同時に指定することはできません**
  • enable_pruning (BOOL型)
    • 重複する冗長なインサイトを除外(プルーニング)するかどうかを指定します。デフォルトは `TRUE` で、より詳細な情報を持つセグメントを残して不要な重複を削ぎ落とします。

【出力フィールド】

  • drivers
    • 要因として特定されたセグメントのディメンション値の組み合わせ
  • metric_interest
    • 関心群(Interest dataset)における対象セグメントのメトリクス合計値
  • metric_reference
    • 参照群(Reference dataset)における対象セグメントのメトリクス合計値
  • difference:metric_interest – metric_reference
    • 関心群と参照群のメトリクス実数値の差分
  • relative_difference:difference / metric_reference
    • 参照群に対するメトリクスの相対的な変化率
  • unexpected_difference:metric_interest – expected_metric_interest
    • 全体の変化傾向から予想される「期待値」に対する、実際の `metric_interest` の予期せぬ変化量
  • apriori_support
    • セグメントがデータ全体に占める規模感(関心群全体に対する割合、または参照群全体に対する割合のいずれか大きい方)
  • contribution:ABS(difference)
    • 差分の絶対値

活用事例:GA4セッション数 増加の主要因分析

AI.KEY_DRIVERS関数を使い、GA4でセッション数が増加した特定の日を対象に、その増加要因を分析します。なお、分析にあたっては事前に要因を探索する範囲を指定する必要があるため、今回は「デバイス」「国」「参照元」の中から特定していきます。

CREATE TEMP FUNCTION date_from() RETURNS STRING AS ('20260801');
CREATE TEMP FUNCTION date_to()   RETURNS STRING AS ('20260930');

-- =============================================================================
-- 一時関数(TEMP FUNCTION)の定義
-- 指定基準日(target_date)から過去 N 週分の同一曜日(当日含む)を構造体配列で返す
-- =============================================================================
CREATE TEMP FUNCTION get_past_same_weekdays(
  target_date DATE,
  weeks_back INT64
)
RETURNS ARRAY<STRUCT<past_date DATE, table_suffix STRING, weeks_ago INT64>>
AS (
  ARRAY(
    SELECT AS STRUCT
      past_date,
      FORMAT_DATE('%Y%m%d', past_date) AS table_suffix,
      weeks_ago
    FROM
      UNNEST(
        GENERATE_DATE_ARRAY(
          DATE_SUB(target_date, INTERVAL weeks_back * 7 DAY),
          target_date,
          INTERVAL 7 DAY
        )
      ) AS past_date
      WITH OFFSET AS pos,
      UNNEST([weeks_back - pos]) AS weeks_ago
    ORDER BY
      past_date DESC
  )
);

-- =============================================================================
-- メインクエリ:GA4データ集計と AI.KEY_DRIVERS による要因分析
-- =============================================================================

-- 1. 一時関数を呼び出して行展開し、比較対象日(9/8 当日 + 過去3週の火曜日)を準備
WITH 
  TargetDays AS (
    SELECT
      past_date,
      table_suffix,
      weeks_ago,
      (weeks_ago = 0) AS is_target_date,
      COUNTIF(weeks_ago > 0) OVER() AS ref_weeks_count
    FROM
      UNNEST(get_past_same_weekdays(DATE('2026-09-08'), 3))
  ),

  -- 2. GA4生ログから対象日のセッション数をディメンション別に集計
  DailyDimensionSessions AS (
    SELECT
      e.event_date,
      t.is_target_date,
      t.ref_weeks_count, 
      IFNULL(e.device.category, '(unknown)') AS device_category,
      IFNULL(e.session_traffic_source_last_click.cross_channel_campaign.source, '(direct)') AS source,
      IFNULL(e.session_traffic_source_last_click.cross_channel_campaign.medium, '(none)') AS medium,
      IFNULL(e.session_traffic_source_last_click.cross_channel_campaign.campaign_name, '(none)') AS campaign,
      IFNULL(e.geo.country, '(unknown)') AS country,
      COUNT(DISTINCT CONCAT(user_pseudo_id, '-', CAST((SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS STRING))) AS _ss
    FROM
      `<project>.<dataset>.events_*` AS e
    INNER JOIN
      TargetDays AS t
      ON e._TABLE_SUFFIX  = t.table_suffix
    WHERE
      e.event_name = 'session_start'
      AND e._TABLE_SUFFIX  BETWEEN date_from() AND date_to()
    GROUP BY ALL
  ),

  -- 3. 「9月8日当日」と「過去3週分の1日あたり平均値」をユニオンオール(正規化)
  PreparedData AS (
    SELECT
      device_category,
      source,
      medium,
      campaign,
      country,
      _ss AS session_metric,
      TRUE AS is_target_date
    FROM
      DailyDimensionSessions
    WHERE
      is_target_date = TRUE
    UNION ALL
    SELECT
      device_category,
      source,
      medium,
      campaign,
      country,
      SUM(_ss) / ANY_VALUE(ref_weeks_count) AS session_metric,
      FALSE AS is_target_date
    FROM
      DailyDimensionSessions
    WHERE
      is_target_date = FALSE
      
    GROUP BY
      device_category,
      source,
      medium,
      campaign,
      country
  ),

  Calc AS (
    SELECT
      drivers,
      ROUND(metric_reference, 1) AS avg_past_sessions,
      ROUND(metric_interest, 1) AS target_day_sessions,
      ROUND(difference, 1) AS session_diff,
      ROUND(relative_difference, 3) AS rel_diff,
      ROUND(unexpected_difference, 1) AS unexpected_diff,
      apriori_support,
      contribution
    FROM
      AI.KEY_DRIVERS(
        TABLE PreparedData,
        metric_col => 'session_metric',
        interest_label_col => 'is_target_date',
        dimension_cols => ['device_category', 'source', 'medium', 'campaign', 'country'],
        top_k => 10
      )
    ORDER BY
      unexpected_difference DESC
  )

SELECT
  *
FROM
  Calc

関連記事

BigQueryのWITH句(CTE)とサブクエリの使い分け

BigQuery workflowsでGA4スキーマ履歴を管理

SQL不要でSearch Consoleを深掘り!BigQuery「会話型分析」で実現する次世代SEOデータ分析 Conversational Analytics

おすすめ記事

最近の記事
おすすめ記事
  1. [BigQuery] AI.KEY_DRIVERS:GA4セッション数 増加の主要因分析

  2. BigQuery 会話型分析の設計とデータパイプライン構築 – 生成AIを活用したデータ分析

  3. BigQuery パイプラインによるクエリ処理の定期実行

  1. [GA4] セッション キーイベントレート・ユーザー キーイベントレートとは

  2. 【GA4 SQL】ボタンクリックのイベント数をBigQueryから集計

  3. 【GA4SQL】日次のセッション数をBigQueryから取得するクエリ

PAGE TOP