04. 시계열 트렌드 분석 (Time Series)
1. 개요 및 시나리오
상황: 갑자기 CS 티켓이 폭증하여 팀이 마비되었습니다. 팀장님이 다급하게 묻습니다.
“이게 일시적인 건가요, 아니면 계속 늘어나는 추세인가요? 언제부터 이런 거죠?”
우리는 **“시간의 흐름”**을 읽어야 합니다. 단순히 “오늘 몇 건”이 아니라, “어제보다 얼마나 늘었는지(WoW)”, “장기적인 추세(Trend)는 어떤지” 분석해봅시다.
2. 데이터 준비
기본적으로 cs_tickets_dummy 테이블을 사용합니다.
시간 데이터(opened_at)를 다루는 것이 핵심입니다.
BigQuery (SQL)
# BigQuery 연결 설정
from google.cloud import bigquery
client = bigquery.Client()3. 일별/주별 트렌드 분석
데이터 노이즈를 줄이기 위해 먼저 일별(Daily) 또는 주별(Weekly)로 집계해야 합니다.
❓ 문제 1: 일별 티켓 접수량 시각화
Q. 최근 90일간 일별 티켓 접수량을 구하고, 선 그래프로 시각화하세요.
BigQuery (SQL)
Hint: DATE(opened_at) 함수로 날짜만 추출하고 GROUP BY 하세요.
정답 코드 보기
SELECT
DATE(opened_at) as date,
COUNT(*) as ticket_count
FROM `your-project-id.retail_analytics_us.cs_tickets_dummy`
GROUP BY date
ORDER BY date;4. 이동 평균 (Moving Average)
일별 데이터는 들쭉날쭉(Noise)해서 트렌드를 보기 어렵습니다. **7일 이동 평균(7-day Rolling Average)**을 사용하면 패턴이 훨씬 잘 보입니다.
❓ 문제 2: 7일 이동 평균 계산
Q. 일별 티켓 수의 7일 이동 평균을 계산하세요.
BigQuery (SQL)
Hint: Window Function의 ROWS BETWEEN 6 PRECEDING AND CURRENT ROW를 사용하세요.
정답 코드 보기
WITH daily_stats AS (
SELECT DATE(opened_at) as date, COUNT(*) as count
FROM `your-project-id.retail_analytics_us.cs_tickets_dummy`
GROUP BY 1
)
SELECT
date,
count,
ROUND(AVG(count) OVER (
ORDER BY date
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
), 2) as ma_7day
FROM daily_stats
ORDER BY date;5. 전주/전월 대비 증감율 (WoW / MoM)
“지난주보다 얼마나 늘었나요?”는 비즈니스에서 가장 중요한 질문입니다. 이것을 Week over Week (WoW) 또는 Month over Month (MoM) 분석이라고 합니다.
❓ 문제 3: 주별(Weekly) 증감율 계산
Q. 주별 티켓 수와 **지난주 대비 증감율(%)**을 계산하세요.
BigQuery (SQL)
Hint: LAG(daily_count) OVER (ORDER BY date) 함수를 사용해 지난주 값을 가져오세요.
정답 코드 보기
WITH weekly_stats AS (
SELECT
DATE_TRUNC(opened_at, WEEK(MONDAY)) as week_start,
COUNT(*) as weekly_count
FROM `your-project-id.retail_analytics_us.cs_tickets_dummy`
GROUP BY week_start
)
SELECT
week_start,
weekly_count,
LAG(weekly_count) OVER (ORDER BY week_start) as prev_week_count,
ROUND(
(weekly_count - LAG(weekly_count) OVER (ORDER BY week_start)) * 100.0 /
LAG(weekly_count) OVER (ORDER BY week_start),
2
) as wow_change_pct
FROM weekly_stats
ORDER BY week_start;6. 심화: 시계열 이상치 탐지 (Anomaly Detection)
갑자기 티켓이 3배로 뛰었다면? 이건 단순 트렌드가 아니라 **사건(Anomaly)**입니다. 간단한 규칙(Rule-based)으로 이상치를 찾아봅시다.
❓ 문제 4: 3-Sigma 규칙으로 이상치 찾기
Q. 일별 티켓 수가 평균 + 2 * 표준편차를 넘는 날을 “이상 급증일”로 정의하고 찾아주세요.
BigQuery (SQL)
정답 코드 보기
WITH stats AS (
SELECT
DATE(opened_at) as date,
COUNT(*) as count
FROM `your-project-id.retail_analytics_us.cs_tickets_dummy`
GROUP BY 1
),
bounds AS (
SELECT
AVG(count) as avg_val,
STDDEV(count) as std_val
FROM stats
)
SELECT
s.date,
s.count,
CASE
WHEN s.count > (b.avg_val + 2 * b.std_val) THEN 'Anomaly High'
WHEN s.count < (b.avg_val - 2 * b.std_val) THEN 'Anomaly Low'
ELSE 'Normal'
END as status
FROM stats s, bounds b
ORDER BY s.count DESC;💡 요약 및 인사이트
시간의 흐름을 분석하면 단편적인 숫자 너머의 스토리가 보입니다.
- 이동 평균(Moving Average): 노이즈를 제거하고 ‘진짜 추세’를 보여줍니다.
- Window Functions:
LAG,LEAD,SUM() OVER()등은 SQL 분석의 꽃입니다. - 이상치 탐지: 단순 통계만으로도 비즈니스 위기를 조기에 감지할 수 있습니다.
다음 단계: 고객도 분석했고, 시간도 분석했습니다. 하지만 “모든 고객이 똑같지 않습니다”. 다음 챕터에서는 고객을 그룹으로 나누어 분석하는 **세그먼테이션(Segmentation)**을 배웁니다.