Feature Engineering — 시계열 데이터에서 feature 만들기
Regression은 X를 알면 Y를 예측할 수 있는가를 묻는다. 판매량 예측에서 Y는 "오늘 판매량"이고, 날짜와 수량밖에 없을 때 X는 이 둘에서 만들어내야 한다. 이 과정이 feature engineering이다.
## 1. 과거 수량에서 파생 — Lag & Rolling
### Lag feature
과거의 자기 자신을 feature로 쓰는 방법이다.
오늘이 10월 10일이면:
- `lag_1` = 10월 9일 판매량
- `lag_7` = 10월 3일 판매량
- `lag_30` = 9월 10일 판매량
모델은 "어제 많이 팔렸으면 오늘도 많이 팔릴 가능성이 있다"는 패턴을 학습한다. 어떤 lag를 쓸지는 데이터의 자기상관(autocorrelation) 구조에 달려있다. EDA에서 확인한다.
### Rolling mean (이동평균)
단일 날의 판매량은 노이즈가 크다. 이동평균은 그 노이즈를 평탄화해서 "최근 N일의 추세 수준"을 나타낸다.
- `rolling_7` = 최근 7일 평균
- `rolling_30` = 최근 30일 평균
lag_7과 rolling_7의 차이: lag_7은 7일 전 단일 값이고, rolling_7은 최근 7일의 평균이다. rolling이 더 안정적인 추세 신호를 준다.
### ⚠️ Data Leakage 주의 — shift(1)
오늘 판매량을 예측하는 feature를 만들 때 오늘 데이터를 포함하면, 모델이 미래를 미리 아는 상황이 된다. 이를 **data leakage**라고 한다. 학습할 때는 성능이 좋아 보이지만, 실제 예측에서는 쓸 수 없는 feature가 된다.
항상 예측 시점 이전 데이터만 써야 한다. pandas에서는 `shift(1)`로 한 칸 밀어서 해결한다.
## 2. 날짜에서 파생 — Temporal feature
날짜 문자열(`2024-01-15`)은 모델이 이해하지 못한다. 날짜를 의미 있는 숫자들로 쪼개서 넣는다.
| Feature | 범위 | 포착하는 패턴 |
|---------|------|-------------|
| 요일 | 0~6 | 주 단위 반복 패턴 |
| 월 | 1~12 | 계절 효과 |
| 분기 | 1~4 | 큰 계절 단위 |
| 월의 몇 번째 주 | 1~5 | 월초/월말 패턴 |
이 feature들의 원리는 **주기성**이다. 요일은 7일마다, 월은 12달마다 반복된다. 이 반복 패턴이 판매량에 영향을 준다면 모델이 학습할 수 있다.
### 주의: EDA 먼저
패턴이 없는 feature는 모델에 노이즈만 추가한다. 요일별로 판매량 차이가 실제로 있는지 EDA([[eda-step2]])에서 시각화로 확인한 뒤 feature를 결정하는 것이 맞다.
## 정리
| 구분 | 종류 | 원리 |
|------|------|------|
| 과거 수량 파생 | lag, rolling mean | 시간 의존성 — 과거가 미래에 영향 |
| 날짜 파생 | 요일, 월, 분기 | 주기성 — 반복 패턴 |
## 둘 중에 고르는 게 아니다
두 종류의 feature는 서로 다른 정보를 포착하기 때문에 **함께 쓰는 것이 일반적**이다.
- 과거 수량 파생 → "최근 흐름"을 담는다. 지난주 판매가 많았는지 적었는지.
- 날짜 파생 → "시간적 위치"를 담는다. 지금이 금요일인지, 12월인지.
이 둘은 서로 설명하지 못하는 것을 보완한다. 날짜 정보만으로는 올해가 예년보다 잘 팔리는 추세인지 모르고, 최근 이동평균만으로는 지금이 계절적으로 원래 많이 팔리는 시기인지 모른다.
실제 feature set 구성 예시:
```
lag_1, lag_7, lag_30 ← 과거 수량
rolling_7, rolling_30 ← 과거 수량 (평탄화)
요일, 월 ← 날짜 (EDA에서 패턴 확인된 것만)
```
단, 모든 feature를 무조건 다 넣는 것이 아니다. EDA([[eda-step2]])에서 실제로 패턴이 있는지 확인하고, 있는 것만 포함한다. 패턴이 없는 feature는 모델에 노이즈만 추가한다.