Régression multiple en Python

Shivam Arora 10 octobre 2023
  1. Utilisez le module statsmodel.api pour effectuer une régression linéaire multiple en Python
  2. Utilisez le numpy.linalg.lstsq pour effectuer une régression linéaire multiple en Python
  3. Utilisez la méthode scipy.curve_fit() pour effectuer une régression linéaire multiple en Python
Régression 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]]