# Data-drivenData-drivenAn approach where decisions are systematically informed by data analysis rather than intuition alone.Voir la définition complète → pricing, markdowns, and elasticity in practice
A winter coat costs the retailer $60. It launches at $180. By February it sells for $89, and the buyer is happy. Why $89 and not $99 or $79? A generation ago that answer came from a merchant's gut. Today it comes from data: a measured estimate of how many extra coats sell for each dollar you drop the price, weighed against the cost of holding stock nobody wants by March.
This lesson shows you how that estimate gets built and how it drives two decisions: the opening price and the markdown cadence (the schedule of price cuts that clears inventory before the season ends).
Price elasticity of demandPrice elasticity of demandHow sensitive demand is to a price change. High elasticity means customers react strongly to price increases.Voir la définition complète → measures how sensitive sales volume is to price. The formula is simple:
> Elasticity = (% change in units sold) / (% change in price)
If cutting price 10% lifts unit sales 20%, elasticity is roughly -2.0. The number is almost always negative (higher price, fewer units). Retailers usually drop the minus sign and talk about "elasticity of 2."
Two practical buckets:
The whole game is knowing which items are which, at which times, in which stores.
You do not need a lab. Your point-of-sale (POS) system already ran hundreds of natural experiments: every past promotion was a price change with a measurable sales response.
Build a table at the SKU-store-week level. SKU means Stock Keeping Unit, the individual product variant (this exact coat, in navy, size medium). Each row needs:
The trap: sales rise in December because it is December, not only because you cut prices. You must separate the price signal from seasonality, weather, and stockouts. A common starting model is a log-log regression, where the coefficient on log price is the elasticity directly.
import statsmodels.formula.api as smf
# df has: units, price, is_promo, week_of_year, store_id
df["log_units"] = np.log(df["units"])
df["log_price"] = np.log(df["price"])
model = smf.ols(
"log_units ~ log_price + C(week_of_year) + C(store_id) + is_promo",
data=df
).fit()
# coefficient on log_price IS the elasticity estimate
print(model.params["log_price"])A coefficient of -1.8 means roughly 1.8% more units for every 1% price cut. Always check the confidence interval: a wide range means you lack enough price variation to trust the number.
Your own history tells you how customers respond to your prices. It does not tell you what a rival is charging next door. That is where competitive price scraping comes in: automated collection of competitor prices from public websites.
A few cautions, because this is often misunderstood:
Competitor prices sharpen the model by explaining demand your own history cannot. If your sales dropped one week despite no price change from you, a rival's promotion may be the reason.
For a solid, plain-language primer on elasticity itself, the OpenStax Principles of Economics chapter on elasticity is free and reliable.
With an elasticity estimate per product family, opening prices stop being guesswork.
Work backward from your goals. For a new fashion item, the objective is usually to sell most units at or near full price during the peak weeks, leaving a manageable remainder for markdown. High elasticity argues for a sharper opening price to build volume early. Low elasticity lets you hold a premium.
Two anchors keep the model honest:
1. Cost floor. Never model below landed cost plus minimum required margin.
2. Competitive ceiling. Scraped rival prices cap how high you can go on comparable goods.
The elasticity estimate then guides where to land between floor and ceiling to maximize expected gross margingross marginGross margin is the share of revenue left after subtracting the direct cost of producing goods or services, expressed as a percentage of revenue.Voir la définition complète → dollars, not just margin percent. A 55% margin on 100 units loses to a 45% margin on 300 units.
Here is the tension every seasonal retailer lives with. You bought a fixed quantity of coats. They have a shelf life: after the season, leftover stock is dead capital, often liquidated for pennies. But every early markdown gives away margin on coats that might have sold at full price anyway.
Markdown optimization is the discipline of scheduling price cuts to clear inventory by a deadline while protecting total margin.
The optimal path threads between them.
You need three ingredients per SKU:
1. A demand forecast at each candidate price, driven by your elasticity estimate and seasonality.
2. Remaining inventory and days left in the season.
3. A salvage value: what one leftover unit is worth after the deadline.
The engine simulates markdown schedules (for example: hold at full price four weeks, then 20% off, then 40% off) and projects the ending inventory and total margin for each. It recommends the schedule that clears stock by the deadline with the highest expected margin.
Say you have 500 units, eight weeks left, and current pace of 30 units per week at full price. At that rate you end with 260 units unsold. That is the trigger.
Your elasticity of 2.0 suggests a 20% cut roughly lifts weekly pace toward 42 units. Rerun the projection: closer to clearance, but maybe not enough. The model may recommend 20% now and a deeper 40% cut in week five if pace still lags. The point is the cadence, staged cuts, not one panicked blowout.
Merchants track sell-through rate: units sold divided by units received, as a percentage. If your target is 80% sell-through by week six and you are tracking at 60%, the model surfaces the gap early enough to act. Modern markdown systems rerun this weekly, sometimes daily, feeding fresh POS and scrape data back in.
Vérification des acquis
1. A retailer finds that a 10% price cut on a staple grocery item produces almost no increase in units sold. What does this reveal about the item, and what is the implication for discounting it?
2. Why can a retailer estimate elasticity from its own POS history without running a formal experiment?
3. The lesson says the markdown cadence weighs the extra units sold per dollar of price cut against the cost of holding unsold stock. What core trade-off does this represent?
4. Select ALL correct answers. Which characteristics tend to make an item MORE elastic (elasticity greater than 1)?
Sélectionnez toutes les réponses correctes.
5. Select ALL correct answers. Why is the elasticity panel built at the SKU-store-week level rather than as a single company-wide number?
Sélectionnez toutes les réponses correctes.
Models mislead when the data lies. Guard against these:
Keep humans in the loop. The best setups let the system recommend and let a merchant approve, with guardrails: no price below cost, no cut deeper than X% without sign-off, no more than one markdown per two weeks. The algorithm handles scale; people handle judgment and exceptions.