某所でボソッと呟いたら結構反応があったので、折角なので小ネタながら記事として書いてみようと思います。
「多重共線性を放置したまま交差検証して汎化性能が確保できたつもりになる」ことの危険性、ブログにまとめたら需要あるんだろうかhttps://t.co/DkauusM1Ip
— TJO (@TJO_datasci)2025年5月14日
ビジネス実務における回帰分析全般、特にMMMや経営陣向け需要予測モデルなどでありがちなパターンを想定しています。ちなみにこれに類する事例は僕が直接聞いている範囲でも複数実在しており、決して珍しい話ではない旨予めお断りしておきます。
多重共線性については、今年初めの記事で解説した通りですが念のためおさらいしておきます。基本的には「説明変数同士に高い相関があるにもかかわらず回帰モデルを推定すると、得られるパラメータ(偏回帰係数)にバイアスがかかる」という現象です。ついでにRによる例も再掲しておきます。
まず、"Boston Housing"データセットを用いた、オリジナルの線形回帰モデルの推定結果を載せておきます。
d<-read.csv('https://raw.githubusercontent.com/ozt-ca/tjo.hatenablog.samples/refs/heads/master/r_samples/public_lib/jp/R/housing.csv', sep='\t')d$CHAS<-as.factor(d$CHAS)d$RAD<-as.integer(d$RAD)summary(d)#R> CRIM ZN INDUS CHAS NOX RM#R> Min. : 0.00632 Min. : 0.00 Min. : 0.46 0:471 Min. :0.3850 Min. :3.561#R> 1st Qu.: 0.08205 1st Qu.: 0.00 1st Qu.: 5.19 1: 35 1st Qu.:0.4490 1st Qu.:5.886#R> Median : 0.25651 Median : 0.00 Median : 9.69 Median :0.5380 Median :6.208#R> Mean : 3.61352 Mean : 11.36 Mean :11.14 Mean :0.5547 Mean :6.285#R> 3rd Qu.: 3.67708 3rd Qu.: 12.50 3rd Qu.:18.10 3rd Qu.:0.6240 3rd Qu.:6.623#R> Max. :88.97620 Max. :100.00 Max. :27.74 Max. :0.8710 Max. :8.780#R> AGE DIS RAD TAX PTRATIO#R> Min. : 2.90 Min. : 1.130 Min. : 1.000 Min. :187.0 Min. :12.60#R> 1st Qu.: 45.02 1st Qu.: 2.100 1st Qu.: 4.000 1st Qu.:279.0 1st Qu.:17.40#R> Median : 77.50 Median : 3.207 Median : 5.000 Median :330.0 Median :19.05#R> Mean : 68.57 Mean : 3.795 Mean : 9.549 Mean :408.2 Mean :18.46#R> 3rd Qu.: 94.08 3rd Qu.: 5.188 3rd Qu.:24.000 3rd Qu.:666.0 3rd Qu.:20.20#R> Max. :100.00 Max. :12.127 Max. :24.000 Max. :711.0 Max. :22.00#R> B LSTAT MEDV#R> Min. : 0.32 Min. : 1.73 Min. : 5.00#R> 1st Qu.:375.38 1st Qu.: 6.95 1st Qu.:17.02#R> Median :391.44 Median :11.36 Median :21.20#R> Mean :356.67 Mean :12.65 Mean :22.53#R> 3rd Qu.:396.23 3rd Qu.:16.95 3rd Qu.:25.00#R> Max. :396.90 Max. :37.97 Max. :50.00d.lm<-lm(MEDV~ ., d)summary(d.lm)#R>#R> Call:#R> lm(formula = MEDV ~ ., data = d)#R>#R> Residuals:#R> Min 1Q Median 3Q Max#R> -15.595 -2.730 -0.518 1.777 26.199#R>#R> Coefficients:#R> Estimate Std. Error t value Pr(>|t|)#R> (Intercept) 3.646e+01 5.103e+00 7.144 3.28e-12 ***#R> CRIM -1.080e-01 3.286e-02 -3.287 0.001087 **#R> ZN 4.642e-02 1.373e-02 3.382 0.000778 ***#R> INDUS 2.056e-02 6.150e-02 0.334 0.738288#R> CHAS1 2.687e+00 8.616e-01 3.118 0.001925 **#R> NOX -1.777e+01 3.820e+00 -4.651 4.25e-06 ***#R> RM 3.810e+00 4.179e-01 9.116 < 2e-16 ***#R> AGE 6.922e-04 1.321e-02 0.052 0.958229#R> DIS -1.476e+00 1.995e-01 -7.398 6.01e-13 ***#R> RAD 3.060e-01 6.635e-02 4.613 5.07e-06 ***#R> TAX -1.233e-02 3.760e-03 -3.280 0.001112 **#R> PTRATIO -9.527e-01 1.308e-01 -7.283 1.31e-12 ***#R> B 9.312e-03 2.686e-03 3.467 0.000573 ***#R> LSTAT -5.248e-01 5.072e-02 -10.347 < 2e-16 ***#R> ---#R> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1#R>#R> Residual standard error: 4.745 on 492 degrees of freedom#R> Multiple R-squared: 0.7406,Adjusted R-squared: 0.7338#R> F-statistic: 108.1 on 13 and 492 DF, p-value: < 2.2e-16
次に、"CRIM"に適当な正規分布ノイズを加えたものを"X1", "NOX"にノイズを加えたものを"X2"として、説明変数に加えます。その上で同じことをやると、こうなります。
d1<- dd1$X1<- d1$CRIM+rnorm(nrow(d1),0,sd(d1$CRIM)/10)d1$X2<- d1$NOX+rnorm(nrow(d1),0,sd(d1$NOX)/10)summary(d1)# 省略d1.lm<-lm(MEDV~ ., d1)summary(d1.lm)#R>#R> Call:#R> lm(formula = MEDV ~ ., data = d1)#R>#R> Residuals:#R> Min 1Q Median 3Q Max#R> -15.6377 -2.7417 -0.4871 1.8472 26.1112#R>#R> Coefficients:#R> Estimate Std. Error t value Pr(>|t|)#R> (Intercept) 3.626e+01 5.121e+00 7.081 4.98e-12 ***#R> CRIM -2.989e-01 2.404e-01 -1.243 0.214383 # ←ココ#R> ZN 4.632e-02 1.375e-02 3.368 0.000818 ***#R> INDUS 1.788e-02 6.167e-02 0.290 0.772004#R> CHAS1 2.699e+00 8.669e-01 3.114 0.001957 **#R> NOX -1.908e+01 1.895e+01 -1.007 0.314541 # ←ココ#R> RM 3.800e+00 4.190e-01 9.068 < 2e-16 ***#R> AGE 8.219e-04 1.324e-02 0.062 0.950514#R> DIS -1.467e+00 2.004e-01 -7.320 1.02e-12 ***#R> RAD 3.037e-01 6.650e-02 4.567 6.27e-06 ***#R> TAX -1.219e-02 3.771e-03 -3.231 0.001315 **#R> PTRATIO -9.503e-01 1.316e-01 -7.222 1.97e-12 ***#R> B 9.383e-03 2.692e-03 3.485 0.000536 ***#R> LSTAT -5.264e-01 5.083e-02 -10.355 < 2e-16 ***#R> X1 1.915e-01 2.388e-01 0.802 0.422984#R> X2 1.590e+00 1.851e+01 0.086 0.931546#R> ---#R> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1#R>#R> Residual standard error: 4.752 on 490 degrees of freedom#R> Multiple R-squared: 0.741,Adjusted R-squared: 0.7331#R> F-statistic: 93.45 on 15 and 490 DF, p-value: < 2.2e-16
"CRIM"と"NOX"の回帰係数の推定結果がおかしなことになっていますね。どちらもp< 0.05であったはずがそうではなくなり、回帰係数そのものもバイアスがかかって異なる値になってしまっています。なのですが、この2つの回帰モデルの交差検証を行うとこうなります。
cv::cv(d.lm)# オリジナルR RNG seed set to385600#R> cross-validation criterion (mse) = 23.61569cv::cv(d1.lm)# 多重共線性が存在するケースR RNG seed set to458688#R> cross-validation criterion (mse) = 23.93573
2つの回帰モデルの間で、交差検証誤差には殆ど差がないことが見て取れます。まとめると、「多重共線性は『説明』には悪影響を及ぼすが『予測』には影響しない」というわけです。
で、一般的には回帰モデルの評価をする際は、交差検証によって汎化性能(予測性能)を比較することが多いわけです。前掲の例ではRMSEで比較していますが、ビジネス実務の現場ではMAPE(平均絶対パーセンテージ誤差)を用いることで、モデル間で比較するだけでなく「〇〇%未満なら許容範囲とする」というように、一種の閾値を設けて個々のモデルの採否を決めることも良く行われています。
特にC-levelなど経営上の意思決定に関わるステークホルダーに見せる数字としては、MAPEのように非専門家でも何となく分かる(分かったつもりになれる)評価指標は便利なものであり、比較的多用されているらしいと聞きます。
しかし、既に見たように交差検証はあくまでも汎化性能(予測性能)を測るものであり、多重共線性を測るものではありません(多重共線性は予測に影響しないため)。VIFなどの指標で予め多重共線性の有無を確かめて対処し、その上で交差検証にかける必要があります。
ここからが本題です。先述したように回帰モデルの「説明」を歪めてしまう多重共線性ですが、ビジネスの現場においては意外にも放置されてしまうことが多いんですね。それは、以前の記事でも指摘したような「年に1-2回の書き入れ時だけに全施策を集中させて残りの期間は殆ど何もしない」のが最適戦略になっているビジネスでは特に顕著だったりしますし、広告・マーケティングのキャンペーンを実施するたびに「一斉にTV・web・SNS・新聞・交通広告などの全施策を打ち始め、キャンペーン終了と同時に一斉に引き上げる」*1というのが常態化している界隈は少なくないどころかむしろ過半数とすら言えます。
勿論これらは回帰分析にとっては避けたい事態ですが、一方で「マーケティング部門で一元的に全施策のスケジュールを管理しているのでいちいち施策ごとにスケジュールを分けるのは非効率」「書き入れ時にたかが分析のためだけにあえて特定の施策を控えたら機会損失になる」「担当役員肝煎りの施策なので他の変数とマージしたり況してや割愛などできない」などといった理由で、解消できない(したくない)という界隈は少なくないどころかむしろ多数派と言って良いでしょう。
ここまで来たらもうお分かりでしょう。多重共線性はビジネスの性質やステークホルダーの都合で放置されることがある一方で、交差検証は分かりやすい概念なのでどのステークホルダーにも比較的受け入れられやすいため*2、回帰モデルの採否を決定するエビデンスとして用いられます。その際に、例えばモデル間の比較がされなくとも単一のモデルに対して「MAPE< 〇〇%だからOK」というような判断もなされ得るわけです。
これらが悪魔合体すると、「多重共線性が深刻であるにもかかわらずビジネスやステークホルダーの都合で放置されたまま推定された回帰モデル」が、「交差検証してみたらMAPEが〇〇%未満だった」ので、「ステークホルダーに受け入れられて重要な経営上の意思決定に用いられる」という、とんでもない事態がまかり通ってしまうんですね。特に、その回帰モデルが「予測」ではなく「説明」即ち個々の説明変数の偏回帰係数の大小に基づいて、個々の施策の取捨選択を決めるために用いられるのであれば尚更です。
正直言って僕個人だけの知見からは何とも言えませんが、少なくとも過去13年間に伝聞した範囲では「様々な組織のステークホルダーの方々はあまり統計学の知識はなかったとしても『交差検証』については何となく理解できていることが多いが、『多重共線性』についてはそもそも聞いたことすらないのが大半」だという印象があります。これを踏まえると、上述の事態はもしかしたら想像以上にそこら中に蔓延しているのかもしれません。
なればこそ、標題の通りですが「交差検証さえしていれば事足りると思って、多重共線性をスルーしてはいけない」のです。「多重共線性のチェックと解消」が必須かつ先で、「交差検証」はその後。そうでなければ、多重共線性がゴリゴリに乗ったままの歪んだ回帰モデルが大手を振ってまかり通ってしまいかねないのです。
割と古典的な話題ではありますが、その重大さに最近気付くことがあり、このたび改めて警鐘を鳴らしてみた次第です。心当たりがおありのデータ分析職と意思決定層の方々におかれましては、今一度この問題の存在を再認識していただければ幸いです。
追記
多重共線性では、回帰係数の推定量β^の分散V[β^]=σ²(XᵀX)^{-1}の固有値に大きい値が現れ、
— 内場 崇之(Takayuki Uchiba) (@utaka233)2025年5月29日
・説明 : β^の推定が不安定
・予測 : V[xᵀβ^|x]=xᵀV[β^]xが大きくなる点xの存在
が問題になる。しかし、CVの評価にはE[V[xᵀβ^|x]] = σ²tr(xxᵀ(XᵀX)^{-1}) ~ 定数が関わるので、この問題を検出できない。https://t.co/aIStlJ53vG
すうがくぶんか代表の内場さんから、問題の定式化についてのコメントをいただきました。有難うございます。
id:TJOTakashi J. OZAKI, Ph.D.
Data Scientist (尾崎 隆)
English:https://tjo-en.hatenablog.com/
このブログにはApache 2.0ライセンスのもとで配布されている製作物が含まれています。
ブログの内容は個人の意見・見解の表明であり、所属組織の意見・見解を代表しません。またブログ内容の正確性については一切保証いたしません(誤りを見つけた場合はコメント欄などでお知らせいただけると有難いです)。
また、ブログの中で取り上げられているデータ分析事例・データセット・分析上の知見など全ての記述は、特に明記されていない限りは、いずれもいかなる実在する企業・組織・機関の、いかなる個別の事例とも無関係です。ブログ記事内容は予告なく公開後に改変されることがあります。改変した事実は明示されることもあれば明示されないこともあります。
現在、講演依頼・書籍執筆依頼・メディア取材及び出演依頼等は全てお断りしております。悪しからずご了承ください。
ご連絡はLinkedInメッセージでお願いいたします。
Copyright © Takashi J. OZAKI 2013 All rights reserved.
引用をストックしました
引用するにはまずログインしてください
引用をストックできませんでした。再度お試しください
限定公開記事のため引用できません。