Mímisbrunnr知恵の泉

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

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

📎 関連:顧客獲得コスト(CAC)とLTV/CAC | 前提:需要曲線と価格弾力性

要点(BLUF)

1. 利益最大化問題:収入最大化との違い

価格を上げると、1単位あたりのマージンは増えますが、売れる数量は減ります。この綱引きの最適点を探すのが価格最適化です。利益は「マージン × 数量」で、

π(P)=(Pc)Q(P)\pi(P) = (P - c)\,Q(P)

ここで cc限界費用(1単位を追加で売るのにかかる変動費)PcP-c が1単位あたりの粗利(マージン)です。Q(P)Q(P)需要曲線と価格弾力性 の需要曲線。

よくある取り違えが収入最大化との混同です。収入最大化は R=PQR=PQ を最大にし、コスト cc完全に無視します。利益最大化は (Pc)Q(P-c)Q を最大にする。c>0c>0 なら、1単位売るたびに cc かかるので、収入最大化ほど数量を追いません——価格を高めにして数量を抑えるのが得。したがって一般に

利益最大価格  >  収入最大価格\text{利益最大価格} \;>\; \text{収入最大価格}

です。「値下げして売上を伸ばす」発想は、コストを忘れると利益を削ります。

2. 一階条件とラーナー公式(数式)

最適価格は π(P)=(Pc)Q(P)\pi(P)=(P-c)Q(P)PP で微分して 0 とおくことで求まります(積の微分)。

dπdP=Q+(Pc)dQdP=0\frac{d\pi}{dP} = Q + (P-c)\frac{dQ}{dP} = 0

両辺を Q(>0)Q\,(>0) で割り、dQdP1Q=εP\dfrac{dQ}{dP}\cdot\dfrac{1}{Q}=\dfrac{\varepsilon}{P}(弾力性の定義 ε=dQdPPQ\varepsilon=\dfrac{dQ}{dP}\dfrac{P}{Q} より)を使うと、

1+(Pc)εP=01 + (P-c)\frac{\varepsilon}{P} = 0

これを PcP\dfrac{P-c}{P} について解くと、ラーナー公式が出ます。

PcP=1ε=1ε\frac{P-c}{P} = -\frac{1}{\varepsilon} = \frac{1}{|\varepsilon|}

左辺 PcP\dfrac{P-c}{P}ラーナー指数(価格に占めるマージンの割合=マークアップ率)。これが弾力性の逆数に等しい、という美しい結果です。弾力的な市場(ε|\varepsilon| 大)ほどマークアップは薄く、非弾力的なら厚い。ただし内点で最適が存在するには ε>1|\varepsilon|>1 が必要です(ε1|\varepsilon|\le1 だと価格を上げるほど利益が増え、最適が定まらない)。

flowchart LR
  D["需要の価格弾力性(絶対値)"] --> L["ラーナー指数 (P-c)/P = 1/弾力性"]
  L --> M["最適マークアップが決まる"]
  M --> Ps["最適価格 P*"]

線形需要での具体解Q=abPQ=a-bP を入れて一階条件を解くと、

dπdP=(abP)+(Pc)(b)=a2bP+bc=0P=a+bc2b\frac{d\pi}{dP} = (a-bP) + (P-c)(-b) = a - 2bP + bc = 0 \quad\Longrightarrow\quad P^{*} = \frac{a+bc}{2b}

最適数量は Q=abP=abc2Q^{*}=a-bP^{*}=\dfrac{a-bc}{2}、最大利益は π=(Pc)Q\pi^{*}=(P^{*}-c)\,Q^{*} です。

定弾力性需要での具体解ε=e\varepsilon=-e(一定)なら、ラーナー公式 PcP=1e\dfrac{P-c}{P}=\dfrac{1}{e} を解いて、

P=ee1cP^{*} = \frac{e}{e-1}\,c

これは独占企業の古典的マークアップ公式です(e>1e>1 が必要。e1e\le1 だと最適価格が発散)。コストに ee1\dfrac{e}{e-1} という、弾力性で決まる倍率を掛けるのであって、単純なコストプラス(固定%の上乗せ)ではない点が重要です。

3. 解析解と数値解の一致を確かめる(コード)

a=1000,b=2,c=100a=1000,b=2,c=100 で利益 π(P)=(Pc)(abP)\pi(P)=(P-c)(a-bP) を最大化します。解析解 P=(a+bc)/(2b)=300P^{*}=(a+bc)/(2b)=300 と、scipy.optimize.minimize_scalar による数値解π-\pi を最小化)が一致すること、そして最適点でラーナー指数 (Pc)/P(P^{*}-c)/P^{*}1/ε(P)1/|\varepsilon(P^{*})| が一致することを確かめます。あわせて収入最大価格 250 と並べて対比します。

import numpy as np
from scipy.optimize import minimize_scalar

# 線形需要 Q(P)=a-bP、限界費用(変動費)c。利益 π(P)=(P-c)(a-bP)
a, b, c = 1000.0, 2.0, 100.0

def demand(P):  return a - b * P
def profit(P):  return (P - c) * demand(P)     # 利益
def revenue(P): return P * demand(P)           # 収入

# (a) 解析解:一階条件 dπ/dP=0 より P* = (a+bc)/(2b)
P_star = (a + b * c) / (2 * b)
Q_star = demand(P_star)
pi_star = profit(P_star)

