Rで重回帰モデルの変数選択 ーAIC, BIC, ステップワイズ法ー

Rでデータ解析と可視化

目的変数と複数の説明変数があった場合、目的変数の予測に用いることができるのが重回帰分析です。
重回帰分析を行う際、そのモデルに使用する変数を適切に選択することはとても重要です。

今回使用するデータセットのBostonは、Housing Values in Suburbs of Boston(ボストン近郊の住宅価格)と、1住戸当たりの平均部屋数、町ごとの一人当たり犯罪率、持ち家の値段(中央値)などの14の変数情報が含まれます。

「持ち家の値段を予測するために、他の13の変数情報が全て必要なのか?」
必要な変数で精度が高い重回帰モデルを作る方が、よりよい予測ができるはず💡
そこで行うのが、変数選択(特徴量選択)です。

本記事では、RのBostonデータセットを例に、モデルのあてはまりの良さを表す、AIC(赤池情報量基準)BIC(ベイズ情報量基準)の値を用いて変数選択を行います。
変数選択の方法には、ステップワイズ法を用い、Rのコードを含めて解説を行います。




1. モデルのあてはまりの良さ(AIC, BIC)

モデルの”あてはまりの良さ“を評価する指標として、AIC(赤池情報量基準)BIC(ベイズ情報量基準) がよく使われます。
これらの指標は、モデルがデータにどれだけ適合しているかを示し、同時にモデルの複雑さにもペナルティを与えることで、過剰適合を防ぎつつ、シンプルで良いモデルを選択するのに役立ちます。

■AIC(赤池情報量基準)
AIC(Akaike Information Criterion)は、モデルの適合度と複雑さのバランスを評価する指標で、値が小さいほどモデルの予測精度とシンプルさが両立できているとされます。
AICの式:

  AIC=−2×log(L)+2×p

L:モデルの尤度(データに対する適合度)で大きいほどデータに適合していることを示す。
p:モデルのパラメータ数(変数数)で、複雑さに応じてペナルティが増加する。

式の前項部分がモデルの適合度を示し、後項部分がモデルの複雑さを示しています。
AICはデータに対する予測精度を重視し、モデルがデータをどれだけうまく説明するかを評価しています。

■BIC(ベイズ情報量基準)
BIC(Bayesian Information Criterion)は、AICと同様にモデルの適合度と複雑さを評価しますが、ペナルティが強く、よりシンプルなモデルを選びやすい特徴があります。
BICの式:

BIC=2×log(L)+log(n)×p

L:モデルの尤度(データに対する適合度)で大きいほどデータに適合していることを示す。
p:モデルのパラメータ数(変数数)で、複雑さに応じてペナルティが増加する。
n:サンプルサイズを示し、サンプルサイズが大きくなるとペナルティが大きくなる。

BICは、式の後項で変数数が多いほどペナルティが増えることからも、モデルのシンプルさをより重視していることが分かります。適合度とモデルの複雑さのバランスをとりながら、変数選択を行います。

Lの詳細は、こちらを参照ください。

AICとBICについては、以下の論文で議論されています。

Burnham K. P., Anderson D. R. (2004). Multimodel inference understanding AIC and BIC in model selection. Sociological Methods & Research, 33, 261–304.

2. AIC/BICを使ったステップワイズ法による変数選択

ステップワイズ法は、重回帰モデルの変数選択手法の一つで、モデルの適合度を考慮しつつ、不要な変数を含めず、最適なモデルを見つけます。進め方は以下の3つがあります。
 前進選択法:変数を一つずつ追加していく方法。
 後退削除法:初期段階で全変数を含み、変数を一つずつ削除していく方法。
 双方向法:変数の追加と削除を交互に行う柔軟な方法。
各ステップで変数を追加または削除してAICやBICなどの評価指標を最小化する方向に進めます。
今回は、よりよいモデルが得られやすい双方向法を選択します。

ここでは、AICとBICの両方で変数選択行います。

2.1 目的変数以外の全変数を用いたモデルの作成

まずは、Bostonデータセットを使って住宅価格(medv)を予測するため、medv以外の全変数を用いて重回帰モデルを作成します。

library(MASS)
summary(Boston) #1 データの概要
#      crim        zn       indus 
# Min. : 0.00632    Min. : 0.00    Min. : 0.46 
#1st Qu.: 0.08205  1st Qu.: 0.00  1st Qu.: 5.19 
#Median : 0.25651  Median : 0.00  Median : 9.69 
#  Mean : 3.61352    Mean : 11.36   Mean :11.14 
#3rd Qu.: 3.67708  3rd Qu.: 12.50 3rd Qu.:18.10 
#  Max. :88.97620    Max. :100.00   Max. :27.74 ・・・
full_model <- lm(medv ~ ., data = Boston) #2 全変数を用いた重回帰モデル作成
full_model 
#Call:
#lm(formula = medv ~ ., data = Boston)
#Coefficients:
# (Intercept)          crim            zn          indus          chas  
#  3.646e+01   -1.080e-01    4.642e-02    2.056e-02    2.687e+00  
#          nox             rm           age            dis           rad  
# -1.777e+01    3.810e+00    6.922e-04   -1.476e+00    3.060e-01  
#          tax       ptratio           black          lstat  
# -1.233e-02   -9.527e-01    9.312e-03   -5.248e-01

