
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
『Googleアナリティクス4 完全入門』 書籍販売中!