DSA Baseline Forecast Accuracy — Plan vs Actual

Product line × channel × month · Plan: SRX Live File 'YYYY - SALES' tabs · Actuals: data cube T02OrderData · Generated 2026-08-19 by build_baseline_accuracy.py

Reading this report: the client-quoted “~16% wMAPE” is reproduced here at product line × year grain (16.8% in 2025). At planning grain (product line × channel × month) the same plan shows 95% wMAPE — errors cancel as you aggregate. The plan source is the live file (latest in-year revision ≈ B3/B4), so true B1 accuracy is likely worse than shown.

2025 wMAPE by aggregation grain — same plan, same actuals

Each bar re-slices the identical plan-vs-actual dataset. Coarser grain lets over- and under-forecasts across channels and months net out.

wMAPE by year and grain

Greyed years: under 80% of Srixon-brand actual volume matched plan line names (naming drift in older tabs) — treat as indicative. Coverage vs whole cube is lower because the cube spans all brands (Cleveland, XXIO, Asics, Tennis) while the plan file is Srixon golf only.

Plan vs actual units by month

Monthly wMAPE (product line × channel grain)

wMAPE per month = Σ|plan−actual| ÷ Σactual across all product line × channel cells in that month.

Month table

Annual plan vs actual by channel

Monthly wMAPE by channel

Channel table

Channel groups are canonical rollups — see the Data Model tab for the exact mapping. OFF/KEY/OTHER pools every bucket that lacks a clean 1:1 name on both sides.

Drill-down: monthly plan vs actual, by channel

Product line table (2025) — click headers to sort

Annual wMAPE = |Σplan−Σactual| ÷ Σactual for the year. Monthly wMAPE = Σ|plan−actual| ÷ Σactual over channel × month cells — the planning-grain error for that line.

Trace plan vs actual at any slice

Δ = plan − actual (positive = over-planned). |err| and wMAPE are computed at the grouped grain shown — regroup to watch errors cancel at coarser slices. Product filter: pick a name from the dropdown (or type it in full) for an exact match; type a fragment (e.g. SOFT FEEL) to see the whole family. Rows render up to 3,000; refine filters or download the CSV of the current slice for the full set. 2022–2024 are indicative only (plan-name coverage <80%).

How the data model was built

1 · Plan (forecast) — from Excel

  • File: SRX 2026 Live File_07072026.xlsx (04_DSA_excel/03_Data/raw)
  • Tabs: 2022 - SALES2025 - SALES
  • Fields: Product Line (or MODEL), CHANNEL (or SOP Channel Desc), 12-column Total Units block (J…D)
  • Cleaning: header auto-detected in first 8 rows (layouts differ by year); ADJ channel dropped (internal adjustment bucket); names upper-cased & trimmed

2 · Actuals — from data cube

  • File: T02OrderData.csv (04_DSA_excel/03_Data/data_cube)
  • Note: file ships with no header row — 19 columns named per the T-02 field spec in DSA_Data_Request_vShare.xlsx
  • Fields used: product_line_desc, year, period, sop_region_desc, qty (net units incl. returns/credits)
  • Aggregation: Σqty by product line × region × year × month

3 · Join & measure

  • Keys: product line name + canonical channel group + month
  • Join: full outer, then scoped to product lines present in that year's plan tab
  • Plan cells with no shipments and shipments with no plan both count as error
  • wMAPE computed after aggregating to each reporting grain

The formula

wMAPE(grain) = Σ |plan_units − actual_units| ÷ Σ actual_units
            — after summing plan and actual to that grain first.

grains: company × year  |  product line × year  |  PL × channel × year  |  PL × channel × month

Aggregation order is why the same data yields 0.3%, 16.8%, 42% and 95%: summing before taking the absolute value lets a +10k miss in ON COURSE cancel a −10k miss in AMAZON, and a March over-forecast cancel a June under-forecast. Planning decisions (build plans, allocations, buys) are made at PL × channel × month, so that grain is the honest baseline for the value case's K1.

What came from where

ElementSourceDetail
Forecast (plan units)Excel — live planner file'YYYY - SALES' Total Units monthly block, per product line × channel
Actual shipmentsCube — T02OrderDataNet order qty, 2020–2026, item-level rolled to product line × region × month
Channel dimensionCube — T06ChannelRegionDimUsed to design the canonical rollup (SOP region → channel → on/off)
Field names for headerless T02Excel — DSA_Data_Request_vShare.xlsxT-02 field spec sheet
Annual sanity checkExcel — 2017-2025 forecast accuracy.xlsxBrian's B1/B2 vs actual revenue, product × year (B2 pooled wMAPE 18.1%)

Canonical channel mapping

GroupPlan CHANNEL valuesT02 SOP region values
ON COURSEON COURSE, ON COURSE FITTERSON COURSE
AMAZONAMAZONAMAZON
ECOMECOMMERCE, GOLFBALLS.COMECOMMERCE, GOLFBALLS.COM
MASSWALMART, TARGETWALMART, TARGET
SPORTING GOODSDICKS, SPORTING GOODSDICKS, OTHER SPORTING GOODS
DISTRIBUTORDISTRIBUTORDISTRIBUTOR
OFF/KEY/OTHERGALAXY, KEY, PGATSS, ROGER DUNN, CLUB CHAMPION, OFF*, NON DEALERS, OTHER DOMESTIC, SRX PARTNER, SRX VANOFF COURSE, PGATSS, ROGER DUNN, CLUB CHAMPION, GOLFTEC, 2ND SWING, CARL'S GOLFLAND, OTHER DOMESTIC

PGATSS / ROGER DUNN / CLUB CHAMPION exist on both sides but the plan also carries a generic KEY bucket that can hold their volume — pooling them avoids false channel misses.

Caveats & limitations

  • Live plan, not frozen submissions. The 'YYYY - SALES' tabs are continuously revised during the year (≈ B3/B4 state). A true B1 baseline needs the frozen B1–B4 submission files (data request F-01 — marked available by the client, not yet delivered).
  • Name-match coverage. Within Srixon-brand actuals, plan-line name matching captures 95.7% of 2025 volume but only 45–66% in 2022–2024 (naming drift) — those years are indicative only.
  • Channel rollup is approximate. Plan-only buckets (KEY, GALAXY, OFF REG…) and cube-only regions (GOLFTEC, 2ND SWING…) pool into OFF/KEY/OTHER.
  • Units basis. Actuals are net order quantity including returns/credits; 2025 totals reconcile with plan within 0.3%. Revenue-weighted wMAPE would differ.
  • Scope. Srixon golf only (the plan file's scope). Cleveland, XXIO, Asics in the cube are untouched.