【R】単回帰分析のやり方と結果の見方

この記事ではRで単回帰分析を実行する方法と、その結果の見方について解説していきます。

重回帰分析に関してはこちらで簡単に解説しています。

【R】重回帰分析のやり方と結果の見方

今回はRの標準で入っているcarsのデータセットを使用していきますのでまずは下記の手順でデータを読み込んでください。

# データセット読み込み
data(cars)
# データセットの一部を確認
head(cars)
speed dist
1 4 2
2 4 10
3 7 4
4 7 22
5 8 16
6 9 10

単回帰分析の実行

それでは早速単回帰分析を実行していきましょう。
Rでは標準で「lm」関数があるので、そちらを利用するっことで簡単に単回帰分析を実行することができます。

# 単回帰分析を実行
result <- lm(dist ~ speed, data = cars)
result
Call:
  lm(formula = dist ~ speed, data = cars)
Coefficients:
  (Intercept) speed 
  -17.579 3.932 

実行自体はこれだけでOKです。結構簡単ですよね。

単回帰分析の結果の見方

上記実行結果の見方ですが、lm()を実行するとした結果をresultに格納していますが、中身を確認すると「Call」と「Coefficients」という2つの要素が入っていることがわかります。

簡単に説明すると、それぞれ下記を表しています。

  • 「Call」は回帰の式
  • 「Coefficients」は回帰係数

「Coefficients」に関しては、速度(spped)の係数が3.932で、定数項が-17.579であると読み取ることができます。

つまり、下記の直線で表せることを意味しています。

dist = 3.932 * speed - 17.579

ggplotを使って結果を可視化

上記の結果を今度はggplotを使って可視化してみましょう。

library(ggplot2)
# 回帰直線の係数
coeff <- result$coefficients
# 回帰直線の傾き
slope <- coeff[2]
# 回帰直線の切片
intercept <- coeff[1]
# グラフの作成と描画
p <- ggplot(data = cars, aes(x = speed, y = dist)) +
geom_point() + geom_abline(intercept = intercept, slope = slope)
print(p)

f:id:yunosuke1107:20200815111605p:plain

このグラフを見ると、多少直線から乖離している点があるものの、全体的にはある程度フィットしていることがわかります。

回帰分析結果の要約

今度は回帰分析の結果をsummary()関数を使って要約してみましょう。

summary(result)
Call:
lm(formula = dist ~ speed, data = cars)

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

summary()関数を使うと6つの要素を取得することができます。

summary()関数の結果の見方

項目 説明
Call 回帰に用いた式
Residuals 残差の統計量。残差は実績値と予測値の差で定義されます。
Coefficients 回帰係数。(Intercept)が回帰直線の切片、speedが傾きを表しています。
Residual standard error 残差の標準誤差とその自由度を表しています。
Multiple R-squared 決定係数R2を表しています。
F-statistic 分散分析のF-値とその自由度を表しています

 

回帰の診断

ここからは、上記の回帰直線で、速度と距離の関係をどれくらいフィッティングできているかについて分析してみます。

単回帰分析は、残差に次の過程をおいています。

  • 残差の期待値は0である
  • 残差の分散は等しい(等分散の仮定)
  • 残差はお互いに独立である(独立性の仮定)

残差のプロット

それでは残差分析をしてみましょう。

layout(matrix(1:4, 2, 2))
plot(result)

残差のプロット

Residual vs Fitted

左上のグラフは、横軸に回帰分析でフィッティングした予測値、縦軸に残差をプロットしています。
このグラフは、単回帰分析の過程であった予測値の値によらず残差の期待値が0であること、残差が同じような分布になるかについて確認するために使用します。

今回の分析では、だいたいこの過程が成り立っていることが確認できますが、一部残差(23, 35, 49)が大きくなっています。

Scale-Location

右上のグラフは、横軸に回帰分析でフィッティングした値、縦軸に基準化した残差の平方根をプロットしています。
ここでも23, 35, 49のデータが基準化した残差の平方根が大きくなっていることが確認できるかと思います。

Normal Q-Q

左下のグラフは、横軸に区分点の理論値、縦軸に基準化した残差の区分点をプロットしています。
このグラフは、残差の正規性を確認するために使用されるもので、残差が正規分布に従っていれば点は直線上に並びます。

なので、点が直線から外れた場合、正規分布から外れるという解釈をすればOKです。
このグラフを見るとやはり、23, 35, 49のデータが直線から大きく外れていますね。

Residuals vs Leverage

最後に右下のグラフですが、こちらは横軸にてこ比、縦軸に基準化した残差をプロットしています。
このグラフは外れ値(クックの距離が大きくなるデータ)を見つけるために使用します。クックの距離は、回帰式の推定に大きな影響を与えたデータほど大きくなる指標です。
なので、ここでも23, 35, 49のデータはクックの距離が大きく、回帰式の推定に大きな影響を与えていることが読み取れます。

少し長くなりましたが、単回帰分析のやり方と結果の見方を少し詳細にまとめてみましたので、ぜひ参考にしていただけると幸いです。

実はcarsデータセットの場合、対数を取ってから回帰した方が当てはまりが良くなるそうなので、今度そちらも試してみます!

参考書