RT-W6: 예측 재고 관리 및 자동 보충

🎯 연구 배경

전통적인 고정 안전 재고(EOQ·ROP) 방식은 수요 변동성이 큰 SKU에서 재고 과잉과 품절을 동시에 발생시킵니다. 프로모션·계절성·경쟁사 품절 같은 외생 변수를 반영하지 못하기 때문입니다. RT-W6는 XGBoost 기반 일별 수요 예측 서비스 수준에 기반한 safety_stock 동적 계산을 결합하여, 각 SKU의 보충 시점과 재주문 수량을 자동으로 결정합니다. 3월 실증 결과 MAPE 11.4% · 재고 22.7% 감소 · 품절률 3.8% → 1.9%로 목표(예측 12% 이하, 품절 2% 이하)를 모두 달성했습니다.

🧮 XGBoost 수요 예측 피처 설계

SKU별 과거 판매량·계절성·프로모션·가격 민감도·카테고리 트렌드까지 총 9개 피처를 설계했습니다. 계절성은 sin/cos 인코딩으로 순환 구조를 보존하고, 가격·경쟁사 품절은 전일 대비 변화량을 사용합니다.

features_per_sku = [ "sales_lag_7d", "sales_lag_14d", # 과거 판매량 "season_sin", "season_cos", # 계절 순환 인코딩 "is_promo", "promo_intensity", # 프로모션 "price_change", "competitor_oos", # 가격·경쟁사 품절 "category_trend" # 카테고리 트렌드 ] # 예측 정확도 목표: MAPE < 12%
📅 Lag Features
7d · 14d
직전 7일·14일 이동 판매량. 최근 수요 수준(level)과 단기 추세를 포착.
🔄 Seasonality
sin · cos
연간 365일 주기의 sin/cos 인코딩. 12월 → 1월 경계 단절을 제거.
🎁 Promotion
flag · int
is_promo 이진 플래그 + promo_intensity(할인율·노출 지수). 급증 구간 모델링.
💰 Price Signal
Δprice · oos
자사 가격 변화율 + 경쟁사 품절 여부. 수요 대체 효과를 학습.
📊 Category Trend
rolling
소속 카테고리 30일 평균 성장률. 신규·롱테일 SKU의 데이터 희소 문제를 보완.
🛡 동적 안전 재고 공식

고정 안전 재고 대신 서비스 수준(service_level)에 대응하는 z-score에 수요 표준편차와 리드타임을 곱해 SKU별로 매일 재계산합니다. 97% 서비스 수준에서 z ≈ 1.88, 이는 정규분포 상단 97백분위수를 의미합니다.

def safety_stock(sku, service_level=0.97): z = norm.ppf(service_level) # z=1.88 at 97% sigma = demand_std(sku, window=30) lead = replenishment_lead(sku) return z * sigma * sqrt(lead) # 안전 재고량

결과적으로 수요가 안정적인 SKU(낮은 σ)는 안전 재고가 자동 감소하고, 변동성·리드타임이 긴 SKU는 상향 조정됩니다. 97% 수준을 유지하면서도 평균 재고를 22.7% 줄일 수 있었던 핵심 메커니즘입니다.

📉 3월 학습·운영 결과
✓ XGBoost + safety_stock 통합 운영 (2025.03 기준)
수요 예측 MAPE
11.4%
목표 12% 달성 · 2월 12.6% 대비 −1.2p
평균 재고 수준
−22.7%
baseline 100 → 77.3 · 자본 회전률 개선
품절 발생률
1.9%
3.8% → 1.9% · 목표 2% 달성