research

Spike 대응 재고 준비 전략

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²는 더 이상 문제가 되지 않는다.