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.45metadata:6 display_name: "Demand Forecast Explanation"7 short_description: "Explain demand forecast drivers, bias, and deviations"8 default_prompt: "Explain my demand forecast in simple words and next steps"9 version: "1.0.0"10 tags:11 - cpg-retail12 icon_path: "assets/icon.png"13---1415# Demand Forecast Explanation1617## Overview1819This 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.2021## When to Use2223- A demand planner asks why a forecast increased or decreased for a specific SKU/location24- Stakeholders need to understand what is driving demand for an upcoming planning cycle25- Forecast accuracy has degraded and leadership requires root-cause attribution26- During S&OP meetings when forecast assumptions need to be defended or challenged27- When comparing statistical forecast vs. consensus forecast to justify overrides28- Post-period forecast error review to improve future accuracy2930## Required Inputs3132| Input | Description | Format |33|-------|-------------|--------|34| `sku_id` | Product identifier (SKU, GTIN, or internal ID) | String |35| `location_id` | Store, DC, or region identifier | String |36| `forecast_period` | Time horizon (weekly, monthly, quarterly) | ISO date range |37| `statistical_forecast` | Model-generated forecast values | Numeric array |38| `actuals` | Historical actual demand (minimum 52 weeks) | Numeric array |39| `promotion_calendar` | Planned and historical promotions | Structured object |40| `price_history` | Historical and planned price points | Numeric array |41| `external_signals` | Weather, events, macro indicators (optional) | Structured object |4243## Methodology4445### Step 1: Forecast Decomposition4647Break the aggregate forecast into additive or multiplicative components:4849```50Forecast = Baseline + Trend + Seasonality + Promo_Lift + Price_Effect + External_Factors + Residual51```5253- **Baseline**: Deseasonalized, detrended average demand (rolling 12-week median)54- **Trend**: Linear or exponential growth/decline rate (units per period)55- **Seasonality**: Seasonal indices by period (e.g., week-of-year indices normalized to 1.0)56- **Promo Lift**: Incremental volume from promotions (calculated as promoted vs. non-promoted base)57- **Price Effect**: Price elasticity impact using `ΔQ/Q ÷ ΔP/P` coefficient58- **External Factors**: Weather sensitivity coefficients, event-driven demand spikes5960### Step 2: Accuracy Metrics Computation6162Calculate standard forecast accuracy KPIs:6364- **MAPE** (Mean Absolute Percentage Error): `MAPE = (1/n) × Σ|Actual - Forecast| / Actual × 100`65- **Weighted MAPE**: Weight by revenue or volume to prioritize high-value SKUs66- **Bias**: `Bias = Σ(Forecast - Actual) / Σ(Actual) × 100` — positive = over-forecast, negative = under-forecast67- **Tracking Signal**: `TS = RSFE / MAD` — flag when |TS| > 4 for systematic bias68- **Forecast Value Added (FVA)**: Compare each step in the process (statistical → consensus → final) to naive forecast6970### Step 3: Error Attribution7172For each period where `|Actual - Forecast| / Actual > threshold` (default 20%):73741. **Promotion Attribution**: Did an unplanned promotion or cancelled promotion explain the gap?752. **Distribution Gap**: Was the product available? Check in-stock rate and void scan data763. **Cannibalization/Halo**: Did a related SKU promotion shift demand?774. **External Shock**: Weather events, competitor actions, market disruption785. **Model Drift**: Has the underlying demand pattern changed (structural break test)?7980### Step 4: Narrative Generation8182Construct a planner-friendly explanation following this template:8384> "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])."8586### Step 5: Recommendation Synthesis8788Based on error patterns, recommend:89- Adjusting seasonal indices if seasonality has shifted90- Incorporating new causal variables if external factors are material91- Planner override guidelines with confidence intervals92- Segmentation changes (move SKU between A/B/C forecast tiers)9394## Output Specification9596```yaml97forecast_explanation:98 sku_id: "SKU-12345"99 location: "DC-WEST-01"100 period: "2026-W06 to 2026-W10"101 forecast_summary:102 statistical_forecast: 12500103 consensus_forecast: 13000104 actual: 11800105 decomposition:106 baseline: 9200107 trend: -150108 seasonality: 1800109 promo_lift: 1400110 price_effect: 250111 external: 0112 accuracy_metrics:113 mape: 10.2114 bias_pct: 5.8115 tracking_signal: 2.3116 fva_vs_naive: 12.5117 error_attribution:118 - driver: "Promo cancellation"119 impact_units: -800120 confidence: "high"121 - driver: "Seasonal index drift"122 impact_units: -350123 confidence: "medium"124 narrative: "..."125 recommendations:126 - "Recalibrate seasonal indices using 2025-2026 data"127 - "Flag promo calendar sync as upstream data quality issue"128```129130## Analysis Framework131132### ABC-XYZ Segmentation for Forecast Prioritization133134| Segment | Volume (ABC) | Variability (XYZ) | Forecast Approach |135|---------|-------------|-------------------|-------------------|136| AX | High volume, low variability | Statistical auto-forecast, minimal planner touch |137| AY | High volume, moderate variability | Statistical + planner review of promotions |138| AZ | High volume, high variability | Planner-intensive, scenario-based forecasting |139| BX-CZ | Lower volume | Aggregate forecasting, safety stock buffers |140141### Bias Pattern Detection142143- **Persistent positive bias** (>3 consecutive periods): Model is systematically over-forecasting — investigate demand decline, distribution loss, or competitive entry144- **Persistent negative bias**: Model is under-forecasting — investigate organic growth, new distribution, or untracked promotions145- **Oscillating bias**: Model is chasing noise — consider dampening or longer smoothing windows146147## Examples148149**Example 1 — Seasonal Forecast Miss**150> "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."151152**Example 2 — Promotion-Driven Variance**153> "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."154155## Guidelines1561571. Always present accuracy metrics in context — a 25% MAPE on a CZ item is acceptable; on an AX item it signals a problem1582. Distinguish between forecastable error (model improvement opportunity) and unforecastable error (random demand variation)1593. Quantify each driver's contribution in units, not just percentages, so planners can make tangible adjustments1604. Compare FVA at each process step to identify whether planner overrides are adding or destroying value1615. Use 52-week rolling windows for accuracy metrics to smooth out period-specific anomalies1626. Flag when sample sizes are too small for reliable decomposition (fewer than 13 periods of history)1637. Present recommendations ranked by expected impact on forecast accuracy improvement164165## Validation Checklist166167- [ ] Decomposition components sum to within 2% of the total forecast168- [ ] MAPE, bias, and tracking signal are computed on aligned actuals (same granularity, same periods)169- [ ] Promotion calendar is synchronized with the latest trade promotion management system export170- [ ] Error attribution drivers are mutually exclusive and collectively exhaustive171- [ ] Narrative is free of statistical jargon — uses business terms planners understand172- [ ] Recommendations include specific parameter changes, not just directional guidance173- [ ] FVA analysis includes naive benchmark (e.g., same period last year) as the baseline174- [ ] Seasonal index recalibration recommendation includes the proposed new indices175- [ ] Output YAML conforms to the specification schema and passes validation