#Coefficientsには、モデルに含まれる変数の係数が示されており、モデルに対する各変数の影響度を示しています。
(Intercept):切片で、住宅価格の基本値を表す(36.46)。
crim、zn、indus、chas、nox、rm、age、dis、rad、tax、ptratio、black、lstat:各説明変数の回帰係数。
例えば、crim(犯罪率)の係数は-0.108で、犯罪率が増加すると住宅価格が低下することを示す。
各変数の係数は住宅価格に対する影響の大きさと方向性を示しており、正の係数は価格の上昇、負の係数は価格の低下に寄与します。

2.2 AICを用いたステップワイズ法

step()関数で、AICを基準としたステップワイズ法による変数選択を行います。

step_model_AIC <- step(full_model, direction = "both", k = 2) #1 ステップワイズ法(双方向法)、AIC
#Start:  AIC=1589.64
#medv ~ crim + zn + indus + chas + nox + rm + age + dis + rad + 
#    tax + ptratio + black + lstat
#          Df Sum of Sq   RSS    AIC  
#- age      1      0.06 11079 1587.7  
#- indus    1      2.52 11081 1587.8
#<none>                 11079 1589.6
#- chas     1    218.97 11298 1597.5
#- tax      1    242.26 11321 1598.6
#- crim     1    243.22 11322 1598.6
#- zn       1    257.49 11336 1599.3
#- black    1    270.63 11349 1599.8
#- rad      1    479.15 11558 1609.1
#- nox      1    487.16 11566 1609.4
#- ptratio  1   1194.23 12273 1639.4
#- dis      1   1232.41 12311 1641.0
#- rm       1   1871.32 12950 1666.6
#- lstat    1   2410.84 13490 1687.3
#Step:  AIC=1587.65
#medv ~ crim + zn + indus + chas + nox + rm + dis + rad + tax + 
#    ptratio + black + lstat
#          Df Sum of Sq   RSS    AIC
#- indus    1      2.52 11081 1585.8
#<none>                 11079 1587.7
#+ age      1      0.06 11079 1589.6
#- chas     1    219.91 11299 1595.6
#- tax      1    242.24 11321 1596.6
#- crim     1    243.20 11322 1596.6
#- zn       1    260.32 11339 1597.4
#- black    1    272.26 11351 1597.9
#- rad      1    481.09 11560 1607.2
#- nox      1    520.87 11600 1608.9
#- ptratio  1   1200.23 12279 1637.7
#- dis      1   1352.26 12431 1643.9
#- rm       1   1959.55 13038 1668.0
#- lstat    1   2718.88 13798 1696.7
#Step:  AIC=1585.76
#medv ~ crim + zn + chas + nox + rm + dis + rad + tax + ptratio + 
#    black + lstat
#          Df Sum of Sq   RSS    AIC
#<none>                 11081 1585.8
#+ indus    1      2.52 11079 1587.7
#+ age      1      0.06 11081 1587.8
#- chas     1    227.21 11309 1594.0
#- crim     1    245.37 11327 1594.8
#- zn       1    257.82 11339 1595.4
#- black    1    270.82 11352 1596.0
#- tax      1    273.62 11355 1596.1
#- rad      1    500.92 11582 1606.1
#- nox      1    541.91 11623 1607.9
#- ptratio  1   1206.45 12288 1636.0
#- dis      1   1448.94 12530 1645.9
#- rm       1   1963.66 13045 1666.3
#- lstat    1   2723.48 13805 1695.0

summary(step_model_AIC) #2
#Call:
#lm(formula = medv ~ crim + zn + chas + nox + rm + dis + rad + 
#    tax + ptratio + black + lstat, data = Boston)
#Residuals:
#     Min       1Q   Median       3Q      Max 
#-15.5984  -2.7386  -0.5046   1.7273  26.2373 
#Coefficients:
#              Estimate Std. Error t value Pr(>|t|)    
#(Intercept)  36.341145   5.067492   7.171 2.73e-12 ***
#crim         -0.108413   0.032779  -3.307 0.001010 ** 
#zn            0.045845   0.013523   3.390 0.000754 ***
#chas          2.718716   0.854240   3.183 0.001551 ** 
#nox         -17.376023   3.535243  -4.915 1.21e-06 ***
#rm            3.801579   0.406316   9.356  < 2e-16 ***
#dis          -1.492711   0.185731  -8.037 6.84e-15 ***
#rad           0.299608   0.063402   4.726 3.00e-06 ***
#tax          -0.011778   0.003372  -3.493 0.000521 ***
#ptratio      -0.946525   0.129066  -7.334 9.24e-13 ***
#black         0.009291   0.002674   3.475 0.000557 ***
#lstat        -0.522553   0.047424 -11.019  < 2e-16 ***
#---
#Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#Residual standard error: 4.736 on 494 degrees of freedom
#Multiple R-squared:  0.7406,	Adjusted R-squared:  0.7348 
#F-statistic: 128.2 on 11 and 494 DF,  p-value: < 2.2e-16

