Summary
Google BigQuery를 활용한 데이터 분석
- DAU, WAU, MAU
- Bounce Rate
- 시간 및 요일별 방문자수
이탈률. 전체 DAU(접속한 유저 수)로 잡혔지만 특정 행동에 도달하지 못한 사람들의 비율.
fullVisitorId
를 중복 없이 카운트하여 구함totals_bounces
를 활용하여 하루에 이탈이 한번 이상 있었던 방문자를 이탈 유저로 정의SELECT d.`date`,
TOTAL_DAU,
BOUNCE,
(BOUNCE / TOTAL_DAU * 100) BOUNCE_RATIO
FROM
(-- total DAU 구하기
SELECT `date`, COUNT(DISTINCT `fullVisitorId`) TOTAL_DAU
FROM `ga`
GROUP BY `date`
) d
INNER JOIN ( -- 이탈 구하기
SELECT `date`, COUNT(DISTINCT `fullVisitorId`) BOUNCE
FROM ( -- 방문자id별로 하루에 이탈이 한번 이상 있었던 고객 구하기
SELECT `date`, `fullVisitorId`, SUM(`totals_bounces`) BOUNCES
FROM `ga`
GROUP BY `date`, `fullVisitorId`
HAVING BOUNCES >= 1
) id_r
GROUP BY `date`
) r
ON d.`date` = r.`date`
ORDER BY 1;
fullVisitorId
를 중복 없이 카운트SELECT d.START_DATE `DATE`, DAU, WAU, MAU
FROM (
SELECT `date` START_DATE,
COUNT(DISTINCT `fullVisitorId`) DAU
FROM (
SELECT `date`, `fullVisitorId`, SUM(`totals_bounces`) BOUNCES
FROM `ga`
GROUP BY `date`, `fullVisitorId`
HAVING BOUNCES IS NULL
) id_r
GROUP BY START_DATE
) d
LEFT JOIN (
SELECT EXTRACT(WEEK FROM `date`) WEEK,
MIN(`date`) START_DATE,
COUNT(DISTINCT `fullVisitorId`) WAU
FROM (
SELECT `date`, `fullVisitorId`, SUM(`totals_bounces`) BOUNCES
FROM `ga`
GROUP BY `date`, `fullVisitorId`
HAVING BOUNCES IS NULL
) id_r
GROUP BY WEEK
) w
ON d.START_DATE = w.START_DATE
LEFT JOIN (
SELECT EXTRACT(MONTH FROM `date`) MONTH,
MIN(`date`) START_DATE,
COUNT(DISTINCT `fullVisitorId`) MAU
FROM (
SELECT `date`, `fullVisitorId`, SUM(`totals_bounces`) BOUNCES
FROM `ga`
GROUP BY `date`, `fullVisitorId`
HAVING BOUNCES IS NULL
) id_r
GROUP BY MONTH
) m
ON d.START_DATE = m.START_DATE
ORDER BY 1;
피봇 오퍼레이터를 활용하여 긴 쿼리를 작성하지 않고도 쉽게 pivot할 수 있음
피봇 오퍼레이터는 다음과 같이 구성됨
FROM 테이블
PIVOT (
집계식
FOR 피봇 대상 컬럼
IN 피봇한 결과 테이블에서 컬럼으로 쓰일 값들
)
요일을 CASE문으로 만든 뒤, 피봇 오퍼레이터를 활용해 피봇하는 쿼리를 아래와 같이 작성
EXTRACT([DATE_PART] FOR [DATETIME])
구문을 사용SELECT *
FROM (
SELECT
CASE -- 요일 컬럼 만들기
WHEN EXTRACT(DAYOFWEEK FROM `date`) = 1 THEN 'SUN'
WHEN EXTRACT(DAYOFWEEK FROM `date`) = 2 THEN 'MON'
WHEN EXTRACT(DAYOFWEEK FROM `date`) = 3 THEN 'TUE'
WHEN EXTRACT(DAYOFWEEK FROM `date`) = 4 THEN 'WED'
WHEN EXTRACT(DAYOFWEEK FROM `date`) = 5 THEN 'THU'
WHEN EXTRACT(DAYOFWEEK FROM `date`) = 6 THEN 'FRI'
WHEN EXTRACT(DAYOFWEEK FROM `date`) = 7 THEN 'SAT'
END DOW,
EXTRACT(HOUR FROM `visitStartTime`) HOUR,
COUNT(DISTINCT `fullVisitorId`) VISIT_CNT
FROM `ga`
GROUP BY 1, 2
)
PIVOT (
SUM(VISIT_CNT) VISIT_CNT
FOR DOW
IN ('SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT')
)
ORDER BY HOUR;
pivot table 참고 글 : https://zzsza.github.io/gcp/2021/05/16/bigquery-pivot/