Feature Engineering — 주별 모델
## 주별 feature set
| feature | 내용 | 근거 |
|---------|------|------|
| `lag_1W` | 1주 전 판매량 | 단기 흐름 |
| `lag_2W` | 2주 전 판매량 | 단기 흐름 |
| `lag_4W` | 4주 전 (약 1달 전) | 중기 흐름 |
| `lag_52W` | 52주 전 (1년 전) | 작년 같은 시기 — 계절성 직접 반영 |
| `rolling_4W` | 최근 4주 평균 | 노이즈 제거한 단기 추세 |
| `rolling_12W` | 최근 12주 평균 | 분기 수준 추세 |
| `month` | 월 (1~12) | 계절성 |
| `quarter` | 분기 (1~4) | 계절성 큰 단위 |
| `week_of_year` | 연간 주차 (1~52) | 계절성 세밀하게 |
## 요일 feature를 넣지 않는 이유
요일 패턴은 일별 EDA에서 뚜렷하게 확인됐지만, 주 단위로 집계하면 월~일 판매량이 하나의 숫자로 합산된다. 모든 주에 월~금이 다 포함되어 있으므로 요일 정보가 의미를 잃는다. 요일 feature는 일별 모델에서만 유효하다.
## lag_52W의 역할
8~9월 계절성이 뚜렷한 데이터에서 "작년 같은 주 판매량"을 직접 feature로 주면 모델이 계절성을 훨씬 쉽게 학습한다. month나 quarter가 계절 위치를 간접적으로 알려준다면, lag_52W는 실제 수량을 직접 알려주는 것.
## 데이터 손실
lag_52W를 사용하면 처음 52주 데이터는 lag 값이 없어서 제외된다.
559행 → 약 507행. 학습에는 충분한 수준.
## 구현 방향
```python
df = weekly.copy()
df.columns = ['weekly_qty']
# Lag features
df['lag_1W'] = df['weekly_qty'].shift(1)
df['lag_2W'] = df['weekly_qty'].shift(2)
df['lag_4W'] = df['weekly_qty'].shift(4)
df['lag_52W'] = df['weekly_qty'].shift(52)
# Rolling features (shift(1)로 data leakage 방지)
df['rolling_4W'] = df['weekly_qty'].shift(1).rolling(4).mean()
df['rolling_12W'] = df['weekly_qty'].shift(1).rolling(12).mean()
# 시간 features
df['month'] = df.index.month
df['quarter'] = df.index.quarter
df['week_of_year'] = df.index.isocalendar().week.astype(int)
df = df.dropna()
```
## Train/Test split
시계열은 random split 금지. 시간 순서 유지.
→ [[forecast-horizon]]