🎓 レベル:標準 | 重要度:A(必須)
📎 関連:顧客獲得コスト(CAC)とLTV/CAC | 前提:需要曲線と価格弾力性
要点(BLUF)
- 価格最適化は、利益 を最大にする価格を選ぶ問題です。収入最大化とは別物——限界費用 があるぶん、利益最大価格は収入最大価格より高くなります。
- 一階条件 を整理すると、ラーナー指数 。価格に占めるマージンの割合は弾力性の逆数で、弾力的な市場ほどマークアップは小さい。線形需要では 。
- 例()では、利益最大 (収入最大 250 より高い)、、。ラーナー指数 が成立します。
1. 利益最大化問題:収入最大化との違い
価格を上げると、1単位あたりのマージンは増えますが、売れる数量は減ります。この綱引きの最適点を探すのが価格最適化です。利益は「マージン × 数量」で、
ここで は限界費用(1単位を追加で売るのにかかる変動費)、 が1単位あたりの粗利(マージン)です。 は 需要曲線と価格弾力性 の需要曲線。
よくある取り違えが収入最大化との混同です。収入最大化は を最大にし、コスト を完全に無視します。利益最大化は を最大にする。 なら、1単位売るたびに かかるので、収入最大化ほど数量を追いません——価格を高めにして数量を抑えるのが得。したがって一般に
です。「値下げして売上を伸ばす」発想は、コストを忘れると利益を削ります。
2. 一階条件とラーナー公式(数式)
最適価格は を で微分して 0 とおくことで求まります(積の微分)。
両辺を で割り、(弾力性の定義 より)を使うと、
これを について解くと、ラーナー公式が出ます。
左辺 はラーナー指数(価格に占めるマージンの割合=マークアップ率)。これが弾力性の逆数に等しい、という美しい結果です。弾力的な市場( 大)ほどマークアップは薄く、非弾力的なら厚い。ただし内点で最適が存在するには が必要です( だと価格を上げるほど利益が増え、最適が定まらない)。
flowchart LR D["需要の価格弾力性(絶対値)"] --> L["ラーナー指数 (P-c)/P = 1/弾力性"] L --> M["最適マークアップが決まる"] M --> Ps["最適価格 P*"]
線形需要での具体解。 を入れて一階条件を解くと、
最適数量は 、最大利益は です。
定弾力性需要での具体解。(一定)なら、ラーナー公式 を解いて、
これは独占企業の古典的マークアップ公式です( が必要。 だと最適価格が発散)。コストに という、弾力性で決まる倍率を掛けるのであって、単純なコストプラス(固定%の上乗せ)ではない点が重要です。
3. 解析解と数値解の一致を確かめる(コード)
で利益 を最大化します。解析解 と、scipy.optimize.minimize_scalar による数値解( を最小化)が一致すること、そして最適点でラーナー指数 と が一致することを確かめます。あわせて収入最大価格 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で一致しました——閉形式 と汎用最適化(minimize_scalar)が同じ答えを返す、という相互検証です。最適数量 、最大利益 。次に、最適点でのラーナー指数 が と一致(True)。§2 の一階条件が「マークアップ率=弾力性の逆数」を意味することの、数値での裏取りです。最後の対比が実務的に効きます。収入最大価格 250 は収入こそ最大(125,000)ですが利益は 75,000 にとどまり、利益最大価格 300 は収入が 120,000 に下がっても利益は 80,000 と大きい。限界費用 があるぶん、最適価格は収入最大点より上にずれる——「売上を最大化すれば利益も最大」ではないことが、はっきり数字に出ました。
利益曲線と収入曲線を重ねて描くと、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()
赤の利益カーブは 、青破線の収入カーブは で頂点をとり、**利益のピークが収入のピークより右(高価格側)**にあることが見て取れます。
⚠️ よくある誤解
- 収入最大化と利益最大化の混同:「売上を最大にすれば利益も最大」は誤り。コストを無視して値下げしすぎると利益を削ります。最適化するのは ではなく です。
- は固定費ではなく変動費(限界費用):一階条件に入るのは1単位あたりの限界費用 だけ。固定費は最適価格 を動かしません(利益の高さは変えるが、最適点の場所は変えない)。
- コストプラスではなく マークアップ:適正なマークアップは「原価に一律◯%」ではなく、弾力性で決まる (線形なら 、定弾力性なら )。弾力的な財ほど薄く、非弾力的な財ほど厚く取るのが理屈です。
- 需要曲線の推定が外れれば、最適価格も外れる: は弾力性( や )に依存します。弾力性の推定には不確実性があり(需要曲線と価格弾力性 の内生性も含む)、点推定の を鵜呑みにせず、弾力性のレンジで最適価格の幅を見るべきです。
- 静学モデルの外にあるもの:このモデルは1期・単一企業・単一価格の静的最適化です。競合の価格反応、需要の異時点効果(先食い・後ろ倒し)、在庫制約は含みません。動的価格・バンドル・心理価格は、次の 03-03 価格戦略で扱います。
関連ノート
- 需要曲線と価格弾力性(前提・弾力性とラーナー公式の出発点)
- 第3章 需要と価格 目次
- 顧客獲得コスト(CAC)とLTV/CAC(粗利=マージン は採算・LTV/CAC とつながる)
- 動的価格・バンドル・心理価格(行動経済学的な値付け)は 03-03 価格戦略で扱う(本章後半)/競合反応を含むゲーム的な価格設定は発展トピック
- マーケティング・サイエンス 全体目次