アクティブユーザー数の定義
GA4にはユーザー数のカウント方法にいくつかの条件を付けたものを用意していて、その中の1つに「アクティブユーザー数」がある。近しい指標としては「合計ユーザー数」(探索での表記は「総ユーザー数」)があり、これは全く条件を付けずにカウントされている。対して「アクティブユーザー数」はいくつかの条件のもとにユーザー数がカウントされておりユーザー数を母数とする指標としてGA4で採用されている。「アクティブユーザー数」の条件をまとめると以下の3つのいずれかを満たせばアクティブユーザーとしてカウントされる。
- エンゲージメントセッションが発生
- first_visitイベントが付く
- engagement_time_msecパラメータの値が収集
エンゲージメント セッションが発生するか、アナリティクスで以下の情報が収集されると、アクティブ ユーザーとして認識されます。
- ウェブサイトの first_visit イベントまたは engagement_time_msec パラメータ
- Android アプリの first_open イベントまたは engagement_time_msec パラメータ
- iOS アプリの first_open イベントまたは user_engagement イベント
エンゲージメントセッションの定義は以下の通り。
エンゲージメント セッションとは、10 秒を超えて継続したセッション、コンバージョン イベントが発生したセッション、または 2 回以上のページビューもしくはスクリーン ビューが発生したセッションです。
この定義をみて疑問に感じるのは、engagement_time_msecパラメータの値が収集されればという条件がかなり緩いいため、この条件の中に「エンゲージメントセッション」も内包されるのではないのか?という点であるが、「エンゲージメントセッション」の条件を省いて値を集計したところ、探索での集計結果よりも値が少なく計上された。そのため、すべてがengagement_time_msecパラメータの発生の条件の中に包含されないケースもあるということがあるということが分かった。
合計ユーザー数とどれほどの差異があるのか?
これはサイトによって異なるが、アクティブユーザー数のカウントの条件がかなり敷居が低いため、基本的には合計ユーザー数とほとんど同値となる。しかし、流入数が多いサイトや期間を数ヶ月間など長い期間で比較した場合、差が大きくなることがある。検証した1例だと約500人の数値の乖離があったサイトもあった。差異がどれほどあるかは実際にGA4の探索で「総ユーザー数」と「アクティブユーザー数」を並べて検証してみれば検証可能である。
合計ユーザー数とアクティブユーザー数をどちらを使うべきか?
結論からいうと「アクティブユーザー数」を使うことを推奨する。理由は以下の通り。
- GA4が「アクティブユーザー数」を採用している
ユーザーに関する指標を算出する際に、GA4のレポートで使われているユーザー数は「アクティブユーザー数」が元になっているため、合わせた方がよい。 - Botを省くことができる
全てではないが、アクティブユーザー数を採用することでBotのフィルターをかけることができるかもしれない。
また、そもそもサイトへのアクセス後に1秒以内に離脱した「ユーザー」について考慮すれば、直帰するかの判断も付かないような短い時間で離脱したユーザー・Botをカウントする意味はないように思える。
BigQueryの対応フィールドは「is_active_user」
2023年7月にアクティブユーザーか否かを判定する「is_active_user」フィールドが追加された。そのため、これ以降であればこのフィールドを判定条件として活用することができる。BOOLEAN型であるため、WHERE文に「is_active_user」を追加するだけで「総ユーザー数」から「アクティブユーザー数」への置換が可能となる。23年7月以前のデータを扱う場合は、アクティブユーザーの条件を満たす判定式を組み込み算出する必要がある。
参考:[GA4] BigQuery Export スキーマ > is_active_user – アナリティクス ヘルプ
以上が、アクティブユーザー数のまとめとなる。BigQueryにおけるアクティブユーザー数(「is_active_user」を使用する方法とアクティブユーザー数の条件を組み込む方法)を取得するSQLを以下に提示する。アクティブユーザー数の条件を組み込む方法のコードはnoteでリツイートもしくは「Visual SEM Report」の購入後の保護ページにPASSを記載しているので、そちらを張り付けると以下コンテンツの続きが閲覧可能。
合計ユーザー(総ユーザー)数をカウントするクエリ
探索でいう総ユーザー数を集計するクエリは、単純に重複のない’user_pseudo_id’をカウントすれば求められる。
WITH
Total_UU AS (
SELECT
PARSE_DATE("%Y%m%d", event_date) AS ymd,
COUNT(DISTINCT user_pseudo_id) AS _total_uu
FROM
`<project>.<dataset>.events_*`
WHERE
_TABLE_SUFFIX BETWEEN '20240401' AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
GROUP BY
ymd
ORDER BY
ymd ASC
)
SELECT * FROM Total_UU
アクティブユーザー数をカウントするクエリ
・24/04/03:アクティブユーザー数の集計方法にミスがあったため修正
-- 「is_active_user」フィールドによるカウント
WITH
Active_UU AS (
SELECT
ymd,
COUNT(uuid) AS _active_uu
FROM (
SELECT
PARSE_DATE("%Y%m%d", event_date) AS ymd,
user_pseudo_id AS uuid,
FROM
`<project>.<dataset>.events_*`
WHERE
_TABLE_SUFFIX BETWEEN '20240401' AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
AND
is_active_user
GROUP BY
ymd,
uuid
)
GROUP BY
ymd
ORDER BY
ymd ASC
)
SELECT * FROM Active_UU
日次のランディングページごとのアクティブユーザー数をカウント
-- 「is_active_user」フィールドによるカウント
WITH
LP_UU_Daily AS (
SELECT
ymd,
page_location AS LandingPage,
COUNT(DISTINCT user_pseudo_id) AS _uu
FROM (
SELECT
PARSE_DATE("%Y%m%d", event_date) AS ymd,
user_pseudo_id,
REGEXP_REPLACE((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location'), r"\?.*", "") AS page_location
FROM
`<project>.<dataset>.events_*`
WHERE
_TABLE_SUFFIX BETWEEN '20240315' AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
AND
event_name = 'session_start'
AND
is_active_user
)
GROUP BY
ymd,
page_location
ORDER BY
ymd ASC
)
SELECT
*
FROM
LP_UU_Daily