【R言語】単回帰分析

R言語で統計学 R言語
R言語で統計学

 

回帰分析の中でも説明変数が一つであるものを単回帰分析と言います。

今回はそんな単回帰分析についてやっていきます。

対象データ

今回の対象データはR言語の標準データセットに含まれる「cars」を用います。

# スピードと車の停止距離データセットを使用
libary(datasets)
data(cars)

「cars」データセットには自動車の速度と制動距離のデータから構成されています。

データセットの中身を確認すると以下のようになります。

#データの構造と項目の一覧を確認する
str(cars)

#データフレームの先頭と最後を表示
head(cars)
ctail(cars)

#関数summary()を使って平均値,中央値などを表示
summary(cars)
> str(cars)
'data.frame':	50 obs. of  2 variables:
 $ speed: num  4 4 7 7 8 9 10 10 10 11 ...
 $ dist : num  2 10 4 22 16 10 18 26 34 17 ...
> #データフレームの先頭と最後を表示
> head(cars)
  speed dist
1     4    2
2     4   10
3     7    4
4     7   22
5     8   16
6     9   10

このように、2変数から構成されているため単回帰分析には持って来いなデータセットです。

散布図

いきなり回帰分析を行う前にデータの特性を見てみましょう。

#速度と制動距離の関係を図示(標準のplot()関数)
plot(cars$speed, cars$dist)

散布図を見る限りではおおよそ正の相関がありそうだということがわかります。

もっとわかりやすくするために、gplot2を用いて回帰直線も図示してみましょう。

#速度と制動距離の関係を図示
library(ggplot2)
ggplot(cars, aes( x=speed, y=dist) )+              #x軸とy軸を指定
  geom_point(colour="purple", size=3, alpha=0.5)+  #色,サイズ,透明度
  stat_smooth(method="lm", se=T)                   #回帰直線を加える
# seは回帰直線を描く際に上下に幅(95%信頼区間)を持たせる指定
# se=Tで直線に幅を加えて描く(se=Fで直線のみを描く)  

回帰直線と回帰直線の95%信頼区間を追加で描写すると、回帰分析のイメージがし易いですね。

単回帰分析

それでは実際に単回帰分析を行っていきましょう。

回帰分析はlm関数を用います。

今回は目的変数を”dist”。説明変数を”speed”にして分析を行います。
このとき、目的変数distを\(y\)説明変数speedを\(x\)としたとき下記の回帰式で表せるようにするのが回帰分析です。

\(y = b_0 + b_1x\)

#関数lm()を使って回帰モデルを作成する
#扱う変数を括弧内に 目的変数~説明変数 の形で記述
#これだけでは詳しい情報は表示されない
lm( dist ~ speed, data=cars)
Call:
lm(formula = dist ~ speed, data = cars)

Coefficients:
(Intercept)        speed  
    -17.579        3.932  

コメントにも記載の通り、これだと詳細がわからないため詳細が出力するようにします。

#モデルを一旦LM1という名前でオブジェクトに格納する
LM1 <- lm( dist ~ speed, data=cars)

#一旦格納したモデルを関数summary()で表示する
#この場合はより詳しい情報が表示される
summary(LM1)
Residuals:
    Min      1Q  Median      3Q     Max 
-29.069  -9.525  -2.272   9.215  43.201 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -17.5791     6.7584  -2.601   0.0123 *  
speed         3.9324     0.4155   9.464 1.49e-12 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 15.38 on 48 degrees of freedom
Multiple R-squared:  0.6511,	Adjusted R-squared:  0.6438 
F-statistic: 89.57 on 1 and 48 DF,  p-value: 1.49e-12

それぞれの出力結果は以下の内容を表しています。

Residuals・・・・・残差の分布
 残差の分布を示す。最小値、四分位、最大値が示される。

Estimate・・・・・パラメータの推定値
 1行目のInterceptは切片を表す。2行目は説明変数にかかる回帰係数。

Std.Error・・・・・標準誤差
 パラメータの推定に伴うブレ幅。

t value・・・・・・t値
 パラメータの推定値を標準誤差で割ったもの。

Pr(>|t|)・・・・・有意確率
 パラメータの値が0であるという可能性を検証した結果。この確率が0.05以上であれば、有意ではないと判断する。

Mlutiple R-squared・・・・決定係数
 モデルのデータへの適合度合いの指標。目的変数の値の変動のうち、何%をモデルで説明できるかを示す。

Adjusted R-squared・・・・自由度調整済み決定係数
 決定係数をパラメータの数で調節した指標。過度に複雑なモデルでは値が低くなる。

p-value・・・・有意確率(モデル全体)
 すべての回帰係数の値が0であるという可能性を検証した結果。この確率が0.05以上であれば、有意でないと判断する。

今回の回帰分析で得られた回帰式は以下になります。

\(y = -17.58 + 3.93x\)

つまり、自動車の速度が1増加すると制動距離は3.93増加するという関係が成り立ちます。

おわりに

より精度の良い回帰式を求めるには説明変数の加工が必要になりそうです。

説明変数が少ないほうが解釈がし易いですが、精度の向上には限界がありそうですね。

GitHubに今回のコードを一式置いています。宜しければぜひご覧ください。
 

https://github.com/soeatu/RegressionAnalysis/blob/main/RegressionAnalysis.R
タイトルとURLをコピーしました