7.6 多項選択モデル紹介

本章のこれまでの内容では、2 つの選択肢から 1 つを選ぶ 2 項選択モデルに着目していた。しかし、複数の選択肢から 1 つを選ぶという多項選択モデルにもこれまでの議論を拡張することができる。任意の \(m\) 個の選択肢の中からある選択肢 \(j\) を選ぶ場合、選択肢 \(j\) の効用は、\(j\) を含む 1 から \(m\) までの選択肢の中で最も大きいといえる。

詳細は省略するが、(7.1) でベルヌーイ試行に着目していたものをカテゴリカル分布に拡張し、選択確率についての確率密度関数を考えることで、多項選択モデルを得る。なお、計算の複雑性から、多項選択の分析では、多項ロジットモデルが用いられることが多い。多項離散選択モデルの実行においては、解釈やデータ準備においていくつか注意が必要である。

多項選択モデルの推定では、mlogit パッケージを用いる。そのため、install.packages("mlogit") によってパッケージをインストールしてほしい。分析においては、3 章でも紹介した、wide型とLong型のデータ構造に注意が必要である。ここで、 mlogit パッケージに含まれる Cracker データを用いて多項ロジットモデルを実行する。このデータは3293件のクラッカーの選択について扱ったデータである。このデータには以下の変数が含まれている。

  • id: 個人を特定する番号
  • choice: sunshine, keebler, nabisco, private,のうちどれを選んだか
  • disp.z: ブランドz (各ブランド) が特別な陳列をされていたか
  • feat.z: ブランドz (各ブランド) が新聞広告を掲載していたか
  • price.z: ブランドz (各ブランド) の価格
library(mlogit)
data(Cracker, package = "mlogit")
head(Cracker, n=20)
##    id disp.sunshine disp.keebler disp.nabisco disp.private feat.sunshine
## 1   1             0            0            0            0             0
## 2   1             0            0            0            0             0
## 3   1             1            0            0            0             0
## 4   1             0            0            0            0             0
## 5   1             0            0            0            0             0
## 6   1             0            0            0            0             0
## 7   1             0            0            1            0             0
## 8   1             0            0            1            0             0
## 9   1             0            0            1            0             0
## 10  1             1            0            1            0             0
## 11  1             0            0            1            0             0
## 12  1             0            0            0            0             0
## 13  1             1            0            0            0             0
## 14  1             0            1            1            0             0
## 15  1             0            0            0            0             0
## 16  1             0            0            1            0             0
## 17  2             0            0            0            0             0
## 18  2             1            0            1            0             1
## 19  2             1            0            0            0             1
## 20  2             1            0            0            0             0
##    feat.keebler feat.nabisco feat.private price.sunshine price.keebler
## 1             0            0            0             98            88
## 2             0            0            0             99           109
## 3             0            0            0             49           109
## 4             0            0            0            103           109
## 5             0            0            0            109           109
## 6             0            0            0             89           109
## 7             0            0            0            109           109
## 8             0            0            0            109           119
## 9             0            0            0            109           121
## 10            0            0            0             79           121
## 11            0            0            0            109           113
## 12            0            0            0            109           121
## 13            0            0            0             89           121
## 14            0            0            0            109           109
## 15            0            0            0            109           109
## 16            0            0            0            129           104
## 17            0            0            0             79            99
## 18            0            0            0             69           105
## 19            0            0            0             79           125
## 20            0            0            0             79           125
##    price.nabisco price.private   choice
## 1            120            71  nabisco
## 2             99            71  nabisco
## 3            109            78 sunshine
## 4             89            78  nabisco
## 5            119            64  nabisco
## 6            119            84  nabisco
## 7            129            78 sunshine
## 8            129            78  nabisco
## 9            109            78  nabisco
## 10           109            78  nabisco
## 11           109            96  nabisco
## 12            99            86  nabisco
## 13            99            86  nabisco
## 14           129            96  nabisco
## 15           129            79  nabisco
## 16           129            96  nabisco
## 17            69            69  nabisco
## 18            89            65 sunshine
## 19           106            69 sunshine
## 20           106            69 sunshine

このデータ構造を、long型に変更する19

