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