BigQuery의 사용자 정의 함수와 보기를 통해 Google Analytics4와 결합된 이벤트 데이터를 쉽게 처리할 수 있습니다.

Google Analythics4와 BigQuery의 협력을 조사할 수 있는 기회가 생겼습니다.
https://zenn.dev/waddy/scraps/940ac10e7c3f94
Google Tag Manager를 통해 다음과 같은 형식이 논의되고 있습니다.
graph TB;
webapp[ Web Next.js]-->|タグマネージャー用\nスクリプト|gtm([Google タグマネージャー]);
subgraph 管理コンソールで設定
gtm-->|設定により自動転送|ga4[(Google Analytics 4)];
end
subgraph Google Cloud
ga4-->|自動連携|gq[(BigQuery)];
end

Google Analytics4 と BigQuery を連携してどうするの?という部分なのですが、Webアプリの商品(コンテンツ)の"質"を計測する実験を行っています。せっかくBigQueryと連携できるし、GA4で取得できるデータを使おうかなとやや手段先行な部分はありつつもGA4+BigQueryを使うところまでは決定。で、最後まで悩んだのが、「Google Tag Manager/Google Analytics4 でどこまで設定して、どこからBigQueryのクエリに任せるか」といったことです。正直なところまだ結論は出ていませんが、いまのところ、GTM/GA4の設定は最小限にして、取得できたイベントから計測に都合の良いデータをクエリするとしています。

graph TB;
webapp[ Web Next.js]-->|タグマネージャー用\nスクリプト|gtm([Google タグマネージャー]);
subgraph sub_gtm[最小限の設定]
gtm-->|設定により自動転送|ga4[(Google Analytics 4)];
end
subgraph sub_gcp[Google Cloud]
ga4-->|自動連携|gq[(BigQuery)];
subgraph sub_bq_view[Terraform 管理]
score_app-->|Google SDK|score_page_view[集計に都合の良いPV用VIEW]
score_app-->|Google SDK|score_scroll[集計に都合の良い他のVIEW]
end
end

style sub_bq_view fill:#FA7

理由は以下です。

  1. GTM/GA4の設定画面で複雑な設定を行うと、メンテナンスが大変
  2. GTMで設定を再現するための手順書の作成が難しい(画面や仕様変更への追従)
  3. BigQuery のクエリであれば、クエリを保存して再現することが可能

特に3番目のメリットを重視しました。

GA4 페이지view

特に断りがない限り、この記事のBigQueryは표준 SQLを利用しています。

この記事では Google Analytics4 から連携される基本イベントのひとつ、page_viewをBigQueryで変形する方法を例にとります。ん?わざわざVIEWを作る必要があるの?という話ですが、Google Analytics4 のpage_viewイベントは以下のようなデータになっています。

JSONだと:

