MAWSIMDemand-aware promo planning

Plan

Forecast

Hourly demand per site, and the baseline it has to beat. A forecast that loses to “the same hour last week” is worse than no forecast, because it looks like knowledge.

Weeks beaten, all sites36/36target 70% · achieved 100%
Marina Walk · absolute error8.46seasonal naive 11.75 — 28% better
80% interval coverage93%share of held-out hours inside the band
Holdout56 dayschronological, never random

Next 28 days at Marina Walk

The band is the 80% prediction interval, fitted as two quantile models rather than derived from a residual standard deviation. Demand is bounded below by zero and its spread grows with its level, so a symmetric interval would be too wide at 04:00 and too narrow at the evening peak — which is exactly when a planner needs it.

05001,0001,50009-2309-2710-0110-0510-0910-1310-17
Forecast
Forecast daily footfall, generated series · visitors per day

All four sites, one scale

DXB-DTN30% better
Downtown
MAE 7.8 vs 11.2 naive
peak 1,549
DXB-MOE34% better
Al Barsha
MAE 9.2 vs 13.9 naive
peak 1,804
DXB-MAR28% better
Marina Walk
MAE 8.5 vs 11.7 naive
peak 1,561
DXB-DEI29% better
Deira
MAE 4.6 vs 6.4 naive
peak 885

Forecast daily footfall over the horizon · all four drawn to one scale, so the cards are read against each other

What moves it

Gain-based importance from the median model. The lag terms dominate because an hourly retail series is mostly its own past — which is exactly why the seasonal-naive baseline is hard to beat, and why beating it means the exogenous drivers are earning their place.

Same hour last week53.0%
Hour of day22.7%
Same hour two weeks ago22.1%
Event pull, distance-decayed0.5%
Day of Ramadan0.4%
Ramadan0.3%
Day of week0.2%
Trailing week average0.2%

Week by week against the baseline

Reported per week rather than as one aggregate, because a single mean hides a model that wins on average by being spectacular once and worse every other week.

weekhoursmodel MAEnaive MAEresult
311208.5111.12beat
321689.2511.03beat
331688.4910.49beat
341688.0410.70beat
3516811.3215.11beat
361687.6416.30beat
371687.229.97beat
381687.729.91beat
39486.618.88beat

Where the model is worse, and why that is reported

sMAPE is higher for the model than for the baseline on every site, and MAE is lower. Both are correct. Seasonal naive returns the exact integer count from the same hour last week, which on the many low-count hours is often exactly right and therefore proportionally perfect, while being further away in absolute terms. For staffing a cafe the absolute error is the decision-relevant one, so MAE is the gate and sMAPE is reported rather than optimised.

Marina Walk · sMAPE26.4%naive 20.6%
MethodGBRabsolute-error median, pinball quantiles
Rows fitted4,536approximate, per site