GA4

[GA4 SQL] アクティブユーザー数の定義と総ユーザー数との違い

アクティブユーザー数の定義

GA4ではユーザーのカウント方法として2つのパターンを用意している。1つが「アクティブユーザー数」であり、もう一つが「合計ユーザー数」(探索での表記は「総ユーザー数」)。総ユーザー数のカウントは条件を付けずにカウントしたものであるのに対して、アクティブユーザー数は、ユーザーが「アクティブ」であったという指標とするために、いくつかの条件を満たした場合にアクティブユーザー数として集計を行っている。

  • エンゲージメントセッションが発生
  • first_visitイベントが付く
  • engagement_time_msecパラメータの値が収集される
  • 1秒以内にuser_engagementイベントが検出される

指定した期間にサイトまたはアプリを利用したユニーク ユーザーの数。

エンゲージメント セッションが発生するか、アナリティクスで以下の情報が収集されると、アクティブ ユーザーとして認識されます。

・ウェブサイトの first_visit イベントまたは engagement_time_msec パラメータ
・Android アプリの first_open イベントまたは engagement_time_msec パラメータ
・iOS アプリの first_open イベントまたは user_engagement イベント

1 秒以内に user_engagement イベントが検出されると、そのユーザーはアクティブ ユーザーと見なされます。

参考:[GA4] ユーザーに関する指標を理解する – アナリティクス ヘルプ

エンゲージメントセッションの定義は以下の通り。

エンゲージメント セッションとは、10秒を超えて継続したセッション、コンバージョン イベントが発生したセッション、または2回以上のページビューもしくはスクリーン ビューが発生したセッションです。

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

この定義をみて疑問に感じるのは、engagement_time_msecパラメータの値が収集されればという条件がかなり緩いいため、この条件の中に「エンゲージメントセッション」も内包されるのではないのか?という点であるが、「エンゲージメントセッション」の条件を省いて値を集計したところ、探索での集計結果よりも値が少なく計上された。そのため、すべてがengagement_time_msecパラメータの発生の条件の中に包含されないケースもあるということがあるということが判明した。

合計ユーザー数とどれほどの差異があるのか?

これはサイトによって異なるが、アクティブユーザー数のカウントの条件がかなり敷居が低いため、基本的には合計ユーザー数とほとんど同値となる。しかし、流入数が多いサイトや期間を数ヶ月間など長い期間で比較した場合、差が大きくなることがある。検証した1例だと約500人の数値の乖離があったサイトもあった。差異がどれほどあるかは実際にGA4の探索で「総ユーザー数」と「アクティブユーザー数」を並べて検証してみれば検証可能である。

合計ユーザー数とアクティブユーザー数をどちらを使うべきか?

結論からいうと「アクティブユーザー数」を使うことを推奨する。理由は以下の通り。

  • GA4が「アクティブユーザー数」を採用している
    ユーザーに関する指標を算出する際に、GA4のレポートで使われているユーザー数は「アクティブユーザー数」が元になっているため、合わせた方がよい。
  • Botを省くことができる
    全てではないが、アクティブユーザー数を採用することでBotのフィルターをかけることが可能。

また、そもそもサイトへのアクセス後に1秒以内に離脱した「ユーザー」について考慮すれば、直帰するかの判断も付かないような短い時間で離脱したユーザーをカウントする意味はないだろう。

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を記載しているので、そちらを張り付けると以下コンテンツの続きが閲覧可能。

【GA4SQL】アクティブユーザー数カウント -note

合計ユーザー(総ユーザー)数をカウントするクエリ

探索でいう総ユーザー数を集計するクエリは、単純に重複のない 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

アクティブユーザー数をカウントするクエリ

-- 「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
Protected Area

This content is password-protected. Please verify with a password to unlock the content.

日次のランディングページごとのアクティブユーザー数をカウント

CREATE TEMP FUNCTION date_from() RETURNS STRING AS ('20241201');
CREATE TEMP FUNCTION date_to() RETURNS STRING AS ('20241231');

WITH
  LP_UU AS (
    SELECT
      ymd,
      page_location,
      COUNT(DISTINCT user_pseudo_id) AS _uu
    FROM (
      SELECT
        PARSE_DATE("%Y%m%d", event_date) AS ymd,
        REGEXP_REPLACE((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location'), r"\?.*", "") AS page_location,
        user_pseudo_id,
        (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'entrances') AS entrances
      FROM
        `<project>.<dataset>.events_*`
      WHERE
        _TABLE_SUFFIX BETWEEN date_from() AND date_to()
      AND
        event_name = 'page_view'
      AND
        is_active_user
    )
    WHERE
      entrances = 1
    GROUP BY
      ymd,
      page_location
)

SELECT
  ymd,
  page_location,
  SUM(_uu) AS _uu
FROM
  LP_UU
GROUP BY
  ymd,
  page_location
ORDER BY
  ymd
Protected Area

This content is password-protected. Please verify with a password to unlock the content.

「実人数」と「延べ人数」の集計方法の違い

GA4及び過去のUAの時代から、ユーザー数の集計では「実人数」としてカウントされる仕様となっている。つまり訪問ごとにユーザーをカウントするのではなく、ディメンションに日付を追加しなかった場合には、期間全体の中でのユニークなユーザー数をカウントするというものである。対して「延べ人数」の集計では日付のディメンションで区切った場合、その日付ベースの訪問ごとのユーザー数のカウントとなるため、その合算は「実人数」よりも多く集計される。

これは完全にGA4の集計方法と合わせることが必須ではなく、集計方法の違いを理解した上で使い分けることが重要である。例えば、リピーターの訪問頻度を分析したい場合などは、実人数で集計すると何回訪問しても一人の1回の訪問となるが、そのような集計は求めていないと思う。セッション数であれば30分でセッションが切れるので、必然的に「延べ人数」の集計になるが、ユーザー数の集計に関しても日単位でユーザー数を延べ人数でカウントすることになんら問題はない。

関連記事

【詳解】session_engaged パラメーター

【GA4 SQL】ページ離脱数・離脱率をBigQueryから取得

【GA4 SQL】新規ユーザー数・リピーター数の取得

おすすめ記事

最近の記事
おすすめ記事
  1. GA4 × Looker Studio テンプレートの最高峰

  2. 【GA4】「ページとスクリーン」と「ランディング ページ」レポートの違い

  3. BigQuery(SQL)を使わないLooker Studioのテンプレートが無価値である理由

  1. BigQueryからスプレッドシートのデータを連携

  2. Google広告 × BigQueryによる基本SQL

  3. 【BigQuery】データセットのテーブルを一括削除するSQL

PAGE TOP