Comment effectuer une régression des moindres carrés pondérés en Python



L’une des hypothèses clés de la régression linéaire est que les résidus sont distribués avec une variance égale à chaque niveau de la variable prédictive. Cette hypothèse est connue sous le nom d’homoscédasticité .

Lorsque cette hypothèse n’est pas respectée, on dit que l’hétéroscédasticité est présente dans les résidus. Lorsque cela se produit, les résultats de la régression deviennent peu fiables.

Une façon de résoudre ce problème consiste à utiliser la régression des moindres carrés pondérés , qui attribue des poids aux observations de telle sorte que celles avec une faible variance d’erreur reçoivent plus de poids car elles contiennent plus d’informations par rapport aux observations avec une plus grande variance d’erreur.

Ce didacticiel fournit un exemple étape par étape de la façon d’effectuer une régression des moindres carrés de poids en Python.

Étape 1 : Créer les données

Tout d’abord, créons le DataFrame pandas suivant qui contient des informations sur le nombre d’heures étudiées et la note de l’examen final pour 16 étudiants d’une classe :

import pandas as pd

#create DataFrame
df = pd.DataFrame({'hours': [1, 1, 2, 2, 2, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 8],
                   'score': [48, 78, 72, 70, 66, 92, 93, 75, 75, 80, 95, 97,
                             90, 96, 99, 99]})

#view first five rows of DataFrame
print(df.head())

   hours  score
0      1     48
1      1     78
2      2     72
3      2     70
4      2     66

Étape 2 : Ajuster le modèle de régression linéaire simple

Ensuite, nous utiliserons les fonctions du module statsmodels pour ajuster un modèle de régression linéaire simple en utilisant les heures comme variable prédictive et le score comme variable de réponse :

import statsmodels.api as sm

#define predictor and response variables
y = df['score']
X = df['hours']

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

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

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

                            OLS Regression Results                            
==============================================================================
Dep. Variable:                  score   R-squared:                       0.630
Model:                            OLS   Adj. R-squared:                  0.603
Method:                 Least Squares   F-statistic:                     23.80
Date:                Mon, 31 Oct 2022   Prob (F-statistic):           0.000244
Time:                        11:19:54   Log-Likelihood:                -57.184
No. Observations:                  16   AIC:                             118.4
Df Residuals:                      14   BIC:                             119.9
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const         60.4669      5.128     11.791      0.000      49.468      71.465
hours          5.5005      1.127      4.879      0.000       3.082       7.919
==============================================================================
Omnibus:                        0.041   Durbin-Watson:                   1.910
Prob(Omnibus):                  0.980   Jarque-Bera (JB):                0.268
Skew:                          -0.010   Prob(JB):                        0.875
Kurtosis:                       2.366   Cond. No.                         10.5

À partir du résumé du modèle, nous pouvons voir que la valeur R au carré du modèle est de 0,630 .

Connexes : Qu’est-ce qu’une bonne valeur R au carré ?

Étape 3 : Ajuster le modèle des moindres carrés pondérés

Ensuite, nous pouvons utiliser la fonction WLS() de statsmodels pour effectuer des moindres carrés pondérés en définissant les poids de telle manière que les observations avec une variance plus faible reçoivent plus de poids :

#define weights to use
wt = 1 / smf.ols('fit.resid.abs() ~ fit.fittedvalues', data=df).fit().fittedvalues**2

#fit weighted least squares regression model
fit_wls = sm.WLS(y, X, weights=wt).fit()

#view summary of weighted least squares regression model
print(fit_wls.summary())

                            WLS Regression Results                            
==============================================================================
Dep. Variable:                  score   R-squared:                       0.676
Model:                            WLS   Adj. R-squared:                  0.653
Method:                 Least Squares   F-statistic:                     29.24
Date:                Mon, 31 Oct 2022   Prob (F-statistic):           9.24e-05
Time:                        11:20:10   Log-Likelihood:                -55.074
No. Observations:                  16   AIC:                             114.1
Df Residuals:                      14   BIC:                             115.7
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const         63.9689      5.159     12.400      0.000      52.905      75.033
hours          4.7091      0.871      5.407      0.000       2.841       6.577
==============================================================================
Omnibus:                        2.482   Durbin-Watson:                   1.786
Prob(Omnibus):                  0.289   Jarque-Bera (JB):                1.058
Skew:                           0.029   Prob(JB):                        0.589
Kurtosis:                       1.742   Cond. No.                         17.6
==============================================================================

À partir du résultat, nous pouvons voir que la valeur R au carré pour ce modèle des moindres carrés pondérés a augmenté jusqu’à 0,676 .

Cela indique que le modèle des moindres carrés pondérés est capable d’expliquer une plus grande partie de la variance des résultats aux examens que le modèle de régression linéaire simple.

Cela nous indique que le modèle des moindres carrés pondérés offre un meilleur ajustement aux données par rapport au modèle de régression linéaire simple.

Ressources additionnelles

Les didacticiels suivants expliquent comment effectuer d’autres tâches courantes en Python :

Comment créer un tracé résiduel en Python
Comment créer un tracé QQ en Python
Comment tester la multicolinéarité en Python

Ajouter un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *