Python で単純な線形回帰を実行する方法 (ステップバイステップ)


単純線形回帰は、単一の説明変数と単一の応答変数の間の関係を理解するために使用できる手法です。

この手法は、データに最もよく「適合」する線を見つけ、次の形式になります。

ŷ = b 0 + b 1 x

金:

  • ŷ : 推定応答値
  • b 0 : 回帰直線の原点
  • b 1 : 回帰直線の傾き

この方程式は、説明変数と応答変数の関係を理解するのに役立ち、(統計的に有意であると仮定して) 説明変数の値に基づいて応答変数の値を予測するために使用できます。

このチュートリアルでは、Python で単純な線形回帰を実行する方法について段階的に説明します。

ステップ 1: データをロードする

この例では、15 人の生徒に対して次の 2 つの変数を含む偽のデータセットを作成します。

  • 特定の試験の合計学習時間数
  • 試験の結果

説明変数として時間、応答変数として検査結果を使用して、単純な線形回帰モデルの当てはめを試みます。

次のコードは、Python でこの偽のデータセットを作成する方法を示しています。

 import pandas as pd

#create dataset
df = pd. DataFrame ({' hours ': [1, 2, 4, 5, 5, 6, 6, 7, 8, 10, 11, 11, 12, 12, 14],
                   ' score ': [64, 66, 76, 73, 74, 81, 83, 82, 80, 88, 84, 82, 91, 93, 89]})
      

#view first six rows of dataset
df[0:6]

    hours score
0 1 64
1 2 66
2 4 76
3 5 73
4 5 74
5 6 81

ステップ 2: データを視覚化する

単純な線形回帰モデルを当てはめる前に、まずデータを視覚化して理解する必要があります。

まず、時間スコアの関係がほぼ線形であることを確認します。これは、単純な線形回帰の基礎となる仮定だからです。

単純な散布図を作成して、2 つの変数間の関係を視覚化できます。

 import matplotlib.pyplot as plt

plt. scatter (df.hours, df.score)
plt. title (' Hours studied vs. Exam Score ')
plt. xlabel (' Hours ')
plt. ylabel (' Score ')
plt. show ()

Python の点群

グラフから、関係が線形であることがわかります。時間数が増加するにつれて、スコアも直線的に増加する傾向があります。

次に、箱ひげ図を作成して検査結果の分布を視覚化し、 外れ値をチェックします。デフォルトでは、Python は、観測値が第 3 四分位 (Q3) より上の四分位範囲の 1.5 倍、または第 1 四分位 (Q1) より下の四分位範囲の 1.5 倍である場合、その観測を外れ値として定義します。

観測値が外れ値である場合、箱ひげ図に小さな円が表示されます。

 df. boxplot (column=[' score ']) 

Python の箱ひげ図

箱ひげ図には小さな円はありません。これは、データセットに外れ値がないことを意味します。

ステップ 3: 単純な線形回帰を実行する

変数間の関係が線形であり、外れ値がないことを確認したら、時間を説明変数として、スコアを応答変数として使用して、単純な線形回帰モデルの近似に進むことができます。

注: statsmodels ライブラリのOLS() 関数を使用して回帰モデルを適合させます。

 import statsmodels.api as sm

#define response variable
y = df[' score ']

#define explanatory variable
x = df[[' hours ']]

#add constant to predictor variables
x = sm. add_constant (x)

#fit linear regression model
model = sm. OLS (y,x). fit ()

#view model summary
print ( model.summary ())

                            OLS Regression Results                            
==================================================== ============================
Dept. Variable: R-squared score: 0.831
Model: OLS Adj. R-squared: 0.818
Method: Least Squares F-statistic: 63.91
Date: Mon, 26 Oct 2020 Prob (F-statistic): 2.25e-06
Time: 15:51:45 Log-Likelihood: -39,594
No. Observations: 15 AIC: 83.19
Df Residuals: 13 BIC: 84.60
Model: 1                                         
Covariance Type: non-robust                                         
==================================================== ============================
                 coef std err t P>|t| [0.025 0.975]