[
  {
    "event_date": "20210924",
    "event_timestamp": "1632477063761534",
    "event_name": "page_view",
    "event_params": [
      {
        "key": "page_title",
        "value": {
          "string_value": "iPad mini6 アクセサリ",
          "int_value": null,
          "float_value": null,
          "double_value": null
        }
      },
      {
        "key": "page_location",
        "value": {
          "string_value": "http://localhost/waddy/products/nwerwewewfadfa",
          "int_value": null,
          "float_value": null,
          "double_value": null
        }
      },
      {
        "key": "page_referrer",
        "value": {
          "string_value": "http://localhost:3000/products/nwerwewewfadfa/edit",
          "int_value": null,
          "float_value": null,
          "double_value": null
        }
      }
      // ... 省略
    ],
    "event_previous_timestamp": null,
  }
]
각 매개 변수는 event_params의 배열을 하고 KeyValue 형식으로 들어간다.PV 활성 데이터입니다.여러 개의 SELECT를 응용 프로그램에서 분석하고 필터링하는 것은 매우 고생스럽고 일부러 빅큐리와 합작하는 것도 장점이 적다.대체로 GA4의 원시 데이터를 사용했다.WHRE 문을 줄이기 위해서도 다음과 같은 내용을 준비해야 한다.
  • JSON 구조에서 특정한 키를 찾아 가치를 얻는 데 사용사용자정의 함수(UDF)
  • 1 추출page_title의 사용자 정의 함수 사용
  • 1 추출page_location의 사용자 정의 함수 사용
  • 2, 3으로'어떤 페이지의 PV 활동을 수집한 표'를 제작한 VIEW
  • 나는 마지막으로 아래 그림과 같은 탁자를 만들고 싶다.

    SQL은 원본 데이터보다 사용하기 쉽습니다.이 VIEW를 만들자.순서대로 보다.

    1. JSON 배열 구조에서 키의 사용자 정의 함수 찾기


    이 데이터죠?여기서 page_titlestring_value를 추출합니다.
        "event_params": [
          {
            "key": "page_title",
            "value": {
              "string_value": "iPad mini6 アクセサリ",
              "int_value": null,
              "float_value": null,
              "double_value": null
            }
          }
        ]
    
    앱으로 세척하는 것도 좀 번거로운데 SQL로 해도 될까요?조사를 해보면 빅큐리는 JSON 데이터를 쉽게 처리하기 위해 JSON 함수를 준비했다.
    https://cloud.google.com/bigquery/docs/reference/standard-sql/json_functions
    JSON_EXTRACTjsonpath를 매개 변수로 받아들이기 때문에 하고 싶은 일을 할 수 있을 것 같아요.아, 정말 고마워요... 그렇게 말하고 싶지만 이 예비 함수는 완성할 수 없어요.이번에는 배열 JSON에서 특정한 열쇠를 찾아야 하기 때문에 이 조작JSON_EXTRACT은 지원되지 않습니다.
    https://stackoverflow.com/questions/51673083/jsonpath-in-bigquery-doesnt-support-for-filter-suggestions-for-alternatives
    사용을 실현하기 위해JavaScript에 대한 사용자 정의 함수.이제 다 됐어.
    CREATE FUNCTION `project-name.dataset_name.CUSTOM_JSON_EXTRACT`(json STRING, json_path STRING)
    RETURNS STRING
    LANGUAGE js AS """
    try {
          var parsed = JSON.parse(json);
          var res =  jsonpath.query(parsed, json_path);
          return res.length ? res[0] : null
        } catch (e) { return null }
    """
    OPTIONS (
        library="https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/jsonpath/jsonpath-1.1.js"
    );
    
    자바스크립트 주체의 기술 외에 OPTIONS를 통해 외부 프로그램 라이브러리를 지정했다.함수를 만들 때 Google Cloud Stroage에 업로드해야 합니다.JS를 끼울 수 있다면 많은 일을 할 수 있을 것 같아요.이 함수는 아래와 같다.
    SELECT `CUSTOM_JSON_EXTRACT_SCALAR`("""
        [
          {
            "key": "page_title",
            "value": {
              "string_value": "iPad mini6 アクセサリ",
              "int_value": null,
              "float_value": null,
              "double_value": null
            }
          }
        ]
    """, '$[?(@.key=="page_title")].value.string_value');
    
    json_path(두 번째 매개변수)에 주의하십시오.key 배열에서 page_title의 물건을 찾아 그것value.string_value을 얻는다.page_title가string인 것을 알기 때문에string_value로 결정하는 것은 문제없습니다.조금 힘들지만 이렇게 하면 GA4의 활동 매개 변수를 취향에 맞게 뽑을 수 있다.

    2. page_title의 사용자 정의 함수 추출

    CUSTOM_JSON_EXTRACT_SCALAR 사용할 수 있다면 그리 어렵지 않을 거예요.
    CREATE FUNCTION `project-name.dataset_name.EXTRACT_PAGE_TITLE`(event_params_json STRING)
    RETURNS STRING
    AS (
    `project-name.dataset_name.CUSTOM_JSON_EXTRACT_SCALAR`(event_params_json,'$[?(@.key=="page_title")].value.string_value')
    )
    
    이것은 VIEW에서 사용합니다.

    3. page_위치 추출에 사용되는 사용자 정의 함수


    page_타이틀과 같다.
    CREATE FUNCTION `project-name.dataset_name.EXTRACT_PAGE_LOCATION`(event_params_json STRING)
    RETURNS STRING
    AS (
    `project-name.dataset_name.CUSTOM_JSON_EXTRACT_SCALAR`(event_params_json,'$[?(@.key=="page_location")].value.string_value')
    )
    
    이것도 VIEW에서 사용합니다.

    4. VIEW로 PV 이벤트를 모은 탁자


    먼저 표를 표시하는 목적이 보통일 수 있도록 조회를 하세요.2와 3으로 구성된 사용자 정의 함수를 사용합니다.
    SELECT
      `project-name.dataset-name.EXTRACT_PAGE_TITLE`(TO_JSON_STRING(event_params)) AS page_title,
      `project-name.dataset-name.EXTRACT_PAGE_LOCATION`(TO_JSON_STRING(event_params)) AS page_location,
      event_name
    FROM
      `project-name.dataset-name.events_intraday*`
    WHERE
      event_name='page_view'
      AND REGEXP_CONTAINS(`project-name.dataset-name.EXTRACT_PAGE_LOCATION`(TO_JSON_STRING(event_params)), r'https?://.+?/(.+?)/products/[\w-]+.*$')
    
    이런 결과를 얻을 수 있을 것이다.

    대상 모양이 되면 보기를 저장합니다.

    알기 쉬운 책상 이름을 붙이면 완성된다.
    이렇게 되면 제작된 VIEW를 테이블로 비집고 들어가 합산할 수 있다.JSON의 배열도 없어지고 열이 펼쳐지기 때문에 WHERE 문장 등도 쉽게 사용할 수 있다.
    VIEW 질의 사용 예
    SELECT * FROM `my-project.analytics_999999.pv_intraday_view` LIMIT 1000
    
    추가 데이터가 필요하면 이벤트parameter에서 추출하여 뷰에 추가할 수 있습니다.

    총결산


    BigQuery UDF를 사용하여 Google Analytics 4와 결합된 데이터를 쉽게 분석할 수 있는 테이블로 만듭니다.다음과 같은 이점이 있습니다.
  • 총 앱은 제작된 VIEW만 보면 되며, JSON 제거를 고려할 필요가 없음
  • 사용자 정의 함수와 VIEW의 실제 상태는 FUCTION 또는 조회 정의이며 GiitHub와 같은 생태계에서 버전 관리를 할 수 있다
  • 이외에 테라form 등 IaC와 조합하여 재현할 수 있다
  • 아직 정확한지는 알 수 없으며 상품의 품질을 측정하기 위해 다음과 같은 방침을 정했다.
  • GA4에서 수집할 수 있는 기본 데이터만 적용
  • BigQuery의 사용자정의 함수와 VIEW에서 측정 데이터로 변환(본 글의 내용)
  • 여전히 부족한 데이터가 나타나면 GTM/GA4에서 스피커 이동 스피커 파라미터 추가
  • 를 논의한다.
    테라프롬과 빅큐리의 협업에 대해서는 다른 기사에서 소개했다.

    좋은 웹페이지 즐겨찾기