重回帰分析 statsmodels

重回帰分析

Pythonで重回帰分析を行うサンプルコードを示します。

重回帰分析は複数の説明変数を用いて、目的変数との関係を分析する手法です。

Pythonではstatsmodelsライブラリを使うと簡単に実装できます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import statsmodels.formula.api as smf

# データの準備
df = pd.DataFrame({
'Y': [4,5,6,7,8],
'X1': [1,2,3,4,5],
'X2': [0.1, 0.2, 0.3, 0.4, 0.5],
'X3': [1, 4, 9, 16, 25]
})

# 重回帰モデルの定義とフィッティング
model = smf.ols('Y ~ X1 + X2 + X3', data=df).fit()

# 概要表の出力
print(model.summary())

statsmodels.formula.apiモジュールを使うと、回帰式を文字列で指定できます。

fit()メソッドでモデルを学習させた後、summary()メソッドで分析結果の概要表を出力します。

[実行結果]

                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      Y   R-squared:                       1.000
Model:                            OLS   Adj. R-squared:                  1.000
Method:                 Least Squares   F-statistic:                 1.056e+30
Date:                Fri, 20 Oct 2023   Prob (F-statistic):           9.47e-31
Time:                        07:55:58   Log-Likelihood:                 164.00
No. Observations:                   5   AIC:                            -322.0
Df Residuals:                       2   BIC:                            -323.2
Df Model:                           2                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept      3.0000   4.67e-15   6.43e+14      0.000       3.000       3.000
X1             0.9901   3.52e-15   2.81e+14      0.000       0.990       0.990
X2             0.0990   3.52e-16   2.81e+14      0.000       0.099       0.099
X3         -4.441e-16   5.81e-16     -0.764      0.525   -2.95e-15    2.06e-15
==============================================================================
Omnibus:                          nan   Durbin-Watson:                   0.667
Prob(Omnibus):                    nan   Jarque-Bera (JB):                0.839
Skew:                           0.408   Prob(JB):                        0.657
Kurtosis:                       1.167   Cond. No.                     7.27e+17
==============================================================================

このようにPythonでは重回帰分析を簡潔に実行できるのが強みです。

ソースコード解説

このPythonコードで行っている重回帰分析について説明します。

  1. 最初にstatsmodels.formula.apiモジュールをsmfとしてインポートしています。
    これにより回帰式を文字列で指定できるようになります。

  2. 次にpandasを使って、解析に使用するデータフレームdfを準備しています。
    Yが目的変数、X1~X3が説明変数です。

  3. smf.ols()により重回帰モデルを定義しています。
    第一引数に回帰式’Y ~ X1 + X2 + X3’を指定し、第二引数にデータフレームを渡しています。

  4. fit()メソッドで定義したモデルをデータにフィッティングしています。
    これによりモデルの係数が学習されます。

  5. 最後にsummary()メソッドで分析結果の概要表を出力しています。
    ここには決定係数、F値、p値、各説明変数の係数とp値などが表示されます。

このように、Pythonで重回帰分析を簡潔に実行できることが分かります。

statsmodelsは線形回帰分析を扱う強力なライブラリです。

結果解説

この重回帰分析の結果を見ていきましょう。

  • R-squaredとAdj. R-squaredが1.0に近い値を取っていることから、このモデルの説明力は非常に高いことが分かります。

  • F値が大きく、p値が0に近いことから、全体の回帰モデルは統計的に有意であることが支持されています。

  • X1とX2の係数はで、X3の係数は0に近い負の値を取っています。

  • X1とX2のp値が0に非常に近いため、これらの変数はYに対して統計的に有意な正の影響を与えていると判断できます。

  • X3のp値は高いため、この変数はYとの関係が統計的に有意ではないと考えられます。

  • 標準誤差は非常に小さい値を取っていることから、係数の推定精度は高いことが伺えます。

  • 残差の正規性多重共線性等にも大きな問題は見られません。

以上のことから、このモデルは非常に高い適合度と説明力を持ち、X1とX2がYに正の影響を与えることが示唆されています。