#1  direction = “both” AICの双方向ステップワイズ法を用いた最適な重回帰モデルを求めました。
最初のモデル(全変数を含む)からAICが1589.64でスタートし、各変数の追加または削除を試みながらAICを減少させていきました。
age や indus を削除するとAICが低下しました。
各ステップで、AICが最小になる変数の組み合わせが選ばれ、これ以上AICの改善が見られない時点で、変数選択が終了しました。
最終的にAICが1585.76となり、ageとindusが除外された11の変数からなるモデルが得られました。

#2  選択されたモデルでは、11の変数が住宅価格(medv)に対して有意に影響を与えていることが分かりました。
lm(formula = medv ~ crim + zn + chas + nox + rm + dis + rad + tax + ptratio + black + lstat, data = Boston)
R-squared(決定係数)は0.7406で、モデルが住宅価格の74.06%を説明していることを示しています。
また、Adjusted R-squared(自由度調整済み決定係数)が0.7348と高く、モデルの適合度が良いことが分かります。

自由度調整済み決定係数は、変数の数に応じて調整された決定係数で、過剰な変数が含まれている場合にR-squared(決定係数)の値が不適切に上がることを防ぎます。このモデルのAdjusted R-squaredも高いため、モデルが適切にフィットしていると判断できます。

また、全体のモデルの有意性を示すF-statisticのp値も低く、有意水準を0.05とした場合、このモデルは統計的に有意であるといえます。




2.3 BICを用いたステップワイズ法

次に、BIC基準のステップワイズ法による変数選択を行います。

step_model_BIC <- step(full_model, direction = "both", k = log(nrow(Boston))) #1 ステップワイズ法(双方向法)、BIC
#Start:  AIC=1648.81   #AIC表示だが、これはBICの値
#medv ~ crim + zn + indus + chas + nox + rm + age + dis + rad + 
#    tax + ptratio + black + lstat
#          Df Sum of Sq   RSS    AIC
#- age      1      0.06 11079 1642.6  
#- indus    1      2.52 11081 1642.7
#<none>                 11079 1648.8
#- chas     1    218.97 11298 1652.5
#- tax      1    242.26 11321 1653.5
#- crim     1    243.22 11322 1653.6
#- zn       1    257.49 11336 1654.2
#- black    1    270.63 11349 1654.8
#- rad      1    479.15 11558 1664.0
#- nox      1    487.16 11566 1664.4
#- ptratio  1   1194.23 12273 1694.4
#- dis      1   1232.41 12311 1696.0
#- rm       1   1871.32 12950 1721.6
#- lstat    1   2410.84 13490 1742.2

#Step:  AIC=1642.59
#medv ~ crim + zn + indus + chas + nox + rm + dis + rad + tax + 
#    ptratio + black + lstat
#          Df Sum of Sq   RSS    AIC
#- indus    1      2.52 11081 1636.5
#<none>                 11079 1642.6
#- chas     1    219.91 11299 1646.3
#- tax      1    242.24 11321 1647.3
#- crim     1    243.20 11322 1647.3
#- zn       1    260.32 11339 1648.1
#- black    1    272.26 11351 1648.7
#+ age      1      0.06 11079 1648.8
#- rad      1    481.09 11560 1657.9
#- nox      1    520.87 11600 1659.6
#- ptratio  1   1200.23 12279 1688.4
#- dis      1   1352.26 12431 1694.6
#- rm       1   1959.55 13038 1718.8
#- lstat    1   2718.88 13798 1747.4

#Step:  AIC=1636.48
#medv ~ crim + zn + chas + nox + rm + dis + rad + tax + ptratio + 
#    black + lstat
#          Df Sum of Sq   RSS    AIC
#<none>                 11081 1636.5
#- chas     1    227.21 11309 1640.5
#- crim     1    245.37 11327 1641.3
#- zn       1    257.82 11339 1641.9
#- black    1    270.82 11352 1642.5
#+ indus    1      2.52 11079 1642.6
#- tax      1    273.62 11355 1642.6
#+ age      1      0.06 11081 1642.7
#- rad      1    500.92 11582 1652.6
#- nox      1    541.91 11623 1654.4
#- ptratio  1   1206.45 12288 1682.5
#- dis      1   1448.94 12530 1692.4
#- rm       1   1963.66 13045 1712.8
#- lstat    1   2723.48 13805 1741.5

