이전글:
2026.04.07 - [Project] - [블로그프로젝트#13] 빅쿼리 raw event 데이터 추출하기(.csv)
[블로그프로젝트#13] 빅쿼리 raw event 데이터 추출하기(.csv)
이전 글:2026.04.01 - [Project] - [블로그프로젝트#12] BigQuery Export로 쌓은 raw event 살펴보기 [블로그프로젝트#12] BigQuery Export로 쌓은 raw event 살펴보기어떤 데이터가 쌓이고 있는지 확인해보자. 1. 데이터
yj-data.tistory.com
부끄럽게도 이전글이 근 한달전이네.. 반 이상은 회사 면접보고 지원하느라 썼구나(다행)
목차
테이블을 수정하자
지난 글에서 최종 테이블을 뽑았었는데.. 그 최종 테이블이 여러번 바뀌어버림..
수정된 사항(데이터)
- batch_page_id 수정
- 'batch_page_id'를 페이지 고유 id로 가정하고 뽑았었다. 뽑은 이유는 페이지 순서대로 넘버링해서 첫페이지가 어디였는지 알아내기 위함.
- 그런데 알고보니 '세션 내에서' 페이지의 고유 아이디였음;; 세션이 바뀌면 같은 페이지임에도 batch_page_id가 변경됨.. 그래서 이 변수는 page_location으로 변경했다.
- 그런데!!! page_location에서 같은 글 뒤에 ?pidx=숫자 가 붙는 경우가 있어, 이 경우도 다르게 체크하더라. (*pidx.. 가 붙는것은 글 내 있는 사진을 클릭했을때 뜨더라)
- 예, yj-data.tistory.com/485 vs yj-data.tistory.com/485?pidx=0
- 처리방식: ?pidx=숫자 부분은 무시하고 동일하게 체크하도록 수정했다.
REGEXP_REPLACE(
(SELECT ep.value.string_value
FROM UNNEST(event_params) AS ep
WHERE ep.key = 'page_location'),
r'\?.*$',
''
) AS page_location,
- 페이지 넘버링을 2가지 방식으로 함
- 한 세션 혹은 uid 당 페이지를 총 몇개 방문했는지 궁금한것과 + 한 세션 혹은 uid 당 페이지를 몇개를 거쳤는지 궁금한것
- 예를들어, post A - post B - post C - post B - post A를 거쳤을 때, 총 페이지수는 3개, 거친 페이지는 5개가 된다.
- 목적: 전자는, 중복을 제거하고 총 몇개의 페이지를 거쳤는지, 즉 몇개를 최종적으로 소비했는지 알 수 있게 됨. 후자는, 유입부터 이탈까지 고객 여정의 길이를 페이지 수로 알 수 있음. 진짜 첫페이지는 후자로 확인이 가능함. KPI인 '첫 콘텐츠 소비율'도 후자로 계산 가능.
- 시간대를 한국시간대로 변경
- 원래 코드대로 하면 UTC로 계산이 되어서, +9시간 해서 한국시간으로 이벤트 시간을 뽑았다.
- page_referrer에 붙은 검색 키워드 추가
- daum 유입같은 경우는, 리퍼러에 어떤 키워드로 검색 유입이 되었는지 알 수 있더라. 그래서 키워드만 따로 뽑아서 컬럼 만듦.
- nav_type, nav_source 추가
- internal_navigation(내부이동)의 상세 내용을 확인할 수 있는 태그를 GTM으로 만들어뒀었다. 그 태그를 확인하기 위해 nav_type, nav_source를 추가했다. 원래 nav_source는 source가 원래 element인데, 이미 GA에서 자동으로 생성되는 컬럼에 'source'가 있어서 nav_source로 변경해서 추출.
- 일자 변경
- 대조군/실험군 일자를 동일하게 맞추고, 가능하면 2주로 딱 맞아 떨어지게 하고 싶어서, 기간을 수정했다.
- 원래: 3월 27일 ~ 4월 30일
- 현재: 대조군 3월 28일 ~ 4월 10일 (토~금), 실험군 4월 11일 ~ 4월 24일 (토~금)
- 실험용 요소 변경을 4월 11일 0시~2시 동안 진행했기 때문에, 이처럼 정했다. 와 진짜 쉽지않았다.. 200개가 넘는 글에 목차 여부를 확인하고 목차를 새로 단다는것은..
-- 최종 코드
WITH base AS (
SELECT
user_pseudo_id,
(SELECT ep.value.int_value
FROM UNNEST(event_params) AS ep
WHERE ep.key = 'ga_session_id') AS session_id,
event_date,
DATETIME(TIMESTAMP_MICROS(event_timestamp),'Asia/Seoul') AS event_time_kst,
TIMESTAMP_MICROS(event_timestamp) AS event_timestamp_utc,
CASE
WHEN DATE(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')
BETWEEN '2026-03-28' AND '2026-04-10' THEN 'control'
WHEN DATE(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')
BETWEEN '2026-04-11' AND '2026-04-24' THEN 'treatment'
ELSE NULL
END AS test_group,
event_name,
(SELECT ep.value.int_value
FROM UNNEST(event_params) AS ep
WHERE ep.key = 'batch_ordering_id') AS batch_ordering_id,
batch_event_index,
session_traffic_source_last_click.manual_campaign.source,
session_traffic_source_last_click.manual_campaign.medium,
session_traffic_source_last_click.cross_channel_campaign.default_channel_group,
geo.continent,
geo.sub_continent,
geo.country,
geo.region,
geo.city,
device.category,
device.operating_system,
-- (SELECT ep.value.string_value
-- FROM UNNEST(event_params) AS ep
-- WHERE ep.key = 'page_location') AS page_location,
REGEXP_REPLACE(
(SELECT ep.value.string_value
FROM UNNEST(event_params) AS ep
WHERE ep.key = 'page_location'),
r'\?.*$',
''
) AS page_location,
(SELECT ep.value.string_value
FROM UNNEST(event_params) AS ep
WHERE ep.key = 'page_title') AS page_title,
(SELECT ep.value.string_value
FROM UNNEST(event_params) AS ep
WHERE ep.key = 'page_referrer') AS page_referrer,
(SELECT ep.value.string_value
FROM UNNEST(event_params) AS ep
WHERE ep.key = 'term') AS term_page_referrer,
(SELECT ep.value.int_value
FROM UNNEST(event_params) AS ep
WHERE ep.key = 'batch_page_id') AS batch_page_id,
(SELECT ep.value.string_value
FROM UNNEST(event_params) AS ep
WHERE ep.key = 'nav_type') AS nav_type,
(SELECT ep.value.string_value
FROM UNNEST(event_params) AS ep
WHERE ep.key = 'source') AS nav_source
FROM `analytics_526092412.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20260328' AND '20260424'
),
page_ordered AS (
SELECT
*,
MIN(event_timestamp_utc) OVER (
PARTITION BY user_pseudo_id, session_id, batch_page_id
) AS page_first_event_time,
MIN(event_timestamp_utc) OVER (
PARTITION BY user_pseudo_id, session_id, page_location
) AS visited_page_event_time
FROM base
)
SELECT
* EXCEPT(page_first_event_time, visited_page_event_time),
DENSE_RANK() OVER (
PARTITION BY user_pseudo_id, session_id
ORDER BY page_first_event_time, batch_page_id
) AS page_no_in_session,
DENSE_RANK() OVER (
PARTITION BY user_pseudo_id, session_id
ORDER BY visited_page_event_time, page_location
) AS page_cnt_in_session
FROM page_ordered
ORDER BY user_pseudo_id, session_id, event_timestamp_utc, batch_event_index;
PPT를 작성 / 수정하자
Gdrive에 연결하면 언젠간 또 뻑날 수 있으므로 파일박치기!
자신있게 PPT는 2~3일이면 끝까지 작성할 수 있을것이라고 장담했던 나레기.. 진짜 감이 없어도 너무 없었다ㅋㅋㅋㅋㅋ 30% 작성하는데 일주일이 넘게 걸렸다^^! 당장 사업기획쪽으로 다른 프로젝트 진행할게 있어서, 일단 EDA 40%까지 기록한 상황에서 잠시 멈추기로함ㅎㅎ
적당한 틀과.. 적당한 목차로 시작했던 나.. 처음에는 너무 PPT가 짧을까봐 걱정했지만, 쓰다보니 설명해야할게 생각보다 많다는 것을 깨달음. 내용 하나하나가 다 빌드업 되어 결말까지 달려가야한다는 것을 깨닫고 보충하다보니 시간이 슝슝간다.
내 머리속에만 적당히 정리되어있는건 아무 도움이 안되는 거였어!!!
목차
그렇게 고민 고민하다가.. 하나씩 정리되어 아래와 같은 목차로 작성되었고,



추후 추가 될 내용
나중에 작성할 예정인데 아직 세세하게 작성할 감당이 안되는 내용들은 이렇게 당장은 마무리해뒀다.

EDA 하려다 보니
- 트래픽 정제
- 괴상한 데이터가 보여서 열심히 파보니 해외 봇 등장☆ 그리고 내 IP를 제외해뒀다고 생각했는데 그래도 유유히 뚫고 들어오는 나의 흔적..ㅎ
- 봇 제외 기준을 고민고민해서 만들면서.. 이벤트 데이터 탐험하는 맛이 쏠쏠하더이다(약간의 눈물이 추가되어 살짝 짠맛ㅠㅠ)
- 데이터 수정/탐구
- 생각해보니 대조군 기간만 작성해야함; 잔뜩 데이터 수정하고 ㅎㅎ
- 유입 소스에 아무리 봐도 알 수 없는 category라는 녀석을 탐구하고
- 드디어 방문자 데이터 개요를 작성할 공간에 다다랐는데..!
- '무슨 데이터를 어떻게 정리해서 보여줘야 보는 사람이 이해할지' 고민하는 것이 너무너무너무 중요해서 머리속이 매우 복잡해졌다..! 이 데이터가 필요한거 같기도하고 아닌거같기도하고.. 특정 데이터 내용이 누락되면 개연성을 해칠것 같기도하고, 너무 쓸데없는 얘긴가 싶기도 하고.. 고민고민고민고민 하는 나날을 보내면서 일단 40%정도만 작성완료. 앞으로 뭘 할지는 대략 파악은 해뒀지만 하다보면 바뀔 수 있음(;;)

그래도 아직까지는 꽤 개연성 있게 작성이 되고 있다고 생각은 하는데.. 괜찮겠지..? 아무튼 네.. 사업기획쪽 지식을 보충하고 돌아와서 다시 ㅎrㄲㅔyo..☆
2주 뒤 컴백 예정 ★-★v (제발 2주만에 가능해라 제발)
하 진짜 취준하니까 시간 너무 빨리간다 살려줘
'Project' 카테고리의 다른 글
| [블로그프로젝트#13] 빅쿼리 raw event 데이터 추출하기(.csv) (0) | 2026.04.07 |
|---|---|
| [SaaS프로젝트#1] 프로젝트 기획: 서비스 선정, 핵심 질문 선정, 서비스 화면 구성(AI로 생성) (0) | 2026.04.04 |
| [블로그프로젝트#12] BigQuery Export로 쌓은 raw event 살펴보기 (0) | 2026.04.02 |
| [블로그프로젝트#11] BigQuery Export로 GA raw event 수집하기 (성공!!) (0) | 2026.03.30 |
| [블로그프로젝트#10] GA 데이터 검수하기 Part 2. 검수하다보니.. GA로는 분석은 안되겠는데? (0) | 2026.03.26 |