-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmethodology.tex
More file actions
407 lines (328 loc) · 30.3 KB
/
Copy pathmethodology.tex
File metadata and controls
407 lines (328 loc) · 30.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
% !TEX program = xelatex
\documentclass[11pt]{article}
\usepackage[margin=1in]{geometry}
\usepackage{amsmath,amssymb}
\usepackage{booktabs}
\usepackage{enumitem}
\usepackage{xcolor}
\usepackage{hyperref}
\usepackage{microtype}
\usepackage{natbib}
\definecolor{navy}{HTML}{17324D}
\definecolor{steel}{HTML}{35627A}
\hypersetup{
colorlinks=true,
linkcolor=navy,
urlcolor=steel,
citecolor=steel,
pdfauthor={Pricing Promotion Decision Engine},
pdftitle={Methodology: Demand Estimation, Counterfactual Pricing, and Validation}
}
\setlength{\parindent}{0pt}
\setlength{\parskip}{0.55em}
\setlist[itemize]{leftmargin=1.4em,itemsep=0.2em,topsep=0.2em}
\setlist[enumerate]{leftmargin=1.6em,itemsep=0.2em,topsep=0.2em}
\title{\textbf{Methodology: Demand Estimation, Counterfactual Pricing, and Validation}\\
\large Pricing \& Promotion Decision Engine}
\author{}
\date{\today}
\begin{document}
\maketitle
\begin{abstract}
This document lays out the empirical and decision-theoretic methodology for the Pricing \& Promotion Decision Engine. The project studies weekly retail scanner data from Dominick's Finer Foods in the ready-to-eat cereal category and estimates a transparent demand model that relates quantity sold to own price, competitor price, and promotion status. The estimated demand response is then embedded in counterfactual revenue and profit calculations, subject to price, margin, inventory, and experimental-validation constraints. The goal is not to introduce a new econometric estimator or to replicate a full structural demand model such as \citet{berry1995} or \citet{nevo2001}. Rather, the project builds an applied decision-support system that translates standard scanner-data demand estimation into auditable pricing recommendations.
The current empirical implementation estimates an own-price elasticity of approximately $-1.7$ to $-1.9$, a positive cross-price elasticity, and a positive conditional sale-code coefficient. A sale-code coefficient of 0.43 is measured in log points; it corresponds to an implied multiplicative demand difference of approximately $\exp(0.43)-1\approx 54\%$, conditional on price and fixed effects. These signs are economically sensible, but the recommendations are explicitly framed as ``raise-and-test'' candidates rather than direct deployment decisions. The observational nature of prices and promotions remains the central identification limitation.
\end{abstract}
\section{Research Setting and Decision Problem}
Retail pricing teams face a recurrent decision problem: for a given product, store, and time period, should the firm keep the current effective price and promotion status, raise price, lower price, or run a promotion? A useful pricing model must therefore do more than forecast sales. It must map feasible actions into expected demand, revenue, and profit under business constraints.
The decision variables in this project are the effective unit price, a binary promotion status, an optional promotion fixed cost, and scenario-level operational constraints such as available inventory and minimum margin. The output of the system is not an automatic price change. It is a set of candidate pricing and promotion actions, accompanied by assumptions, model uncertainty, and an A/B validation design.
\section{Data and Unit of Observation}
The empirical setting is the Dominick's Finer Foods database distributed by the Kilts Center for Marketing at the University of Chicago Booth School of Business \citep{kilts_dominicks}. The official data description states that Dominick's and Chicago Booth partnered on store-level shelf-management and pricing research, producing store-level scanner data with category-specific UPC and weekly movement files. The cereal movement file contains weekly store-UPC observations with price, units sold, profit margin, and deal-code variables.
The source-of-truth panel is
\[
\text{UPC} \times \text{store} \times \text{week}.
\]
The baseline demand model uses an aggregated panel at
\[
\text{brand} \times \text{size\_oz} \times \text{store} \times \text{week}.
\]
This baseline grain is a transparency-oriented MVP choice. It reduces sparse UPC noise and keeps brand-size differentiation, but it may introduce compositional bias when multiple UPCs within the same brand-size cell have different prices, bundle structures, promotion status, or sales intensity. The UPC-level panel is therefore retained for robustness.
When UPC-level observations are aggregated to the brand-size-store-week level, let $g$ denote a brand-size cell and $u\in g$ denote UPCs assigned to that cell. Quantities are summed:
\begin{equation}
Q_{gst}=\sum_{u\in g} MOVE_{ust}.
\end{equation}
Dollar sales are computed from DFF bundle prices and bundle quantities before aggregation:
\begin{equation}
Sales_{gst}=\sum_{u\in g}\frac{PRICE_{ust}\times MOVE_{ust}}{QTY_{ust}}.
\end{equation}
The aggregated effective price is the revenue-per-unit price, equivalently a unit-sales-weighted effective price:
\begin{equation}
P^{eff}_{gst}=\frac{Sales_{gst}}{Q_{gst}}.
\end{equation}
The aggregated unit-cost proxy is quantity-weighted:
\begin{equation}
c_{gst}=
\frac{\sum_{u\in g} c_{ust} MOVE_{ust}}
{\sum_{u\in g} MOVE_{ust}}.
\end{equation}
The baseline promotion indicator is
\begin{equation}
Promo^{any}_{gst}=\mathbf{1}\left\{\sum_{u\in g} Promo_{ust}>0\right\},
\end{equation}
with the quantity-weighted promotion share retained as a diagnostic:
\begin{equation}
Promo^{share}_{gst}
=
\frac{\sum_{u\in g} Promo_{ust}MOVE_{ust}}
{\sum_{u\in g} MOVE_{ust}}.
\end{equation}
Let $i$ index the product unit, where $i$ is either a brand-size unit in the baseline panel or a UPC in the robustness panel; let $s$ index stores and $t$ index weeks. The main outcome is units sold, $Q_{ist}$. Effective unit price is $P^{eff}_{ist}$, computed from the DFF bundle price divided by bundle quantity. Promotion status is $Promo_{ist}$, based on the cleaned sale-code field. Unit cost $c_{ist}$ is proxied from DFF's gross margin as
\begin{equation}
unit\_cost = unit\_price \times (1-PROFIT/100).
\end{equation}
This cost proxy is useful for decision simulation but should not be interpreted as a perfect marginal cost measure, because DFF's wholesale-cost accounting is based on average acquisition cost rather than a contemporaneous replacement cost.
The baseline log-demand specification requires positive observed sales. Observations with invalid quality flags and invalid non-positive prices are excluded, and the main model is estimated on positive-sales product-store-week observations. Missing movement weeks and zero-sale cells are therefore not interpreted as unconditional zero demand in the baseline specification. A robustness version can complete the panel at the UPC-store-week level and handle zero-sale weeks using $\log(Q+1)$ or an explicit availability indicator. This distinction means that the MVP estimates conditional demand for observed available selling cells, not unconditional category demand across every possible UPC-store-week.
\section{Demand Specification}
The baseline econometric model is a log-log demand equation with product-store and week fixed effects:
\begin{equation}
\log(Q_{ist})=
\alpha_{is}
+ \gamma_t
+ \beta_{own}\log(P^{eff}_{ist})
+ \beta_{cross}\log(P^{comp}_{ist})
+ \theta Promo_{ist}
+ X_{ist}'\delta
+ \epsilon_{ist}.
\label{eq:demand}
\end{equation}
The product-store fixed effect $\alpha_{is}$ absorbs persistent differences in baseline demand across product-store pairs, including stable local demographics, store assortment, shelf placement, and product popularity. Week fixed effects $\gamma_t$ absorb aggregate seasonality and common demand shocks. The optional control vector $X_{ist}$ is left empty in the MVP specification, but the design allows later inclusion of holiday indicators, brand-specific seasonality, or store-specific trends.
The coefficient $\beta_{own}$ is interpreted as an own-price elasticity. A value of $-1.75$, for example, means that a one percent increase in effective price is associated with an approximately 1.75 percent decrease in quantity, conditional on the fixed effects and controls. The coefficient $\beta_{cross}$ is an aggregate cross-price elasticity: for substitute cereal brands, it is expected to be positive. The coefficient $\theta$ measures a conditional sale-code association in log points after controlling for price and fixed effects. Its implied percent demand difference is $\exp(\theta)-1$, not $\theta$ itself.
This specification is deliberately simpler than a full differentiated-products demand system. Structural random-coefficients demand models estimate richer substitution patterns and supply-side primitives, but they are outside the MVP scope. The present model is intended to produce an interpretable demand curve that can support counterfactual simulation and experimental prioritization.
\subsection{Formula Provenance and Interpretation}
The formulas in this methodology combine three types of objects: data-accounting transformations, standard econometric or pricing formulas, and project-specific implementation choices. Distinguishing these objects is important because the project is not claiming to introduce a new econometric estimator. It is an auditable decision-support implementation that combines scanner-data demand estimation, retransformation correction, and constrained pricing optimization.
First, the effective unit price and unit-cost proxy are data-accounting transformations based on the Dominick's Finer Foods documentation. Because DFF sometimes records bundle prices, the effective unit price is computed as
\begin{equation}
P^{eff}_{ist}=\frac{PRICE_{ist}}{QTY_{ist}}.
\end{equation}
Dollar sales are correspondingly computed as
\begin{equation}
Sales_{ist}=\frac{PRICE_{ist}\times MOVE_{ist}}{QTY_{ist}}.
\end{equation}
The unit-cost proxy is derived from the DFF gross-margin variable:
\begin{equation}
c_{ist}=P^{eff}_{ist}\left(1-\frac{PROFIT_{ist}}{100}\right).
\end{equation}
This is not an observed marginal cost. It is an accounting proxy based on DFF's gross-margin definition. Since the DFF documentation states that the wholesale-cost measure corresponds to average acquisition cost rather than replacement cost, this proxy is used only for scenario-based decision simulation.
Second, the demand equation is a reduced-form constant-elasticity panel demand approximation. It is not a full structural differentiated-products model. Product-store and week fixed effects provide a transparent adjustment for persistent product-store heterogeneity and aggregate weekly shocks, but the coefficients remain observational unless supported by randomized or quasi-experimental variation. The promotion coefficient is measured in log points; the implied percentage effect of promotion is $\exp(\theta)-1$, not $\theta$.
Third, the competitor-price index is a project-specific competitive-environment measure. It summarizes same-store, same-week competitor prices using baseline or lagged weights. It should not be interpreted as a structural substitution matrix or a full set of brand-pair cross-price effects.
Fourth, the smearing correction and the corresponding level prediction follow Duan's retransformation correction for log-outcome models. This correction is applied when converting fitted log-demand predictions into level quantities. It is not applied to the anchored counterfactual demand function because that function starts from an observed level baseline.
Finally, the anchored counterfactual demand function is a project-specific implementation derived algebraically from the estimated log-log demand equation:
\begin{equation}
\widehat{Q}(p',m',p^{comp\prime})
=
\bar{Q}_{cell}
\exp\left[
\widehat{\beta}_{own}\Delta \log p
+
\widehat{\beta}_{cross}\Delta \log p^{comp}
+
\widehat{\theta}\Delta m
\right].
\end{equation}
In the MVP optimizer, competitor prices are held fixed unless the user explicitly runs a competitor-price scenario, so $\Delta\log p^{comp}=0$ by default. To avoid confusion with the Duan smearing factor $\widehat{S}$, realized sold quantity is denoted $\widehat{Q}^{sold}$:
\begin{equation}
\widehat{Q}^{sold}(p',m',p^{comp\prime})
=
\min\{
\widehat{Q}(p',m',p^{comp\prime}),Inventory
\}.
\end{equation}
Revenue and profit are then computed as
\begin{align}
Revenue(p',m',p^{comp\prime})
&=
p'\widehat{Q}^{sold}(p',m',p^{comp\prime}), \\
Profit(p',m',p^{comp\prime})
&=
(p'-c)\widehat{Q}^{sold}(p',m',p^{comp\prime})
-
Fm'.
\end{align}
These are accounting and decision-objective formulas, not new econometric estimators. The constrained optimizer applies standard pricing-optimization logic to this estimated demand system, while price bounds, margin constraints, inventory constraints, and promotion fixed costs are project-specific operational guardrails.
\section{Competitor Price Index}
For each focal product $i$, the competitor price index is constructed from other brands in the same store-week:
\begin{equation}
P^{comp}_{ist}=\sum_{b\ne B(i)} w^{base}_{bs}P^{oz}_{bst},
\label{eq:comp-price}
\end{equation}
where $B(i)$ is the focal brand, $P^{oz}_{bst}$ is the price per ounce for competitor brand $b$ in store $s$ and week $t$, and $w^{base}_{bs}$ is a baseline or lagged sales-share weight. Current-week sales shares are not used as weights because they would mechanically reflect current demand shocks. If baseline weights are not available, the MVP can use equal weights across observed competitor brands.
The cross-price term is an average competitive environment measure, not a full brand-pair substitution matrix. If the estimated $\beta_{cross}$ is non-positive or unstable, the optimizer should either disable cross-price response or use a sensitivity range rather than directly using the point estimate.
\section{Promotion Treatment}
The MVP treats promotion as a binary state rather than a continuous discount-depth variable. This choice avoids double-counting discounts. Since the model already includes effective transaction price through $\log(P^{eff}_{ist})$, adding a continuous discount variable without a separately estimated coefficient would conflate the price effect with a promotion effect.
In the cleaned DFF cereal data, known sale codes B, S, and C are mapped to promotion types, while the undocumented but empirically promotion-like code G is retained as \texttt{unknown\_promo} and included in \texttt{promo=True}. The one-row code L is treated as missing. In the brand-size panel, the primary promotion variable is \texttt{promo\_any}. The auxiliary \texttt{promo\_share} is retained for diagnostics, but partial-promotion cells are rare after aggregation, so it is not the main MVP treatment variable.
\section{Estimation Results Used by the MVP}
The current demand estimation notebook produces three main specifications. The baseline brand-size model estimates $\widehat{\beta}_{own}\approx -1.75$ and a conditional sale-code coefficient of approximately 0.43 log points, with within $R^2$ around 0.75. The reported within $R^2$ refers to the fixed-effects panel regression fit, not to out-of-sample predictive accuracy. A coefficient of 0.43 implies a multiplicative difference of $\exp(0.43)-1\approx 54\%$, conditional on price and fixed effects. Adding the competitor price term gives $\widehat{\beta}_{own}\approx -1.73$, $\widehat{\beta}_{cross}\approx 0.65$, and a sale-code coefficient around 0.43. The UPC-level robustness model gives $\widehat{\beta}_{own}\approx -1.90$, $\widehat{\beta}_{cross}\approx 0.50$, and a sale-code coefficient around 0.51.
The sign pattern is economically coherent: own-price elasticity is negative, competitor-price elasticity is positive, and the conditional sale-code association is positive. However, these estimates are not interpreted as final causal effects. They are observational estimates used to parameterize counterfactual decision support.
\section{Retransformation and Prediction}
When the model predicts log quantity directly, retransformation to levels requires care. Applying $\exp(\cdot)$ to a fitted log outcome can produce biased level predictions because of Jensen's inequality. Following \citet{duan1983}, the project computes a smearing factor
\begin{equation}
\widehat{S}=\frac{1}{N}\sum_{n=1}^{N}\exp(\widehat{\epsilon}_n),
\label{eq:smearing}
\end{equation}
and uses
\begin{equation}
\widehat{Q}=\widehat{S}\exp(\widehat{\eta})
\end{equation}
when converting model-level log predictions into level quantities. The estimated smearing factor is approximately 1.14 in the baseline brand-size model and approximately 1.17 in the UPC robustness model.
For the counterfactual optimizer, however, the implemented demand function is cell anchored. It begins from the cell's observed baseline mean quantity and applies only the relative demand response implied by the elasticity estimates:
\begin{equation}
\widehat{Q}(p',m',p^{comp\prime})=
\bar{Q}_{cell}\exp\left[
\widehat{\beta}_{own}\Delta\log p
+\widehat{\beta}_{cross}\Delta\log p^{comp}
+\widehat{\theta}\Delta m
\right].
\label{eq:anchored-q}
\end{equation}
In the MVP optimizer, competitor prices are held fixed unless the user explicitly runs a competitor-price scenario; equivalently, $\Delta\log P^{comp}=0$ in the default case. Because the anchor is already a level quantity, the optimizer does not multiply by the smearing factor again. Doing so would double-count the level correction and inflate counterfactual quantities. The calibration ratio of the current counterfactual implementation is approximately 1.06, which is acceptable for the MVP.
\section{Revenue, Profit, and Feasible Actions}
For a candidate effective price $p'$, promotion status $m'$, and competitor price $p^{comp}$, the model first computes counterfactual demand and then applies the inventory cap to realized sold units:
\begin{equation}
\widehat{Q}^{sold}(p',m',p^{comp})
=
\min\{\widehat{Q}(p',m',p^{comp}),Inventory\}.
\end{equation}
Revenue and profit use the same capped quantity:
\begin{align}
Revenue(p',m',p^{comp})
&=
p'\widehat{Q}^{sold}(p',m',p^{comp}), \\
Profit(p',m',p^{comp})
&=
(p'-c)\widehat{Q}^{sold}(p',m',p^{comp})-Fm',
\label{eq:profit}
\end{align}
where $c$ is unit cost, $Inventory$ is a scenario input, and $F$ is an optional fixed cost of running a promotion. The use of $Inventory$ as a scenario input reflects the fact that the DFF movement data do not observe inventory directly.
When the app reports absolute candidate profit, the promotion fixed cost enters as
\begin{equation}
Profit(p',m')=(p'-c)Q^{sold}(p',m')-Fm'.
\end{equation}
When the app reports profit lift relative to the observed baseline $(p_0,m_0)$, the fixed cost is differenced:
\begin{equation}
\Delta Profit =
\left[(p'-c)Q^{sold}(p',m')-Fm'\right]
-
\left[(p_0-c)Q^{sold}(p_0,m_0)-Fm_0\right].
\end{equation}
Thus, the fixed cost affects the incremental recommendation only when the candidate and baseline promotion states differ.
The feasible action set is restricted by price bounds, a minimum margin condition, optional inventory constraints, and a binary promotion status. These constraints are essential because an unconstrained profit problem can recommend implausible prices when the model is extrapolated outside the historically observed range.
\subsection{Scenario Overlay (App)}\label{sec:scenario}
The Streamlit app exposes a unified \emph{scenario overlay} on top of the frozen demand model. The overlay applies business shocks to model outputs rather than re-fitting the demand model. Five inert defaults
($\delta_q = \delta_c = \delta_{comp} = F = 0$, $\bar{Q}=\infty$) reproduce the offline counterfactual exactly. Writing $\delta_q,\delta_c,\delta_{comp}$ for the demand, cost, and competitor-price shocks, $\bar{Q}$ for an optional inventory cap, and $F$ for a per-period promotion fixed cost, the overlay equations are
\begin{align}
\Delta\log p^{comp} &= \log(1+\delta_{comp}), \\
\widetilde{Q}(p',m') &= \widehat{Q}\!\left(p',m';\,\Delta\log p^{comp}\right)\,(1+\delta_q), \\
Q^{sold}(p',m') &= \min\{\widetilde{Q}(p',m'),\,\bar{Q}\}, \\
c_{eff} &= c\,(1+\delta_c), \\
Revenue(p',m') &= p'\,Q^{sold}(p',m'), \\
Profit(p',m') &= (p' - c_{eff})\,Q^{sold}(p',m') - F\,m'. \label{eq:scenario_profit}
\end{align}
The multiplicative shocks must satisfy
\begin{equation}
\delta_q>-1,\qquad \delta_c>-1,\qquad \delta_{comp}>-1,
\end{equation}
so that demand, cost, and competitor prices remain non-negative and the logarithm in $\Delta\log p^{comp}$ is well-defined.
The margin floor uses $c_{eff}$, so cost shocks tighten the lower price guardrail, and the same scenario instance flows through both the cell-level simulator and the panel-wide optimizer so candidate rankings update consistently when any input is perturbed.
The overlay is intentionally a simple post-hoc transformation: it supports what-if stress tests on cost, demand, competitor pricing, and capacity, but it does not replace IV identification, dynamic stockpiling, or explicit competitor best-response (those are itemized as roadmap notebooks in \S11). Risk flags fire when any shock leaves a sane range:
\begin{equation}
|\delta_q|>0.20,\quad |\delta_c|>0.25,\quad
|\delta_{comp}|>0.15,\quad \text{or}\quad
\bar{Q}<\bar{Q}^{base}_{cell}.
\end{equation}
These flags warn the user that the inputs lie outside the observational support of the model.
\section{Optimization Problem}
The MVP optimizer evaluates candidate prices and promotion states using a grid search. Since $m\in\{0,1\}$, the problem can be decomposed into two one-dimensional searches: fix $m=0$ and scan feasible candidate prices, fix $m=1$ and scan feasible candidate prices, then select the feasible action with the highest objective value.
The supported objectives are revenue maximization, profit maximization, and profit maximization subject to a minimum quantity constraint. The current counterfactual notebook uses cost, baseline demand, price bounds, and elasticity estimates to produce top candidate actions.
The most important optimizer finding is a diagnostic warning rather than evidence of a successful automatic recommendation rule: 98.5 percent of eligible cells recommend a price at the upper guardrail. For an interior single-product optimum with constant marginal cost and $\varepsilon<-1$, constant-elasticity demand $Q=A p^{\varepsilon}$ implies the Lerner condition
\begin{equation}
\frac{p-c}{p}=-\frac{1}{\varepsilon}.
\end{equation}
With an elasticity around $-1.73$, this implies an unconstrained margin of roughly $58\%$, which explains why the optimizer frequently pushes prices above the historical support and into the upper bound. These cases should be interpreted as candidate ``raise-and-test'' opportunities, not direct deployment recommendations.
This guardrail binding result highlights several missing forces: competitor reaction, within-brand cannibalization across package sizes, loss-leader roles, nonlinear elasticities near extreme prices, and strategic category management. These are not defects in the MVP, but they are central limitations that must be disclosed before using the recommendations operationally.
\section{Identification and Causal Interpretation}
The estimation strategy controls for product-store and week fixed effects, but price and promotion are still observational choices. Managers may lower price when expected demand is weak, raise price during high-demand periods, or promote products because of inventory pressure, vendor funding, or category-level campaign schedules. Competitor prices may also respond to common local demand shocks. As a result, $\widehat{\beta}_{own}$, $\widehat{\beta}_{cross}$, and $\widehat{\theta}$ should be interpreted as conditional associations suitable for decision support, not as definitive causal effects.
The fixed-effects design is therefore paired with explicit validation requirements. Any recommended price or promotion action should be tested through randomized or quasi-experimental rollout before production deployment. In the DFF context, a natural design is store-level or store-cluster-level randomization over weeks. In an online environment, user-, session-, or geo-level randomization may be feasible depending on the operational setting.
\section{Robustness and Extensions}
The MVP already compares the brand-size model against a UPC-level robustness model and checks that the own-price, cross-price, and promotion coefficients have stable signs. Additional robustness checks should include models with and without competitor price, sensitivity of recommendations to elasticity bounds, holdout prediction diagnostics, and smearing-factor diagnostics.
As an additional robustness check, the project should estimate specifications with store-week fixed effects:
\begin{equation}
\log(Q_{ist}) =
\alpha_{is}
+
\lambda_{st}
+
\beta_{own}\log(P^{eff}_{ist})
+
\theta Promo_{ist}
+
\epsilon_{ist}.
\end{equation}
The store-week fixed effect $\lambda_{st}$ absorbs local demand shocks, store-level campaigns, and week-specific inventory or traffic conditions. This is important because DFF prices and promotions are manager choices, and the sale-code variable is not a clean randomized treatment. The DFF documentation also notes that sale coding is imperfect: if the sale code is not set, there still may have been a promotion that week. The store-week-FE specification sacrifices some cross-price variation but provides a stricter check on whether the own-price elasticity is driven by local store-week confounding. The competitor-price index is excluded from the store-week-FE robustness specification when it is mechanically absorbed by local category-level price variation or becomes collinear/unstable.
The main modeling extensions are clear. First, a same-brand cross-size price index can capture within-brand cannibalization, which is especially relevant when the optimizer recommends price increases for one package size that may shift demand to another size of the same brand. Second, a full brand-pair substitution matrix would require a richer differentiated-products demand system. Third, temporary promotions may induce household stockpiling, so a static weekly demand model may misstate longer-run price response. \citet{hendel2006} provide the canonical warning for this dynamic issue.
\section{Relationship to Prior Literature}
This project is closest in spirit to empirical scanner-data demand estimation and pricing optimization. The DFF price, quantity, movement, sale-code, and profit-margin variables come from the DFF documentation; the effective-price, dollar-sales, and unit-cost formulas are accounting transformations of those fields, not arbitrary definitions. The unit-cost measure is a gross-margin-derived average-acquisition-cost proxy, not an observed marginal cost.
\citet{berry1995} provide the structural differentiated-products framework that motivates thinking about substitution and market power. \citet{nevo2001} applies related ideas to ready-to-eat cereal and documents the role of product differentiation and multi-product pricing in explaining margins. These papers motivate the cereal-market context and the importance of substitution, but they are not the source of the reduced-form fixed-effects equation used in this MVP. The present project does not estimate a structural random-coefficients model.
The retransformation correction follows \citet{duan1983}. The competitor-price index and anchored counterfactual demand function are project-specific implementations: the former summarizes the competitive environment, and the latter is an algebraic relative-response implementation of the estimated log-log demand model. They should not be described as a structural cross-price system or as published formulas. The revenue and profit equations are accounting and decision-objective formulas, not econometric estimators.
The revenue and pricing optimization layer is motivated by revenue-management and pricing-optimization treatments such as \citet{talluri2004} and \citet{phillips2005}. The grid search is an implementation of constrained pricing optimization, not a new optimization method. The identification caveats are consistent with the applied econometrics perspective in \citet{angrist2009} and with the broader causal-inference distinction between observational adjustment and experimental validation \citep{imbens2015}. The online experimentation component follows the practical controlled-experiment logic summarized by \citet{kohavi2020}; it is a validation design, not causal proof from the observational model itself.
\begin{thebibliography}{99}
\bibitem[Angrist and Pischke(2009)]{angrist2009}
Angrist, Joshua D., and Jörn-Steffen Pischke. 2009.
\textit{Mostly Harmless Econometrics: An Empiricist's Companion}.
Princeton University Press.
\url{https://doi.org/10.1515/9781400829828}.
\bibitem[Berry, Levinsohn, and Pakes(1995)]{berry1995}
Berry, Steven, James Levinsohn, and Ariel Pakes. 1995.
``Automobile Prices in Market Equilibrium.''
\textit{Econometrica} 63(4): 841--890.
\url{https://doi.org/10.2307/2171802}.
\bibitem[Duan(1983)]{duan1983}
Duan, Naihua. 1983.
``Smearing Estimate: A Nonparametric Retransformation Method.''
\textit{Journal of the American Statistical Association} 78(383): 605--610.
\url{https://doi.org/10.1080/01621459.1983.10478017}.
\bibitem[Hendel and Nevo(2006)]{hendel2006}
Hendel, Igal, and Aviv Nevo. 2006.
``Sales and Consumer Inventory.''
\textit{RAND Journal of Economics} 37(3): 543--561.
\url{https://doi.org/10.1111/j.1756-2171.2006.tb00030.x}.
\bibitem[Imbens and Rubin(2015)]{imbens2015}
Imbens, Guido W., and Donald B. Rubin. 2015.
\textit{Causal Inference for Statistics, Social, and Biomedical Sciences}.
Cambridge University Press.
\url{https://doi.org/10.1017/CBO9781139025751}.
\bibitem[Kohavi, Tang, and Xu(2020)]{kohavi2020}
Kohavi, Ron, Diane Tang, and Ya Xu. 2020.
\textit{Trustworthy Online Controlled Experiments: A Practical Guide to A/B Testing}.
Cambridge University Press.
\url{https://doi.org/10.1017/9781108653985}.
\bibitem[Kilts Center for Marketing(n.d.)]{kilts_dominicks}
UChicago Booth Kilts Center for Marketing. n.d.
``Dominick's Finer Foods Database.''
Accessed April 2026.
\url{https://www.chicagobooth.edu/research/kilts/research-data/dominicks}.
\bibitem[Nevo(2001)]{nevo2001}
Nevo, Aviv. 2001.
``Measuring Market Power in the Ready-to-Eat Cereal Industry.''
\textit{Econometrica} 69(2): 307--342.
\url{https://doi.org/10.1111/1468-0262.00194}.
\bibitem[Phillips(2005)]{phillips2005}
Phillips, Robert L. 2005.
\textit{Pricing and Revenue Optimization}.
Stanford Business Books.
\url{https://doi.org/10.1515/9780804781640}.
\bibitem[Talluri and van Ryzin(2004)]{talluri2004}
Talluri, Kalyan T., and Garrett J. van Ryzin. 2004.
\textit{The Theory and Practice of Revenue Management}.
Springer.
\url{https://doi.org/10.1007/b139000}.
\end{thebibliography}
\end{document}