Step two · before any modelling
Can this data answer the question at all?
A fit takes minutes and hands back confident-looking numbers whether or not the design could ever have identified them. So we ask whether it could first, and it costs a second. Nothing here has been modelled — this is arithmetic on your file.
The verdict
Caution
The model will run and most of your channels will come back with numbers you can use. The ones named below will not, and they carry that mark through every screen after this one.
2 things to carry forward, all about how wide the answers will be, not whether you get them: TV — Broadcast and Out of Home.
How this verdict is decided
There is no score to improve and no percentage to argue with. A caution about one channel never demotes the whole dataset, because it has somewhere better to live: that channel’s own row, and its trust grade after the fit.
Takes about two minutes, and it is the step that catches impossible assumptions before they become results.
Five questions we ask of every dataset
3900 rows · 11.4× headroom
342 things to estimate
2 condition number
no channel moves as another one does
2 channels flagged
TV — Broadcast and Out of Home
Present
a demand control is mapped
7.31 · line at 5.00
across the whole dataset
Three things to know, each with what to do about it
The largest sits 7 robust standard deviations off the local level, around 2022-03-28. Under a normal likelihood a handful of periods like this can pull the whole fit toward explaining them.
What to do: If these were real events — a promotion, a stockout, a price change — add them as a control column so the model can attribute them instead of absorbing them into media. If they are reporting errors, correct them at source. If they are genuine volatility, no action is needed; the fit will switch to a heavy-tailed likelihood automatically.
It runs in 41% of weeks, in bursts rather than at the start or end of the window. The effect is identified from the handful of on/off transitions rather than from the whole period, so its interval comes back wide even when the fit itself is sound.
What to do: Nothing to fix in the data — this is a media plan, not a defect. Expect a wide range on this channel and weight it accordingly; a lift test on a single burst would pin it faster than more history would.
Out of Home is off air most weeks0.583 measured · 0.50 thresholdOpen
It runs in 38% of weeks, in bursts rather than at the start or end of the window. The effect is identified from the handful of on/off transitions rather than from the whole period, so its interval comes back wide even when the fit itself is sound.
What to do: Nothing to fix in the data — this is a media plan, not a defect. Expect a wide range on this channel and weight it accordingly; a lift test on a single burst would pin it faster than more history would.
What we will do about it
Findings change the model, not your numbers. We never impute, winsorise or drop a row — every entry here alters how the fit is estimated, and states what that costs you.
A heavy-tailed likelihood, not a normal one
Will applytriggered by outliersYour outcome has periods far enough from the local level that a normal error model would have to explain them, and the only levers it has are the media coefficients. We fit a Student-t error instead, which treats rare extreme weeks as noise rather than evidence. The tail-heaviness is itself estimated from your data, not fixed by us.
What it costs you
Genuine one-off events are now down-weighted along with the errors. If a spike was a real promotion you want credited, add it as a control column instead — this setting protects the fit, it does not explain the spike.
How much each channel's spend moves about
Ups and downs are what let the model see what a channel does. Spend the same amount every week and there is nothing to learn from — the return comes back as whatever we assumed going in, however large the budget.
| Channel | Spend share | Variation | Overlap cost | Weeks with nothing spent |
|---|---|---|---|---|
| TV — Broadcast | 27.8% | 1.66 | 1.2 | 59% of weeks had no spend |
| Video — CTV | 15.5% | 0.93 | 3.0 | spent every week |
| Paid Social | 19.6% | 0.74 | 2.5 | spent every week |
| Paid Search | 17.3% | 0.77 | 4.8 | spent every week |
| Programmatic Display | 11.5% | 0.71 | 1.9 | spent every week |
| Out of Home | 8.3% | 1.64 | 1.2 | 62% of weeks had no spend |
How closely your channels move together
Read a cell as: when this channel went up, did that one go up too? 1.00 means always, 0.00 means never. Anything above 0.80 and your data cannot tell the two apart. Measured after allowing for advertising that keeps working once it stops running and for the tenth million doing less than the first — checking raw spend instead is the usual reason a tool declares your data fine and then fails to separate anything.
| TV — Broadcast | 1.00 | 0.02 | 0.22 | 0.25 | 0.14 | -0.17 |
|---|---|---|---|---|---|---|
| Video — CTV | 0.02 | 1.00 | 0.14 | 0.13 | 0.01 | -0.01 |
| Paid Social | 0.22 | 0.14 | 1.00 | 0.74 | 0.50 | 0.05 |
| Paid Search | 0.25 | 0.13 | 0.74 | 1.00 | 0.56 | 0.10 |
| Programmatic Display | 0.14 | 0.01 | 0.50 | 0.56 | 1.00 | -0.05 |
| Out of Home | -0.17 | -0.01 | 0.05 | 0.10 | -0.05 | 1.00 |
| TV — Broadcast | Video — CTV | Paid Social | Paid Search | Programmatic Display | Out of Home |