-------------------------------------------------- ----------------------------
const 65.3340 2.106 31.023 0.000 60.784 69.884
hours 1.9824 0.248 7.995 0.000 1.447 2.518
==================================================== ============================
Omnibus: 4,351 Durbin-Watson: 1,677
Prob(Omnibus): 0.114 Jarque-Bera (JB): 1.329
Skew: 0.092 Prob(JB): 0.515
Kurtosis: 1.554 Cond. No. 19.2
==================================================== ============================

モデルの概要から、近似された回帰式は次のとおりであることがわかります。

スコア = 65.334 + 1.9824*(時間)

これは、学習時間が追加されるごとに、試験の平均スコアが1.9824ポイント増加することを意味します。元の値65,334は、0 時間勉強した生徒の予想される試験の平均スコアを示しています。

この方程式を使用して、学生の勉強時間に基づいて予想される試験の得点を求めることもできます。たとえば、10 時間勉強した学生は、試験スコア85.158を達成する必要があります。

スコア = 65.334 + 1.9824*(10) = 85.158

モデルの概要の残りの部分を解釈する方法は次のとおりです。

  • P>|t| :これは、モデル係数に関連付けられた p 値です。時間の p 値 (0.000) は 0.05 よりも大幅に小さいため、時間スコアの間に統計的に有意な関連があると言えます。
  • R 二乗:この数値は、試験の得点の変動のパーセンテージが勉強時間数によって説明できることを示しています。一般に、回帰モデルの R 二乗値が大きいほど、説明変数は応答変数の値をより適切に予測できます。この場合、スコアの変動の83.1%は勉強時間によって説明されます。
  • F 統計量と p 値: F 統計量 ( 63.91 ) と対応する p 値 ( 2.25e-06 ) は、回帰モデルの全体的な重要性、つまりモデル内の説明変数が変動の説明に役立つかどうかを示します。 。応答変数に。この例の p 値は 0.05 未満であるため、モデルは統計的に有意であり、時間はスコアの変動を説明するのに役立つと考えられます。

ステップ 4: 残差プロットを作成する

単純な線形回帰モデルをデータに当てはめた後の最後のステップは、残差プロットを作成することです。

線形回帰の重要な前提の 1 つは、回帰モデルの残差がほぼ正規分布し、説明変数の各レベルで等分散であるということです。これらの前提が満たされない場合、回帰モデルの結果は誤解を招くか、信頼性が低い可能性があります。

これらの仮定が満たされていることを確認するために、次の残差プロットを作成できます。

残差と近似値のプロット:このプロットは等分散性を確認するのに役立ちます。 X 軸は近似値を表示し、Y 軸は残差を表示します。残差がゼロ値の周囲でグラフ全体にランダムかつ均一に分布しているように見える限り、等分散性に違反していないと仮定できます。

 #define figure size
fig = plt. figure (figsize=(12.8))

#produce residual plots
fig = sm.graphics. plot_regress_exog (model, ' hours ', fig=fig)

Python の残差プロット

4 つのプロットが作成されます。右上隅にあるのは、残差プロットと調整済みプロットです。このプロットの X 軸は予測変数の実際の値を示し、Y 軸はその値の残差を示します。

残差はゼロの周りにランダムに分散しているように見えるため、これは説明変数の不均一分散性が問題ではないことを示しています。

QQ プロット:このプロットは、残差が正規分布に従うかどうかを判断するのに役立ちます。プロット内のデータ値が 45 度の角度でほぼ直線に従っている場合、データは正規分布しています。

 #define residuals
res = model. reside

#create QQ plot
fig = sm. qqplot (res, fit= True , line=" 45 ")
plt.show() 

Python での QQ プロット

残差は 45 度の線からわずかに逸脱していますが、重大な懸念を引き起こすほどではありません。正規性の仮定が満たされていると仮定できます。

残差は正規分布し、等分散であるため、単純な線形回帰モデルの仮定が満たされていることを確認しました。したがって、モデルの出力は信頼できます。

このチュートリアルで使用される完全な Python コードは、 ここにあります。

コメントを追加する

メールアドレスが公開されることはありません。 が付いている欄は必須項目です