CASE STUDY

빅쿼리로 GA4 실시간 데이터 분석하기

  • 2024-10-11
  • 유준혁
blog-detail-visual

안녕하세요. 그로스 마케팅 파트너, 허들러스의 유준혁 엔지니어입니다.

이번글에서는 많은 마케터와 데이터 분석가들이 겪고 있는 문제, 바로 GA4의 실시간 데이터 분석 한계를 해결하는 방법에 대해 다뤄보려 합니다. 이 글을 통해 GA4의 실시간 데이터 분석 한계를 극복하고, BigQuery를 통해 실시간 데이터를 분석할 수 있는 방법에 대해서 설명드리겠습니다.

1. GA4에서 실시간 데이터를 보기 어려운 이유

GA4에서 실시간 데이터를 분석하는 것이 어려운 주요 이유는 몇 가지 제한 때문입니다. 먼저, GA4의 실시간 보고서는 최대 30분 이내의 데이터만 제공하므로, 그 이상의 데이터를 확인하거나 분석하는 것이 불가능합니다. 실시간 데이터를 통해 즉각적인 의사결정을 내려야 하는 상황에서는 30분이라는 짧은 시간 범위만으로 충분하지 않을 수 있습니다.

또한, GA4의 실시간 보고서는 데이터 처리 지연이 발생할 수 있어, 사용자가 보고 있는 데이터가 실제로는 몇 분 전의 데이터일 가능성이 있습니다. 이는 실시간으로 중요한 비즈니스 의사결정을 내려야 할 때 큰 제약으로 작용합니다. 특히 트래픽 급증이나 중요한 이벤트 발생 시, 데이터의 신선도에 대한 신뢰성이 떨어질 수 있습니다.

그리고 실시간 보고서에서는 원하는 대로 보고서를 커스터마이징할 수 있는 기능이 부족합니다. 사용자가 보고서를 완전히 제어할 수 없으며, 제공되는 기본 정보에만 의존해야 합니다. 이는 기업이 필요로 하는 맞춤형 실시간 보고서를 만들거나 복잡한 데이터를 분석하는 데 한계를 느끼게 합니다.

이러한 이유들 때문에 GA4 자체만으로는 실시간 데이터를 충분히 활용하기 어렵고, 이를 보완하기 위해 BigQuery와 같은 외부 데이터 웨어하우스 도구의 활용이 필요해집니다. BigQuery는 실시간으로 대용량 데이터를 처리할 수 있는 기능을 제공하여, GA4의 실시간 보고서 한계를 극복하고 실시간 분석을 가능하게 합니다.

2. BigQuery 로 실시간 데이터 분석하기

2-1. GA4 스트리밍 내보내기 활성화

GA4 데이터를 실시간으로 분석하기 위해 가장 먼저 해야 할 일은 GA4와 BigQuery를 연동하고 스트리밍 내보내기를 활성화하는 것입니다. 데이터 내보내기 옵션으로 일별 내보내기와 스트리밍 내보내기를 선택할 수 있습니다. 일별 내보내기는 하루에 한 번 데이터를 전송하는 반면, 스트리밍 내보내기는 데이터가 실시간으로 events_intraday_YYYYMMDD 라는 테이블에 전송됩니다.

GA4와 BigQuery를 아직 연동하지 않으셨다면, 링크를 참고하여 BigQuery 연동을 진행해주세요.


스트리밍 내보내기를 활성화 했다면, BigQuery에서 events_intraday_YYYYMMDD라는 추가 테이블을 확인할 수 있을 것입니다. 모든 실시간 데이터는 이 테이블에 저장되며, 새로운 이벤트가 발생할 때마다 현재 날짜에 맞춰 지속적으로 업데이트됩니다. 



이 테이블에 있는 데이터는 하루 동안만 유지됩니다. 오늘 저장된 데이터는 내일이 되면 삭제되고, events_YYYYMMDD 라는 일별 테이블에 데이터가 저장됩니다.

2-2. 쿼리 설정

스트리밍 내보내기를 활성화한 후, BigQuery에서 실시간 데이터를 분석하기 위해 먼저 events_intraday 테이블에서 데이터를 추출하는 쿼리를 작성해야 합니다. 이 데이터를 활용해 시간대별 주요 이벤트, 트래픽 소스 등을 분석할 수 있습니다. 그런 다음, 데이터를 별도의 테이블에 저장하고 5분마다 자동으로 실행되도록 예약된 쿼리를 설정할 예정입니다

