Skip to Content

04. 시계열 트렌드 분석 (Time Series)

중급2시간

1. 개요 및 시나리오

상황: 갑자기 CS 티켓이 폭증하여 팀이 마비되었습니다. 팀장님이 다급하게 묻습니다.

“이게 일시적인 건가요, 아니면 계속 늘어나는 추세인가요? 언제부터 이런 거죠?”

우리는 **“시간의 흐름”**을 읽어야 합니다. 단순히 “오늘 몇 건”이 아니라, “어제보다 얼마나 늘었는지(WoW)”, “장기적인 추세(Trend)는 어떤지” 분석해봅시다.


2. 데이터 준비

기본적으로 cs_tickets_dummy 테이블을 사용합니다. 시간 데이터(opened_at)를 다루는 것이 핵심입니다.

# BigQuery 연결 설정 from google.cloud import bigquery client = bigquery.Client()

3. 일별/주별 트렌드 분석

데이터 노이즈를 줄이기 위해 먼저 일별(Daily) 또는 주별(Weekly)로 집계해야 합니다.

❓ 문제 1: 일별 티켓 접수량 시각화

Q. 최근 90일간 일별 티켓 접수량을 구하고, 선 그래프로 시각화하세요.

💡

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일 이동 평균을 계산하세요.

💡

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. 주별 티켓 수와 **지난주 대비 증감율(%)**을 계산하세요.

💡

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 * 표준편차를 넘는 날을 “이상 급증일”로 정의하고 찾아주세요.

정답 코드 보기

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;

💡 요약 및 인사이트

시간의 흐름을 분석하면 단편적인 숫자 너머의 스토리가 보입니다.

  1. 이동 평균(Moving Average): 노이즈를 제거하고 ‘진짜 추세’를 보여줍니다.
  2. Window Functions: LAG, LEAD, SUM() OVER() 등은 SQL 분석의 꽃입니다.
  3. 이상치 탐지: 단순 통계만으로도 비즈니스 위기를 조기에 감지할 수 있습니다.

다음 단계: 고객도 분석했고, 시간도 분석했습니다. 하지만 “모든 고객이 똑같지 않습니다”. 다음 챕터에서는 고객을 그룹으로 나누어 분석하는 **세그먼테이션(Segmentation)**을 배웁니다.

Last updated on

🤖AI 모의면접실전처럼 연습하기