baseball <- read.csv("ball2017.csv",na.strings="*",fileEncoding = "UTF-8")
え,こんなにも色々なことができるの?と思われたかもしれません。ちょっと大げさに表現していますが,これらはいずれも今日の「回帰分析」を応用したRQです。RQのうしろ,カッコ内の分析名がより正しいモデル名なのですが,いずれも「回帰分析」の応用系なのです。
回帰分析とは,ある目的となる変数を説明する関数を当てはめることです。一般に,\[y=ax+b\] という線形関数を当てはめます。
身長と体重を例にして説明しましょう。 この二つの変数の散布図を書いてみます。
library(ggplot2)
g <- ggplot(baseball,aes(x=height,y=weight)) + geom_point()
plot(g)
右肩あがりの関係がありそうです。線を入れてみます。
g <- g + geom_smooth(method="lm",se=FALSE)
plot(g)
この線の引き方が,線形回帰をするということです。回帰モデルをデータに当てはめる,とも言います。 lmは,liner model(線形モデル)という意味です。
この線形モデルを数式で表現するのが次の方法です。
reg <- lm(weight~height,data=baseball)
reg
##
## Call:
## lm(formula = weight ~ height, data = baseball)
##
## Coefficients:
## (Intercept) height
## -160.906 1.377
すなわち,体重=1.377* 身長 -160.906 という関係にあるということがわかります。言い換えると,身長が1cm高いと体重が1.37kg大きいということです(このデータの中では)。また。Intercept(切片)は身長が0だった時の(!)値です。
もちろん,すべてのデータがこの直線上に乗っているわけではありません。むしろほとんど外れていますが,この線が「当てはまっている」といえるのはどうしてでしょうか?ここでは,最小二乗基準 によってこの数字を決めています。最小二乗法による回帰分析,ということもあります。 推定値の決め方は他にもある,ということを頭の片隅に置いておいてください。
さて,最小二乗基準で推定値が得られはしましたが,誤差も多いので,これをどう評価すればよいでしょうか。 ちなみに,推定値や誤差は結果のオブジェクトに入っています。
reg$residuals #誤差。残差ともいう。
## 1 2 3 4 5 6
## 3.4372215 15.8287594 13.0456836 9.3214092 -4.0701287 14.9592721
## 7 8 9 10 11 12
## -11.0701287 6.1908966 14.1908966 4.0750843 15.5530338 6.1908966
## 13 14 15 16 17 18
## -7.0701287 6.2920085 4.1908966 11.9445717 2.0603840 10.0750843
## 19 20 21 22 23 24
## -7.5480781 -3.9249157 -1.9249157 -1.9249157 7.2055970 -2.1712406
## 25 26 27 28 29 30
## -2.5333778 9.7129472 -10.5480781 -0.6638904 2.2055970 -12.9249157
## 31 32 33 34 35 36
## 0.0897847 -6.3017532 -12.1859409 -10.9249157 -8.5627785 -7.4322659
## 37 38 39 40 41 42
## 5.2055970 -1.1712406 1.0750843 2.6835464 -1.9249157 -13.5480781
## 43 44 45 46 47 48
## -9.5480781 7.2055970 -13.0554283 -11.9249157 0.3214092 -4.9249157
## 49 50 51 52 53 54
## 9.2055970 -0.1712406 -7.8238038 -7.4175655 -4.7944030 -13.7944030
## 55 56 57 58 59 60
## 4.6982468 2.9592721 21.9592721 1.5824345 12.9445717 3.0750843
## 61 62 63 64 65 66
## -8.4175655 -1.9249157 -8.9249157 1.3361096 -3.4175655 10.4666222
## 67 68 69 70 71 72
## -3.5480781 3.1908966 -5.0407279 -3.8091034 3.3214092 5.2055970
## 73 74 75 76 77 78
## -14.0407279 -4.9396160 4.3361096 -2.0554283 1.6982468 -1.0407279
reg$fitted.values #推定値
## 1 2 3 4 5 6 7
## 96.56278 84.17124 108.95432 89.67859 102.07013 80.04073 102.07013
## 8 9 10 11 12 13 14
## 93.80910 93.80910 86.92492 103.44697 93.80910 102.07013 111.70799
## 15 16 17 18 19 20 21
## 93.80910 91.05543 97.93962 86.92492 85.54808 86.92492 86.92492
## 22 23 24 25 26 27 28
## 86.92492 82.79440 84.17124 74.53338 77.28705 85.54808 78.66389
## 29 30 31 32 33 34 35
## 82.79440 86.92492 75.91022 88.30175 95.18594 86.92492 96.56278
## 36 37 38 39 40 41 42
## 92.43227 82.79440 84.17124 86.92492 99.31645 86.92492 85.54808
## 43 44 45 46 47 48 49
## 85.54808 82.79440 91.05543 86.92492 89.67859 86.92492 82.79440
## 50 51 52 53 54 55 56
## 84.17124 104.82380 81.41757 82.79440 82.79440 88.30175 80.04073
## 57 58 59 60 61 62 63
## 80.04073 81.41757 91.05543 86.92492 81.41757 86.92492 86.92492
## 64 65 66 67 68 69 70
## 78.66389 81.41757 74.53338 85.54808 93.80910 80.04073 93.80910
## 71 72 73 74 75 76 77
## 89.67859 82.79440 80.04073 97.93962 78.66389 91.05543 88.30175
## 78
## 80.04073
この推定値と実際のデータとの相関係数が当てはまりの良さ(適合度)の一つの指標です。相関係数が高ければ高いほど,良い予測ができていると言えます。 相関係数は-1から1までの値を取りますが,適合度指標としては相関係数の二乗を使います(R-squared)。 この指標も実は結果のオブジェクトに既に入っています。
summary(reg)
##
## Call:
## lm(formula = weight ~ height, data = baseball)
##
## Residuals:
## Min 1Q Median 3Q Max
## -14.0407 -5.9865 -0.4176 5.0788 21.9593
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -160.9058 30.0502 -5.355 8.81e-07 ***
## height 1.3768 0.1662 8.285 3.13e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 8.247 on 76 degrees of freedom
## Multiple R-squared: 0.4746, Adjusted R-squared: 0.4677
## F-statistic: 68.65 on 1 and 76 DF, p-value: 3.128e-12
0.46ほどですね。これは実際のデータとしては,とても良い当てはまりだと言えます。
説明する変数が増えたら重回帰分析(Multiple Regression Analysis)と名前が変わります。 モデルの書き方はそれほど変わりません。
reg2 <- lm(HR~height+weight,data=baseball)
reg2
##
## Call:
## lm(formula = HR ~ height + weight, data = baseball)
##
## Coefficients:
## (Intercept) height weight
## -16.1248 -0.1603 0.6568
summary(reg2)
##
## Call:
## lm(formula = HR ~ height + weight, data = baseball)
##
## Residuals:
## Min 1Q Median 3Q Max
## -13.614 -5.449 -2.470 5.274 19.062
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -16.1248 34.0112 -0.474 0.637
## height -0.1603 0.2211 -0.725 0.471
## weight 0.6568 0.1106 5.937 8.42e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.954 on 75 degrees of freedom
## Multiple R-squared: 0.4309, Adjusted R-squared: 0.4158
## F-statistic: 28.4 on 2 and 75 DF, p-value: 6.584e-10
このことから,(同じ身長の人であれば)体重が0.65kg増えるとホームランが一本増えることになります。身長はHRとは関係なかったようですね!
説明変数が複数になると,解釈はちょっと注が必要です。従属変数に対して個別に影響しているのではなく,他の説明変数を統制した時の影響力の大きさである,と解釈する必要があることに注意してください。このことについては特に豊田秀樹編著「もう一つの重回帰分析」東京図書で言及されていますので,副読本として紹介しておきます。
さて,説明変数に年収を入れて見ましょう。
reg2.2 <- lm(HR~height+weight+pay,data=baseball)
reg2.2
##
## Call:
## lm(formula = HR ~ height + weight + pay, data = baseball)
##
## Coefficients:
## (Intercept) height weight pay
## -6.5900043 -0.1950482 0.5697236 0.0002792
summary(reg2.2)
##
## Call:
## lm(formula = HR ~ height + weight + pay, data = baseball)
##
## Residuals:
## Min 1Q Median 3Q Max
## -16.979 -4.920 -1.905 4.408 16.498
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6.590e+00 3.189e+01 -0.207 0.83686
## height -1.950e-01 2.068e-01 -0.943 0.34862
## weight 5.697e-01 1.064e-01 5.356 9.21e-07 ***
## pay 2.792e-04 8.078e-05 3.457 0.00091 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.43 on 74 degrees of freedom
## Multiple R-squared: 0.51, Adjusted R-squared: 0.4902
## F-statistic: 25.68 on 3 and 74 DF, p-value: 1.721e-11
年収(pay)も統計的に有意な説明変数のようですが,係数が0.00002792(2.792e-04)ととても小さな値になっています。この小さい値は,影響が小さいことを意味するのではなく,payが1万円(元のデータの単位が「万円」)上がると0.00002792本ホームランが増える,ということを意味しているのですが,ちょっとわかりにくいですね。
また,0.00002792と体重の係数0.5697ではどちらが大きいか?という比較も意味をなしません。単位が違うからです。 そこで,単位にとらわれずに重要度を比較できるようにするために,データの標準化を考えます。
baseball2 <- subset(baseball,select=c("HR","weight","height","pay")) #データの一部抜き出し
baseball2z <- scale(baseball2) #標準化
baseball2z <- data.frame(baseball2z) #データフレーム型にしておく
summary(baseball2z)
## HR weight height pay
## Min. :-1.2173 Min. :-1.9418 Min. :-1.7228 Min. :-1.0212
## 1st Qu.:-0.9290 1st Qu.:-0.7696 1st Qu.:-0.6619 1st Qu.:-0.7809
## Median :-0.3524 Median :-0.1724 Median :-0.1315 Median :-0.4248
## Mean : 0.0000 Mean : 0.0000 Mean : 0.0000 Mean : 0.0000
## 3rd Qu.: 0.6807 3rd Qu.: 0.6238 3rd Qu.: 0.5316 3rd Qu.: 0.5878
## Max. : 2.1463 Max. : 3.0125 Max. : 3.0512 Max. : 3.0469
こうした上で,あらためて。
reg2.3 <- lm(HR~height+weight+pay,data=baseball2z)
reg2.3
##
## Call:
## lm(formula = HR ~ height + weight + pay, data = baseball2z)
##
## Coefficients:
## (Intercept) height weight pay
## -2.268e-16 -1.060e-01 6.189e-01 3.014e-01
summary(reg2.3)
##
## Call:
## lm(formula = HR ~ height + weight + pay, data = baseball2z)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.6317 -0.4729 -0.1831 0.4236 1.5855
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2.268e-16 8.085e-02 0.000 1.00000
## height -1.060e-01 1.124e-01 -0.943 0.34862
## weight 6.189e-01 1.155e-01 5.356 9.21e-07 ***
## pay 3.014e-01 8.721e-02 3.457 0.00091 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.714 on 74 degrees of freedom
## Multiple R-squared: 0.51, Adjusted R-squared: 0.4902
## F-statistic: 25.68 on 3 and 74 DF, p-value: 1.721e-11
こうすると単位が整っていますから,大きさを比較することができます。体重の係数は0.6189,年収の係数は0.3014ですから,体重の方が説明する力(影響力)は大きいと考えることができます。
前回はMDSで選手をプロットしたりしたのでした。ちょっと再現して見ましょう。
身長と体重だけのサブセットを作って選手の散布図(!)を書いて見ます。
subdat <- subset(baseball,select=c("height","weight")) #二変数だけ抽出
subdat.dist <- dist(subdat) # 距離行列を計算
player.map <- cmdscale(subdat.dist,2) # MDSで座標を得る
plot(player.map,type="n")
text(player.map,levels(baseball$name))
たくさんの選手がいて,野球に詳しくない人には特徴がわかりにくいかもしれません。 しかし,MDSによって一人一人に座標=連続的な数字が割り当てられたのですから,その座標値を予測する変数があれば,次元の意味がわかるかもしれません!
baseball$dim1 <- player.map[,1]
reg4 <- lm(dim1~HR, data=baseball)
summary(reg4)
##
## Call:
## lm(formula = dim1 ~ HR, data = baseball)
##
## Residuals:
## Min 1Q Median 3Q Max
## -29.573 -3.629 1.138 5.721 19.802
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 9.3876 1.6662 5.634 2.84e-07 ***
## HR -0.7411 0.1019 -7.273 2.68e-10 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 9.305 on 76 degrees of freedom
## Multiple R-squared: 0.4103, Adjusted R-squared: 0.4026
## F-statistic: 52.89 on 1 and 76 DF, p-value: 2.682e-10
これはホームランの本数を独立変数にして,座標を従属変数にした時の回帰係数です。-0.7なのでホームランが増えるほど左のほうにプロットされるようです。ホームラン次元なのかもしれませんねえ。