Python での重回帰

Shivam Arora 2023年10月10日
  1. Python で statsmodel.api モジュールを使用して複数の線形回帰を実行する
  2. Python で numpy.linalg.lstsq を使用して多重線形回帰を実行する
  3. Python で scipy.curve_fit() メソッドを使用して複数の線形回帰を実行する
Python での重回帰

このチュートリアルでは、多重線形回帰とそれを Python で実装する方法について説明します。

多重線形回帰は、2つ以上の変数と 1つの応答変数の間の関係を、それらの間に線形回帰方程式を当てはめることによって計算するモデルです。これは、独立変数の変化に対する従属変数間の依存関係または変化を推定するのに役立ちます。標準の多重線形回帰では、すべての独立変数が同時に考慮されます。

Python で statsmodel.api モジュールを使用して複数の線形回帰を実行する

Python の statsmodel.api モジュールには、線形回帰を実装するための関数が備わっています。通常の最小二乗回帰を実行する OLS() 関数を使用します。

pandas モジュールを使用してデータセットをインポートするか、独自のダミーデータを作成して重回帰を実行できます。従属変数と独立変数を分岐して、これらの変数間に線形回帰モデルを適用します。

OLS() 関数を使用して回帰モデルを作成します。次に、この関数に独立変数と従属変数を渡し、fit() 関数を使用してこのモデルを近似します。この例では、重回帰を示すためにいくつかの配列を作成しました。

以下のコードを参照してください。

import statsmodels.api as sm
import numpy as np

y = [1, 2, 3, 4, 3, 4, 5, 3, 5, 5, 4, 5, 4, 5, 4, 5, 6, 0, 6, 3, 1, 3, 1]
X = [
    [0, 2, 4, 1, 5, 4, 5, 9, 9, 9, 3, 7, 8, 8, 6, 6, 5, 5, 5, 6, 6, 5, 5],
    [4, 1, 2, 3, 4, 5, 6, 7, 5, 8, 7, 8, 7, 8, 7, 8, 6, 8, 9, 2, 1, 5, 6],
    [4, 1, 2, 5, 6, 7, 8, 9, 7, 8, 7, 8, 7, 4, 3, 1, 2, 3, 4, 1, 3, 9, 7],
]


def reg_m(y, x):
    ones = np.ones(len(x[0]))
    X = sm.add_constant(np.column_stack((x[0], ones)))
    for ele in x[1:]:
        X = sm.add_constant(np.column_stack((ele, X)))
    results = sm.OLS(y, X).fit()
    return results


print(reg_m(y, x).summary())

出力:

 OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.241
Model:                            OLS   Adj. R-squared:                  0.121
Method:                 Least Squares   F-statistic:                     2.007
Date:                Wed, 16 Jun 2021   Prob (F-statistic):              0.147
Time:                        23:57:15   Log-Likelihood:                -40.810
No. Observations:                  23   AIC:                             89.62
Df Residuals:                      19   BIC:                             94.16
Df Model:                           3                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
x1            -0.0287      0.135     -0.213      0.834      -0.311       0.254
x2             0.2684      0.160      1.678      0.110      -0.066       0.603
x3             0.1339      0.160      0.839      0.412      -0.200       0.468
const          1.5123      0.986      1.534      0.142      -0.551       3.576
==============================================================================
Omnibus:                        9.472   Durbin-Watson:                   2.447
Prob(Omnibus):                  0.009   Jarque-Bera (JB):                7.246
Skew:                          -1.153   Prob(JB):                       0.0267
Kurtosis:                       4.497   Cond. No.                         29.7
==============================================================================

summary() 関数を使用すると、回帰の結果と係数を出力できます。R-Squared および Adjusted R-Squared は、回帰の効率について教えてくれます。

Python で numpy.linalg.lstsq を使用して多重線形回帰を実行する

numpy.linalg.lstsq メソッドは、法線||B-Ax||を最小化するためにベクトル x を計算することにより、方程式を Ax=B として解くことにより、提供された方程式の最小二乗解を返します。

以下に示すように、これを使用して重回帰を実行できます。

import numpy as np

y = [1, 2, 3, 4, 3, 4, 5, 3, 5, 5, 4, 5, 4, 5, 4, 5, 6, 0, 6, 3, 1, 3, 1]
X = [
    [0, 2, 4, 1, 5, 4, 5, 9, 9, 9, 3, 7, 8, 8, 6, 6, 5, 5, 5, 6, 6, 5, 5],
    [4, 1, 2, 3, 4, 5, 6, 7, 5, 8, 7, 8, 7, 8, 7, 8, 6, 8, 9, 2, 1, 5, 6],
    [4, 1, 2, 5, 6, 7, 8, 9, 7, 8, 7, 8, 7, 4, 3, 1, 2, 3, 4, 1, 3, 9, 7],
]
X = np.transpose(X)  # transpose so input vectors
X = np.c_[X, np.ones(X.shape[0])]  # add bias term
linreg = np.linalg.lstsq(X, y, rcond=None)[0]
print(linreg)

出力:

[ 0.1338682   0.26840334 -0.02874936  1.5122571 ]

各変数の係数を前の方法と比較すると、結果が同じであることがわかります。ここで、最終結果は NumPy 配列になります。

Python で scipy.curve_fit() メソッドを使用して複数の線形回帰を実行する

このモデルは、いくつかの値のモデルを計算するためにさらに使用される関数を使用し、その結果は、この関数を指定されたデータに適合させるために非線形最小二乗法で使用されます。

以下のコードを参照してください。

from scipy.optimize import curve_fit
import scipy
import numpy as np


def function_calc(x, a, b, c):
    return a + b * x[0] + c * x[1]


y = [1, 2, 3, 4, 3, 4, 5, 3, 5, 5, 4, 5, 4, 5, 4, 5, 6, 0, 6, 3, 1, 3, 1]
X = [
    [0, 2, 4, 1, 5, 4, 5, 9, 9, 9, 3, 7, 8, 8, 6, 6, 5, 5, 5, 6, 6, 5, 5],
    [4, 1, 2, 3, 4, 5, 6, 7, 5, 8, 7, 8, 7, 8, 7, 8, 6, 8, 9, 2, 1, 5, 6],
    [4, 1, 2, 5, 6, 7, 8, 9, 7, 8, 7, 8, 7, 4, 3, 1, 2, 3, 4, 1, 3, 9, 7],
]

popt, pcov = curve_fit(function_calc, x, y)
print(popt)
print(pcov)

出力:

[1.44920591 0.12720273 0.26001833]
[[ 0.84226681 -0.06637804 -0.06977243]
 [-0.06637804  0.02333829 -0.01058201]
 [-0.06977243 -0.01058201  0.02288467]]

関連記事 - Python Regression