cracker <- mlogit.data(Cracker, choice = "choice", shape = "wide", varying=c(2:13))
head(cracker, n=20)
## ~~~~~~~
##  first 20 observations out of 13168 
## ~~~~~~~
##    id choice      alt disp feat price chid    idx
## 1   1  FALSE  keebler    0    0    88    1 1:bler
## 2   1   TRUE  nabisco    0    0   120    1 1:isco
## 3   1  FALSE  private    0    0    71    1 1:vate
## 4   1  FALSE sunshine    0    0    98    1 1:hine
## 5   1  FALSE  keebler    0    0   109    2 2:bler
## 6   1   TRUE  nabisco    0    0    99    2 2:isco
## 7   1  FALSE  private    0    0    71    2 2:vate
## 8   1  FALSE sunshine    0    0    99    2 2:hine
## 9   1  FALSE  keebler    0    0   109    3 3:bler
## 10  1  FALSE  nabisco    0    0   109    3 3:isco
## 11  1  FALSE  private    0    0    78    3 3:vate
## 12  1   TRUE sunshine    1    0    49    3 3:hine
## 13  1  FALSE  keebler    0    0   109    4 4:bler
## 14  1   TRUE  nabisco    0    0    89    4 4:isco
## 15  1  FALSE  private    0    0    78    4 4:vate
## 16  1  FALSE sunshine    0    0   103    4 4:hine
## 17  1  FALSE  keebler    0    0   109    5 5:bler
## 18  1   TRUE  nabisco    0    0   119    5 5:isco
## 19  1  FALSE  private    0    0    64    5 5:vate
## 20  1  FALSE sunshine    0    0   109    5 5:hine
## 
## ~~~ indexes ~~~~
##    chid      alt
## 1     1  keebler
## 2     1  nabisco
## 3     1  private
## 4     1 sunshine
## 5     2  keebler
## 6     2  nabisco
## 7     2  private
## 8     2 sunshine
## 9     3  keebler
## 10    3  nabisco
## 11    3  private
## 12    3 sunshine
## 13    4  keebler
## 14    4  nabisco
## 15    4  private
## 16    4 sunshine
## 17    5  keebler
## 18    5  nabisco
## 19    5  private
## 20    5 sunshine
## indexes:  1, 2

変換後のデータセットでは、各選択肢の特徴と、それに対する個人の選択結果(TRUE or FALSE)を含める形で行が構成されている。このようにデータの構造を修正することで、分析を行う。

分析についても mlogitパッケージを利用して実行するのだが、分析結果の解釈を確かなものにするため、多項ロジットモデルについての説明を加える。多項ロジットモデルでは、\(m\) 個の選択肢の中からある選択肢 \(j\) を選ぶ行為を分析対象としている。分析モデルにおいては、説明変数 \(x_{1i},...,x_{ki}\) が与えられたときにある選択肢 \(j\) を選ぶ確率は 0 から 1 の間の値を取る必要がある。そのため、各選択肢に対する選択確率の合計が1になるように調整しなければならない。これに対して多項ロジットモデルでは、ある特定の選択肢(仮に選択肢 1 とする)を基準とし、その選択肢に対応する回帰係数パラメータ(\(\beta_{10},\beta_{11},...,\beta_{1k},\))をすべて 0 に固定する20。多項ロジットモデルは以下のように表すことができる。

