Spike 대응 재고 준비 전략
## 문제 재정의
일반 regression은 평균적인 판매량을 예측한다. 재고 준비에는 평균이 아니라 **"이 정도까지는 커버할 수 있어야 한다"는 상한선**이 필요하다. 문제를 "정확히 얼마나 팔릴까" → "얼마나 준비해야 안전한가"로 바꾸는 것이다.
## 방향 1 — Quantile Regression
특정 분위수를 예측하는 모델. 90th percentile을 예측하면 "실제 판매량이 이 값을 넘을 확률이 10%"라는 의미다.
```python
from sklearn.linear_model import QuantileRegressor
model_90 = QuantileRegressor(quantile=0.9, alpha=0.1)
model_50 = QuantileRegressor(quantile=0.5, alpha=0.1)
```
- 50th percentile → 일반적인 판매 수준
- 90th percentile → 재고 준비 기준선
## 방향 2 — Safety Stock (안전 재고)
모델 예측값에 변동성을 반영한 버퍼를 추가하는 고전적 재고 관리 방법.
```
재고 준비량 = 예측값 + Z × 표준편차
```
| 서비스 수준 | Z값 |
|-----------|-----|
| 90% | 1.28 |
| 95% | 1.65 |
| 99% | 2.33 |
"99% 커버" → 예측값 + 2.33 × 과거 예측 오차 표준편차
## 방향 3 — Spike 패턴 분석
Spike가 특정 시기에 집중되는 패턴이 있다면 시기별 재고 전략을 다르게 가져갈 수 있다.
```python
threshold = weekly['weekly_qty'].quantile(0.9)
spikes = weekly[weekly['weekly_qty'] > threshold]
# spike 집중 시기 확인
spikes.groupby('month')['weekly_qty'].count()
spikes.groupby('week_of_year')['weekly_qty'].count()
```
## 조합 전략
```
일반 기간: 예측값 + Safety Stock (95% 수준)
성수기(8~9월): 예측값 × spike 보정 계수 + Safety Stock (99% 수준)
```
## R² 음수가 의미하는 것
모든 모델의 R²가 음수인 것은 spike 예측이 불가능하다는 것이 아니라, **spike를 포함한 정확한 수량 예측이 어렵다**는 의미다. Quantile regression으로 문제를 바꾸면 R² 대신 Pinball Loss(분위 손실 함수)로 평가한다. 이 경우 음수 R²는 더 이상 문제가 되지 않는다.