At an assumed 2-month lead time, forecast-error sizing requires 26.19M units of safety stock, which is 1.67M units (6.8%) more than the 24.52M units required under demand sizing.
34 of the 50 SKUs require additional safety stock, and class C is the only class in which the requirement decreases.
Forecasts were generated with a 4-month moving average lagged by 2 months, which outperformed seasonal naive in a 2016 backtest with a WAPE of 19.3% against 29.1%.
Each tile reports a portfolio total across the 50 SKUs, and the chart breaks safety stock down by ABC class.
Gray bars represent demand sizing and blue bars represent forecast-error sizing.
The lead time slider recalculates every safety stock figure on this page and on the inventory policy page.
The 4-month moving average outperformed seasonal naive on 41 of 50 SKUs, with a portfolio WAPE of 19.3% versus 29.1%.
Selecting the better method for each SKU individually improves the portfolio WAPE only to 18.87%, and this figure is optimistic because each method was selected and evaluated on the same 2016 data.
The two methods miss in opposite directions, with the moving average under-forecasting by 2.6% and seasonal naive over-forecasting by 5.75%.
The additional 1.67M units raise safety stock cover from 0.59 to 0.63 months, which is roughly one additional day of demand.
Class A accounts for about 80% of the increase (1.33M units), and class C is the only class in which safety stock falls.
Both policies share each class's service level, so each SKU's change depends only on forecast error versus demand variation.
Product_1359 (WAPE 7.75%) needs 5.0% less, whereas Product_1570 (WAPE 23.48%) needs 26.6% more.
Class totals do not describe individual SKUs, as 16 SKUs need less stock, and Product_0083 rises 16.6% even though class C as a whole falls.
Moving from a 2-month to a 4-month lead time adds 10.85M units of forecast-error safety stock, against a 1.67M gap between the policies.
The gap between the policies grows to 2.36M units but stays at 6.8%, since both scale with the square root of lead time.
The reorder point rises from 109.85M to 204.36M units, as expected demand over the lead time doubles.
The line chart compares 2016 actual demand with both forecasts for the selected category or SKU.
The table lists each SKU's WAPE under both methods, the winning method, and its bias.
The category and product slicers filter the chart and the table together.
The moving average stays nearly flat across the year, yet it still misses actual demand by less than the seasonal naive, whose peaks often fall in a different month from the actual ones.
Each row is one SKU, sorted by the change in safety stock between the two policies.
The table shows each SKU's service level, demand variation, forecast error, both safety stock figures, and reorder point.
The lead time slider recalculates both safety stock columns, the reorder point, and the change.
The largest increases sit at the top of the table and are mostly in class A, while the 16 SKUs that need less, including Product_1359, appear further down in the full report.
A 77-second walkthrough of the report showing the lead time slider, the forecast filters, and the per-SKU table in use.
In my view, forecast error is the better basis, since it reflects the misses a planner actually faces when ordering.
This costs about 6.8% more units, roughly one extra day of cover, though without cost data the dollar impact is unknown.
Under forecast-error sizing, a SKU's safety stock is set directly by the size of its forecast error.
Better forecasts on those SKUs would therefore reduce safety stock directly, with no change to service levels.
Moving from a 2-month to a 4-month lead time adds 10.85M units of forecast-error safety stock, against a 1.67M gap between the policies.
An error in the assumed lead time would therefore outweigh the policy choice.
The data is the Kaggle dataset Forecasts for Product Demand, with 1,048,575 rows of order history across four warehouses.
I chose Whse_J as the planning point because it carries about 65% of net demand.
SKUs needed demand in at least 39 of the 48 training months, since sporadic demand calls for different forecasting methods.
1,141 SKUs qualified, and I kept the top 50 by 2012 to 2015 volume.
I built the data in PostgreSQL, moving from raw rows to monthly demand per SKU and then to a summary for each SKU.
Values in parentheses were treated as returns, and 11,239 rows without valid dates were excluded.
I set months with no orders to zero, since they reflect real demand and the variation has to include them.
I floored net monthly demand at zero in 148 SKU-months across Whse_J and reconciled totals back to the cleaned data.
I built both forecasts on 2012 to 2015 data and tested them on all 12 months of 2016.
Seasonal naive repeats last year's demand for the same month, scaled by the year-over-year growth.
The moving average uses the four months ending two months before the target, matching an order for the month after next.
I fixed both methods before looking at 2016 and scored them with WAPE, since MAPE breaks on zero-demand months.
Both policies use the same formula, z × variation × √lead time, and differ only in the variation they use.
Demand sizing uses the standard deviation of 2016 monthly demand.
Forecast-error sizing uses the RMSE of the moving average's errors, so any bias adds to the buffer.
I built the reorder point and months of cover on top, and Power BI recalculates both from the lead time slider.
I recomputed three SKUs by hand in Excel, one from each class, and they matched both SQL and Power BI.
The safety stock totals in SQL and Power BI differ by only a few units, a gap caused by rounding.
The 4-month safety stock equals the 2-month figure multiplied by √2, which confirms the slider works as intended.
The dataset has no lead times, costs, or service targets, so these settings are my choices, not facts from the data.
Changing the lead time, service levels, or ABC cutoffs would change the safety stock figures on this page.
Demand sigma and forecast error both come from the 12 months of 2016, the same year the safety stock is meant to cover.
Twelve monthly points give only a rough estimate of variation, so one unusual month can noticeably shift a SKU's safety stock.
Both policies use the same 12 months, so the comparison between them is fair, but a live planner would size on errors from earlier months.
The data has no lead times, so the 2-month default reflects ocean freight in general rather than this company's actual suppliers.
Lead time variability is not modeled, and real shipping delays would add safety stock beyond what either policy shows.
Since lead time moves safety stock more than the choice of policy, this assumption has the largest effect on the totals.
Both methods are simple baselines, and more advanced approaches such as exponential smoothing or regression were not tested.
Forecast-error sizing scales directly with forecast error, so a more accurate method could narrow the 6.8% gap or reverse it.
The result shows what forecast-error sizing needs with a basic forecast, not what it would need with a stronger one.
The 50 SKUs are the highest-volume items with steady demand, out of 1,625 in Whse_J, so sporadic items may behave differently.
The company and products are anonymized, so the findings cannot be checked against real suppliers or lead times.
The file holds 1,048,575 data rows, which fills Excel's row limit once the header is counted, so it may have been cut off.