\[ \begin{aligned} P(y_i=j|x_{1i},...,x_{ki})= \left\{ \begin{array}{ll} \frac{1}{1+\sum^J_{j=2}[\exp(\beta_{j0}+\beta_{j1}x_{1i}+...+\beta_{jk}x_{ki})]} & ~(y_i=1) \\ \frac{\exp(\beta_{j0}+\beta_{j1}x_{1i}+...+\beta_{jk}x_{ki})}{1+\sum^J_{j=2}[\exp(\beta_{j0}+\beta_{j1}x_{1i}+...+\beta_{jk}x_{ki})]} & ~(y_i=2,..,m) \end{array} \right. \end{aligned} \]

多項ロジットの係数の解釈にも注意が必要である。多項ロジットモデルの係数(\(\beta\))は、対応する説明変数が微小に変化したときの、\(y_i=j\)\(y_i=1\)(基準となる選択肢)との相対確率がどのように変化するかを示している。一方で限界効果は、説明変数が変化した時に \(y_i=j\) を選ぶ確率がどのように変化するかを示している。そのため、推定される係数そのものと限界効果との意味が大きく異なる点も、多項ロジットモデルの特徴である(西山ほか, 2019)。 また、多項ロジットモデルでは任意の 2 つの選択肢の相対的な選択確率は他の選択肢からは独立であるという、無関係な選択肢からの独立(independence from irrelevant alternatives: IIA)という仮定を置く。この仮定が満たされない場合には、データセット内の選択肢を統合(ひとまとめに)するなどして、IIAの仮定が適切だとみなせる状況を作るよう工夫が必要となる。

これらを踏まえ、多項ロジットモデルを実行する。分析においては mlogit::mlogit() を用いる。多項ロジットモデルの推定では、用いる変数に対する係数をどの細かさで分析するかを分析者が判断することが重要になる。例えば、選択肢ごとに異なる係数を推定すべきなのか、それとも各選択肢に共通で同一の係数が推定されるべきなのか、という点については分析者が指定することになる。Rコードでのモデルの定式化においては、以下の 3 つの変数カテゴリを区別する形で、変数と推定される係数の関係を記述する必要がある(ただし、\(j\) はある選択肢を示す)。

  • データ上選択肢固有の変数であり、複数の選択肢に共通の一般的な係数\(\beta\)を得るための変数:\(x_{ij}\)
  • データ上個人固有の変数であり、各選択肢ごとに異なる係数 \(\gamma_{j}\) を得るための変数:\(z_i\)
  • データ上選択肢固有の変数であり、各選択肢ごとに異なる係数 \(\delta_j\)を得るための変数:\(w_{ij}\)

これらの変数と係数のカテゴリを踏まえ、個人 \(i\)、選択肢 \(j\) に関する効用の確定項(モデルにおける確率的誤差項以外の部分) \(V_{ij}\)は以下のように示すことができる。

\[ V_{ij}=\alpha_j+\beta x_{ij}+\gamma_j z_i+\delta_j w_{ij} \] そのため、どの変数が選択肢ごとの係数を推定すべきなのかについて、分析者側が、既存の理論やドメイン知識(実務・社会的知識)を用いて決定する必要がある。例えば、価格と効用の関係についてはブランド間で統一だと仮定しても良さそうだが、特殊なマーケティング方策を行っている企業・ブランドがある場合、選択肢ごとに推定できるモデルも検討したほうが良いかもしれない。しかしながら、消費者一般に成立する価格への反応を推定したい場合には、ブランドごとに異なる価格反応を前提としたモデル化は適切ではないかもしれない。このように、研究目的や採用する理論、着目するデータの背景などに注意してモデルを構築する必要がある。

Rでのコード作成では、formula = choice ~ x|z|w という形でモデルを定義することができる。以下では、価格に対する消費者の反応はブランドごとに異なるものではないが、広告や陳列については各ブランドの具体的な戦術の特徴によって影響の程度が変わるかもしれないと考え、以下のように分析を行う(プロビットモデルを使うときには、probit=TRUEとする)。なお、このような選択肢に関する特徴を説明変数に含む多項ロジットモデルは、条件付きロジットモデル(Conditional logit model)と呼ばれることもある。

ml_cracker <- mlogit(choice ~ price|1|disp + feat, probit = FALSE,
                     data = cracker)

summary(ml_cracker)
## 
## Call:
## mlogit(formula = choice ~ price | 1 | disp + feat, data = cracker, 
##     probit = FALSE, method = "nr")
## 
## Frequencies of alternatives:choice
##  keebler  nabisco  private sunshine 
## 0.068651 0.544350 0.314399 0.072600 
## 
## nr method
## 5 iterations, 0h:0m:0s 
## g'(-H)^-1g = 0.000258 
## successive function values within tolerance limits 
## 
## Coefficients :
##                        Estimate Std. Error  z-value  Pr(>|z|)    
## (Intercept):nabisco   2.0011226  0.0831336  24.0712 < 2.2e-16 ***
## (Intercept):private   0.3193793  0.1238052   2.5797 0.0098888 ** 
## (Intercept):sunshine -0.5435987  0.1139407  -4.7709 1.834e-06 ***
## price                -0.0300966  0.0021082 -14.2761 < 2.2e-16 ***
## disp:keebler          0.2999316  0.2070369   1.4487 0.1474251    
## disp:nabisco          0.1011111  0.0773633   1.3070 0.1912249    
## disp:private         -0.2244555  0.1495236  -1.5011 0.1333199    
## disp:sunshine         0.4818670  0.1672400   2.8813 0.0039605 ** 
## feat:keebler          0.6678542  0.2581732   2.5868 0.0096859 ** 
## feat:nabisco          0.6047773  0.1404077   4.3073 1.653e-05 ***
## feat:private          0.1726981  0.2004446   0.8616 0.3889213    
## feat:sunshine         0.8304895  0.2340938   3.5477 0.0003886 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log-Likelihood: -3333.8
## McFadden R^2:  0.052798 
## Likelihood ratio test : chisq = 371.66 (p.value = < 2.22e-16)

この分析モデルでは、priceはブランドごとに係数が推定されない変数(\(x_{ij}\))、dispfeat はブランドごとに係数が異なる変数(\(w_{ij}\))として定義している。そして、ブランドごとに係数を分析するが、その特徴自体は同個人に共通(同一のid内では各ブランドに共通の値が与えられる)である変数(\(z_i\))には、1 という値が記入されている。これは、他の変数から独立して、各ブランドが持つ特徴である「定数項」として分析するための指示である。これにより、各説明変数から独立して、消費者が各選択肢に対してどのような選択確率を(相対的に)有しているのかを表している。なお、ここで出力されている選択肢ごとの係数の推定値は基準となる選択肢(keebler)との相対的な選択確率の変化を表していることに、改めて注意が必要である。


  1. なお、mlogit.data() 関数の引数の設定については、元々のデータ構造によって変わるので、[Cranにあるソフトウェア](https://cran.r-project.org/package=mlogit)の説明などを確認し、応用することを進める↩︎

  2. ただし。\(\exp(0)=1\)↩︎