#2 - Z Chart Analysis
์์ํ๊ธฐ ์ ์
๊ท๋ชจ์๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ ์ผ๊ด๋ ์ฝ๋ ๊ตฌ์กฐ์ ์คํ์ผ์ ์ ์ง๊ฐ ์ค์ํ๋ค. ์ด ๊ธ์ ์์๋ ๋ค์ BigQuery ์คํ์ผ ๊ฐ์ด๋๋ฅผ ์ฐธ๊ณ ํ๊ณ ์๋ค.
BI ๋ถ์ ํธ์ฆ์จ
๊ธฐ์ ์ ๋งค์ถ๊ณผ ๊ฐ์ด ์๊ฐ์ ๊ฒฝ๊ณผ์ ๋ฐ๋ผ ๋ณํํ๋ ๋ฐ์ดํฐ๋ก๋ถํฐ ๊ณผ๊ฑฐ ์ค์ ์ด๋ ์ถ์ด ๋ฑ์ ํ์ ํ๊ณ ๋ฏธ๋์ ์ค์ ์ ์์ธกํ๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก ์๊ณ์ด ๋ถ์์ด ํ์ฉ๋๋ค.
์ด๋ฒ ํธ์ฆ์จ์ ์๊ณ์ด ๋ถ์ ๊ธฐ๋ฒ ์ค์ ํ๋์ธ Z-Chart ๋ถ์์ BigQuery ์ธ์ด๋ก ์งํํ๋ฉฐ SQL ํ์ฉ ๋ฅ๋ ฅ์ ํค์ฐ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค.
์๋์ ๋จ๊ณ๋ณ๋ก Z-Chart ๋ถ์์ ์๊ตฌ๋๋ ์งํ๋ค์ ์ฐ์ถํ๊ณ ์๊ฐํํ๋ ๊ณผ์ ์ ๋ฐ๋ผ๊ฐ ๋ณด์.
raw data --> data mart --> visualization
๋ฐ์ดํฐ ์ค๋น
ํธ์ฆ์จ์ ์ฌ์ฉํ ๋งค์ถ ๋ฐ์ดํฐ๋ ์๋ ์ฐธ๊ณ ๋์์์ ๊ณต๊ฐํ ๋ถ๋ก/์์ ์์ค
๋ฅผ ์ฐธ๊ณ ํ์ฌ BigQuery ํ๊ฒฝ์์ ์ค์ต ๊ฐ๋ฅํ๋๋ก ์ ๋ฆฌํ์๋ค.
[์ฐธ๊ณ ๋์] ๋ฐ์ดํฐ ๋ถ์์ ์ํ SQL ๋ ์ํผ - 4์ฅ
๋งค์ถ ๋ฐ์ดํฐ ๋ถ์
1. ์์ ํ
์ด๋ธ ์์ฑ
์ฐ์ ์์ ์์ค ์ค 9-1-data.sql
์ ์ต์ํ์ ๋ณ๊ฒฝ์ผ๋ก BigQuery ํ
์ด๋ธ๋ก ์์ฑํด ๋ณด๋๋ก ํ์.
CREATE OR REPLACE TABLE learning_club.purchase_log (
dt STRING,
order_id INT64,
user_id STRING,
purchase_amount INT64,
);
INSERT INTO learning_club.purchase_log VALUES
('2014-01-01', 1, 'rhwpvvitou', 13900),
('2014-01-01', 2, 'hqnwoamzic', 10616),
('2014-01-02', 3, 'tzlmqryunr', 21156),
('2014-01-10', 26, 'cyxfgumkst', 11339)
-- ...
๋ฌด๋ฃ๋ก ์ฌ์ฉ์ค์ธ GCP Project free tier ์์ ์์ ์ฟผ๋ฆฌ๋ INSERT
๋ฌธ์ ์ฌ์ฉํ์ง ๋ชปํ๋ค๋ ์๋ฌ๋ฅผ ๋๋ ค์ค๋ค.