summary(step_model_BIC)
#Call:
#lm(formula = medv ~ crim + zn + chas + nox + rm + dis + rad + 
#    tax + ptratio + black + lstat, data = Boston)
#Residuals:
#     Min       1Q   Median       3Q      Max 
#-15.5984  -2.7386  -0.5046   1.7273  26.2373 
#Coefficients:
#              Estimate Std. Error t value Pr(>|t|)    
#(Intercept)  36.341145   5.067492   7.171 2.73e-12 ***
#crim         -0.108413   0.032779  -3.307 0.001010 ** 
#zn            0.045845   0.013523   3.390 0.000754 ***
#chas          2.718716   0.854240   3.183 0.001551 ** 
#nox         -17.376023   3.535243  -4.915 1.21e-06 ***
#rm            3.801579   0.406316   9.356  < 2e-16 ***
#dis          -1.492711   0.185731  -8.037 6.84e-15 ***
#rad           0.299608   0.063402   4.726 3.00e-06 ***
#tax          -0.011778   0.003372  -3.493 0.000521 ***
#ptratio      -0.946525   0.129066  -7.334 9.24e-13 ***
#black         0.009291   0.002674   3.475 0.000557 ***
#lstat        -0.522553   0.047424 -11.019  < 2e-16 ***
#---
#Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#Residual standard error: 4.736 on 494 degrees of freedom
#Multiple R-squared:  0.7406,	Adjusted R-squared:  0.7348 
#F-statistic: 128.2 on 11 and 494 DF,  p-value: < 2.2e-16

BIC基準で双方向ステップワイズ法を行い、最適な変数を選択ました。
最初のモデル(全変数を含む)ではBICが1648.81からスタートし、各ステップで変数の増減を試みながらBICを低下させました。
ageやindusなどが削除されることでBICが減少し、最適な組み合わせが選ばれました。
最終的に、ageとindusが除外され、11個の変数が残るモデルが選択され、BICは1636.48に達しました。

今回のデータでは、AICとBICのそれぞれのステップワイズ法によって同じ変数選択を行われたため、回帰係数も一致し、同じモデルが得られました。

3. 最適化モデルのプロット

AICとBICのステップワイズ法で得られた最適化モデル:

lm(formula = medv ~ crim + zn + chas + nox + rm + dis + rad + tax + ptratio + black + lstat, data = Boston)

このモデルについて、実測値と予測値のプロット(青)を行います。
傾き1(実測値=予測値を示す)の基準線(赤)も合わせて引きます。

library(ggplot2)

predicted_values <- predict(step_model_AIC)
data_plot <- data.frame(Actual = Boston$medv, Predicted = predicted_values)
ggplot(data_plot, aes(x = Actual, y = Predicted)) +
     geom_point(color = "blue", alpha = 0.6, size = 2) +
     geom_abline(intercept = 0, slope = 1, color = "red", linetype = "dashed", size = 1) +  #基準線
     labs(title = "実測値-予測値",
          x = "実測値",
          y = "予測値") +
     theme_classic() +
     theme(plot.title = element_text(hjust = 0.5)) +
     scale_x_continuous(limits = c(0,50)) +  # X軸の範囲を設定
     scale_y_continuous(limits = c(0, 50))  # Y軸の範囲を設定

図で見ると、基準線周辺にプロットされていて、実測値に対してよく予測できているようなモデルが作成できました。

今回は、線形の重回帰モデルを作成しましたが、その他にもLasssoやリッジ回帰といった正則化法に基づく回帰分析もありますので、後日紹介したいと思います。

ありがとうございました。

以下のサイトにRでの単回帰分析や重回帰分析について書いていますので、閲覧いただけると幸いです。

Rで回帰分析① ー単回帰分析, lm関数, 残差プロット, Q-Qプロットー
車の運転速度が速いほど、ブレーキを踏んでから停止するまでに必要な距離は長くなる💡 これは日常の運転でも実感できる事象かと思います。 このような関係性をデータから数式で表現し、予測に活用できる手法である単回帰分析です。 ...
Rで回帰分析②ー重回帰分析, lm関数, 価格予測ー
AをB、C、Dなどの複数の要因で予測したいという場合に、重回帰分析が用いられます。 例えば、住宅の価格(目的変数)を、町ごとの一人当たり犯罪率、1940年以前に建てられた持ち家の割合、ボストンの5つの雇用中心地までの距離の加重平均のデ...

参考図書▼▼▼

コメント

タイトルとURLをコピーしました