logitモデルには IIA(Independence of Irrelevant Alternatives)という強い制約があり、代替のパターンが不自然になることがある。
nested logit を使うと、財を「似ているもの同士」でグループ化(ネスト)することで、代替性をより柔軟に表現できる。
市場レベルのシェア・価格データしかなくても、logitシェア式を反転すれば OLS で推定できる回帰式になる(Berry (1994) の反転)。
価格は未観測の需要ショック(未観測の品質・広告など)と相関しやすい。本講義で扱う典型例のように、他の説明変数を条件づけても両者の共分散が正なら、これを無視した OLS は価格反応を過小評価する(共分散が負ならバイアスの向きも逆になる)。
コストシフターや競合属性を操作変数として使う 2SLS で、価格内生性に対処できる。
前回とのつながり・今回のゴール
前回は、消費者の効用に Type I 極値分布のショックを加えることで、multinomial logit モデルを導出した。選択確率の閉じた式が書け、最尤法で推定でき、価格弾力性まで計算できる——logit は驚くほど扱いやすい道具だった。ただし前回の最後で少し匂わせたように、この扱いやすさは「誤差項が財を超えて iid である」という強い仮定の代償として得られている。
今回は、その代償の中身を直視するところから始める。具体的には2つの問題を扱う。
1つ目は IIA(Independence of Irrelevant Alternatives) の問題である。logitモデルでは、ある財の価格が変化したときに他の財へ流出する需要が、他の財の「シェアの比率」だけで機械的に決まってしまう。これは「似た財ほど競合として強く反応するはず」という直感と食い違うことが多い。この問題への対処として nested logit を導入し、財をグループ(ネスト)にまとめることで、グループ内の代替をグループ外の代替より強く表現できるようにする。
2つ目は、価格の内生性 の問題である。前回までは、価格を含む説明変数はすべて「外生」として扱ってきた。しかし現実の価格は、企業が需要側の情報(消費者に人気がある、広告で話題になっている、といった要因)を知った上でつけている。この情報が分析者には見えない「未観測の需要ショック」だとすると、価格とこの未観測ショックは相関し、OLSによる価格反応の推定はバイアスを持つ。これはまさに第1回のイントロで見せたデモ——「値上げすると売上が増える」——の正体である。今回はこれを操作変数法(2SLS)で解決する。
次回(第4回)は、消費者ごとに価格感応度や好みが異なる状況(random coefficient logit)を扱い、そこから合併分析へ進む。今回学ぶ「代替性をどう捉えるか」という問題意識は、次回さらに柔軟な形で引き継がれる。
IIAを直視する:赤バス・青バス問題の現代版
思考実験
古典的な「赤バス・青バス問題」(McFadden (1974) 等に由来)は次のような設定である。通勤手段として「車」と「青バス」の2つがあり、シェアが50%ずつだとする。ここに「赤バス」(青バスと座席の色以外は全く同じ)が新たに参入したら、シェアはどうなるべきか。直感的には、赤バスは青バスの完全な代替物なので、青バスのシェアが25%、赤バスのシェアが25%、車のシェアは50%のまま変わらないはずである。ところがlogitモデルでは、車のシェアも33%に低下してしまう。青バスと同じぐらい車からも人を奪ってしまうのである。
これを現代のビジネスの文脈に置き換えてみる。次のような3つの選択肢を考える。
財1:コンビニのプライベートブランド缶コーヒーA
財2:ほぼ同じ処方・同じ価格帯のプライベートブランド缶コーヒーB(Aとほとんど区別がつかない)
財3:全く方向性の違う高級ブランドのスペシャルティコーヒー(価格は財1・2の2倍以上)
財1と財2は消費者から見てほぼ同じもの、財3は全く違う商品カテゴリに近い。ここで財3が値上げされた とき、あなたの直感では、財3から流出した客はどこに向かうと思うだろうか。おそらく「財1と財2はどちらもコンビニの安いブランドなので、ほぼ均等に流れる」というのは自然な予想である。むしろ問題は、財3の値上げによって財1・財2の需要が「財3の値上げ幅に比例して」増えるという部分——それ自体はさほど不自然ではない。IIAの本当の問題は、財1と財2がどれだけ似ているか(あるいは財3とどれだけ違うか)が、代替パターンの計算に一切登場しない ことである。
Rシミュ1:3財logitでのIIAの確認
まず前回と同じ枠組みで、財1・2・3(+ outside option)の3財市場を作る。財1と財2は品質パラメータ・価格ともにほぼ同じに設定し、財3は品質は高いが価格も高い「高級ブランド」として設定する。
alpha <- 1.0
beta_j <- c (2.0 , 2.0 , 3.0 ) # 財1,2,3の品質パラメータ(x'betaに相当)
price_j <- c (3.0 , 3.0 , 8.0 ) # 財1,2は同価格帯、財3は高級ブランドで高価格
logit_shares <- function (beta_j, alpha, price_j) {
delta <- beta_j - alpha * price_j
ev <- exp (delta)
denom <- 1 + sum (ev)
s <- ev / denom
s0 <- 1 / denom
list (s = s, s0 = s0)
}
base <- logit_shares (beta_j, alpha, price_j)
base
$s
[1] 0.211122015 0.211122015 0.003866835
$s0
[1] 0.5738891
財1・財2のシェアはそれぞれ約21%、財3は1%未満、outside optionが約57%というシェア構成になった。財1と財2はほぼ同じ品質・価格なので、シェアも一致している。
ここで財3の価格を10%引き上げる とどうなるか見てみる。
price_shock <- price_j
price_shock[3 ] <- price_shock[3 ] * 1.10
shocked <- logit_shares (beta_j, alpha, price_shock)
shocked
$s
[1] 0.211572527 0.211572527 0.001741188
$s0
[1] 0.5751138
share_change <- shocked$ s - base$ s
share_change
[1] 0.0004505128 0.0004505128 -0.0021256462
財3のシェアが減り、財1・財2のシェアが増えている。ここで注目したいのは、財1が得た需要と財2が得た需要の比率 である。
gain_ratio <- share_change[1 ] / share_change[2 ]
baseline_ratio <- base$ s[1 ] / base$ s[2 ]
cat ("財1/財2の需要獲得比:" , round (gain_ratio, 6 ), " \n " )
cat ("財1/財2のbaselineシェア比:" , round (baseline_ratio, 6 ), " \n " )
2つの比率はぴったり一致する。財1と財2は今回たまたま全く同じ設定なので比が1になるが、これは偶然ではなく、logitモデルでは常に「値上げされた財から流出した需要が、残りの財のシェア比に応じて配分される」 ことの表れである。財1と財2が「似ている」かどうかは、この配分比に一切影響しない。
図で確認する。
df_iia <- data.frame (
good = factor (c ("財1(PB-A)" , "財2(PB-B)" , "財3(高級)" ), levels = c ("財1(PB-A)" , "財2(PB-B)" , "財3(高級)" )),
share_before = base$ s,
share_after = shocked$ s
) %>%
pivot_longer (cols = c (share_before, share_after), names_to = "period" , values_to = "share" ) %>%
mutate (period = ifelse (period == "share_before" , "値上げ前" , "値上げ後" ))
ggplot (df_iia, aes (x = good, y = share, fill = period)) +
geom_col (position = position_dodge (width = 0.7 ), width = 0.6 ) +
labs (x = NULL , y = "シェア" , fill = NULL ,
title = "財3(高級ブランド)の値上げに対するシェアの変化" ) +
scale_y_continuous (labels = scales:: percent)
交差弾力性行列でも確認する
前回導入した交差弾力性の式 \(\eta_{jk} = \alpha p_k s_k\) (\(j \neq k\) )を思い出そう。この式には財\(j\) の情報(品質、財\(k\) との類似度など)が一切入っていない。つまり財\(k\) が値上げしたときの反応の強さは、反応する側の財\(j\) が何であるかによらず、\(k\) 自身のシェアと価格だけで決まる 。財1が財3の値上げにどれだけ反応するかと、財2が財3の値上げにどれだけ反応するかは、モデルの上では全く同じ値になる。
cross_elasticity <- function (beta_j, alpha, price_j) {
sh <- logit_shares (beta_j, alpha, price_j)$ s
J <- length (price_j)
E <- matrix (NA , J, J)
for (j in 1 : J) {
for (k in 1 : J) {
if (j == k) {
E[j, k] <- - alpha * price_j[j] * (1 - sh[j])
} else {
E[j, k] <- alpha * price_j[k] * sh[k]
}
}
}
E
}
E_iia <- cross_elasticity (beta_j, alpha, price_j)
rownames (E_iia) <- colnames (E_iia) <- c ("財1" , "財2" , "財3" )
round (E_iia, 4 )
財1 財2 財3
財1 -2.3666 0.6334 0.0309
財2 0.6334 -2.3666 0.0309
財3 0.6334 0.6334 -7.9691
3行目・3列目を見ると、財1が財3の値上げに反応する弾力性(1行3列目)と、財2が財3の値上げに反応する弾力性(2行3列目)が完全に一致している。財1と財2がどれだけ似ているかに関係なく、この値は同じになる。
「BMWが値上げしたら、シェアの比率に応じて軽トラの需要も増える」——これがlogitモデルの機械的な帰結である。もちろん現実には、BMWの値上げで乗り換える先は同じ高級車セグメント(ベンツやアウディ)に偏るはずで、軽トラに乗り換える人はほとんどいないだろう。しかしlogitモデルは、この「BMWと軽トラは全然違うカテゴリだ」という情報を一切使わずに、シェアの大きさだけで機械的に配分してしまう。
原因は、各消費者の効用ショック \(\varepsilon_{ijt}\) が財を超えてiid (独立同一分布)だと仮定していることにある。財1と財2が「似ている」ということは、本来ならある消費者が財1を好むなら財2も好みやすい、つまり \(\varepsilon_{i1t}\) と \(\varepsilon_{i2t}\) が正に相関しているはずである。しかしlogitはこの相関を許さない。この仮定の帰結が IIA と呼ばれる性質であり、次のセクションで扱う nested logit は、まさにこの相関を部分的に許すことで問題を緩和するモデルである。
研究の問い :CTスキャナー(医療用画像診断機器)という耐久財市場で、技術革新(画質の向上など)が消費者余剰にどれだけ貢献したかを測るには、まず適切な需要モデルが必要である。単純なlogitで代替性を捉えようとすると何が起きるか。
データ :1973年から1983年にかけての病院によるCTスキャナー購入データ。メーカー・世代の異なる複数の機種が並行して販売されていた市場である。
識別戦略・モデル :Trajtenberg (1989, Journal of Political Economy ) は、複数のブランド・世代のCTスキャナーが存在する差別化財市場で、単純なlogitモデルを適用するとIIA的な制約により、技術的に近い機種同士の競合関係が過小に、遠い機種同士の競合関係が過大に評価されてしまう問題を指摘した。画質や解像度といった性能次元で製品を整理し、「近い性能の機種ほど強く競合する」構造を明示的にモデルに組み込む必要があることを示した点が、後続のより柔軟な離散選択モデル(nested logitやrandom coefficient logit)の使用を後押しする一つの動機となった。
なぜこの講義のトピックと繋がるのか :Trajtenbergの研究は、耐久財・医療機器という文脈でも、差別化財市場の代替性を正しく捉えることの重要性、そしてlogitのIIA制約がもたらす実務的な問題(技術的に近い競合を過小評価する)を具体的に示した初期の実証例である。今回学ぶnested logitは、まさにこうした「近い財ほど強く競合する」という構造を組み込むための最初の一歩になる。
nested logit:財をグループにまとめる
アイデア
IIAの問題は、財同士の「近さ」を効用ショックの相関として表現できないことに起因していた。nested logitは、財をあらかじめいくつかのネスト(グループ) に分け、同じネストに属する財同士は効用ショックが相関し、異なるネストの財同士は相関しない、という構造を与える。
具体例として、缶コーヒー市場を考える。
「まったり系」ネストに属するブランドA・Bは互いによく似ているので、片方が値上げされたらもう片方に流出しやすい。「すっきり系」ネストに属するブランドC・Dも同様である。しかしまったり系とすっきり系は方向性が違うので、ネストをまたぐ代替は相対的に起きにくい、という構造をモデルに与える。
選択確率の分解
nested logitの選択確率は、「まずどのネストを選ぶか」と「ネストの中でどの財を選ぶか」の2段階に分解できる。財\(j\) がネスト\(g\) に属するとして、
\[
s_{jt} = \bar{s}_{j|g,t} \times s_{gt}
\]
と書く。\(\bar{s}_{j|g,t}\) は「ネスト\(g\) を選んだという条件のもとでの財\(j\) の選択確率」(within-nest share )、\(s_{gt}\) は「ネスト\(g\) が選ばれる確率」(between-nest share)である。それぞれ次の式で与えられる。
\[
\bar{s}_{j|g,t} = \frac{\exp(\delta_{jt} / (1-\rho))}{\sum_{k \in g} \exp(\delta_{kt} / (1-\rho))}, \qquad
s_{gt} = \frac{\left[\sum_{k \in g} \exp(\delta_{kt}/(1-\rho))\right]^{1-\rho}}{1 + \sum_{g'} \left[\sum_{k \in g'} \exp(\delta_{kt}/(1-\rho))\right]^{1-\rho}}
\]
ここで \(\lambda = 1-\rho\) を dissimilarity parameter(非類似度パラメータ) と呼ぶ。ランダム効用モデルと整合的な通常の範囲は \(0<\lambda\leq 1\) 、すなわち \(0\leq\rho<1\) である。\(\rho\) は相関そのものではなく、ネストの結びつきの強さを表すネスティング・パラメータ である。標準的な正規化では、同一ネスト内の誤差相関は
\[
\operatorname{Corr}(\varepsilon_{ij},\varepsilon_{ik})
=1-\lambda^2=1-(1-\rho)^2 \qquad (j\neq k, j,k\in g)
\]
となる。したがって \(\rho\) が大きいほど相関も強いが、両者の数値は同じではない。\(\rho=0\) (\(\lambda=1\) )ならplain logitに一致し、\(\rho\to1\) (\(\lambda\to0\) )ではネスト内の代替が極端に強くなる。
nested logitは、効用ショック \(\varepsilon_{ijt}\) が iid Gumbel ではなく、generalized extreme value (GEV) 分布 という、より一般的な同時分布に従うと仮定することで導かれる。GEV分布は、各財の周辺分布をGumbelに保ちながら、同じネストのショックに正の依存を持たせる。
この構成のもとで選択確率を計算すると、上の分解式が得られる。この講義では導出の詳細(GEV生成関数の形など)には立ち入らない。興味があれば Train (2009) Discrete Choice Methods with Simulation 第4章を参照してほしい。実務上重要なのは、(1) 選択確率がwithin/betweenに分解できること、(2) \(\rho\) は誤差相関を単調に動かすが相関そのものではないこと、(3) \(\rho=0\) でplain logitに一致すること、の3点である。なお、\(\zeta_g\rho+(1-\rho)\varepsilon_j\) のように独立なGumbelを足すだけでは、一般にこのGEV同時分布は作れない。シミュレーションでは上のシェア写像をDGPとして使う。
Rシミュ2:nested logitの選択確率とシェア計算
先ほどの4財(まったり系2財、すっきり系2財)の例で、nested logitのシェアを計算する関数を作る。
nested_logit_shares <- function (delta, nests, rho) {
# delta: 長さJのベクトル(平均効用)
# nests: リスト。各要素が同じネストに属する財のインデックス(1-indexed)
# rho: ネスティング・パラメータ(共通)。相関そのものではない
lambda <- 1 - rho
J <- length (delta)
n_nests <- length (nests)
IV <- numeric (n_nests) # inclusive value
for (g in seq_len (n_nests)) {
idx <- nests[[g]]
IV[g] <- sum (exp (delta[idx] / lambda))
}
denom <- 1 + sum (IV^ lambda)
s0 <- 1 / denom
s_g <- (IV^ lambda) / denom
s <- numeric (J)
s_within <- numeric (J)
for (g in seq_len (n_nests)) {
idx <- nests[[g]]
for (j in idx) {
s_within[j] <- exp (delta[j] / lambda) / IV[g]
s[j] <- s_within[j] * s_g[g]
}
}
list (s = s, s0 = s0, s_g = s_g, s_within = s_within)
}
これを使って、まったり系(財1・2)・すっきり系(財3・4)という4財市場のシェアを計算してみる。
alpha_n <- 1.0
beta_n <- c (2.2 , 2.0 , 2.3 , 2.1 )
price_n <- c (3.0 , 3.2 , 3.5 , 3.3 )
delta_n <- beta_n - alpha_n * price_n
nests4 <- list (c (1 , 2 ), c (3 , 4 )) # ネスト1={財1,財2}, ネスト2={財3,財4}
rho_n <- 0.5
nl <- nested_logit_shares (delta_n, nests4, rho_n)
nl$ s
[1] 0.18975819 0.08526385 0.10828074 0.10828074
\(\rho \to 0\) にすると、plain logitのシェアと一致することを確認しておこう(式の検算)。
plain_logit_shares <- function (delta) {
ev <- exp (delta)
denom <- 1 + sum (ev)
list (s = ev / denom, s0 = 1 / denom)
}
nl_rho0 <- nested_logit_shares (delta_n, nests4, rho = 1e-6 )
pl <- plain_logit_shares (delta_n)
data.frame (
good = c ("財1" , "財2" , "財3" , "財4" , "outside" ),
nested_rho_near_0 = c (nl_rho0$ s, nl_rho0$ s0),
plain_logit = c (pl$ s, pl$ s0)
)
good nested_rho_near_0 plain_logit
1 財1 0.1909672 0.1909672
2 財2 0.1280091 0.1280091
3 財3 0.1280091 0.1280091
4 財4 0.1280091 0.1280091
5 outside 0.4250055 0.4250053
ほぼ完全に一致している(わずかな差は \(\rho\) を厳密に0ではなく極小値にしているための丸め誤差)。
Rシミュ2続き:財3の値上げで代替がネスト内に集中するか
いよいよ今回の見せ場である。すっきり系ネストの財3を20%値上げしたとき、plain logitとnested logitで代替パターンがどう変わるかを比較する。
price_shock_n <- price_n
price_shock_n[3 ] <- price_shock_n[3 ] * 1.20
delta_shock_n <- beta_n - alpha_n * price_shock_n
pl_before <- plain_logit_shares (delta_n)
pl_after <- plain_logit_shares (delta_shock_n)
nl_before <- nested_logit_shares (delta_n, nests4, rho_n)
nl_after <- nested_logit_shares (delta_shock_n, nests4, rho_n)
d_plain <- pl_after$ s - pl_before$ s
d_nested <- nl_after$ s - nl_before$ s
df_compare <- data.frame (
good = rep (c ("財1(まったり)" , "財2(まったり)" , "財3(すっきり,値上げ)" , "財4(すっきり)" ), 2 ),
model = rep (c ("plain logit" , "nested logit" ), each = 4 ),
share_change = c (d_plain, d_nested)
)
df_compare
good model share_change
1 財1(まったり) plain logit 0.013153909
2 財2(まったり) plain logit 0.008817329
3 財3(すっきり,値上げ) plain logit -0.060063131
4 財4(すっきり) plain logit 0.008817329
5 財1(まったり) nested logit 0.009063862
6 財2(まったり) nested logit 0.004072656
7 財3(すっきり,値上げ) nested logit -0.072843908
8 財4(すっきり) nested logit 0.035422714
図で見比べる。
df_compare$ good <- factor (df_compare$ good, levels = c ("財1(まったり)" , "財2(まったり)" , "財3(すっきり,値上げ)" , "財4(すっきり)" ))
df_compare$ model <- factor (df_compare$ model, levels = c ("plain logit" , "nested logit" ))
ggplot (df_compare, aes (x = good, y = share_change, fill = model)) +
geom_col (position = position_dodge (width = 0.7 ), width = 0.6 ) +
geom_hline (yintercept = 0 , linewidth = 0.3 ) +
labs (x = NULL , y = "シェアの変化" , fill = NULL ,
title = "財3値上げ時の代替パターン:nested logitでは財4(同ネスト)への流出が大きい" ) +
theme (axis.text.x = element_text (angle = 15 , hjust = 1 ))
plain logitでは、財3から流出した需要は財1・財2・財4にほぼ均等に(シェア比に応じて)配分される。ところがnested logitでは、同じ「すっきり系」ネストに属する財4への流出が、異なるネストの財1・財2への流出より明確に大きくなる 。これは、財3と財4が同じネストにいることで効用ショックが正に相関しており、「財3が気に入らなくなった消費者は、似た系統の財4に流れやすい」という自然な代替パターンが再現されているためである。
弾力性行列でも同じことを確認できる。
elasticity_numeric <- function (share_fn, delta, price, alpha, ...) {
J <- length (price)
E <- matrix (NA , J, J)
eps <- 1e-6
s_base <- share_fn (delta, ...)$ s
for (k in 1 : J) {
delta_eps <- delta
delta_eps[k] <- delta_eps[k] - alpha * eps
s_eps <- share_fn (delta_eps, ...)$ s
for (j in 1 : J) {
E[j, k] <- (s_eps[j] - s_base[j]) / eps * price[k] / s_base[j]
}
}
E
}
E_plain <- elasticity_numeric (function (d, ...) plain_logit_shares (d), delta_n, price_n, alpha_n)
E_nested <- elasticity_numeric (function (d, nests, rho) nested_logit_shares (d, nests, rho),
delta_n, price_n, alpha_n, nests = nests4, rho = rho_n)
rownames (E_plain) <- colnames (E_plain) <- c ("財1" , "財2" , "財3" , "財4" )
rownames (E_nested) <- colnames (E_nested) <- c ("財1" , "財2" , "財3" , "財4" )
cat ("plain logitの弾力性行列: \n " )
財1 財2 財3 財4
財1 -2.427 0.41 0.448 0.422
財2 0.573 -2.79 0.448 0.422
財3 0.573 0.41 -3.052 0.422
財4 0.573 0.41 0.448 -2.878
cat (" \n nested logitの弾力性行列: \n " )
財1 財2 財3 財4
財1 -3.361 1.265 0.379 0.357
財2 2.639 -5.135 0.379 0.357
財3 0.569 0.273 -4.871 2.007
財4 0.569 0.273 2.129 -4.593
nested logitの行列では、同じネスト内の交差弾力性(1行2列目・2行1列目、3行4列目・4行3列目)が、ネストをまたぐ交差弾力性(1行3列目など)よりもはっきり大きくなっている。plain logitではこの区別が一切ない。
nested logitは「似た財ほど強く競合する」という、多くの実務家にとって自然な直感を、\(\rho\) というたった1つの追加パラメータでモデルに組み込む。\(\rho \to 0\) でplain logitに戻るので、nested logitはplain logitを特殊ケースとして含む一般化 になっている。次に学ぶBerry反転でも、\(\rho\) の推定は「plain logitで十分か、ネスト構造が必要か」を判定する重要な役割を果たす。
市場レベルデータへ:Berry (1994) の反転
問題設定
ここまでは、個々の消費者が誰を選んだかという個票データ(誰が財1を買ったか、誰が買わなかったか)を持っている前提で話を進めてきた。しかし実務では、企業のPOSデータやスキャナーデータのように、「市場\(t\) ・製品\(j\) ごとの販売シェアと価格」しか手に入らないことが非常に多い。個々の消費者の識別番号すらなく、集計された市場シェアだけが観測される状況である。
個票がなくても、製品別の購入者数 \(n_{jt}\) と市場規模 \(N_t\) (outsideの人数を含む)が分かれば、集計カウントに対する多項尤度 \(L_t\propto\prod_{j=0}^J s_{jt}^{n_{jt}}\) は組める。したがって「集計データではMLEが不可能」なのではない。ただし、シェアだけで市場規模や標本抽出過程が分からないと、カウント尤度の情報量や標準誤差は定まらない。ここで便利なのが Berry (1994) の反転である。logitのシェア式を代数的に反転すると、尤度を直接最大化せずに推定できる回帰式が出てくる 。
思い出そう。財\(j\) ・市場\(t\) のlogitシェアは
\[
s_{jt} = \frac{\exp(\delta_{jt})}{1 + \sum_{k=1}^J \exp(\delta_{kt})}, \qquad
s_{0t} = \frac{1}{1 + \sum_{k=1}^J \exp(\delta_{kt})}
\]
であった。この2つの比を取ると、
\[
\frac{s_{jt}}{s_{0t}} = \exp(\delta_{jt})
\]
となり、分母の面倒な項がきれいに消える。両辺の対数を取ると、
\[
\ln s_{jt} - \ln s_{0t} = \delta_{jt} = x_{jt}'\beta - \alpha p_{jt} + \xi_{jt}
\]
という式が得られる。これがBerry反転 である。左辺は観測データ(シェア)から直接計算できる。右辺は、商品属性 \(x_{jt}\) ・価格 \(p_{jt}\) に係数がかかった、見慣れた線形回帰式の形をしている。つまり、
「個々の消費者の離散選択」という複雑な問題が、「市場×製品レベルのシェアの対数比を被説明変数とする回帰」という、計量Iで慣れ親しんだOLSの問題に化ける。
これは実務上とても嬉しい事実である。個票が手に入らなくても、市場シェアと価格・商品属性があり、後述する外生性・操作変数の条件が満たされれば、\(\beta\) と \(\alpha\) を推定できる。
nested logitについても同様の反転ができる。詳細は省くが(\(\bar{s}_{j|g,t}\) を使って同様に比を取ればよい)、結果は
\[
\ln s_{jt} - \ln s_{0t} = x_{jt}'\beta - \alpha p_{jt} + \rho \ln \bar{s}_{j|g,t} + \xi_{jt}
\]
という形になる。plain logitの式に、within-nest share の対数 という項が1つ追加されただけである。\(\rho = 0\) ならplain logitの式に一致することも確認できる。
nested logit版のBerry反転式をよく見ると、右辺に \(\ln \bar{s}_{j|g,t}\) という「シェアそのもの」から計算される変数が説明変数として入っている。これは価格と同じように内生変数 である。\(\bar{s}_{j|g,t}\) は同じネストの財の \(\xi\) にも依存して決まるので、単純にOLSで回帰すると、価格の内生性と同様の問題が \(\rho\) の推定にも及ぶ。この点は後ほど数値シミュレーションで確認する。
価格内生性の正体
なぜ価格と \(\xi_{jt}\) は相関するのか
\(\xi_{jt}\) は「観測されない需要ショック」で、具体的には次のようなものを指す。
未観測の商品品質(パッケージデザイン、口コミでの評判)
広告・販促の強さ(分析者のデータセットに含まれていない場合)
店頭の棚位置・陳列面積(良い場所に置かれている商品ほど売れる)
企業はこれらの情報を、少なくとも分析者よりはよく知った上で価格を決めている。\(\xi_{jt}\) が高い(消費者から人気がある、話題になっている)商品ほど、企業は「多少値上げしても売れる」と判断し、強気の価格をつける傾向がある。つまり
価格を観測属性\(x\) へ線形射影した残差を\(\tilde p_{jt}\) と書けば、本節で想定する典型ケースでは
\[
\operatorname{Cov}(\tilde p_{jt}, \xi_{jt}) > 0
\]
が生じる。これは前回まで仮定していた「説明変数は外生」という前提が崩れていることを意味する。
バイアスの方向
Berry反転の回帰式 \(\ln s_{jt} - \ln s_{0t} = x_{jt}'\beta - \alpha p_{jt} + \xi_{jt}\) をOLSで推定するとどうなるか。Frisch–Waugh–Lovellの考え方で\(x\) を取り除くと、価格係数$ b_p=-$の確率極限は
\[
\operatorname{plim}\hat b_p
=-\alpha+\frac{\operatorname{Cov}(\tilde p,\xi)}{\operatorname{Var}(\tilde p)}.
\]
したがって\(\operatorname{Cov}(\tilde p,\xi)>0\) のとき、OLSで推定した価格係数は真の\(-\alpha\) よりも大きく (0に近く)出る。つまり \(\hat\alpha_{\text{OLS}} < \alpha_{\text{true}}\) :価格反応の強さ(\(\alpha\) )を過小評価 してしまう。共分散が負なら、この不等号は逆になる。
これは需要が実際より非弾力的に見えることを意味する。実務的には次のような危険につながる。
「このモデルの推定では、値上げしてもあまり客が離れないようです。強気の値上げを提案しましょう。」
しかし実際の \(\alpha\) はもっと大きい(需要はもっと弾力的)かもしれない。過小評価された価格反応をもとに値上げを実行すれば、想定以上に客が離れ、シェアも利益も見込みを下回る。これはまさに第1回のイントロで見せた「値上げすると売上が増える」というデモの正体 である。あのデモでは、価格が需要ショックと同時に決まっている(人気商品ほど値上げされる)状況で、単純な相関・OLSが価格の効果を正しく捉えられないことを見た。今回はその問題を、離散選択モデル・市場レベルデータという具体的な文脈で再訪し、次のセクションで解決策(2SLS)を学ぶ。
Rシミュ3(メイン):市場レベルDGPでOLSのバイアスと2SLSでの回収を確認する
ここからが今回のシミュレーションの本丸である。価格を未観測需要ショックに正に反応させるDGPを書き、(i) このDGPではBerry反転をOLSで推定するとαが過小評価されること、(ii) 2SLSで回収できること、(iii) 弱操作変数の診断(first-stage F)、(iv) OLSとIVで弾力性行列がどれだけ変わるか、を順番に確認する。
DGPの設計
\(T = 100\) 市場、\(J = 4\) 財のplain logit市場を考える。各市場・財について、
\(x_{jt}\) :商品属性(観測される)
\(w_{jt}\) :コストシフター(操作変数の候補。\(\xi_{jt}\) とは無相関になるよう外生的に生成する)
\(\xi_{jt}\) :観測されない需要ショック
限界費用 \(mc_{jt} = 1 + 0.8 w_{jt} + \text{(誤差)}\)
価格 \(p_{jt} = mc_{jt} + \text{markup}_{jt}\) 、ここで \(\text{markup}_{jt} = 1 + \kappa \, \xi_{jt}\) (\(\kappa\) は「企業が\(\xi\) にどれだけ強気に反応するか」を表すパラメータ)
\(\kappa\) (内生性の強さ)を大きくするほど、価格は需要ショックに強く反応し、\(\mathrm{corr}(p, \xi)\) が大きくなる。
T_mkt <- 100
J_mkt <- 4
alpha_true <- 2.0
beta_true <- 1.5
kappa <- 1.1 # 内生性の強さ(markupがxiにどれだけ反応するか)
x_mkt <- matrix (rnorm (T_mkt * J_mkt, mean = 1.0 , sd = 0.5 ), nrow = T_mkt, ncol = J_mkt)
w_mkt <- matrix (rnorm (T_mkt * J_mkt, mean = 4.0 , sd = 1.0 ), nrow = T_mkt, ncol = J_mkt)
xi_mkt <- matrix (rnorm (T_mkt * J_mkt, mean = 0 , sd = 0.6 ), nrow = T_mkt, ncol = J_mkt)
mc_mkt <- 1.0 + 0.8 * w_mkt + matrix (rnorm (T_mkt * J_mkt, sd = 0.3 ), nrow = T_mkt, ncol = J_mkt)
markup_mkt <- pmax (1.0 + kappa * xi_mkt, 0.05 )
price_mkt <- mc_mkt + markup_mkt
cat ("corr(price, xi):" , round (cor (as.vector (price_mkt), as.vector (xi_mkt)), 3 ), " \n " )
想定通り、価格と需要ショックの間に正の相関が生まれている。この市場のシェアをlogit式で計算する。
compute_market_shares <- function (x, price, xi, alpha, beta) {
delta <- beta * x - alpha * price + xi
ev <- exp (delta)
denom <- 1 + rowSums (ev)
s <- ev / denom
s0 <- 1 / denom
list (s = s, s0 = s0)
}
mkt <- compute_market_shares (x_mkt, price_mkt, xi_mkt, alpha_true, beta_true)
cat ("平均シェア:" , round (mean (mkt$ s), 4 ), " 平均outsideシェア:" , round (mean (mkt$ s0), 4 ), " \n " )
平均シェア: 0.0007 平均outsideシェア: 0.9971
データフレームに整形し、価格とシェアの関係を可視化しておく。
market_df <- data.frame (
market = rep (1 : T_mkt, times = J_mkt),
product = rep (1 : J_mkt, each = T_mkt),
x = as.vector (x_mkt),
w = as.vector (w_mkt),
xi = as.vector (xi_mkt),
price = as.vector (price_mkt),
share = as.vector (mkt$ s)
) %>%
mutate (share0 = rep (mkt$ s0, times = J_mkt)) %>%
mutate (y_berry = log (share) - log (share0))
head (market_df)
market product x w xi price share
1 1 1 0.7074781 4.492364 -0.7172734 4.681840 0.000120891896
2 2 1 1.2836703 3.893052 -0.8518636 4.102195 0.000799359043
3 3 1 0.5511793 5.461092 0.4652291 7.224989 0.000001929680
4 4 1 0.3722566 4.527367 0.5330375 6.387126 0.000008085379
5 5 1 1.5180953 1.618548 0.2011861 3.332211 0.014918265878
6 6 1 1.1292310 4.843173 0.2014685 5.941822 0.000045893964
share0 y_berry
1 0.9991232 -9.019737
2 0.9990492 -7.130749
3 0.9998243 -13.157981
4 0.9582721 -11.682830
5 0.9811047 -4.186093
6 0.9991526 -9.988329
ggplot (market_df, aes (x = price, y = share, color = factor (product))) +
geom_point (alpha = 0.5 , size = 1.3 ) +
labs (x = "価格" , y = "シェア" , color = "財" ,
title = "価格が高い財ほどシェアが低い、という単純な関係だけではない" ) +
scale_y_continuous (labels = scales:: percent)
見ての通り、価格が高いからといって必ずしもシェアが低いわけではない(\(\xi\) の効果が混ざっているため)。まさにこれが内生性のある状況で、単純な散布図から価格弾力性を読み取れない理由である。
(i) Berry反転をOLSで推定する
ols_fit <- feols (y_berry ~ price + x, data = market_df, vcov = "hetero" )
summary (ols_fit)
OLS estimation, Dep. Var.: y_berry
Observations: 400
Standard-errors: Heteroskedasticity-robust
Estimate Std. Error t value Pr(>|t|)
(Intercept) -1.76689 0.147335 -11.9923 < 2.2e-16 ***
price -1.66370 0.025202 -66.0153 < 2.2e-16 ***
x 1.49822 0.051494 29.0951 < 2.2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
RMSE: 0.510671 Adj. R2: 0.937349
alpha_ols <- - coef (ols_fit)["price" ]
cat ("alpha_true =" , alpha_true, " \n " )
cat ("alpha_hat(OLS) =" , round (alpha_ols, 3 ), " \n " )
cat ("バイアス =" , round (alpha_ols - alpha_true, 3 ), " \n " )
真値 \(\alpha = 2.0\) に対して、OLSの推定値ははっきりと小さい。想定通り、価格反応を過小評価している。
(ii) 2SLSで回収する:コストシフター\(w\) を操作変数に
コストシフター\(w_{jt}\) は、価格を動かす一方で(\(mc\) を通じて)、需要ショック\(\xi_{jt}\) そのものには影響しない、という設定でDGPを組んでいる。これを操作変数として2SLSを行う。fixest::feolsのIV構文は y ~ 外生変数 | 内生変数 ~ 操作変数 である。
iv_fit <- feols (y_berry ~ x | price ~ w, data = market_df, vcov = "hetero" )
summary (iv_fit)
TSLS estimation - Dep. Var.: y_berry
Endo. : price
Instr. : w
Second stage: Dep. Var.: y_berry
Observations: 400
Standard-errors: Heteroskedasticity-robust
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.089410 0.195710 -0.456853 0.64803
fit_price -1.976282 0.033308 -59.334031 < 2.2e-16 ***
x 1.483007 0.057124 25.961269 < 2.2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
RMSE: 0.614918 Adj. R2: 0.817109
F-test (1st stage), price: stat = 600.43, p < 2.2e-16, on 1 and 397 DoF.
Wu-Hausman: stat = 843.45, p < 2.2e-16, on 1 and 396 DoF.
coef()が返す係数名はfixestのバージョンによって内生変数名がそのまま使われる場合と接頭辞が付く場合があるため、まず名前を確認してから安全に取り出す。
# 内生変数priceに対応する係数名を、接頭辞の有無によらず取り出すヘルパー
get_coef_for <- function (model, varname) {
cf <- coef (model)
hit <- grepl (varname, names (cf), fixed = TRUE )
cf[hit][1 ]
}
names (coef (iv_fit)) # 係数名を確認しておく
[1] "(Intercept)" "fit_price" "x"
alpha_iv <- - get_coef_for (iv_fit, "price" )
cat ("alpha_true =" , alpha_true, " \n " )
cat ("alpha_hat(OLS) =" , round (alpha_ols, 3 ), " \n " )
cat ("alpha_hat(2SLS) =" , round (alpha_iv, 3 ), " \n " )
2SLSの推定値は真値2.0にかなり近い値まで戻ってくる。真値回収の様子を表にまとめておく。
comparison_tbl <- data.frame (
method = c ("真値" , "OLS" , "2SLS" ),
alpha_hat = c (alpha_true, round (alpha_ols, 3 ), round (alpha_iv, 3 ))
)
knitr:: kable (comparison_tbl, col.names = c ("推定方法" , "alpha_hat" ))
(iii) first-stage Fと弱操作変数
2SLSがうまく機能するためには、操作変数\(w\) が、含まれる外生変数 \(x\) を条件づけたうえで価格\(p\) を十分強く説明する必要がある。見るべきなのはfirst-stage回帰全体のFではなく、除外された操作変数 \(w\) のpartial F である。ここでは除外IVが1本なので、\(H_0:\pi_w=0\) に対するロバストt統計量の二乗がロバストWald Fになる。
first_stage <- feols (price ~ x + w, data = market_df, vcov = "hetero" )
t_w <- coeftable (first_stage)["w" , "t value" ]
partial_F_w <- unname (t_w^ 2 )
cat ("excluded-IV partial F (w | x):" , round (partial_F_w, 1 ), " \n " )
excluded-IV partial F (w | x): 711
partial Fは十分大きく、少なくとも関連性が極端に弱いという兆候はない。ただし「Fが10以上」という基準は、単一内生変数・古典的な分散仮定を念頭に置いた大まかな経験則であり、合否判定ではない。異分散や複数の内生変数がある実証では、Kleibergen–Paap統計量、Sanderson–Windmeijerのconditional F、弱IVに頑健な推論も併用する。
feols(y ~ x | price ~ w) は「\(y\) を\(x\) (外生)と\(\widehat{\text{price}}\) (\(x,w\) で予測した価格)に回帰する」2SLSを実行する。summary(..., stage = 1)でfirst stageを確認できる。明示的に回帰する場合も、fitstat(first_stage, "f")が返す回帰全体のF と、除外IVだけを検定するpartial Fを混同しないこと。除外IVが1本なら本文のようにそのロバストt値を二乗すればよい。複数なら除外IVの係数を同時にゼロとするWald検定を使う。
(iv) OLS vs IVで弾力性行列を比較する
\(\alpha\) の推定値が変われば、当然すべての価格弾力性の計算も変わる。自己価格弾力性 \(\eta_{jj} = -\alpha p_j (1-s_j)\) 、交差弾力性 \(\eta_{jk} = \alpha p_k s_k\) を、OLSの\(\hat\alpha\) とIVの\(\hat\alpha\) それぞれで計算し、比較してみる(説明を単純にするため、市場平均のシェア・価格を使う)。
mean_share <- market_df %>% group_by (product) %>% summarize (share = mean (share), price = mean (price))
build_elasticity <- function (alpha_hat, mean_share) {
J <- nrow (mean_share)
E <- matrix (NA , J, J)
for (j in 1 : J) {
for (k in 1 : J) {
if (j == k) {
E[j, k] <- - alpha_hat * mean_share$ price[j] * (1 - mean_share$ share[j])
} else {
E[j, k] <- alpha_hat * mean_share$ price[k] * mean_share$ share[k]
}
}
}
E
}
E_ols <- build_elasticity (alpha_ols, mean_share)
E_iv <- build_elasticity (alpha_iv, mean_share)
E_true <- build_elasticity (alpha_true, mean_share)
cat ("真値alphaでの弾力性行列(対角=自己弾力性): \n " )
真値alphaでの弾力性行列(対角=自己弾力性):
[,1] [,2] [,3] [,4]
[1,] -10.609 0.007 0.005 0.013
[2,] 0.006 -10.578 0.005 0.013
[3,] 0.006 0.007 -10.782 0.013
[4,] 0.006 0.007 0.005 -10.544
cat (" \n OLSのalphaでの弾力性行列: \n " )
[,1] [,2] [,3] [,4]
[1,] -8.825 0.005 0.004 0.011
[2,] 0.005 -8.800 0.004 0.011
[3,] 0.005 0.005 -8.969 0.011
[4,] 0.005 0.005 0.004 -8.771
cat (" \n 2SLSのalphaでの弾力性行列: \n " )
[,1] [,2] [,3] [,4]
[1,] -10.484 0.006 0.005 0.013
[2,] 0.006 -10.453 0.005 0.013
[3,] 0.006 0.006 -10.655 0.013
[4,] 0.006 0.006 0.005 -10.419
OLSベースの弾力性行列は、真値ベースの行列と比べて、対角成分(自己価格弾力性)の絶対値がはっきり小さい。これは「需要が実際より非弾力的に見える」ことの直接的な帰結である。2SLSベースの行列は真値にずっと近い。
自己価格弾力性を過小評価するということは、企業から見れば「値上げしても客はあまり離れない」という誤ったシグナルを受け取ることを意味する。これは値付けの意思決定だけでなく、次回学ぶ合併分析(合併後にどれだけ値上げが起きるかの予測)にも直結する。OLSで内生性を無視した弾力性行列を使うと、値付けでも合併審査でも、意思決定を大きく誤る ことがこのシミュレーションからわかる。
IVの品揃え:何を操作変数に使うか
先ほどのシミュレーションでは「コストシフター\(w\) 」を操作変数として使った。実務・研究でよく使われる操作変数には、大きく3種類ある。それぞれの識別の仮定と、危ない場面を整理しておく。
コストシフター(cost shifter)
原材料費、賃金、為替レート、税制変更など、企業の限界費用を動かすが消費者の需要ショック\(\xi\) には直接影響しない変数。先ほどのシミュレーションで使ったのがこれである。
識別の仮定 :コストシフターは価格には影響するが、\(\xi_{jt}\) (未観測の需要側の要因)とは無相関。
危ない場面 :原材料費の高騰が、同時に商品の品質改善(例えばオーガニック素材への切り替え)を伴う場合、\(\xi\) も動いてしまい、除外制約が壊れる。
Hausman型IV(他市場の同一製品の価格)
同じ全国チェーンの製品が複数の地域市場で売られているとき、「他の地域市場における同じ製品の価格」を操作変数として使う。この発想はHausman (1996) に由来する。
識別の仮定 :全国共通のコスト構造(原材料費、全国的な仕入れ交渉力)が地域を横断して価格に反映される一方、地域ごとの需要ショック\(\xi_{jt}\) は市場をまたいで独立。
危ない場面 :全国的な広告キャンペーンやテレビCMのように、需要ショックが全国共通に動く場合、この仮定は崩れる。全国的な人気の高まりが、たまたま同じタイミングで複数の地域市場の\(\xi\) を同時に押し上げてしまうと、他市場の価格と自市場の\(\xi\) が相関し、操作変数として機能しなくなる。この点は後述のBresnahanによる批判で指摘されている。
BLP型IV(自社他製品・競合製品の属性)
Berry, Levinsohn and Pakes (1995) の標準的な構成では、自財の外生属性 \(x_j\) に加え、同じ企業が持つ他製品の属性和 と他企業が持つ製品の属性和 を別々に作る。前者は多製品企業のカニバリゼーション、後者は競争環境を通じてマークアップと価格を動かす。これらの除外された属性和を、一般にBLP型IVと呼ぶ。
識別の仮定 :観測属性を条件づけたとき、他製品の属性は自財の未観測需要ショック \(\xi_{jt}\) と無相関であり、製品集合はそのショックに反応して選ばれていない。
直感 :自社ラインナップや競合の位置が変わると、最適マークアップが変わって自財価格が動く。
危ない場面 :企業が市場の未観測な成長性を見て参入・退出や属性を選ぶ場合、他製品属性と自財の \(\xi\) が相関し、除外制約が壊れる。
BLP型IVの標準的な作り方(競合属性の単純な合計・平均)には、実は理論的な弱点がある。合計・平均を取る操作の中で、本来識別に使いたい「製品間の差別化の程度」に関する情報の多くが失われてしまうためである。Gandhi and Houde (2019, NBER WP 26375) は、differentiation instruments(差別化IV) として、競合属性との「距離」や「非類似度」を明示的に使う操作変数を提案し、BLP型IVより効率的に代替パターン(特にランダム係数の分散パラメータ)を識別できることを示した。この講義では詳細な構成法には立ち入らないが、「BLP型IVの改良版」として、より柔軟な代替性を推定したい場面(次回のrandom coefficient logitのような場面)で有力な選択肢になることは覚えておいてほしい。
研究の問い :ビールやシリアルのようなブランド差別化財市場で、需要の価格弾力性を推定する際、価格の内生性にどう対処するか。
データ :複数の地域市場で販売される同一ブランド製品の価格・数量データ(シリアル市場が有名な応用例)。
識別戦略・モデル :Hausman (1996) は、ある都市におけるブランドの価格を、他の都市における同一ブランドの価格で操作変数化する「Hausman型IV」を提案した。全国共通の生産コスト構造が価格に反映される一方、都市ごとの需要ショックは独立だという仮定に基づく。
主要な発見と批判 :この手法は広く使われたが、Bresnahanをはじめとする論者から、全国的な需要ショック (全国キャンペーン、トレンドの変化など)が存在すると、都市を横断して\(\xi\) が相関してしまい、除外制約が崩れるという批判が寄せられた。この論争は、操作変数の妥当性が「もっともらしい物語」だけでなく、具体的なデータの構造・市場の性質に強く依存することを浮き彫りにした。
なぜこの講義のトピックと繋がるのか :この論争は「IVの仮定は無料ではない」ことを示す典型例である。コストシフターにせよHausman型IVにせよBLP型IVにせよ、操作変数を選ぶたびに「除外制約が本当に成り立つか」を市場の制度的な背景に照らして吟味する必要がある、という教訓を残している。
研究の問い :スーパーマーケットのブランド選択データでも、価格内生性は無視できない大きさで効いているのか。
データ :家庭レベルのスキャナーパネルデータ(マーガリン、ケチャップなど複数カテゴリのブランド選択履歴)。
識別戦略・モデル :Villas-Boas and Winer (1999, Management Science ) は、ブランド選択モデル(multinomial logitやprobit)において、店舗の価格設定が過去の販売実績や需要動向に反応して決まる可能性(内生的な価格設定)を考慮し、内生性を制御した場合と無視した場合で価格弾力性の推定値がどう変わるかを比較した。
主要な発見 :内生性を考慮すると、価格弾力性の推定値は無視した場合よりも大きく(弾力的に)変化することを報告しており、本講義で示したシミュレーションの結果——OLSは価格反応を過小評価する——と整合的な実証結果を提供している。
なぜこの講義のトピックと繋がるのか :Berry (1994) の市場レベルデータだけでなく、個票のブランド選択データでも価格内生性は無視できない問題として現れることを示した点で重要である。「個票データさえあれば内生性を気にしなくていい」というわけではないことを教えてくれる。
研究の問い :市場レベルのシェア・価格データだけから、需要モデルの関数形(例えばlogitなのかnested logitなのか、係数がどんな分布をしているか)にほとんど仮定を置かずに、どこまで需要の構造を識別できるのか。
データ :具体的なデータセットに基づく実証論文ではなく、識別理論を扱う理論的な論文である。
識別戦略・モデル :Berry and Haile (2014, Econometrica ) は、需要システムの反転可能性(connected substitutes)、指数構造、操作変数の外生性・completeness、必要なsupportなどの条件を明示し、そのもとで市場レベル需要をノンパラメトリックに識別できることを示した。単に「IVの数やばらつきが多ければよい」という結果ではない。
主要な発見 :強いが明示的な条件のもとでは、集計データからでも特定のlogit関数形に依存せず需要を識別できる。これは「集計データだから必ずlogitが必要」という誤解を正す結果である。
なぜこの講義のトピックと繋がるのか :Berry反転を、より一般的な需要反転・IV識別へ拡張した理論的基礎としてつながる。ただし、同論文はlogitやnested logitの関数形が正しいことを保証しない。これらを使うときは、近似の妥当性を代替パターンや仕様検定で別途吟味する必要がある。
ビジネスの現場で
自社ECサイトで、ある商品Aを値下げしたキャンペーン中に、商品Bの売上が落ちたとする。マーケティング担当者は「商品Bの客が商品Aに流れた」と結論づけ、商品Bのプロモーションを強化しようとするかもしれない。しかしこの分析には少なくとも2つの罠がある。
1つ目は、今回学んだIIAの問題そのものである。実際には商品Aと商品C(Bとは全く違うカテゴリ)の方が「似ている」ために強く競合していたのに、単純なシェア変化の分析ではその違いが見えない。2つ目は価格内生性である。商品Aの値下げが、たまたま競合サイトのセール時期と重なっていたなら、商品Bの売上減少は商品Aの値下げのせいではなく、外部要因(\(\xi\) )によるものかもしれない。「値下げしたタイミングで別の商品の売上が落ちた」という相関だけから、代替関係の強さを主張するのは危険である。nested logitやBerry反転+IVのような構造的なアプローチは、こうした罠を避けるための一つの手段になる。
ビール・発泡酒市場は、nested logitの典型的な応用場面としてよく使われる。プレミアムビール(各社の看板ブランド)と発泡酒・新ジャンルは、価格帯も飲用シーンも大きく異なる。同じ「プレミアムビール」ネスト内のブランド同士(例えば各社のフラッグシップ商品)は、値上げされたときに互いへの代替が強く起きるはずである一方、プレミアムビールの値上げが発泡酒の需要に与える影響は、相対的に小さいと予想される。POSデータ(店舗×週×ブランドのシェアと価格)があれば、Berry反転+nested logitで、こうした「プレミアム内での競合の強さ」と「価格帯をまたいだ競合の弱さ」を定量的に推定できる。合併審査や新製品の価格設定において、「一番怖い競合はどのブランドか」を答える基礎になる分析である。
多くの企業では、売上予測に機械学習モデル(勾配ブースティング木、ニューラルネットなど)を使っている。これらは「来週の売上が何個になるか」を予測する上では非常に強力である。しかし「価格を10%上げたら売上がどう変わるか」という反実仮想の問い に答えるには注意が必要である。機械学習モデルは、学習データの中で価格と売上がどう相関していたかを学習するだけなので、今回のシミュレーションで見たのと同じ内生性の問題(人気商品ほど値上げされる、というパターンを学習してしまう)に無防備である。今回学んだBerry反転や2SLSのような構造的アプローチは、まさに「価格を変えたら何が起きるか」という反実仮想の問いに答えるために設計されている。実務では、需要予測(何個売れるか)には機械学習、価格・商品設計の意思決定(弾力性・代替性の理解)には構造モデル、という使い分けが有効な場面が多い。
まとめ
logitモデルはIIAという強い制約を持ち、ある財の値上げに対する代替が「シェアの比率」だけで機械的に決まってしまう。似た財ほど強く競合するという直感的なパターンを表現できない。
nested logitは財をネスト(グループ)に分け、ネスティング・パラメータ\(\rho\) を導入してこの問題を緩和する。\(\rho\) は相関そのものではないが相関を単調に動かし、\(\rho=0\) でplain logitに一致する。
Berry (1994) の反転により、logit・nested logitの選択確率式は、市場レベルのシェア・価格データに対する線形回帰式に変換できる。個票データがなくても需要パラメータを推定できる。
価格は未観測の需要ショック\(\xi\) と相関しやすい。企業が高い\(\xi\) を見て高価格をつける典型例、すなわち他の説明変数を条件づけても\(\operatorname{Cov}(p,\xi)>0\) となる場合、これを無視したOLS推定は価格反応\(\alpha\) を過小評価する。需要を実際より非弾力的だと誤認し、値付けや合併審査で誤った意思決定につながる危険がある。共分散が負ならバイアスの向きも逆であり、「内生性なら常に過小」とは限らない。
コストシフター、Hausman型IV、BLP型IVといった操作変数を使った2SLSで、この内生性に対処できる。ただしどの操作変数も「除外制約」という仮定に依存しており、無条件に信頼できるわけではない。
宿題
ブラウザ実験室(playground3.html )で、今回のシミュレーションの数値を自分でいじって遊んでみよう。インストール不要、ブラウザだけでRが動く(初回ロードのみ30秒〜1分かかる)。
今回のRシミュ3で、kappa(内生性の強さ)の値を0から3まで変化させながら、OLSと2SLSそれぞれのalpha推定値がどう動くか折れ線グラフを描いてみよう。内生性が全くないとき(kappa=0)にOLSと2SLSがほぼ一致することも確認してみるとよい。
ChatGPTなどの対話AIに「nested logitのwithin-nest shareが内生変数になるのはなぜか」と質問し、返ってきた説明が今回学んだ内容と整合的かどうか検討してみよう。
coding課題は assignment3.qmd を参照。
次回予告
次回(第4回)は、今回のnested logitでは捉えきれない、より柔軟な代替性のパターンを扱う。nested logitは「あらかじめ決めたネスト構造」に沿ってしか代替性を表現できないという限界がある。次回学ぶrandom coefficient logit(BLPモデル)は、消費者ごとに価格感応度や商品属性への好みが異なるという「観測されない消費者異質性」を導入することで、ネストをあらかじめ決めなくても、データから柔軟な代替パターンを推定できるようにする。この考え方は、合併によって競合企業の商品が同じ企業の傘下に入ったときに何が起きるか(合併後の価格上昇の予測)を分析する、合併分析(merger analysis)の土台になる。
参考文献
上武康亮・遠山祐太・若森直樹・渡辺安虎『実証ビジネス・エコノミクス』日本評論社、2025年、第3章。
Berry, Steven T. (1994) “Estimating Discrete-Choice Models of Product Differentiation,” RAND Journal of Economics , 25(2), 242-262.
Berry, Steven T., James Levinsohn, and Ariel Pakes (1995) “Automobile Prices in Market Equilibrium,” Econometrica , 63(4), 841-890.
Berry, Steven T. and Philip A. Haile (2014) “Identification in Differentiated Products Markets Using Market Level Data,” Econometrica , 82(5), 1749-1797.
Gandhi, Amit and Jean-Francois Houde (2019) “Measuring Substitution Patterns in Differentiated-Products Industries,” NBER Working Paper No. 26375.
Hausman, Jerry A. (1996) “Valuation of New Goods under Perfect and Imperfect Competition,” in The Economics of New Goods , University of Chicago Press.
McFadden, Daniel (1974) “Conditional Logit Analysis of Qualitative Choice Behavior,” in Frontiers in Econometrics , Academic Press.
Train, Kenneth E. (2009) Discrete Choice Methods with Simulation , 2nd ed., Cambridge University Press, Chapter 4.
Trajtenberg, Manuel (1989) “The Welfare Analysis of Product Innovations, with an Application to Computed Tomography Scanners,” Journal of Political Economy , 97(2), 444-479.
Villas-Boas, J. Miguel and Russell S. Winer (1999) “Endogeneity in Brand Choice Models,” Management Science , 45(10), 1324-1338.