【完全攻略】多重共線性をわかりやすく解説
多重共線性(Multicollinearity)とは
重回帰分析を勉強していると、最小二乗法の仮定の一つに「多重共線性がないこと」と見たことがあると思います。
冪乗項や交互作用項などを説明変数に入れて必然的に生じる多重共線性(structual multicollinerity)と観測されたデータに存在している説明変数間に生じる多重共線性(data based multicollinearity)の2種類に分かれますが、大抵後者が問題視されますね、
さて、統計学の観点では、回帰を目的変数に対する説明変数の影響度を解釈することを目的としていることが多く、多重共線性(マルチコ)は避けるべき事象として扱われます。
なぜなら、マルチコがあると説明変数の回帰係数の符号が逆転したり、極端な値を取ったりするからです。
多重共線性のメカニズム
今回は、多重共線性の内容と、対処法を解説いたします。
多重共線性が発生している状態は、以下の二つのような状態です。
・定数の説明変数が存在している状態
・ある説明変数が、別の説明変数を線形関係にある状態
この記事では、特に二つ目の多重共線性について、詳しく取り上げます。
もう少し数式で説明すると、全ての${a_i}$が${0}$である場合を除いて、以下の事柄が成り立つ場合には多重共線性があると認められます。
$$a_0+a1X_{1i}+a_2X_{2i}+…+a_kX_{ki}≠0$$
方程式を満たす組み合わせがないということですね。
では、いつ気づくのでしょうか?
事前に相関行列を作って、相関が高いものを除いたりしていくわけですが、例えば多重共線性のある説明変数をあえてモデルに入れてみると、回帰係数を見た結果、符号が事前に予想されているものと異なる場合には多重共線性が原因で、説明変数の評価が誤っている場合があります。
例えば、「気温」という目的変数に対して、日照量という説明変数の回帰係数が負の数だとおかしいと感じると思います(常識的には日照量が増えれば増えるほど気温は上がっていくはず)
具体例
具体例を見ていきましょう。
年収がどのような要素によって決定されていくのか重回帰分析で調べたいと思います。 調査対象は30歳の日本人100人です。 「個人の年収Yi」を目的変数におき、説明変数に「教育年数X1」と「父親の年収X2」をおきます。
$$Y_{i}=\beta_{0}+\beta_{1}X_{1i}+\beta_{2}X_{2i}+u_{i}$$
\(\beta_{0}\)は定数項で、\(u_{i}\)は誤差項です。
重回帰分析は、各説明変数がどのくらいYに貢献しているのか調べることです。
多重共線性があり、説明変数同士が相関し合っていると、目的変数の値が不安定になります。
この不安定、と言うのは、回帰係数の標準誤差を大きくしてしまう、と言うことです。
→標準誤差が大きくなることで、実現される統計量が上がってしまい、有意であるはずの係数が有意水準によっては有意ではなくなります。
逆説的に、回帰係数の標準誤差が大きいと説明変数に多重共線性が生じているのでは?とちゅいしてみましょう。
つまり、高い標準誤差と高いp値、低いt値になってしまうということです。
このあたりの話は、青の統計学だと以下の記事がおすすめです。
ここの仕組みを国語的に理解していただくために、不安定さを2つに分解してみました。
係数推定の不安定性
- 説明変数間に強い相関があると、それぞれの変数の独自の影響を分離して推定することが難しい
- 例えば「教育年数の効果」と「父親の年収の効果」が似たような動きをするため、どちらがどれだけ効いているのか判別できなくなります
打ち消し合う効果
- 相関の強い2つの変数の係数は、大きな正の値と大きな負の値を取りやすくなります
- これらの値は互いに打ち消し合うため、わずかなデータのノイズでも予測値が大きく変動します
予測値と実際のデータの乖離が大きくなると、モデル自体の信頼性は低いですよね。
今回のモデルでいうと、父親の年収が高いほど、その子供の教育年数は多くなるのはなんとなく想像がつきそうです。
つまり、説明変数の設定の仕方があまり良くないということです。
多重共線性のデメリット|線形代数で説明
では、もう少し数学的に多重共線性のメカニズムを理解していきましょう。
説明変数間に強い相関がある場合、データ行列Xの列ベクトルが線形従属(一方が他方の線形結合で表される)に近くなります。
これにより、行列\(X^T X\)はランクが不足し、特異行列に近づくことがあります。
定量的には\(rank(A)<n\)で多重共線性があると言われます。
$$\begin{bmatrix} a_{11} & a_{12} \\ a_{21} & a_{22} \\ k a_{11} & k a_{12} \end{bmatrix}$$
特異行列は逆行列が存在しないため、連立方程式が一意的な解を持たない(不能)ことを意味します。
説明変数間に高い相関がある場合(多重共線性)、データ行列Xがほぼシンギュラー(特異行列となり、行列式が0になる)になることがあります。
逆行列が存在しても、数値的な不安定性が生じ、計算が収束せず、解析解が不正確になることがあります。
これが多重共線性における基本的な悪影響を指します。
では逆行列がないとなぜ解析的にパラメータを求められないかという部分を深掘りしていきます。
まず線形回帰の目的関数(損失関数)は以下のようになっております。
$$J(w) = ||X\beta – y||^2$$
パラメータ${\beta}$で偏微分して一階条件を適用すると、
$$J(w) = ||X\beta – y||^2$$
$$∇J(w) = 0$$
となります。
これを書き換えると
$$X^T X \beta = X^T y$$
$$\beta = (X^T X)^{-1} X^T y$$
最適パラメータを求めるにはデータ行列Xの逆行列が必要ということですね。
さて、多重共線性が強く特異行列になってしまったとすると、
$$X^{-1}=X × \frac{1}{|X|} \tilde{X}$$
行列式|X|が0なら、逆行列は存在しませんね!
つまり、解析解で使用する逆行列を求められないということになります。
代替案として最急勾配降下法のような方法で近似的に最適なパラメータを求めることが必要です。
補足|p値
ここでは、p値について説明をしております。
わかる方は飛ばしてOKです。
p値は、観測された統計量が帰無仮説 $${H_0}$$のもとでどれだけ起こりにくいかを表しています。
手順を追ってみてみましょう。
①統計量の選択
あるデータに対して、統計的検定の対象となる統計量 $${T}$$を計算します。
たとえば、2つのグループ間で平均値に差があるかどうかを検定する場合、t統計量を用いますね。
$$T=\frac{\overline{X}_1-\overline{X}_2}{S_p\sqrt{{n_1}^{-1}-{n_2}^{-1}}}$$
ここで、\{\overline{X}_1\)と \(\overline{X}_2\) はそれぞれのグループの標本平均、\(n_1\)と \(n_2\) はサンプルサイズ、\(S_p\)はプール(加重平均という理解でOK)された標準偏差です。
②p値の計算
t統計量を用いて、帰無仮説のもとでその値またはそれ以上に極端な値が発生する確率(p値)を計算します。
t統計量が従う確率分布(t分布)から、以下のように計算します。
$${p=P(T\ge |t| | H_0)}$$
最後に算出したp値を解釈します。
$${p<\alpha}$$
帰無仮説 \(H_0\) が真である場合に観測された結果が得られる確率が\(\alpha\)以下であるとき、統計的に有意とされ、帰無仮説を棄却します。通常、\(\alpha\)は \(0.05\) や\(0.01\) と設定されます。
*事前に設定せず、p値を超える有意水準を事後的に設定したり、p値が低くなるまで何度も検定をしたり、などの行為は研究不正となりますのでご注意ください。
最後にp値に関する注意するポイントは二つあります。
- p値 ≠ 確率:とてもややこしいのですが、p値は帰無仮説が「真である確率」ではなく、「帰無仮説が真であると仮定した場合に観測された結果が得られる確率」を表します。
- p値と実質的な意義:p値が小さいからといって、その効果が実質的に重要であるとは限りません。効果(effect size)も同時に評価することが重要です。
機械学習における多重共線性の扱い
ここまで統計学でのマルチコの捉え方を説明してきましたが、機械学習の観点では少し捉え方が異なります。
機械学習の中でもモデルの予測精度に関心がある場合、説明変数の影響度合いには注意をそれほど払いません。
→kaggleのコンペでも交互作用項を多く作り、GBDTで後から説明変数を削るなどのアプローチがあるように、モデルの中の多重共線性は説明力を低下させるものの、目的変数の予測の精度には影響を与えないと考えられています。
→ただし未知のデータは別です。
VIF(Variance Inflation Factor)
そもそも、特徴量同士に相関がない(=直行(orthogonal)している)方が稀です。
では、多重共線性の評価指標や、その指標がどういった閾値を超えると共線性が認められると判断できるのでしょうか。
では、定量的な多重共線性の指標として、VIFをご紹介します。
$$VIF = \frac{1}{1-R_{j}^2}$$
${r}$は説明変数${X_1}$と${X_2}$の相関係数を表します。
正の相関であろうが、負の相関であろうが、相関が大きい場合にVIFの値は大きくなります。
VIF value | conclusion |
VIF = 1 | not correlated |
1 < VIF < 5 | moderately correlated |
VIF > 5 | highly correlated |
このVIFの基準は論文によって様々で、3以上で共線性を認めるものもあれば、20以上でないと共線性を認めない論文も見られます。
ただ、この多重共線性の判定基準であるVIFの妥当性には疑問がついています。だからと言って計量経済学で多重共線性の問題を考えないということではありませんが。
とはいえ、多重共線性について言及しているIB論文(international Business )400件のうち、150件はVIFについてなんらかの計算を行っていることから、評価指標としての採用率は高めのようです。
VIF|CODE
ここではVIFを計算するコードを載せています。
各カラムの1行下(1行目ですね)に特徴量のVIFを載せるプログラムです。
乳がんデータという特徴量が多めのデータセットを使っているためか、かなりVIFが大きいです。
# Import libraries
import pandas as pd
from sklearn.datasets import load_breast_cancer
import numpy as np
from statsmodels.stats.outliers_influence import variance_inflation_factor
data_breast_cancer = load_breast_cancer()
df_target = pd.DataFrame(data_breast_cancer["target"], columns=["target"])
df_data = pd.DataFrame(data_breast_cancer["data"], columns=data_breast_cancer["feature_names"])
df = pd.concat([df_target, df_data], axis=1)
# Get column names
columns = df.columns
# Create VIF dataframe
vif_data = pd.DataFrame()
# Calculate VIF for each column
for i in range(0,len(columns)):
vif = variance_inflation_factor(df[columns],i)
vif_data.loc[0,columns[i]] = vif
# View VIF dataframe
vif_data
target | mean radius | mean texture | mean perimeter | mean area | mean smoothness | mean compactness | mean concavity | mean concave points | mean symmetry | … | worst radius | worst texture | worst perimeter | worst area | worst smoothness | worst compactness | worst concavity | worst concave points | worst symmetry | worst fractal dimension | |
0 | 10.884558 | 63955.019898 | 251.093672 | 58213.349861 | 1320.282793 | 393.418392 | 200.983909 | 158.033586 | 155.053368 | 184.712502 | … | 9993.710616 | 343.419477 | 4498.196282 | 1165.384639 | 375.640625 | 132.918704 | 86.754853 | 148.773818 | 219.621611 | 427.782984 |
カテゴリ変数の追加の際の注意点|ダミー変数の罠
例えば、男女のカテゴリデータをモデルに説明変数として加えるとして、どちらもダミーデータとしてモデルに含んでしまうと
$${male_dummy+female_dummy=1}$$
と言う線形関係が生まれ、ある説明変数が、別の説明変数を線形関係にある状態、が生まれることに気づくはずです。
これをダミー変数の罠と呼びます
これは、別にダミー変数のカテゴリが3つ以上の場合でも状況は同じです。
例えば、「大学生、高校生、中学生」をとる、studentと言う質的変数があったときに、
student_大学生,student_高校生,student_中学生をモデルに含めてしまうと、
${student_大学生+student_高校生+student_中学生=1}$
と言う関係性になり、上述した通りの問題が発生してしまいます。
こういった場合には、「ベースグループ」を立ててあげるのがよく、ベースグループを中学生として、student_大学生,student_高校生をモデルに含めるとすると、${student_大学生+student_高校生={0,1}}$となり、値が一意に定まらなくなります。
もちろん、student_中学生ダミーが必要なときは、高校生と大学生のダミーは0にすればokです。
ダミー変数は、カテゴリ数の多さに加え、そもそも種類が2種以上の場合もあります。
そのような場合は、ダミー変数同士を掛け合わせたりして、カラムを落とす必要があります。
ダミー変数の罠|実例
では、実例を見てみましょう。
今度は年収に与える影響を調べるために、以下のようなダミー変数を与えました。 H:高卒ダミー。高卒なら1、大卒なら0。 C:大卒ダミー。高卒なら0、大卒なら1。 母集団は高卒以上の集団であるとし、大卒か高卒かの2通りに必ずわかれるとします。 この時、多重共線性はあるでしょうか?
$$Y_{i}=\beta_{0}+\beta_{1}H_{i}+\beta_{2}C_{i}+u_{i}$$
答え:多重共線性はあります。
母集団には、高卒と大卒しかいませんので、ある個人iに関して以下の関係が必ず成り立ちます。
$$H_{i}+C_{i}=1$$
よって、このような反例が作れるので上の定義に基づき、多重共線性がある言えます。
$$-\frac{1}{\sqrt{3}}+\frac{1}{\sqrt{3}}H_{i}+\frac{1}{\sqrt{3}}C_{i}=0$$
まとめ
一般的に、
①どれか一つのダミー変数が1の時に他は0をとる
②どれかのダミー変数は必ず1をとる
場合、定数項を含めると多重共線性が発生します。これを、ダミー変数の罠と言います。
この多重共線性は、「定数項かダミー変数2つ」のうち一つを除外すれば解決できます
3通り考えられますね。
例えば以下のモデルです。
$$Y_{i}=\beta_{0}+\beta_{1}H_{i}+u_{i}$$
よく考えれば、ある個人が大卒の時、Cは1でHは必ず0でした。
これは、説明変数が負の相関を持っていると言えます。
多重共線性の解決方法について
多重共線性の解決方法としては
①説明変数を消す
②主成分回帰
③回帰係数の重みを小さくする
④共線性のある説明変数を組み合わせて一つの説明変数とする
ですが、上の例では①だったと言うわけです。
説明変数を一つ消したのは、「相関しているのなら、消しても影響はモデルに残るから消してしまおう」という意味です。
重回帰分析で多重共線性を解決する手法の一つに「正則化項を加える」がありますが、以下のコンテンツでは正則化について扱っています。
【python】Ridge(リッジ)回帰で多重共線性を解決する話
単回帰分析よりも重回帰分析の方が、基本的に説明力が高くなります。
そのため、説明変数をたくさん入れたモデルの方が良いと感じる人も多いでしょう。
しかし、説明変数を増やせば増やすほど、モデルが複雑になることで実用性が下がり、加えて多重共線性のリスクは高まります。
説明変数を加える際は気をつけましょう。
おまけ|多重共線性へのいくつかの誤解について
今回の記事を書くにあたり、いくつかの論文を読みました、
①Multicollinearity and Regression Analysis
(Jamal I. Daoud 2017 J. Phys.: Conf. Ser. 949 012009)
②Misconceptions about multicollinearity
in international business research: Identification, consequences, and remedies
(Journal of International Business Studies (2020) 51, 283–298)
②の論文では、多重共線性に対する最も頻繁に行われている対処法として上記の「相関のある説明変数を削除する」ことを認めつつも、同時に省略された変数バイアスのリスクを増加させることも懸念しています。
多重共線性を回避するために、共線性のある特徴量の一方を減らすことでもう一方の標準誤差が減るのは当然ですが、
偽有意な係数を導く可能性があり、問題があることは否定できないということです。
先ほど多重共線性により、「有意であるはずの係数が有意でなくなる」と説明しましたが、それが真に正しいかどうかは別の問題です。
そのため、予測された回帰係数に問題があるのは、共線性があるためではなく、安易に説明変数を削除した結果であるとも言えるということです。
また、多重共線性だけの問題だけではなく、単にサンプルサイズが小さすぎることによる問題を無視できません。
②の論文での主な主張としては、
- 多重共線性は標準誤差を大きくさせることには同意
- 標準誤差が大きくなることは、妥当性が下がるわけではなく、信頼性を過小評価するというだけで計量経済学的な問題はない
- むしろ、安易に共線性のある変数を除くことによる、誤った(変数除去によりバイアスがかかった)回帰結果が有意になることが問題である
- なので、共線性のある説明変数は残しておくほうが望ましい
- ただし、共線性のある説明変数の係数の解釈が難しいことには同意する
となります。
②の論文では、多重共線性があると回帰係数がブレるという認識に対して、データを用いて「説明変数を省いても省かなくても回帰係数は変わらない」と示しています。
回帰係数が変わる場合は、そもそものモデルの仕様が間違っているという主張です。
共線性のある説明変数に対しては、機械的な処理を施すのではなく、一つずつの属性とデータに対する背景知識を用いて、丁寧に処理することが望ましそうです。