๋ฐฐ์์ ๊ธธ์ ๋ฉ๊ณ ๋ ํํ๋ค. ์ด์ฉ ์ ์๋ค. ์ฝ๊ฐ์ ๊ณ ๊ธ์ง ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ INSERT
๊ฐ์ DML
๋ฌธ์ ์ฌ์ฉํ์ง ์๊ณ ์์ ํ
์ด๋ธ์ ๋ง๋ค์ด ๋ณด์.
BigQuery Scripting์ ๋ฒ์ฉ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ฒ๋ผ ๋ฌธ์ฅ๋ด์์ ๋ณ์๋ฅผ ์ ์ธํ๊ณ ์ฌ์ฉํ ์ ์๋๋ก ํด์ค๋ค.
์ด ๊ฐ์ด๋ฐ DECLARE
๋ ๋ณ์๋ฅผ ์ ์ธํ๋ ๊ตฌ๋ฌธ์ธ๋ฐ ์ด๋ฐ๊ฒ ์๊ตฌ๋ ์ ๋๋ก ๋์ด๊ฐ์. BigQuery Scripting์ ๋ณ๋์ ๋ฌธ๋ฒ ๊ฐ์์์ ๋ค๋ฃฐ ์์ ์ด๋ค.
๋ค๋ง, ๋ฐ์ดํฐ ํ์์ด ๊ตฌ์กฐ์ฒด์ ๋ฐฐ์ด(Array of Struct)์ธ ๋ณ์๋ BigQuery๋ด์์ ํ ์ด๋ธ๊ณผ ๊ฑฐ์ ๋๋ฑํ๊ฒ ๋ค๋ฃจ์ด์ง๋ค๋ ๊ฒ๋ง ๊ธฐ์ตํด ๋๋ฉด ์ข๊ฒ ๋ค.
์๋ ๊ทธ๋ฆผ์์ ๋ฐฐ์ด์ ๊ฐ ์์(element)๋ ํ ์ด๋ธ์์ ํ๋์ ํ(row)์ผ๋ก, ๊ฐ ์์์ ํด๋นํ๋ ๊ตฌ์กฐ์ฒด๋ 4๊ฐ์ ๋ฉค๋ฒ์ ๊ฐ์ง๋๋ฐ ํ ์ด๋ธ์ ์ปฌ๋ผ(column)์ผ๋ก ์๊ฐํ ์ ์๋ค.
[๊ทธ๋ฆผ 1.] ARRAY<STRUCT<fruit, coffee, cake>>
๊ตฌ์กฐ์ฒด ๋ฐฐ์ด
Nested Table ์์ฑ ์ฟผ๋ฆฌ
DECLARE
๊ตฌ๋ฌธ์ ํตํด์ purchase_log
๋ผ๋ ๊ตฌ์กฐ์ฒด ๋ฐฐ์ด ๋ณ์๋ฅผ ํ๋ ์ ์ธํ์. ๊ตฌ์กฐ์ฒด๋ ๊ตฌ๋งค๋ ์ง
, ์ฃผ๋ฌธ๋ฒํธ
, ์ฌ์ฉ์์๋ณ์
, ๊ตฌ๋งค๊ธ์ก
์ ํฌํจํ๋ ๋ ์ฝ๋์ด๋ค.
DECLARE purchase_log ARRAY<STRUCT<
dt STRING,
order_id INT64,
user_id STRING,
purchase_amount INT64
>>
DEFAULT [
('2014-01-01', 1, 'rhwpvvitou', 13900),
('2014-01-01', 2, 'hqnwoamzic', 10616),
('2014-01-02', 3, 'tzlmqryunr', 21156),
('2014-01-02', 4, 'wkmqqwbyai', 14893),
('2014-01-03', 5, 'ciecbedwbq', 13054),
('2014-01-03', 6, 'svgnbqsagx', 24384),
('2014-01-03', 7, 'dfgqftdocu', 15591),
('2014-01-04', 8, 'sbgqlzkvyn', 3025),
('2014-01-04', 9, 'lbedmngbol', 24215),
('2014-01-04', 10, 'itlvssbsgx', 2059),
('2014-01-05', 11, 'jqcmmguhik', 4235),
('2014-01-05', 12, 'jgotcrfeyn', 28013),
('2014-01-05', 13, 'pgeojzoshx', 16008),
('2014-01-06', 14, 'msjberhxnx', 1980),
('2014-01-06', 15, 'tlhbolohte', 23494),
('2014-01-06', 16, 'gbchhkcotf', 3966),
('2014-01-07', 17, 'zfmbpvpzvu', 28159),
('2014-01-07', 18, 'yauwzpaxtx', 8715),
('2014-01-07', 19, 'uyqboqfgex', 10805),
('2014-01-08', 20, 'hiqdkrzcpq', 3462),
('2014-01-08', 21, 'zosbvlylpv', 13999),
('2014-01-08', 22, 'bwfbchzgnl', 2299),
('2014-01-09', 23, 'zzgauelgrt', 16475),
('2014-01-09', 24, 'qrzfcwecge', 6469),
('2014-01-10', 25, 'njbpsrvvcq', 16584),
('2014-01-10', 26, 'cyxfgumkst', 11339)
];
-- ํ
์ด๋ธ ์์ฑ ์ฟผ๋ฆฌ
CREATE OR REPLACE TABLE learning_club.purchase_log AS
SELECT log.* FROM UNNEST(purchase_log) log;
UNNEST()
ํจ์๋ก ๊ตฌ์กฐ์ฒด ๋ฐฐ์ด(Array of Struct)์ ์์์ธ ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ๊ฐ์ ํ(row)์ผ๋ก ํ์ด๋ด๊ณ , ์ด์ด ๊ตฌ์กฐ์ฒด ์์ ํ๋๋ค์ dot operator
๋๋ member field access operator
(๋ฉค๋ฒ ์ ๊ทผ ์ฐ์ฐ์) ๋ผ๊ณ ๋ถ๋ฆฌ์ฐ๋ ํ๊ธฐ๋ฒ๋ฅผ ํตํด์ ์ด(column)๋ก ๋ถ๋ฆฌ์ํค๋ฉด ์ผ๋ฐ ํ
์ด๋ธ์ SELECT
ํ๋ ๊ฒ๊ณผ ๋์ผํ ๊ฒฐ๊ณผ๊ฐ ๋ง๋ค์ด์ง๋ค.
์ FROM
์ ์ UNNEST()
๊ตฌ๋ฌธ๊ณผ SELECT
์ ์ log.*
ํ๊ธฐ์ ์ฃผ๋ชฉํ์.
์ดํ์ CTAS(Create Table As Select) ๊ตฌ๋ฌธ์ผ๋ก Nested Table์ด BigQuery์ Permanant Table์ด ๋๋๋ก ๋ง๋ ๋ค.
์ด์ ๋ฐ์ดํฐ๊ฐ ์ค๋น๋์์ผ๋ ๋ถ์์ ์ํ ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ์.
2. ๋ ์ง๋ณ ๋งค์ถ ์ง๊ณ
๋ค์์ผ๋ก ์์ ๋ง๋ค์ด์ง ๊ตฌ๋งค์ด๋ ฅ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๊ณ ์ง๊ณํจ์(aggregate function)์ ๋ถ์ํจ์(analytic function)์ ์ฌ์ฉํ์ฌ ๋ช๊ฐ์ง ์งํ๋ค์ ์ฐ์ถํด ๋ณด์.
GROUP BY
์ ์ง๊ณํจ์์ ์ฌ์ฉํ์ฌ ๋ ์ง๋ณ ๋งค์ถ ์งํ๋ฅผ ์ฐ์ถํ๋ ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ๋ค.
dt
๋ ๋ ์ง๋ฅผ ๋ํ๋ด๋ ํ๋์ ์ฐจ์(dimension)์ด ๋๊ณ , COUNT()
, SUM()
, AVG()
์ง๊ณํจ์์ ๊ฒฐ๊ณผ๋ค์ ๊ฐ๊ฐ ํด๋น ์ฐจ์์์ ๊ด์ธก๋ ๊ฐ์ธ ๋ฉํธ๋ฆญ(metric)์ด ๋๋ค.
SELECT dt,
COUNT(1) AS purchase_count,
SUM(purchase_amount) AS total_amount, -- ์ผ๋ณ ๋งค์ถ
AVG(purchase_amount) AS avg_amount, -- ํ๊ท ๊ตฌ๋งค์ก
FROM learning_club.purchase_log
GROUP BY 1
ORDER BY dt;
์ฟผ๋ฆฌ ์ํ์ ๊ฒฐ๊ณผ๋ฅผ Explore Data (๋ฐ์ดํฐ ํ์)
๋ฅผ ํตํด Data Studio์์ ๊ฐ๋จํ๊ฒ ์๊ฐํ๋ฅผ ํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.

