Mímisbrunnr知恵の泉

← マーケティングサイエンス 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 関連:価格最適化(利益最大化) | 前提:マーケティングデータとKPIの体系

要点(BLUF)

1. 需要曲線:価格に対する需要量

需要曲線は、価格 PP を決めたときに売れる数量 Q(P)Q(P) を表す関数です。価格を上げれば需要は減るのがふつうなので、曲線は右下がりになります。マーケティング・サイエンスでよく使う形は2つです。

(1) 線形需要 —— いちばん素朴で扱いやすい形。

Q(P)=abPQ(P) = a - bP

ここで a>0a>0最大需要P=0P=0 のときの需要量)、b>0b>0価格感応度(価格を1単位上げると需要が bb だけ減る)です。需要が 0 になる価格 P=a/bP=a/bチョーク価格と呼びます。傾き dQ/dP=bdQ/dP=-b一定です。

(2) 定弾力性需要 —— 後述する弾力性が価格によらず一定になる形。

Q(P)=APeQ(P) = A\,P^{-e}

両辺の対数をとると lnQ=lnAelnP\ln Q = \ln A - e\,\ln P となり、両対数(log-log)で直線になります。e>0e>0 が大きいほど価格に敏感です。需要を回帰で推定するときに log-log を使うのは、この ee が後で見る弾力性そのものになるからです(推定論の詳細は統計テキストへ)。

2. 価格弾力性(数式)

価格弾力性 ε\varepsilon は、価格の変化率に対する需要の変化率の比です。

ε=dQ/QdP/P=dQdPPQ\varepsilon = \frac{dQ/Q}{dP/P} = \frac{dQ}{dP}\cdot\frac{P}{Q}

「価格を1%動かすと需要が何%動くか」を表す単位を持たない量です。需要曲線が右下がりなら dQ/dP<0dQ/dP<0 なので、ε\varepsilon通常マイナス。絶対値で読み、

ここが肝心です。弾力性は傾き(dQ/dPdQ/dP)ではありません。線形需要では傾き dQ/dP=bdQ/dP=-b は一定ですが、弾力性は

ε=bPQ=bPabP\varepsilon = -b\cdot\frac{P}{Q} = -\frac{bP}{a-bP}

価格 PP とともに変化します。PP が小さい(QQ が大きい)ほど ε|\varepsilon| は小さく非弾力的、PP が大きい(QQ が小さい)ほど ε|\varepsilon| は大きく弾力的。つまり同じ直線の需要曲線でも、どの価格にいるかで弾力性は違うのです。いっぽう定弾力性需要 Q=APeQ=AP^{-e} では、dQ/dP=eAPe1dQ/dP=-eAP^{-e-1} を代入すると ε=e\varepsilon=-e価格によらず一定になります。

弾力性は収入と直結します。収入 R=PQR=PQ を価格で微分すると、

dRdP=Q+PdQdP=Q(1+ε)\frac{dR}{dP} = Q + P\frac{dQ}{dP} = Q\left(1+\varepsilon\right)

Q>0Q>0 なので符号は 1+ε1+\varepsilon で決まります。ε<1|\varepsilon|<1ε>1\varepsilon>-1)なら dR/dP>0dR/dP>0値上げが収入を増やしε>1|\varepsilon|>1ε<1\varepsilon<-1)なら dR/dP<0dR/dP<0値下げが収入を増やす。そして ε=1|\varepsilon|=1dR/dP=0dR/dP=0収入が最大になります。

flowchart TD
  E{"点弾力性の絶対値は?"}
  E -->|"1未満(非弾力的)"| I["値上げで収入が増える"]
  E -->|"1(単位弾力)"| U["収入が最大"]
  E -->|"1超(弾力的)"| EL["値下げで収入が増える"]

3. 価格を振って弾力性と収入を見る(コード)

線形需要 Q=abPQ=a-bPa=1000, b=2a=1000,\ b=2)で価格 PP を振り、需要 QQ・収入 R=PQR=PQ・点弾力性 ε(P)=bP/Q\varepsilon(P)=-bP/Q を表にします。数式の対応は ε(P)=bP/Q\varepsilon(P)=-bP/Q、収入は R=PQR=PQ、収入最大価格は a/(2b)=250a/(2b)=250収入が P=250P=250ε=1|\varepsilon|=1)で最大になること、弾力性が価格とともに変化することを確かめます。

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

出力の意味:収入 RR は価格とともに上がってから下がり、P=250P=250 でピーク(125,000)。このとき点弾力性はちょうど 1.000-1.000(単位弾力)です。P<250P<250 の領域は ε<1|\varepsilon|<1(非弾力的)で、ここでは値上げが収入を増やします(80,000 → 125,000)。P>250P>250 では ε>1|\varepsilon|>1(弾力的)になり、値上げが収入を減らします(125,000 → 45,000)。注目すべきは弾力性が 0.250-0.250 から 9.000-9.000 まで大きく変化している点です——傾き dQ/dP=2dQ/dP=-2 は終始一定なのに、です。高価格ほど弾力的という線形需要の性質が数字で見えます。「弾力性=傾き」ではないこと、そして「収入最大は ε=1|\varepsilon|=1」が、ひとつの表で確認できました。

この関係を図にすると直感的です。次のコードは、左に収入 R(P)R(P)、右に ε(P)|\varepsilon(P)| を描き、両者が P=250P=250 で結びつくことを示します(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()

左の収入カーブは P=250P=250 で頂点をとり、右の弾力性カーブはそこで 1 を横切ります。収入最大点と単位弾力点が一致するのが、§2 の dR/dP=Q(1+ε)dR/dP=Q(1+\varepsilon) の帰結です。

⚠️ よくある誤解

関連ノート