예약된 쿼리를 설정하면 실시간 데이터가 5분 단위로 업데이트되며, 미리 설정해놓은 테이블에 데이터가 쌓이게 됩니다. 빅쿼리에 들어온 구매(purchase)와 같은 모든 이벤트들이 시간대별로 집계되며, 이를 통해 사용자의 행동 패턴을 파악하고 마케팅 캠페인의 성과를 실시간으로 추적할 수 있습니다.

그러면 각 단계별로 어떤 설정을 해야하는지 설명드리겠습니다.

Step 1 : SQL 쿼리 작성

실시간 데이터 분석에서 가장 중요한 단계 입니다. 이를 통해 원하는 데이터를 정확히 추출하고, 추출한 데이터를 바탕으로 실시간 리포트를 구성할 수 있습니다.

이번 글에서는 트래픽 소스/매체별로 세션수를 분석하는 쿼리를 다룹니다. GA4의 스트리밍 내보내기 데이터를 활용해 실시간으로 업데이트되는 정보를 바탕으로, 마케팅 캠페인의 성과를 실시간으로 추적하고, 특정 소스/매체에서 얼마나 많은 세션을 유발했는지 파악할 수 있습니다.

쿼리예시)

SELECT
PARSE_DATE("%Y%m%d",event_date) AS date,
 EXTRACT(HOUR FROM TIMESTAMP_MICROS(event_timestamp) AT TIME ZONE "Asia/Seoul") as hour,
 ifnull(traffic_source.source,'(direct)') as source,
 ifnull(traffic_source.medium,'(none)') as medium,
 count(distinct concat(user_pseudo_id,(select value.int_value from unnest(event_params) where key = 'ga_session_id'))) as sessions
FROM
 `{{프로젝트 이름}}.{{데이터셋 이름}}.events_intraday_*`
WHERE PARSE_DATE('%Y%m%d',event_date) = CURRENT_DATE("Asia/Seoul")
group by all
ORDER BY hour DESC
 

이 쿼리는 GA4의 실시간 데이터를 바탕으로 현재 날짜에 발생한 세션을 시간대별, 트래픽 소스별, 매체별로 집계하는 쿼리입니다. events_intraday_* 테이블에서 오늘 발생한 이벤트 데이터를 추출하여, 시간(hour) 단위로 세션 수를 계산하고 트래픽 소스와 매체에 따라 그룹화한 뒤, 최근 시간 순으로 정렬해 결과를 반환합니다.

쿼리설명)

PARSE_DATE("%Y%m%d", event_date)

event_date 필드를 문자열로 저장된 날짜를 파싱하여 date 필드로 변환합니다. 이를 통해 데이터를 날짜 형식으로 변환하여 활용할 수 있습니다.

EXTRACT(HOUR FROM TIMESTAMP_MICROS(event_timestamp) AT TIME ZONE "Asia/Seoul") 

event_timestamp를 마이크로초 단위로 가져와서 'Asia/Seoul' 시간대로 변환한 뒤, 시간(HOUR) 단위로 추출합니다. 이를 통해 이벤트가 발생한 시간을 기준으로 시간대별로 데이터를 그룹화 할 수 있습니다.

IFNULL(traffic_source.source, '(direct)') 

이벤트가 발생한 트래픽 소스가 있는 경우 해당 값을 사용하고, 없을 경우에는 '(direct)'로 표시합니다.

IFNULL(traffic_source.medium, '(none)')

트래픽 매체 필드로, 소스와 매체의 결합을 통해 유입 경로를 구체적으로 파악할 수 있습니다. 값이 없을 경우 '(none)'으로 대체됩니다.

count(distinct concat(user_pseudo_id,(select value.int_value from unnest(event_params) where key = 'ga_session_id')))

사용자 세션을 고유하게 식별하기 위한 방식으로, user_pseudo_id와 ga_session_id 값을 조합하여 중복되지 않는 세션의 개수를 세는 구문입니다.

쿼리를 작성한 후, BigQuery Studio에서 테스트로 실행하면 아래와 같이 쿼리 결과가 정상적으로 출력되는 것을 확인할 수 있습니다.

Step 2 : 예약된 쿼리 설정

데이터를 자동으로 업데이트하려면, 예약된 쿼리를 설정해야 합니다. 이를 위해 작성한 SQL 쿼리 상단 메뉴에서 '일정' 옵션을 선택합니다.

이후 '세부정보 및 일정'에서 예약된 쿼리의 이름을 지정하고, 실행 주기를 설정합니다. 반복 주기는 최소 5분부터 설정 가능하므로 5분 간격으로 설정을 해두었으나, 분석의 필요에 따라 원하는 주기로 변경하시면 됩니다.