3. ์ด๋ํ๊ท ์ ์ฌ์ฉํ ๋ ์ง๋ณ ์ถ์ด
์์ ์๊ฐํ๋ฅผ ํตํด์ ์ฃผ์ค๊ณผ ์ฃผ๋ง์ ๋งค์ถ ์ฐจ์ด๋ฅผ ํ์ธํ ์ ์๋ค. ์ด์ ์๊ณ์ด ๋ฐ์ดํฐ์ ๊ณ์ ์ฑ(seasonality)์ ์ํ์ํค๊ณ ์ถ์ธ๋ฅผ ํ์ธํ ์ ์๋๋ก 7์ผ ์ด๋ํ๊ท ์ผ๋ก ํํํด ๋ณด์.
SELECT dt,
COUNT(1) AS purchase_count,
SUM(purchase_amount) AS purchase_amount,
AVG(SUM(purchase_amount)) OVER (ORDER BY dt ROWS 6 PRECEDING) AS avg_seven_day,
FROM learning_club.purchase_log
GROUP BY 1
ORDER BY dt;
์ด๋ ํ๊ท ์ ๊ตฌํ๊ธฐ ์ํด์๋ ๋ถ์ํจ์(๋๋ ์๋์ฐํจ์)๋ฅผ ํ์๋ก ํ๋๋ฐ ์๋ ๊ตฌ๋ฌธ์ ๋ญ๊ฐ ๋ณต์กํ๋ค.
AVG(SUM(purchase_amount)) OVER (ORDER BY dt ROWS 6 PRECEDING)
purchase_amount
๋purchase_log
ํ ์ด๋ธ์ ์ปฌ๋ผ์ผ๊น ์๋๋ฉด ์ง์ ์AS purchase_amount
์ ์ํด์ ์๋ก ์ด๋ฆ์ง์ด์ง ๋ณ์นญ(alias)์ผ๊น? ์ ๋ต: ํ ์ด๋ธ์ ์ปฌ๋ผAVG(SUM(....))
์์ SUM()์ ์ง๊ณํจ์์ผ๊น? ๋ถ์ํจ์์ผ๊น? ์ ๋ต: ์ง๊ณํจ์AVG()
๋ ๊ทธ๋ผ ๋ฌด์จ ํจ์์ผ๊น? ์ ๋ต: ๋ถ์ํจ์
SELECT
๋ฌธ(statment)์ ์ด๋ฃจ๋ ๊ฐ ์ (clause)์ ํด์์์์ ์ปฌ๋ผ ์ด๋ฆ์ ํต์ฉ๋ฒ์(scope) ๋๋ฌธ์ธ๋ฐ ๋ณต์กํ๋ ์ผ๋จ ๋์ด๊ฐ์. BigQuery ๋ฌธ๋ฒ ๊ฐ์์์ ์ด๊ฒ๋ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ๋ค.
์ ๊ตฌ๋ฌธ์ ํ
์ด๋ธ ์ ์ฒด๋ฅผ ๋ ์ง๋ณ๋ก ์ค๋ฆ ์ฐจ์์ผ๋ก ์ ๋ ฌ์ํจ ํ์ ๊ฐ ํ์ ์ฌ์ฏ ๋ฒ์งธ ์ ์ ์์นํ ํ๋ถํฐ ํ์ฌ ํ๊น์ง 7์ผ๊ฐ์ SUM(purchase_amount)
๊ฐ์ ํ๊ท ์ ๊ตฌํ๋ ๊ตฌ๋ฌธ์ด๋ค. ์ฌ๊ธฐ์ SUM(purchase_amount)
๋ GROUP BY
์ ์ํด์ ๋จผ์ ๊ณ์ฐ๋์ด์ง๋ ๋ ์ง๋ณ ๊ตฌ๋งค์ก์ ํด๋นํ๋ค.
Data Studio์์ ์์ ๊ฒฐ๊ณผ๋ฅผ ์๊ฐํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
4. ๋น์ ๋๊ณ ๋งค์ถ
Z Chart ๋ถ์์์ ์๊ตฌํ๋ ์งํ๋ค์ ๊ตฌํ๋ ๋ฐฉ๋ฒ๋ค์ ํ๋์ฉ ์ดํด๋ณด์.
๋ค์์ ์ผ๋ณ ๋งค์ถ ๋ฐ์ดํฐ๊ฐ ์ฃผ์ด์ก์ ๋ ํด๋น ์์ ๋๊ณ ๋งค์ถ์ ๊ตฌํ๋ ์ฟผ๋ฆฌ์ด๋ค.
์๋์ฐ ํจ์ ๊ตฌ๋ฌธ์์ PARTITION BY SUBSTR(dt, 1, 7)
์ ์๋์ฐ ํจ์๊ฐ ์ ์ฉ๋ ํํฐ์
์ ์ ๋จ์๋ก ๋๋๋ค๋ ์๋ฏธ์ด๊ณ , ROWS UNBOUNDED PRECEDING
์ ์ ๋จ์๋ก ๋๋์ด์ง ํํฐ์
์ ์ฒซ๋ฒ์งธ ํ (๋งค์ 1์ผ์ ํด๋น)๋ถํฐ ํ์ฌ ํ (๋งค์ ํ์ฌ์ผ)๊น์ง ์๋์ฐ๋ฅผ ์ค์ ํ๋ค. ์ค์ ๋ ์๋์ฐ์ ํฌํจ๋ ํ๋ค์ SUM()
๋ถ์ํจ์๋ฅผ ํธ์ถํ๊ฒ ๋๋๋ฐ ์ฌ๊ธฐ์๋ ์ผ๋ณ ๋งค์ถ(SUM(purchase_amount)
)์ ๋ค์ SUM()
๋ถ์ํจ์๋ก ๋๊ณ์ํค๊ณ ์๋ค.
-- total_amount๋ ์ผ๋ณ ๋งค์ถ์ก, agg_amount๋ ํด๋น ์์ ํด๋น ์ผ๊น์ง์ ๋งค์ถ ๋๊ณ
SELECT dt,
SUBSTR(dt, 1, 7) AS year_month,
SUM(purchase_amount) AS total_amount,
SUM(SUM(purchase_amount)) OVER (
PARTITION BY SUBSTR(dt, 1, 7) ORDER BY dt ROWS UNBOUNDED PRECEDING
) AS agg_amount
FROM learning_club.purchase_log
GROUP BY dt
ORDER BY dt
;
-- ์์ ๋๋ฑํ ๊ฒฐ๊ณผ์ ์ฟผ๋ฆฌ, daily_purchase ์๋ธ์ฟผ๋ฆฌ์์ ์ผ๋ณ ๋งค์ถ์ก์ ๋จผ์ ๊ตฌํ๊ณ ,
-- ๋ฉ์ธ ์ฟผ๋ฆฌ์์ ์๋์ฐ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น์ผ๊น์ง์ ๋งค์ถ ๋๊ณ ์ฐ์ถ
WITH daily_purchase AS (
SELECT dt,
SUBSTR(dt, 1, 4) AS year,
SUBSTR(dt, 6, 2) AS month,
SUBSTR(dt, 9, 2) AS day,
SUM(purchase_amount) AS purchase_amount,
COUNT(order_id) AS orders
FROM learning_club.purchase_log
GROUP BY 1
)
SELECT dt,
year || month AS year_month,
purchase_amount,
SUM(purchase_amount) OVER (
PARTITION BY year, month ORDER BY dt ROWS UNBOUNDED PRECEDING
) AS agg_amount
FROM daily_purchase
;
5. ์๋ณ ๋งค์ถ์ ์๋๋น(์๋
๋๋น๋น์จ)
์ง๊ธ๊น์ง ์ฌ์ฉํ ๋ฐ์ดํฐ๋ ์ดํ๊ฐ์ ๋งค์ถ ์ค์ ๋ฐ์ดํฐ๋ก ์๋ณ ๋งค์ถ ์ถ์ด๋ฅผ ๋ถ์ํ๊ธฐ์๋ ๋ถ์กฑํ๋ค.
๋ค์์ 2014๋ 1์๋ถํฐ 2015๋ 12์๊น์ง ๋งค์ถ ๋ฐ์ดํฐ๋ก ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์๋ณ ๋งค์ถ์ ์๋๋น๋ฅผ ๊ตฌํด๋ณด๋๋ก ํ์.
์์ ๋ฐ์ดํฐ๋ ๋์ ๋ถ์์ ์ธ๊ธํ ๋์์ ๊ณต๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์๋ค.
DECLARE purchase_log_yr ARRAY<STRUCT<
dt STRING,
order_id INT64,
user_id STRING,
purchase_amount INT64
>> DEFAULT [
('2014-01-01', 1, 'rhwpvvitou', 13900),
('2014-02-08', 95, 'chtanrqtzj', 28469),
('2014-03-09', 168, 'bcqgtwxdgq', 18899),
('2014-04-11', 250, 'kdjyplrxtk', 12394),
('2014-05-11', 325, 'pgnjnnapsc', 2282),
('2014-06-12', 400, 'iztgctnnlh', 10180),
('2014-07-11', 475, 'eucjmxvjkj', 4027),
('2014-08-10', 550, 'fqwvlvndef', 6243),
('2014-09-10', 625, 'mhwhxfxrxq', 3832),
('2014-10-11', 700, 'wyrgiyvaia', 6716),
('2014-11-10', 775, 'cwpdvmhhwh', 16444),
('2014-12-10', 850, 'eqeaqvixkf', 29199),
('2015-01-09', 925, 'efmclayfnr', 22111),
('2015-02-10', 1000, 'qnebafrkco', 11965),
('2015-03-12', 1075, 'gsvqniykgx', 20215),
('2015-04-12', 1150, 'ayzvjvnocm', 11792),
('2015-05-13', 1225, 'knhevkibbp', 18087),
('2015-06-10', 1291, 'wxhxmzqxuw', 18859),
('2015-07-10', 1366, 'krrcpumtzb', 14919),
('2015-08-08', 1441, 'lpglkecvsl', 12906),
('2015-09-07', 1516, 'mgtlsfgfbj', 5696),
('2015-10-07', 1591, 'trgjscaajt', 13398),
('2015-11-06', 1666, 'ccfbjyeqrb', 6213),
('2015-12-05', 1741, 'onooskbtzp', 26024)
];
CREATE OR REPLACE TABLE learning_club.purchase_log_yr AS
SELECT l.* FROM UNNEST(purchase_log_yr) l;
์์ ๊ฐ์ด UNNEST
ํจ์์ ๋ฉค๋ฒ์ ๊ทผ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ on-the-flyํ๊ฒ ์ ์๋ nested table์ BigQuery ์๊ตฌํ
์ด๋ธ๋ก ๋จผ์ ๋ง๋ ๋ค.
LAG(col, n)
๋ค๋น๊ฒ์ด์
ํจ์๋ ํํฐ์
์ ํ์ฌ ํ์ ๊ธฐ์ค์ผ๋ก n๋งํผ ์์ ํ์ col
๊ฐ์ ๊ฐ์ ธ์จ๋ค. ๋ฐ๋ผ์ LAG(purchase_amount, 12)
๋ ๋ ์ง์์ผ๋ก ์ ๋ ฌ๋ ์๋ณ ๋งค์ถ์ก ํ
์ด๋ธ์์ ์ผ๋
์ ์ ๋งค์ถ์ก์ ๋๋ ค์ฃผ๊ฒ ๋๋ค. ์ด ๊ฐ์ผ๋ก ํ์ฌ ์๋งค์ถ์ก์ ๋๋๊ฒ ๋๋ฉด ์๋๋น(purchase_amount_rate
)๊ฐ ์ฐ์ถ๋๋ค.
CREATE OR REPLACE TABLE learning_club.purchase_log_dm AS
WITH daily_purchase AS (
SELECT dt,
SUBSTR(dt, 1, 4) AS year,
SUBSTR(dt, 6, 2) AS month,
SUBSTR(dt, 9, 2) AS day,
SUM(purchase_amount) AS purchase_amount,
COUNT(order_id) AS orders
FROM learning_club.purchase_log_yr
GROUP BY 1
),
year_month_purchase AS (
SELECT year,
month,
SUM(purchase_amount) AS purchase_amount,
SUM(orders) AS orders
FROM daily_purchase
GROUP BY 1, 2
)
SELECT year, month, purchase_amount,
LAG(purchase_amount, 12) OVER (ORDER BY year, month) AS purchase_amount_prev,
ROUND(purchase_amount / LAG(purchase_amount, 12) OVER (ORDER BY year, month), 2) AS purchase_amount_rate,
FROM year_month_purchase
ORDER BY year, month;

