← Projects

Dominick's scanner data · pricing & promotion

Retail Promotion Decision Engine

A promotion analysis that asks whether a discount adds contribution margin rather than unit lift — and recommends no action when the evidence cannot support one.

PyMCBayesian HierarchyAIPWOR-ToolsDuckDB
−$481contribution margin from the revenue-optimal plan
29.1%of rows under strict propensity overlap
0actions surviving the downside-margin screen

The question

Which products should a retailer promote, at what discount, and in which stores, when the objective is incremental contribution margin rather than unit lift or revenue alone?

The data

University of Chicago Booth Kilts Center Dominick's Finer Foods scanner data, built into validated store-product-week panels with explicit checks on keys, prices, quantities, source quality, and bundle-price semantics. Promotion coding is incomplete, historical pricing was not randomized, and stockouts are not cleanly observed — limits that shape every conclusion below.

How it was done

  1. A validated DuckDB mart establishes store-product-week grain and provenance.
  2. Fixed-effects and hierarchical Bayesian models estimate conditional price response with temporal holdouts and partial pooling.
  3. A doubly robust promotion analysis faces overlap, balance, placebo, and negative-control tests before it can influence optimization.
  4. A mixed-integer optimizer compares revenue and contribution-margin scenarios under capacity and downside-risk constraints.
  5. Release gates block recommendations when causal identification, calibration, monitoring, or economic inputs are inadequate.

What the evidence showed

Evidence and what each result implies for the decision
EvidenceResultDecision implication
Bayesian holdout uncertainty81.9% coverage for a nominal 90% intervalModel is overconfident
Split-conformal recalibration85.4% coverage on a later windowImprovement, still below target
Historical shadow replayTwelve of thirteen weeks trigger at least one blockAggregate performance hides unstable weeks
Strict propensity overlap29.1% of rowsHistorical promotion effect is not decision-grade
Post-weighting balanceMaximum absolute SMD 0.224Residual imbalance remains material
Revenue scenario+$1,159 revenue and −$481 contribution marginUnit and revenue lift do not imply profitability
Downside-screened margin scenarioZero actions at all tested capacitiesNo promotion is the robust base-case decision

What I recommend

What this does not prove