Manufacturing · Data Science & AI
A demand forecast that had to beat a moving average — or it would not ship
Two internal demand-forecasting POCs had already failed. We started by establishing the simplest possible baseline and set the rule that any model had to beat it to be deployed.
- Sector
- Manufacturing
- Size
- 9 sites, 2,100 employees
- Service
- Data Science & AI
- Model
- Framing then fixed price
- Duration
- 2-week framing, 11-week project
Context
Production planning relied on planner experience and a spreadsheet moving average. Both stockouts and overstocks were frequent, on short-shelf-life products.
The problem
- Two forecasting projects already abandoned at POC stage
- Sales history available but promotions not tracked separately
- No internal consensus on which metric to optimise
- Strong planner distrust of an automated model
What we did
- Two-week framing spent first on settling the metric, with supply chain and financial control
- Reconstruction of promotional history from invoicing data
- Explicit baseline: the current moving average, measured over a rolling twelve months
- Rule set in writing: no model ships unless it beats the baseline on the agreed metric
- One model per product family, not a single model — low-rotation families stay on the baseline
- Manual override interface for planners, with override tracking
- Monthly retraining pipeline and drift alerting
Results
- -31 %
- forecast error reduction
- 4 / 7
- families moved to the model
- 11 sem.
- framing to production
- 18 mois
- in production with no manual retraining
What remains
Three of seven product families stayed on the moving average because the model did not beat it. The client considers that the project's most credible outcome: it is what convinced the planners to accept the model on the other four families. Manual overrides are tracked and feed the retraining signal.
« This is the first provider who told us that part of our need did not require artificial intelligence. »
Stack
- Python
- scikit-learn
- MLflow
- Azure ML
- PostgreSQL