๋ชธํ๊ธฐ๋ฅผ ๋ง์ณค์ผ๋ ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก Z-Chart ๋ถ์์ ๋ค์ด๊ฐ ๋ณด๋๋ก ํ์.
Z-Chart ๋ถ์
Z-Chart
๋ถ์์ ์๋ณ๋งค์ถ
, (๋
)๋งค์ถ๋๊ณ
, ์ด๋(๋
๊ฐ)ํฉ๊ณ
๋ผ๋ 3๊ฐ์ง ์งํ๋ฅผ ๊บพ์์ ๊ทธ๋ํ๋ก ๋ํ๋ธ ๊ฒ์ผ๋ก Z ํํ๋ฅผ ์ด๋ฃฌ๋ค ํ์ฌ Z-Chart
๋ก ๋ถ๋ฆฐ๋ค.
๊ฒฝ์ ๋ถ์์ด๋ ๋ง์ผํ ๋ถ์ผ์์ ์ ๋ณ๋์ด๋ ๊ณ์ ๋ณ๋์ ๋ฐฐ์ ํ ๋งค์ถ ๊ฒฝํฅ์ ๋ถ์ํ๊ธฐ ์ํด ์์ฃผ ์ด์ฉ๋๋ค. Z-Chart ๋ถ์์ ์ํด์๋ ์๋ 3๊ฐ์ง ์งํ๊ฐ ํ์ํ๋ค.
์๋ณ๋งค์ถ
๋งค์ถ๋๊ณ
์ด๋๋ ๊ณ
๋งค์ถ ์ด๋ ฅ ๋ฐ์ดํฐ๋ก๋ถํฐ ๊ฐ๊ฐ์ ์งํ๋ฅผ ์ฐ์ถํ๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.

