Régression multiple en Python
-
Utilisez le module
statsmodel.api
pour effectuer une régression linéaire multiple en Python -
Utilisez le
numpy.linalg.lstsq
pour effectuer une régression linéaire multiple en Python -
Utilisez la méthode
scipy.curve_fit()
pour effectuer une régression linéaire multiple en Python
Ce didacticiel abordera la régression linéaire multiple et comment l’implémenter en Python.
La régression linéaire multiple est un modèle qui calcule la relation entre deux ou plus de deux variables et une seule variable de réponse en ajustant une équation de régression linéaire entre elles. Il permet d’estimer la dépendance ou le changement entre les variables dépendantes au changement dans les variables indépendantes. Dans la régression linéaire multiple standard, toutes les variables indépendantes sont prises en compte simultanément.
Utilisez le module statsmodel.api
pour effectuer une régression linéaire multiple en Python
Le module statsmodel.api
en Python est équipé de fonctions pour implémenter la régression linéaire. Nous utiliserons la fonction OLS()
, qui effectue une régression des moindres carrés ordinaire.
Nous pouvons soit importer un jeu de données à l’aide du module pandas
, soit créer nos propres données factices pour effectuer une régression multiple. Nous bifurquons les variables dépendantes et indépendantes pour appliquer le modèle de régression linéaire entre ces variables.
Nous créons un modèle de régression à l’aide de la fonction OLS()
. Ensuite, nous passons les variables indépendantes et dépendantes dans cette fonction et ajustons ce modèle à l’aide de la fonction fit()
. Dans notre exemple, nous avons créé des tableaux pour démontrer la régression multiple.
Voir le code ci-dessous.
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())
Production:
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
==============================================================================
La fonction summary()
permet d’imprimer les résultats et les coefficients de la régression. Le R-Squared
et le Adjusted R-Squared
nous renseignent sur l’efficacité de la régression.
Utilisez le numpy.linalg.lstsq
pour effectuer une régression linéaire multiple en Python
La méthode numpy.linalg.lstsq
renvoie la solution des moindres carrés à une équation fournie en résolvant l’équation comme Ax=B
en calculant le vecteur x pour minimiser la normale ||B-Ax||
.
Nous pouvons l’utiliser pour effectuer une régression multiple comme indiqué ci-dessous.
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)
Production:
[ 0.1338682 0.26840334 -0.02874936 1.5122571 ]
On peut comparer les coefficients de chaque variable avec la méthode précédente et constater que le résultat est le même. Ici, le résultat final est dans un tableau NumPy
.
Utilisez la méthode scipy.curve_fit()
pour effectuer une régression linéaire multiple en Python
Ce modèle utilise une fonction qui est ensuite utilisée pour calculer un modèle pour certaines valeurs, et le résultat est utilisé avec les moindres carrés non linéaires pour adapter cette fonction aux données données.
Voir le code ci-dessous.
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)
Production:
[1.44920591 0.12720273 0.26001833]
[[ 0.84226681 -0.06637804 -0.06977243]
[-0.06637804 0.02333829 -0.01058201]
[-0.06977243 -0.01058201 0.02288467]]