일정을 모두 작성하셨다면, 화면 아래로 내려가 "쿼리 결과를 저장할 대상"에서 데이터 세트 이름과 테이블 이름을 지정해야 합니다. 데이터 세트 이름은 {{프로젝트 이름}}.{{데이터셋 이름}} 형식으로 작성하며, 테이블 이름은 임의로 설정할 수 있습니다.

이때, "대상 테이블 쓰기" 옵션에서 덮어쓰기를 반드시 선택해야 합니다. 만약 "추가" 옵션을 선택하게 되면 데이터가 중복으로 쌓이게 됩니다.

모든 설정이 완료되면 "저장" 버튼을 눌러 쿼리를 예약합니다. 추가 기능으로, 예약된 쿼리가 실행될 때 로그를 이메일이나 Slack으로 알림을 받을 수 있도록 설정할 수 있습니다. 다만, 이번 글에서는 실시간 데이터 추출에 초점을 맞추고 있기 때문에 이러한 고급 기능들은 추후에 자세히 다루도록 하겠습니다.

이후, 왼쪽 메뉴 바에서 예약된 쿼리를 클릭하면 설정한 예약된 쿼리를 보실 수 있습니다.

예약된 쿼리를 클릭하면 해당 쿼리의 세부 정보를 확인할 수 있습니다. 예시에서는 5분 단위로 반복 실행되도록 설정했기 때문에, 5분 간격으로 쿼리가 정상적으로 작동하는지 확인할 수 있습니다. 이를 통해 실시간 데이터가 원하는 주기마다 자동으로 업데이트되는지 모니터링할 수 있습니다.

마지막으로 생성된 BigQuery 테이블에 대한 정보와 스키마를 확인할 수 있으며, 미리보기를 클릭하여 데이터가 정상적으로 수집되고 있는지 확인할 수 있습니다. 

3. Looker Studio 로 시각화하기

이제 생성한 BigQuery 테이블을 Looker Studio와 연동하여 실시간 차트를 구현할 수 있습니다. 이를 위해, BigQuery 테이블 우측 상단의 '내보내기' 메뉴에서 Looker Studio로 탐색을 클릭합니다. 이 과정에서 실시간 데이터가 Looker Studio로 연결되며, 차트 생성 작업을 시작할 수 있습니다.

Looker Studio에서 원하는 차트 유형을 선택한 후, 실시간으로 시간대별 세션 수를 시각화할 수 있습니다. 현재 구현된 대시보드에서는 시간별 세션 수를 확인할 수 있지만, 향후에는 더 정밀한 분석을 위해 분 단위로 데이터를 추적할 수 있는 테이블을 생성하여, 분 단위 세션 수를 표시하는 SQL 쿼리를 작성하는 것도 가능합니다.

이 글에서는 실시간 보고서 구현에 초점을 맞추었지만, 추후에는 분 단위로 데이터를 추적하는 방법이나 고급 기능들을 추가로 다룰 예정입니다.

이번 글에서는 GA4의 실시간 보고서의 한계를 보완하기 위해 BigQuery와 Looker Studio를 활용해 실시간 데이터를 분석하고 시각화하는 방법에 대해 다뤘습니다. GA4와 BigQuery를 연동하고 스트리밍 내보내기를 활성화한 후, 실시간 데이터를 추출하는 쿼리를 작성하여 데이터를 분석하고, 이를 예약된 쿼리를 통해 자동으로 업데이트되도록 설정하는 과정을 설명했습니다. 마지막으로, 생성된 데이터를 Looker Studio와 연동해 실시간 차트를 구현하는 방법까지 안내했습니다.

이 과정에서 시간대별로 트래픽 소스와 사용자 세션을 분석하는 실시간 리포트를 구성함으로써, GA4의 제한된 실시간 보고서를 보완하고 보다 효과적인 실시간 의사결정을 내릴 수 있는 기반을 마련할 수 있습니다. 

다음 글에서는 앞서 언급한 것처럼, 예약된 쿼리가 실행될 때 이메일이나 Slack으로 알림을 받을 수 있도록 설정하는 Pub/Sub 기능을 소개하겠습니다. 또한, Cloud Functions와 Cloud Scheduler를 활용해 예약된 쿼리를 자동으로 실행시키지 않고, 테이블을 더욱 효과적으로 최적화하는 방법에 대해서도 자세히 다뤄보겠습니다.

긴 글 읽어주셔서 감사합니다.

blog-writer-img
유준혁
CTO

이메일을 입력해주시면 허들러스의 다양한 케이스 스터디
200개 이상의 다채로운 그로스 지식이 발송됩니다.