Price Elasticity: Method, Assumptions & Examples
By MCP Analytics Team | Published , updated
Executive Summary
This paper is an explanation of how to estimate and use price elasticity of demand. It is not a study of real markets. The one worked example uses made-up data. Apart from that example, everything here is method content: definitions, model specifications, assumptions, pitfalls, and guidance on when each technique fits.
To see how much your own demand drops when the price rises, try the free price elasticity tool.
The core idea is simple: elasticity is the percentage change in quantity demanded for a one percent change in price. Estimating it well is harder than the definition suggests, because price is often set in response to demand, the response may differ for increases and decreases, it may change over time, it may differ across customer segments, and it may not be constant across the price range. The paper walks through the models that address each of these issues.
- Log-log regression: the slope on log price is the elasticity, under a constant-elasticity assumption that should be checked.
- Endogeneity: if prices respond to demand, ordinary regression is biased. Instrumental variables or experiments address this.
- Asymmetry: separate coefficients for price increases and decreases let you test whether the response is symmetric.
- Time variation and segments: rolling windows and segment-level models show whether one pooled number hides differences.
- Non-linearity and cross-price effects: polynomial or spline terms and competitor or related-product prices relax the simplest specification.
How to use it: start with the simple log-log baseline, check its assumptions, and add structure (asymmetry, segments, time variation, non-linearity) only where the data and the decision justify it.
A Worked Example With Made-Up Data
Question: In a made-up price test, what happens to sales income after a 10% price rise? Does the result support the change?
Inputs: Made-up data, seed 17. The script makes 600 rows. It picks log price at random, then sets log units using log price and random noise. It sets the price response (elasticity, or how sales change when price changes) to -1.4. This is a made-up result, not a finding about a real market.
Method: Fit a log-log model. It uses log units and log price. Use the slope and its 95% confidence range (a range built so that it holds the true value in 95 of 100 repeats of the same study) to estimate the income change after a 10% price rise. Check the fit score (R-squared). Run the fit again with seeds 1000 to 1999 to show how much the result can change.
Result: With seed 17, the fitted price response is -1.496. Its 95% confidence range is -1.689 to -1.304. The fit score is 0.280. A 10% price rise gives an estimated income change of -4.62%. The range is -6.35% to -2.85%. The rule says to raise price only when the full range is above 0%, so the answer is do not raise price. The built-in price response of -1.4 is below -1, so a price rise cuts income by design; the run shows the fit recovers that, not that the rule picked it up. Across seeds 1000 to 1999, the estimated income change at +10% price had a 5th, middle and 95th percentile of -5.11%, -3.77% and -2.27%. This shows how well the fit can find an effect set in the data. It does not show what buyers will do.
Limit: Price is random here, and the model has one fixed slope. In real life, prices may change with demand, and buyers may react in different ways. This example does not cover those cases.
import numpy as np
from scipy.stats import t
N = 600
PRICE_LOW = -0.15
PRICE_HIGH = 0.15
TRUE_ELASTICITY = -1.4
NOISE_SD = 0.20
PRICE_RISE = 0.10
def fit_one(seed):
rng = np.random.default_rng(seed)
log_price = rng.uniform(PRICE_LOW, PRICE_HIGH, size=N)
log_units = (
5.0
+ TRUE_ELASTICITY * log_price
+ rng.normal(0.0, NOISE_SD, size=N)
)
x = np.column_stack((np.ones(N), log_price))
beta = np.linalg.lstsq(x, log_units, rcond=None)[0]
residual = log_units - x @ beta
df = N - x.shape[1]
s2 = float(residual @ residual / df)
cov = s2 * np.linalg.inv(x.T @ x)
se = float(np.sqrt(cov[1, 1]))
crit = float(t.ppf(0.975, df))
lo = float(beta[1] - crit * se)
hi = float(beta[1] + crit * se)
mean_y = float(np.mean(log_units))
ss_tot = float(np.sum((log_units - mean_y) ** 2))
r2 = float(1.0 - np.sum(residual ** 2) / ss_tot)
def revenue_change(elasticity):
return (1.0 + PRICE_RISE) ** (1.0 + elasticity) - 1.0
return (
beta,
se,
lo,
hi,
r2,
revenue_change(lo),
revenue_change(beta[1]),
revenue_change(hi),
)
single = fit_one(17)
print("Simulated data, seed 17")
print("Rows:", N)
print("Effect built into simulation: elasticity {:.1f}".format(TRUE_ELASTICITY))
print("Price change tested: +10%")
print("Fitted log-log elasticity: {:.3f}".format(single[0][1]))
print("95% confidence interval: [{:.3f}, {:.3f}]".format(single[2], single[3]))
print("R-squared: {:.3f}".format(single[4]))
print("Implied revenue change at +10% price: {:.2f}%".format(100 * single[6]))
print(
"Revenue-change interval from elasticity interval: "
"[{:.2f}%, {:.2f}%]".format(100 * single[5], 100 * single[7])
)
print("Decision rule: raise price only if the full 95% revenue-change interval is above 0%.")
if single[5] > 0:
decision = "raise price"
elif single[7] < 0:
decision = "do not raise price"
else:
decision = "hold the price and gather more evidence"
print("Decision from seed 17: " + decision)
changes = np.array(
[fit_one(seed)[6] * 100 for seed in range(1000, 2000)]
)
print(
"Across seeds 1000 to 1999, implied revenue change at +10% price, "
"5th/median/95th percentiles: {:.2f}% / {:.2f}% / {:.2f}%".format(
*np.percentile(changes, [5, 50, 95])
)
)
Printed output from running the code above:
Simulated data, seed 17
Rows: 600
Effect built into simulation: elasticity -1.4
Price change tested: +10%
Fitted log-log elasticity: -1.496
95% confidence interval: [-1.689, -1.304]
R-squared: 0.280
Implied revenue change at +10% price: -4.62%
Revenue-change interval from elasticity interval: [-6.35%, -2.85%]
Decision rule: raise price only if the full 95% revenue-change interval is above 0%.
Decision from seed 17: do not raise price
Across seeds 1000 to 1999, implied revenue change at +10% price, 5th/median/95th percentiles: -5.11% / -3.77% / -2.27%
1. Introduction
Price elasticity of demand, the percentage change in quantity demanded resulting from a one percent change in price, is a foundational quantity for pricing, revenue management, and competitive positioning. The definition is short. Estimating it credibly from observational data takes care about identification, model form, and uncertainty.
Simple approaches assume constant elasticity across all price points, one response shared by all customers, a static environment, and a linear or log-linear demand relationship. These assumptions make estimation easy, and they are often a reasonable starting point. They can also hide asymmetric responses, segment differences, change over time, and threshold effects. This paper describes how to test for each.
Scope and Objectives
This paper is a method guide. It has three aims:
- Estimation: describe regression-based and experimental approaches to elasticity estimation, and the pitfalls they address: endogeneity, omitted variable bias, and specification error.
- Extensions: describe how to model asymmetric response, temporal variation, segment differences, non-linear effects, and cross-price interactions.
- Application: give general guidance on turning an estimate into a pricing decision, including its limits.
Where numbers appear, they are either standard formulas or an illustrative example with made-up numbers, labelled as such.
2. Background and Current State
For the definition of elasticity as a ratio of percentage changes, see Alfred Marshall, Principles of Economics (1890). The application of elasticity to business decisions developed largely in the mid-20th century, as marketing researchers sought quantitative methods for demand forecasting and pricing.
Common Approaches and Their Limitations
Three basic methods are common for elasticity estimation. The most common is a log-log regression, where both price and quantity are log-transformed. The coefficient on log price is the elasticity. This is simple and easy to interpret, but it imposes constant elasticity, meaning the same percentage response at every price level, which can be a poor fit across a wide price range.
A second approach uses linear regression on untransformed variables and computes elasticity at a chosen point with the formula elasticity = (coefficient × price) / quantity. This lets elasticity vary with price level but makes comparisons across products or periods harder. A third approach aggregates sales to monthly or quarterly intervals and fits a time series regression with controls. Aggregation on its own does not fix endogeneity, because prices can still move with unobserved demand. It helps only when the controls capture the demand drivers (seasonality, promotions, trend) or when it is paired with an identification strategy such as the instruments described later. It also hides short-term behavior and reduces statistical power.
These methods share limitations when used naively. They produce one pooled estimate that averages over segments. They treat elasticity as static. They assume the response to a price rise mirrors the response to a price cut. Whether any of these matters for a given product is an empirical question for that product's data, which is why the later sections describe how to test for each.
Practical Challenges
Transaction-level data from digital channels allows finer analysis, but also brings noise, selection effects, and confounders that can bias estimates. Frequent price changes in dynamic pricing environments strain the equilibrium assumptions behind many econometric specifications. Cross-price elasticities, the response of one product's demand to another product's price, require multi-dimensional models when there are many competing products. Reference price effects, anchoring, and fairness perceptions can make the response non-linear and context-dependent.
What This Paper Covers
This paper reviews ways to estimate price response and explains their limits. It does not claim that any particular pattern holds in any particular market.
3. Methodology and Analytical Approach
This section describes the estimation framework. Credible estimation requires attention to identification strategy, model specification, and statistical inference.
Data Requirements and Structure
Effective elasticity analysis requires transaction-level or product-period data. The dependent variable, typically units sold, must vary enough to detect price effects. Price must vary in a way that is not purely systematic. That variation can come from natural experiments (exogenous price changes), controlled experiments (randomized price tests), or instrumental variables that isolate exogenous price variation from endogenous adjustment.
Control variables should cover competitor prices, promotions, availability, seasonality, and relevant economic conditions. Granularity matters. Daily or weekly data allows detection of short-term responses and time variation. Customer-level data supports segmentation. Product hierarchy information supports cross-price analysis.
Core Estimation Framework
The basic regression specification takes the form:
log(Quantity) = β₀ + β₁·log(Price) + β₂·log(Competitor_Price) + β₃·Promotion + β₄·Controls + ε
Here β₁ is the own-price elasticity and β₂ is the cross-price elasticity with respect to the competitor. The log-log form assumes constant elasticity and serves as a baseline for comparison with richer models. The error term ε should be examined for heteroskedasticity, autocorrelation, and distributional problems, since these affect the standard errors and therefore the confidence interval on β₁.
The baseline can be extended. To test asymmetric response, estimate separate coefficients for price increases and decreases. To examine time variation, use rolling windows or time-varying parameter models. To examine segment differences, fit separate models by customer group or a hierarchical model that estimates segment-specific parameters together.
Extensions for Pattern Detection
Asymmetric Elasticity Estimation: Asymmetric response is modeled by creating separate price change variables for increases and decreases:
Δlog(Q_t) = β₀ + β₁·ΔlogP⁺_t + β₂·ΔlogP⁻_t + Controls + ε
ΔlogP⁺_t = max(log P_t - log P_(t-1), 0)
ΔlogP⁻_t = min(log P_t - log P_(t-1), 0)
Here ΔlogP⁺ is the log price change in periods when the price rose and zero otherwise, and ΔlogP⁻ is the log price change in periods when it fell and zero otherwise. Working in changes keeps every variable defined: a log of a variable that is zero in some periods would not exist. β₁ is the elasticity for price increases and β₂ for price decreases. If β₁ ≠ β₂ by more than sampling noise, a formal test (for example a Wald test of β₁ = β₂) rejects symmetric response. Whether the data shows asymmetry, and in which direction, is something the test must tell you for your product. It is not assumed here.
Temporal Variation Analysis: Rolling window estimation fits the elasticity model over successive time windows (for example, 90 days) and tracks how the coefficient moves. Formal tests can check whether the variation exceeds what sampling error alone would produce. Shorter windows give a more responsive estimate and a noisier one.
Segmentation and Heterogeneity: Segment-specific elasticity requires either separate regressions per group or hierarchical (mixed-effects) models that estimate group-level parameters while allowing partial pooling. The latter is more efficient when segment sizes differ. Segments can be defined by purchase history, geography, or behavioral clustering.
Non-Linear Elasticity Modeling: Polynomial regression, splines, or generalized additive models let elasticity vary across the price range. A second-order polynomial allows one turning point in the log-price and log-quantity relationship:
log(Q) = β₀ + β₁·log(P) + β₂·[log(P)]² + Controls + ε
The elasticity at any price point is ε(P) = β₁ + 2β₂·log(P). If β₂ is distinguishable from zero, the constant-elasticity assumption is rejected for that data.
Addressing Endogeneity and Identification Challenges
A central challenge is that price may be endogenous. Firms often set prices in response to anticipated demand, which correlates price with the error term and biases the elasticity estimate. When price is not set at random, analysts use instrumental variables to estimate price response (Angrist and Krueger 2001, Journal of Economic Perspectives 15(4), 69-85). Instrumental variable estimation uses variables correlated with price but uncorrelated with demand shocks. A valid instrument must be relevant (it moves price) and satisfy exclusion (it affects demand only through price). Cost shifters are a common candidate, but costs that do not respond to demand are not enough: exclusion also requires that costs do not change demand through other channels, such as quality or availability. Lagged prices fail if demand is persistent, and prices in other markets fail if demand shocks are shared across markets. Instruments must be argued for, and weak instruments give unreliable estimates.
Quasi-experimental designs use exogenous variation from policy changes, tax changes, or supply shocks. Difference-in-differences or regression discontinuity designs can give credible causal estimates when such events occur. When prices are set at random, a price test can show cause, because chance, not demand, set the price.
It is good practice to use more than one estimation approach and compare the results. Large disagreement across specifications is a sign of an identification problem worth investigating.
Model Diagnostics
Out-of-sample prediction testing asks whether estimated elasticities forecast demand under new price configurations. Split the data into estimation and holdout samples and compare performance with metrics such as mean absolute percentage error or root mean squared error.
Residual diagnostics check for misspecification. Plots of residuals against fitted values reveal heteroskedasticity or unmodeled curvature. Autocorrelation suggests omitted dynamics. Influence diagnostics show whether a few observations, possibly data errors or unusual events, drive the result.
Statistical significance alone is not enough. A significant estimate can still be too small to justify a pricing change given implementation cost and risk. Report confidence intervals alongside point estimates so that decision-makers can see the uncertainty.
4. Key Points: What to Look For
The following points summarize what each extension is designed to detect. They describe questions to put to your own data, not results we found.
Point 1: Test for Asymmetric Price Response
Demand may react differently to rises and cuts; loss aversion is one proposed reason (Kahneman and Tversky 1979, Econometrica 47(2), 263-291). Whether this appears in a given product's data is an empirical question. The asymmetry ratio (elasticity of increase divided by elasticity of decrease) is a convenient summary, and a ratio near 1 indicates symmetry.
If asymmetry is present, a symmetric model will mis-state the revenue effect of both price cuts and price rises. The worked example below shows the arithmetic.
Worked Example (illustrative, made-up numbers). Suppose a product has an elasticity of -2.0 for price increases and -1.0 for price decreases, and a symmetric model estimates a single elasticity of -1.5. Using the linear approximation (percentage change in quantity = elasticity × percentage change in price):
| Scenario | Quantity change | Revenue change |
|---|---|---|
| 10% price cut, symmetric model (-1.5) | +15% | 0.90 × 1.15 - 1 = +3.5% |
| 10% price cut, asymmetric model (-1.0) | +10% | 0.90 × 1.10 - 1 = -1.0% |
| 10% price rise, symmetric model (-1.5) | -15% | 1.10 × 0.85 - 1 = -6.5% |
| 10% price rise, asymmetric model (-2.0) | -20% | 1.10 × 0.80 - 1 = -12.0% |
In this made-up case the symmetric model predicts the price cut raises revenue when it actually lowers it, and it understates the loss from the price rise. The numbers are invented to show the mechanics. They are not measurements.
Point 2: Check Whether Elasticity Changes Over Time
Competitive actions, seasonality, and economic conditions can shift price sensitivity. Rolling window estimates show whether the coefficient is stable. A formal test of constant elasticity against a time-varying alternative tells you whether a single static number is adequate. If sensitivity does vary, a static estimate averages over periods that call for different decisions, and a forecast of elasticity from observable conditions may be useful.
Point 3: Compare Segments Before Relying on a Pooled Estimate
A pooled estimate is an average. If segments differ, the average describes none of them well. Behavioral segments (purchase frequency, recency, product mix) are often more useful than demographic ones for this purpose because they can be computed from transaction data. Hierarchical models help when some segments have little data. Differential pricing based on segments also raises legal and fairness questions that should be reviewed before any use.
Point 4: Look for Non-Linearity and Price Thresholds
A constant-elasticity model cannot represent price points at which sensitivity changes sharply, such as boundaries between mental price categories. A polynomial or spline specification can detect them if the data contains enough observations on both sides of the threshold. Visualizing the demand-price relationship first helps choose the functional form, and out-of-sample testing guards against overfitting a flexible curve to sparse data.
Point 5: Include Cross-Price Effects in Multi-Product Settings
When products are substitutes or complements, one product's price affects another's demand. Single-product optimization ignores this. Cross-price elasticities are positive for substitutes and negative for complements. With many products the number of parameters grows quickly, so practical approaches restrict attention to the strongest relationships, use regularization, or cluster products into groups with strong internal interactions and model each group jointly.
5. Applying the Methods
This section gives general guidance on how elasticity estimates can inform decisions. It is guidance, not a report of outcomes, and each point is conditional on what your own data shows.
If Response Is Asymmetric
When a test supports asymmetry, a price increase and a price decrease should be evaluated with their own coefficients. Where demand is more sensitive to increases, it may be worth considering smaller or staged increases, pairing an increase with a visible product improvement, or targeting less sensitive segments. Where demand responds weakly to decreases, check whether the volume gain would cover the margin lost before cutting price.
If Elasticity Varies Over Time
If rolling estimates move materially, pricing rules can take the current conditions into account. Calibrate the size of any adjustment to the uncertainty in the elasticity forecast: the less certain the forecast, the smaller the adjustment. Even without dynamic pricing infrastructure, a documented seasonal or calendar pattern can inform when to run promotions.
If Segments Differ
Product line design (value and premium tiers), channel-based pricing, and loyalty programs are ways for customers to select offers suited to their price sensitivity without the seller pricing individuals directly. Check legal constraints and fairness perceptions before adopting segment-based pricing.
If Thresholds Exist
If the estimated curve shows a sharp change at a price point, price selection can take it into account, for example by avoiding a price just above the threshold. Optimization routines that treat price as continuous can land on prices just above a discontinuity, so a penalty or a restricted candidate set may be needed.
In Multi-Product Settings
When cross-price effects are material, pricing decisions for related products should be coordinated. For complements, the margin on one product interacts with demand for the other, so the right price depends on the cross-price elasticity, the margin of each product, and how the products are consumed together. For close substitutes, large price gaps tend to move demand toward the cheaper option, so differentiation matters as much as price.
6. Recommendations for Implementation
The following is general guidance for building an elasticity workflow. It is offered as practical advice, not as a result of any study.
Recommendation 1: Use More Than One Estimation Method
Different methods suit different decisions, and agreement between them builds confidence in an estimate. A reasonable set is:
- Baseline Regression Models: a log-log regression on historical transaction data for a stable long-run estimate.
- Asymmetric Response Models: separate coefficients for increases and decreases, with a formal test of equality.
- Rolling Window Estimation: moving windows to show whether sensitivity is stable.
- Segment-Specific Models: estimates for segments that matter to the decision.
- Experimental Cross-Checks: randomized price tests on selected products, to compare against regression estimates and to expose endogeneity bias.
Recommendation 2: Turn Estimates into Explicit Decision Rules
Write down how an estimate will change an action, so that the decision does not depend on who reads the output. Rules can cover:
- Cost Pass-Through: when input costs rise, compare the revenue effect of a price increase (using the relevant elasticity and its interval) against absorbing the cost.
- Competitive Response: use the cross-price elasticity with each competitor to decide whether matching is worthwhile.
- Promotions: set promotional depth and frequency in light of segment-level elasticity.
- New Product Pricing: use category-level estimates and any threshold effects as inputs, with wide uncertainty acknowledged.
Backtest rules on historical data where possible and revisit them as conditions change.
Recommendation 3: Build Segmentation Carefully
If segment-level estimates are used, consider the following:
- Behavioral Segmentation: segments built from purchase history are directly computable and usually raise fewer fairness concerns than demographic ones.
- Channel Strategy: distinct channels with different price levels let customers self-select.
- Product Line Architecture: value and premium tiers with salient feature differences.
- Targeted Promotion: make sure targeting respects privacy and does not discriminate on protected characteristics.
Recommendation 4: Treat Related Products Together
In multi-product settings:
- Cross-Price Elasticity Estimation: use system-of-equations or vector autoregression models, and focus first on the strongest relationships.
- Product Clustering: network analysis or hierarchical clustering to find groups with strong internal interaction, then optimize within groups.
- Complements: model the pair jointly, since the margin on one depends on demand for the other.
- Substitutes: keep price relationships coherent with how the products are differentiated.
Recommendation 5: Keep Estimates Current
Elasticity can change as preferences and competition change, so treat estimation as ongoing:
- Regular Re-estimation: refresh models on a fixed cycle with new data and flag large changes.
- Forecast Tracking: compare elasticity-based demand forecasts with outcomes and separate estimation error from other sources of error.
- Ongoing Experiments: maintain a calendar of randomized price tests across categories and segments.
- Competitive Monitoring: update cross-price models after significant competitor events.
- Post-Decision Review: compare actual outcomes with the elasticity-based prediction after a pricing change, and use the gap to improve the model.
7. Conclusion
This paper has explained how price elasticity is defined, how it is estimated with log-log regression, and how the basic model can be extended to test for asymmetric response, time variation, segment differences, non-linear effects, and cross-price interactions. It also described how endogeneity threatens estimates and how instruments, quasi-experiments, and randomized tests address it.
Apart from the made-up example, it reports no measured results, and nothing here should be read as evidence that any particular pattern exists in any particular market. Whether elasticity is symmetric, stable, homogeneous, or constant is something each analyst must test on their own data, and the sections above describe how.
The practical advice is to start with a simple baseline, check its assumptions and uncertainty, add complexity only when the data supports it, and tie each estimate to a specific decision rule. Use more than one method where possible, and treat the estimate as something to refresh, not a fixed number.
Your turn
Bring your own data and the question you actually need answered.
MCP AnalyticsData science by email Send us your data and your question, and we will reply. ds@mcpanalytics.ai
Frequently Asked Questions
References & Further Reading
- Bijmolt, T. H. A., Van Heerde, H. J., & Pieters, R. G. M. (2005). New Empirical Generalizations on the Determinants of Price Elasticity. Journal of Marketing Research, 42(2), 141-156.
- Tellis, G. J. (1988). The Price Elasticity of Selective Demand: A Meta-Analysis of Econometric Models of Sales. Journal of Marketing Research, 25(4), 331-341.
- Hanssens, D. M., Parsons, L. J., & Schultz, R. L. (2001). Market Response Models: Econometric and Time Series Analysis (2nd ed.). Kluwer Academic Publishers.
- Neslin, S. A., & Shoemaker, R. W. (1989). An Alternative Explanation for Lower Repeat Rates After Promotion Purchases. Journal of Marketing Research, 26(2), 205-213.
- Kalyanaram, G., & Winer, R. S. (1995). Empirical Generalizations from Reference Price Research. Marketing Science, 14(3), G161-G169.
- Ailawadi, K. L., Lehmann, D. R., & Neslin, S. A. (2003). Revenue Premium as an Outcome Measure of Brand Equity. Journal of Marketing, 67(4), 1-17.
- Nagle, T. T., & Müller, G. (2017). The Strategy and Tactics of Pricing: A Guide to Growing More Profitably (6th ed.). Routledge.
- Train, K. E. (2009). Discrete Choice Methods with Simulation (2nd ed.). Cambridge University Press.
- Varian, H. R. (1989). Price Discrimination. Handbook of Industrial Organization, 1, 597-654.