# (b) 数値解:-π を最小化(=π を最大化)。価格は [0,500] に制限
res = minimize_scalar(lambda P: -profit(P), bounds=(0, 500), method="bounded")
P_num = res.x

print("=== 利益最大化(a=1000, b=2, c=100)===")
print(f"解析解 P* = (a+bc)/(2b) = {P_star:.4f}")
print(f"数値解 minimize_scalar  = {P_num:.4f}")
print(f"最適数量 Q* = {Q_star:.1f}, 最大利益 π* = {pi_star:,.0f}")

# (c) ラーナー指数 (P*-c)/P* と 1/|弾力性(P*)| が一致
eps_star = -b * P_star / Q_star          # 点弾力性 ε(P*)
lerner = (P_star - c) / P_star           # マークアップ率
print(f"\n点弾力性 ε(P*) = {eps_star:+.4f}(絶対値 {abs(eps_star):.4f})")
print(f"ラーナー指数 (P*-c)/P* = {lerner:.4f}")
print(f"1/|弾力性|            = {1/abs(eps_star):.4f}")
print(f"一致するか           : {np.isclose(lerner, 1/abs(eps_star))}")

# (d) 収入最大価格 250 と利益最大価格 300 を対比
P_rev = a / (2 * b)
print(f"\n収入最大価格 a/(2b) = {P_rev:.0f}(利益={profit(P_rev):,.0f}, 収入={revenue(P_rev):,.0f})")
print(f"利益最大価格 P*     = {P_star:.0f}(利益={profit(P_star):,.0f}, 収入={revenue(P_star):,.0f})")
print("→ 限界費用 c>0 があるぶん、利益最大価格(300) は収入最大価格(250) より高い。")

出力:

=== 利益最大化(a=1000, b=2, c=100)===
解析解 P* = (a+bc)/(2b) = 300.0000
数値解 minimize_scalar  = 300.0000
最適数量 Q* = 400.0, 最大利益 π* = 80,000

点弾力性 ε(P*) = -1.5000(絶対値 1.5000)
ラーナー指数 (P*-c)/P* = 0.6667
1/|弾力性|            = 0.6667
一致するか           : True

収入最大価格 a/(2b) = 250(利益=75,000, 収入=125,000)
利益最大価格 P*     = 300(利益=80,000, 収入=120,000)
→ 限界費用 c>0 があるぶん、利益最大価格(300) は収入最大価格(250) より高い。

出力の意味:まず解析解と数値解がともに 300.0000で一致しました——閉形式 P=(a+bc)/(2b)P^{*}=(a+bc)/(2b) と汎用最適化(minimize_scalar)が同じ答えを返す、という相互検証です。最適数量 Q=400Q^{*}=400、最大利益 π=80,000\pi^{*}=80{,}000。次に、最適点でのラーナー指数 0.66670.66671/ε=1/1.5=0.66671/|\varepsilon|=1/1.5=0.6667 と一致True)。§2 の一階条件が「マークアップ率=弾力性の逆数」を意味することの、数値での裏取りです。最後の対比が実務的に効きます。収入最大価格 250 は収入こそ最大(125,000)ですが利益は 75,000 にとどまり利益最大価格 300 は収入が 120,000 に下がっても利益は 80,000 と大きい。限界費用 c>0c>0 があるぶん、最適価格は収入最大点よりにずれる——「売上を最大化すれば利益も最大」ではないことが、はっきり数字に出ました。

利益曲線と収入曲線を重ねて描くと、2つの頂点のズレが一目でわかります。

import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib

a, b, c = 1000.0, 2.0, 100.0
P = np.linspace(c, a / b, 400)        # 価格は限界費用 c 〜 切片価格 a/b の範囲
Q = a - b * P
profit = (P - c) * Q
revenue = P * Q

P_star = (a + b * c) / (2 * b)        # 利益最大価格 = 300
P_rev = a / (2 * b)                  # 収入最大価格 = 250

fig, ax = plt.subplots(figsize=(7.5, 4.6))
ax.plot(P, profit, color="C3", lw=2.2, label="利益 π(P)=(P-c)(a-bP)")
ax.plot(P, revenue, color="C0", lw=1.6, ls="--", label="収入 R(P)=P·Q")

ax.axvline(P_star, color="C3", ls=":", lw=1.2)
ax.axvline(P_rev, color="C0", ls=":", lw=1.2)
ax.scatter([P_star], [(P_star - c) * (a - b * P_star)], color="C3", zorder=5)
ax.scatter([P_rev], [P_rev * (a - b * P_rev)], color="C0", zorder=5)

ax.annotate("利益最大 P*=300\nπ*=80,000",
            xy=(P_star, 80000), xytext=(330, 55000),
            arrowprops=dict(arrowstyle="->", color="C3"))
ax.annotate("収入最大 P=250",
            xy=(P_rev, 125000), xytext=(150, 100000),
            arrowprops=dict(arrowstyle="->", color="C0"))

ax.set_title("利益最大価格(300) は収入最大価格(250) より高い")
ax.set_xlabel("価格 P")
ax.set_ylabel("金額(円)")
ax.legend(loc="lower center")
fig.tight_layout()
plt.show()

赤の利益カーブは P=300P^{*}=300、青破線の収入カーブは P=250P=250 で頂点をとり、**利益のピークが収入のピークより右(高価格側)**にあることが見て取れます。

⚠️ よくある誤解

関連ノート