🎓 レベル:標準 | 重要度:A(必須)
📎 関連:価格最適化(利益最大化) | 前提:マーケティングデータとKPIの体系
要点(BLUF)
- 需要曲線 は、価格 に対して売れる数量を表します。ふつう右下がり(値上げで需要は減る)。代表型は線形 と定弾力性 の2つです。
- 価格弾力性 は「価格を1%上げたとき需要が何%変わるか」。通常は負で、 なら弾力的、 なら非弾力的です。弾力性は傾きではありません。
- 収入 は弾力性で動きます。 なら値下げで収入増、(単位弾力)で収入が最大。線形需要では弾力性が価格で変わり、高価格ほど弾力的になります。
1. 需要曲線:価格に対する需要量
需要曲線は、価格 を決めたときに売れる数量 を表す関数です。価格を上げれば需要は減るのがふつうなので、曲線は右下がりになります。マーケティング・サイエンスでよく使う形は2つです。
(1) 線形需要 —— いちばん素朴で扱いやすい形。
ここで は最大需要( のときの需要量)、 は価格感応度(価格を1単位上げると需要が だけ減る)です。需要が 0 になる価格 をチョーク価格と呼びます。傾き は一定です。
(2) 定弾力性需要 —— 後述する弾力性が価格によらず一定になる形。
両辺の対数をとると となり、両対数(log-log)で直線になります。 が大きいほど価格に敏感です。需要を回帰で推定するときに log-log を使うのは、この が後で見る弾力性そのものになるからです(推定論の詳細は統計テキストへ)。
2. 価格弾力性(数式)
価格弾力性 は、価格の変化率に対する需要の変化率の比です。
「価格を1%動かすと需要が何%動くか」を表す単位を持たない量です。需要曲線が右下がりなら なので、 は通常マイナス。絶対値で読み、
- :弾力的(価格変化より需要変化が大きい。ぜいたく品・代替の多い財)
- :非弾力的(需要が価格に鈍い。生活必需品・代替の少ない財)
- :単位弾力
ここが肝心です。弾力性は傾き()ではありません。線形需要では傾き は一定ですが、弾力性は
と価格 とともに変化します。 が小さい( が大きい)ほど は小さく非弾力的、 が大きい( が小さい)ほど は大きく弾力的。つまり同じ直線の需要曲線でも、どの価格にいるかで弾力性は違うのです。いっぽう定弾力性需要 では、 を代入すると で価格によらず一定になります。
弾力性は収入と直結します。収入 を価格で微分すると、
なので符号は で決まります。()なら で値上げが収入を増やし、()なら で値下げが収入を増やす。そして で 、収入が最大になります。
flowchart TD
E{"点弾力性の絶対値は?"}
E -->|"1未満(非弾力的)"| I["値上げで収入が増える"]
E -->|"1(単位弾力)"| U["収入が最大"]
E -->|"1超(弾力的)"| EL["値下げで収入が増える"]
3. 価格を振って弾力性と収入を見る(コード)
線形需要 ()で価格 を振り、需要 ・収入 ・点弾力性 を表にします。数式の対応は 、収入は 、収入最大価格は 。収入が ()で最大になること、弾力性が価格とともに変化することを確かめます。
import numpy as np
import pandas as pd
# 線形需要 Q(P) = a - bP(右下がり)。a は最大需要、b は価格感応度。
a, b = 1000.0, 2.0
# 価格 P を 100〜450 で振り、需要 Q・収入 R=PQ・点弾力性 ε(P)=-bP/Q を計算
P = np.arange(100, 451, 50, dtype=float)
Q = a - b * P # 需要量
R = P * Q # 収入 R = P × Q
eps = -b * P / Q # 点弾力性 ε = (dQ/dP)(P/Q) = -b P / Q
tbl = pd.DataFrame({"価格P": P, "需要Q": Q, "収入R": R, "弾力性": eps})
print("=== 線形需要 Q=1000-2P:価格・需要・収入・点弾力性 ===")
print(tbl.to_string(index=False, formatters={
"価格P": "{:.0f}".format,
"需要Q": "{:.0f}".format,
"収入R": "{:,.0f}".format,
"弾力性": "{:+.3f}".format}))
# 収入が最大になる価格と、そのときの弾力性
i_star = int(np.argmax(R))
print(f"\n収入が最大の価格 :P = {P[i_star]:.0f}(収入 R = {R[i_star]:,.0f})")
print(f"そのときの点弾力性 :{eps[i_star]:+.3f}(絶対値 = {abs(eps[i_star]):.3f})")
print("→ 収入は単位弾力 |弾力性|=1 の価格で最大になる。")
# 解析的にも確認:収入最大価格 a/(2b)、そこで |弾力性|=1
print(f"\n解析解:収入最大価格 a/(2b) = {a/(2*b):.0f}")
出力:
=== 線形需要 Q=1000-2P:価格・需要・収入・点弾力性 ===
価格P 需要Q 収入R 弾力性
100 800 80,000 -0.250
150 700 105,000 -0.429
200 600 120,000 -0.667
250 500 125,000 -1.000
300 400 120,000 -1.500
350 300 105,000 -2.333
400 200 80,000 -4.000
450 100 45,000 -9.000
収入が最大の価格 :P = 250(収入 R = 125,000)
そのときの点弾力性 :-1.000(絶対値 = 1.000)
→ 収入は単位弾力 |弾力性|=1 の価格で最大になる。
解析解:収入最大価格 a/(2b) = 250
出力の意味:収入 は価格とともに上がってから下がり、 でピーク(125,000)。このとき点弾力性はちょうど (単位弾力)です。 の領域は (非弾力的)で、ここでは値上げが収入を増やします(80,000 → 125,000)。 では (弾力的)になり、値上げが収入を減らします(125,000 → 45,000)。注目すべきは弾力性が から まで大きく変化している点です——傾き は終始一定なのに、です。高価格ほど弾力的という線形需要の性質が数字で見えます。「弾力性=傾き」ではないこと、そして「収入最大は 」が、ひとつの表で確認できました。
この関係を図にすると直感的です。次のコードは、左に収入 、右に を描き、両者が で結びつくことを示します(japanize_matplotlib で日本語ラベル)。
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib # 日本語ラベル
a, b = 1000.0, 2.0
P = np.linspace(1, 499, 499) # P=500 で Q=0(弾力性が発散)するため手前まで
Q = a - b * P
R = P * Q
eps_abs = b * P / Q # |弾力性| = b P / Q
P_rev = a / (2 * b) # 収入最大価格 = 250(ここで |弾力性|=1)
fig, ax = plt.subplots(1, 2, figsize=(11, 4.2))
# 左:収入 R(P)。P=250 で最大
ax[0].plot(P, R, color="C0", lw=2)
ax[0].axvline(P_rev, color="C3", ls="--", lw=1.2)
ax[0].scatter([P_rev], [P_rev * (a - b * P_rev)], color="C3", zorder=5)
ax[0].set_title("収入 R(P)=P·Q は P=250 で最大")
ax[0].set_xlabel("価格 P")
ax[0].set_ylabel("収入 R = P×Q")
ax[0].annotate("収入最大 P=250\n(|弾力性|=1)",
xy=(P_rev, 125000), xytext=(300, 90000),
arrowprops=dict(arrowstyle="->", color="C3"))
# 右:|弾力性|(P)。価格とともに増え、P=250 で 1 を横切る
ax[1].plot(P, eps_abs, color="C2", lw=2)
ax[1].axhline(1.0, color="gray", ls=":", lw=1.2)
ax[1].axvline(P_rev, color="C3", ls="--", lw=1.2)
ax[1].set_ylim(0, 5)
ax[1].set_title("点弾力性 |ε| は価格とともに増大")
ax[1].set_xlabel("価格 P")
ax[1].set_ylabel("|弾力性| = b·P / Q")
ax[1].annotate("|弾力性|=1\nP=250", xy=(P_rev, 1.0), xytext=(300, 2.2),
arrowprops=dict(arrowstyle="->", color="C3"))
ax[1].text(140, 0.55, "非弾力的\n|ε|<1", color="C0", ha="center")
ax[1].text(360, 3.4, "弾力的\n|ε|>1", color="C1", ha="center")
fig.tight_layout()
plt.show()
左の収入カーブは で頂点をとり、右の弾力性カーブはそこで 1 を横切ります。収入最大点と単位弾力点が一致するのが、§2 の の帰結です。
⚠️ よくある誤解
- 弾力性=傾き、ではない:傾き は単位に依存する量(個/円)で、線形需要では一定。弾力性は と を掛けた無単位の量で、同じ曲線上でも価格で変わります。
- 線形需要の弾力性は一定ではない:「直線だから弾力性も一定」は誤り。一定になるのは定弾力性需要 ()の方です。線形需要は高価格ほど弾力的。
- 符号を取り違える:弾力性は通常マイナス(右下がり)。「弾力性 1.5」と言うときは慣習的に絶対値 を指すことが多いので、符号の約束を明示しましょう。
- 観測された価格と数量の相関は、真の需要曲線ではない:実データの と の散らばりには、需要側と供給側が同時に動く同時性・内生性が混じります(価格が高い時期はそもそも需要が強かった、など)。単純回帰の係数を弾力性と読むと過小・過大推定になりがちです。需要弾力性の因果的な推定は、価格テスト(第3章 需要と価格 目次 の第7章 実験)や操作変数で行います。回帰の推定法は統計テキスト、価格の内生性・因果は因果推論テキストを参照してください。
関連ノート
- 価格最適化(利益最大化)(次のトピック・弾力性から最適価格=ラーナー公式を導く)
- 第3章 需要と価格 目次
- マーケティングデータとKPIの体系(単価=価格は KPI の基本因子)
- 需要曲線を実データから推定する回帰(log-log 等)は統計テキスト/価格の内生性・同時性を踏まえた弾力性の因果推定は因果推論テキストへ
- マーケティング・サイエンス 全体目次