Demand Forecast Explanation
Overview
This skill translates complex demand forecasting model outputs into clear, actionable explanations for demand planners and supply chain stakeholders. It decomposes forecasts into constituent drivers—baseline demand, trend, seasonality, promotions, price elasticity, and external factors—and attributes forecast error to specific causes. The goal is to bridge the gap between data science outputs and planner decision-making, enabling informed consensus adjustments.
When to Use
- A demand planner asks why a forecast increased or decreased for a specific SKU/location
- Stakeholders need to understand what is driving demand for an upcoming planning cycle
- Forecast accuracy has degraded and leadership requires root-cause attribution
- During S&OP meetings when forecast assumptions need to be defended or challenged
- When comparing statistical forecast vs. consensus forecast to justify overrides
- Post-period forecast error review to improve future accuracy
Required Inputs
| Input |
Description |
Format |
sku_id |
Product identifier (SKU, GTIN, or internal ID) |
String |
location_id |
Store, DC, or region identifier |
String |
forecast_period |
Time horizon (weekly, monthly, quarterly) |
ISO date range |
statistical_forecast |
Model-generated forecast values |
Numeric array |
actuals |
Historical actual demand (minimum 52 weeks) |
Numeric array |
promotion_calendar |
Planned and historical promotions |
Structured object |
price_history |
Historical and planned price points |
Numeric array |
external_signals |
Weather, events, macro indicators (optional) |
Structured object |
Methodology
Step 1: Forecast Decomposition
Break the aggregate forecast into additive or multiplicative components:
Forecast = Baseline + Trend + Seasonality + Promo_Lift + Price_Effect + External_Factors + Residual
- Baseline: Deseasonalized, detrended average demand (rolling 12-week median)
- Trend: Linear or exponential growth/decline rate (units per period)
- Seasonality: Seasonal indices by period (e.g., week-of-year indices normalized to 1.0)
- Promo Lift: Incremental volume from promotions (calculated as promoted vs. non-promoted base)
- Price Effect: Price elasticity impact using
ΔQ/Q ÷ ΔP/P coefficient
- External Factors: Weather sensitivity coefficients, event-driven demand spikes
Step 2: Accuracy Metrics Computation
Calculate standard forecast accuracy KPIs:
- MAPE (Mean Absolute Percentage Error):
MAPE = (1/n) × Σ|Actual - Forecast| / Actual × 100
- Weighted MAPE: Weight by revenue or volume to prioritize high-value SKUs
- Bias:
Bias = Σ(Forecast - Actual) / Σ(Actual) × 100 — positive = over-forecast, negative = under-forecast
- Tracking Signal:
TS = RSFE / MAD — flag when |TS| > 4 for systematic bias
- Forecast Value Added (FVA): Compare each step in the process (statistical → consensus → final) to naive forecast
Step 3: Error Attribution
For each period where |Actual - Forecast| / Actual > threshold (default 20%):
- Promotion Attribution: Did an unplanned promotion or cancelled promotion explain the gap?
- Distribution Gap: Was the product available? Check in-stock rate and void scan data
- Cannibalization/Halo: Did a related SKU promotion shift demand?
- External Shock: Weather events, competitor actions, market disruption
- Model Drift: Has the underlying demand pattern changed (structural break test)?
Step 4: Narrative Generation
Construct a planner-friendly explanation following this template:
"For [SKU] at [Location] during [Period], the forecast of [X units] was [Y%] [above/below] actual demand of [Z units]. The primary driver was [Driver 1] contributing [N units] of the deviation, followed by [Driver 2] at [M units]. The forecast [does/does not] show systematic bias (tracking signal = [TS])."
Step 5: Recommendation Synthesis
Based on error patterns, recommend:
- Adjusting seasonal indices if seasonality has shifted
- Incorporating new causal variables if external factors are material
- Planner override guidelines with confidence intervals
- Segmentation changes (move SKU between A/B/C forecast tiers)
Output Specification
forecast_explanation:
sku_id: "SKU-12345"
location: "DC-WEST-01"
period: "2026-W06 to 2026-W10"
forecast_summary:
statistical_forecast: 12500
consensus_forecast: 13000
actual: 11800
decomposition:
baseline: 9200
trend: -150
seasonality: 1800
promo_lift: 1400
price_effect: 250
external: 0
accuracy_metrics:
mape: 10.2
bias_pct: 5.8
tracking_signal: 2.3
fva_vs_naive: 12.5
error_attribution:
- driver: "Promo cancellation"
impact_units: -800
confidence: "high"
- driver: "Seasonal index drift"
impact_units: -350
confidence: "medium"
narrative: "..."
recommendations:
- "Recalibrate seasonal indices using 2025-2026 data"
- "Flag promo calendar sync as upstream data quality issue"
Analysis Framework
ABC-XYZ Segmentation for Forecast Prioritization
| Segment |
Volume (ABC) |
Variability (XYZ) |
Forecast Approach |
| AX |
High volume, low variability |
Statistical auto-forecast, minimal planner touch |
|
| AY |
High volume, moderate variability |
Statistical + planner review of promotions |
|
| AZ |
High volume, high variability |
Planner-intensive, scenario-based forecasting |
|
| BX-CZ |
Lower volume |
Aggregate forecasting, safety stock buffers |
|
Bias Pattern Detection
- Persistent positive bias (>3 consecutive periods): Model is systematically over-forecasting — investigate demand decline, distribution loss, or competitive entry
- Persistent negative bias: Model is under-forecasting — investigate organic growth, new distribution, or untracked promotions
- Oscillating bias: Model is chasing noise — consider dampening or longer smoothing windows
Examples
Example 1 — Seasonal Forecast Miss
"Sunscreen SPF-50 at Southeast DC forecast 45,000 units for June but actual was 38,200 (MAPE: 17.8%). Decomposition shows seasonal index was calibrated on 2023-2024 data when summer started earlier. Recommend recalibrating with 2025 weather-adjusted start dates. Bias is +15.2% indicating systematic over-forecast for this category."
Example 2 — Promotion-Driven Variance
"Organic Pasta 16oz forecast 8,200 units during BOGO week but actual was 12,400. The promo lift model estimated 40% uplift based on prior TPRs, but BOGO events historically drive 80-120% uplift for this subcategory. FVA analysis shows consensus adjustment added 1,200 units but still fell short. Recommend a BOGO-specific uplift coefficient."
Guidelines
- Always present accuracy metrics in context — a 25% MAPE on a CZ item is acceptable; on an AX item it signals a problem
- Distinguish between forecastable error (model improvement opportunity) and unforecastable error (random demand variation)
- Quantify each driver's contribution in units, not just percentages, so planners can make tangible adjustments
- Compare FVA at each process step to identify whether planner overrides are adding or destroying value
- Use 52-week rolling windows for accuracy metrics to smooth out period-specific anomalies
- Flag when sample sizes are too small for reliable decomposition (fewer than 13 periods of history)
- Present recommendations ranked by expected impact on forecast accuracy improvement
Validation Checklist
1---2name: demand-forecast-explanation3description: Explain forecast drivers and decomposition to demand planners, translating statistical models into actionable business narratives with accuracy metrics, bias analysis, and root-cause attribution for forecast deviations.4---56# Demand Forecast Explanation78## Overview910This skill translates complex demand forecasting model outputs into clear, actionable explanations for demand planners and supply chain stakeholders. It decomposes forecasts into constituent drivers—baseline demand, trend, seasonality, promotions, price elasticity, and external factors—and attributes forecast error to specific causes. The goal is to bridge the gap between data science outputs and planner decision-making, enabling informed consensus adjustments.1112## When to Use1314- A demand planner asks why a forecast increased or decreased for a specific SKU/location15- Stakeholders need to understand what is driving demand for an upcoming planning cycle16- Forecast accuracy has degraded and leadership requires root-cause attribution17- During S&OP meetings when forecast assumptions need to be defended or challenged18- When comparing statistical forecast vs. consensus forecast to justify overrides19- Post-period forecast error review to improve future accuracy2021## Required Inputs2223| Input | Description | Format |24|-------|-------------|--------|25| `sku_id` | Product identifier (SKU, GTIN, or internal ID) | String |26| `location_id` | Store, DC, or region identifier | String |27| `forecast_period` | Time horizon (weekly, monthly, quarterly) | ISO date range |28| `statistical_forecast` | Model-generated forecast values | Numeric array |29| `actuals` | Historical actual demand (minimum 52 weeks) | Numeric array |30| `promotion_calendar` | Planned and historical promotions | Structured object |31| `price_history` | Historical and planned price points | Numeric array |32| `external_signals` | Weather, events, macro indicators (optional) | Structured object |3334## Methodology3536### Step 1: Forecast Decomposition3738Break the aggregate forecast into additive or multiplicative components:3940```41Forecast = Baseline + Trend + Seasonality + Promo_Lift + Price_Effect + External_Factors + Residual42```4344- **Baseline**: Deseasonalized, detrended average demand (rolling 12-week median)45- **Trend**: Linear or exponential growth/decline rate (units per period)46- **Seasonality**: Seasonal indices by period (e.g., week-of-year indices normalized to 1.0)47- **Promo Lift**: Incremental volume from promotions (calculated as promoted vs. non-promoted base)48- **Price Effect**: Price elasticity impact using `ΔQ/Q ÷ ΔP/P` coefficient49- **External Factors**: Weather sensitivity coefficients, event-driven demand spikes5051### Step 2: Accuracy Metrics Computation5253Calculate standard forecast accuracy KPIs:5455- **MAPE** (Mean Absolute Percentage Error): `MAPE = (1/n) × Σ|Actual - Forecast| / Actual × 100`56- **Weighted MAPE**: Weight by revenue or volume to prioritize high-value SKUs57- **Bias**: `Bias = Σ(Forecast - Actual) / Σ(Actual) × 100` — positive = over-forecast, negative = under-forecast58- **Tracking Signal**: `TS = RSFE / MAD` — flag when |TS| > 4 for systematic bias59- **Forecast Value Added (FVA)**: Compare each step in the process (statistical → consensus → final) to naive forecast6061### Step 3: Error Attribution6263For each period where `|Actual - Forecast| / Actual > threshold` (default 20%):64651. **Promotion Attribution**: Did an unplanned promotion or cancelled promotion explain the gap?662. **Distribution Gap**: Was the product available? Check in-stock rate and void scan data673. **Cannibalization/Halo**: Did a related SKU promotion shift demand?684. **External Shock**: Weather events, competitor actions, market disruption695. **Model Drift**: Has the underlying demand pattern changed (structural break test)?7071### Step 4: Narrative Generation7273Construct a planner-friendly explanation following this template:7475> "For [SKU] at [Location] during [Period], the forecast of [X units] was [Y%] [above/below] actual demand of [Z units]. The primary driver was [Driver 1] contributing [N units] of the deviation, followed by [Driver 2] at [M units]. The forecast [does/does not] show systematic bias (tracking signal = [TS])."7677### Step 5: Recommendation Synthesis7879Based on error patterns, recommend:80- Adjusting seasonal indices if seasonality has shifted81- Incorporating new causal variables if external factors are material82- Planner override guidelines with confidence intervals83- Segmentation changes (move SKU between A/B/C forecast tiers)8485## Output Specification8687```yaml88forecast_explanation:89 sku_id: "SKU-12345"90 location: "DC-WEST-01"91 period: "2026-W06 to 2026-W10"92 forecast_summary:93 statistical_forecast: 1250094 consensus_forecast: 1300095 actual: 1180096 decomposition:97 baseline: 920098 trend: -15099 seasonality: 1800100 promo_lift: 1400101 price_effect: 250102 external: 0103 accuracy_metrics:104 mape: 10.2105 bias_pct: 5.8106 tracking_signal: 2.3107 fva_vs_naive: 12.5108 error_attribution:109 - driver: "Promo cancellation"110 impact_units: -800111 confidence: "high"112 - driver: "Seasonal index drift"113 impact_units: -350114 confidence: "medium"115 narrative: "..."116 recommendations:117 - "Recalibrate seasonal indices using 2025-2026 data"118 - "Flag promo calendar sync as upstream data quality issue"119```120121## Analysis Framework122123### ABC-XYZ Segmentation for Forecast Prioritization124125| Segment | Volume (ABC) | Variability (XYZ) | Forecast Approach |126|---------|-------------|-------------------|-------------------|127| AX | High volume, low variability | Statistical auto-forecast, minimal planner touch |128| AY | High volume, moderate variability | Statistical + planner review of promotions |129| AZ | High volume, high variability | Planner-intensive, scenario-based forecasting |130| BX-CZ | Lower volume | Aggregate forecasting, safety stock buffers |131132### Bias Pattern Detection133134- **Persistent positive bias** (>3 consecutive periods): Model is systematically over-forecasting — investigate demand decline, distribution loss, or competitive entry135- **Persistent negative bias**: Model is under-forecasting — investigate organic growth, new distribution, or untracked promotions136- **Oscillating bias**: Model is chasing noise — consider dampening or longer smoothing windows137138## Examples139140**Example 1 — Seasonal Forecast Miss**141> "Sunscreen SPF-50 at Southeast DC forecast 45,000 units for June but actual was 38,200 (MAPE: 17.8%). Decomposition shows seasonal index was calibrated on 2023-2024 data when summer started earlier. Recommend recalibrating with 2025 weather-adjusted start dates. Bias is +15.2% indicating systematic over-forecast for this category."142143**Example 2 — Promotion-Driven Variance**144> "Organic Pasta 16oz forecast 8,200 units during BOGO week but actual was 12,400. The promo lift model estimated 40% uplift based on prior TPRs, but BOGO events historically drive 80-120% uplift for this subcategory. FVA analysis shows consensus adjustment added 1,200 units but still fell short. Recommend a BOGO-specific uplift coefficient."145146## Guidelines1471481. Always present accuracy metrics in context — a 25% MAPE on a CZ item is acceptable; on an AX item it signals a problem1492. Distinguish between forecastable error (model improvement opportunity) and unforecastable error (random demand variation)1503. Quantify each driver's contribution in units, not just percentages, so planners can make tangible adjustments1514. Compare FVA at each process step to identify whether planner overrides are adding or destroying value1525. Use 52-week rolling windows for accuracy metrics to smooth out period-specific anomalies1536. Flag when sample sizes are too small for reliable decomposition (fewer than 13 periods of history)1547. Present recommendations ranked by expected impact on forecast accuracy improvement155156## Validation Checklist157158- [ ] Decomposition components sum to within 2% of the total forecast159- [ ] MAPE, bias, and tracking signal are computed on aligned actuals (same granularity, same periods)160- [ ] Promotion calendar is synchronized with the latest trade promotion management system export161- [ ] Error attribution drivers are mutually exclusive and collectively exhaustive162- [ ] Narrative is free of statistical jargon — uses business terms planners understand163- [ ] Recommendations include specific parameter changes, not just directional guidance164- [ ] FVA analysis includes naive benchmark (e.g., same period last year) as the baseline165- [ ] Seasonal index recalibration recommendation includes the proposed new indices166- [ ] Output YAML conforms to the specification schema and passes validation