1. Z-Chart ๋ถ์ ์ฟผ๋ฆฌ
CREATE OR REPLACE TABLE learning_club.zchart_dm AS
WITH daily_purchase AS (
SELECT dt,
SUBSTR(dt, 1, 4) AS year,
SUBSTR(dt, 6, 2) AS month,
SUBSTR(dt, 9, 2) AS day,
SUM(purchase_amount) AS purchase_amount,
COUNT(order_id) AS orders
FROM learning_club.purchase_log_yr
GROUP BY 1
ORDER BY 1
),
year_month_purchase AS (
SELECT year,
month,
SUM(purchase_amount) AS purchase_amount,
SUM(orders) AS orders
FROM daily_purchase
GROUP BY 1, 2
)
SELECT year, month,
purchase_amount,
SUM(purchase_amount) OVER (
PARTITION BY year ORDER BY month ROWS UNBOUNDED PRECEDING
) AS purchase_cumulative,
SUM(purchase_amount) OVER (
ORDER BY year, month ROWS 11 PRECEDING
) AS purchase_moving_yr,
FROM year_month_purchase
ORDER BY year, month;
[๊ทธ๋ฆผ] Z Chart Analysis Query
์๋ณ๋งค์ถ
์ GROUP BY
์ง๊ณ๋ฅผ ํตํด ์ฝ๊ฒ ๊ณ์ฐ๋๋ค. ๋งค์ถ๋๊ณ
์ ์ด๋๋
๊ณ
๋ ์์ ๋ชธํ๊ธฐ์์ ์ดํด๋ดค๋ ์ผ๋ณ ๋งค์ถ ๋๊ณ์ ์ด๋ํ๊ท ๋ฅผ ์ฐ์ถํ ๋ ์ฌ์ฉํ๋ ๋ถ์ํจ์(์๋์ฐํจ์)๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ์ถ ๊ฐ๋ฅํ๋ค.
์๋์ฐ ํจ์๋ฅผ ์ฌ์ฉํ ๋๋ ํญ์ ํํฐ์ ์ ์ด๋ป๊ฒ ๋๋์ง, ํํฐ์ ์์์ ์๋์ฐ์ ๋ฒ์๋ฅผ ์ด๋ป๊ฒ ์ก์์ง๋ฅผ ๊ณ ๋ฏผํด์ผ ํ๋ค. ์์ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ๊ฐ์ ์๊ฐํด ๋ณด์.
2. Z-Chart ๋ถ์ ์๊ฐํ
์์์ ์ฐ์ถํ 3๊ฐ์ง ์งํ๋ค๋ค์ ๋งํธํํ์ฌ BigQuery ํ ์ด๋ธ๋ก ์์ฑํ ํ Data Studio์์ ์๊ฐํ๋ฅผ ํ๋ฉด ์๋์ ๊ฐ์ด Z ์ ๋ชจ์์ ๊ทธ๋ํ๊ฐ ๋ง๋ค์ด์ง๋ค.

Last updated