Case Study · Marketing Mix Modelling

Rebuilding media measurement for a national eyewear retailer

Four channels, fourteen regions, 104 weeks. The model found that the most defended line item on the plan was the least defensible.

SectorRetail · Eyewear
ScopeNational + 14 regions
Window104 weeks
RoleLead data scientist
StackPython · PyMC · BigQuery
18%

of working media reallocated under a flat total budget

4×

adstock multiplier on television

11/14

regions where print failed the breakeven test

92%

holdout R² on a blocked 20-week validation window

The brief

The client planned media on a channel ROI dashboard built from last-click platform reporting. Paid search looked extraordinary, television looked mediocre, and print looked adequate. Every one of those three readings was an artefact of the measurement window rather than a fact about the market, and the annual plan had been built on them for three consecutive years.

Approach

Data104 weeks of spend and impressions across TV, print, Meta and paid search, joined to weekly sell-out by region.
TransformsGeometric adstock per channel with normalisation, then Hill saturation. Decay rates estimated by grid search, then re-fit Bayesian for credible intervals.
EstimationHierarchical Bayesian regression in PyMC, regions as partially-pooled groups so low-volume markets borrow strength from the national posterior.
ValidationBlocked time-series cross-validation and a 20-week holdout.
DeliveryBudget optimiser with executable bounds, plus a scenario interface the planning team could drive without me in the room.

What the model found

Carryover differed by an order of magnitude across the plan. Television held a 2.5-week half-life; paid search held 0.7. Once both were expressed as cumulative adstock rather than same-week spend, television's contribution roughly doubled and search's fell by about a third.

The finding that mattered

Print's decay rate was healthy, which is why it had survived. But circulation overlapped heavily with television reach, and once that overlap was modelled, print's incremental contribution did not clear its cost of delivery in eleven of fourteen regions.

contribution decomposition, 104 weeks, stacked area · matplotlib · 1600×720
Figure 1. Weekly sales decomposition, baseline, four media channels, and controls.