Comment effectuer une régression OLS en Python (avec exemple)



La régression des moindres carrés ordinaires (OLS) est une méthode qui nous permet de trouver une droite qui décrit le mieux la relation entre une ou plusieurs variables prédictives et une variable de réponse .

Cette méthode nous permet de trouver l’équation suivante :

ŷ = b 0 + b 1 x

où:

  • ŷ : La valeur de réponse estimée
  • b 0 : L’origine de la droite de régression
  • b 1 : La pente de la droite de régression

Cette équation peut nous aider à comprendre la relation entre le prédicteur et la variable de réponse, et elle peut être utilisée pour prédire la valeur d’une variable de réponse étant donné la valeur de la variable prédictive.

L’exemple étape par étape suivant montre comment effectuer une régression OLS en Python.

Étape 1 : Créer les données

Pour cet exemple, nous allons créer un ensemble de données contenant les deux variables suivantes pour 15 étudiants :

  • Nombre total d’heures étudiées
  • Résultat de l’examen

Nous effectuerons une régression OLS, en utilisant les heures comme variable prédictive et le score à l’examen comme variable de réponse.

Le code suivant montre comment créer ce faux ensemble de données dans les pandas :

import pandas as pd

#create DataFrame
df = pd.DataFrame({'hours': [1, 2, 4, 5, 5, 6, 6, 7, 8, 10, 11, 11, 12, 12, 14],
                   'score': [64, 66, 76, 73, 74, 81, 83, 82, 80, 88, 84, 82, 91, 93, 89]})

#view DataFrame
print(df)

    hours  score
0       1     64
1       2     66
2       4     76
3       5     73
4       5     74
5       6     81
6       6     83
7       7     82
8       8     80
9      10     88
10     11     84
11     11     82
12     12     91
13     12     93
14     14     89

Étape 2 : effectuer une régression OLS

Ensuite, nous pouvons utiliser les fonctions du module statsmodels pour effectuer une régression OLS, 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
model = sm.OLS(y, x).fit()

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

                            OLS Regression Results                            
==============================================================================
Dep. Variable:                  score   R-squared:                       0.831
Model:                            OLS   Adj. R-squared:                  0.818
Method:                 Least Squares   F-statistic:                     63.91
Date:                Fri, 26 Aug 2022   Prob (F-statistic):           2.25e-06
Time:                        10:42:24   Log-Likelihood:                -39.594
No. Observations:                  15   AIC:                             83.19
Df Residuals:                      13   BIC:                             84.60
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const         65.3340      2.106     31.023      0.000      60.784      69.884
hours          1.9824      0.248      7.995      0.000       1.447       2.518
==============================================================================
Omnibus:                        4.351   Durbin-Watson:                   1.677
Prob(Omnibus):                  0.114   Jarque-Bera (JB):                1.329
Skew:                           0.092   Prob(JB):                        0.515
Kurtosis:                       1.554   Cond. No.                         19.2
==============================================================================

À partir de la colonne coef , nous pouvons voir les coefficients de régression et écrire l’équation de régression ajustée suivante :

Score = 65,334 + 1,9824*(heures)

Cela signifie que chaque heure supplémentaire étudiée est associée à une augmentation moyenne de la note à l’examen de 1,9824 points.

La valeur d’origine de 65,334 nous indique la note moyenne attendue à l’examen pour un étudiant qui étudie zéro heure.

Nous pouvons également utiliser cette équation pour trouver la note attendue à l’examen en fonction du nombre d’heures qu’un étudiant étudie.

Par exemple, un étudiant qui étudie pendant 10 heures devrait obtenir une note à l’examen de 85,158 :

Note = 65,334 + 1,9824*(10) = 85,158

Voici comment interpréter le reste du résumé du modèle :

  • P(>|t|) : Il s’agit de la valeur p associée aux coefficients du modèle. Puisque la valeur p pour les heures (0,000) est inférieure à 0,05, nous pouvons dire qu’il existe une association statistiquement significative entre les heures et le score .
  • R au carré : cela nous indique que le pourcentage de variation des résultats de l’examen peut s’expliquer par le nombre d’heures étudiées. Dans ce cas, 83,1 % de la variation des scores peut être expliquée par les heures étudiées.
  • Statistique F et valeur p : La statistique F ( 63,91 ) et la valeur p correspondante ( 2,25e-06 ) nous indiquent la signification globale du modèle de régression, c’est-à-dire si les variables prédictives du modèle sont utiles pour expliquer la variation. dans la variable de réponse. Étant donné que la valeur p dans cet exemple est inférieure à 0,05, notre modèle est statistiquement significatif et les heures sont considérées comme utiles pour expliquer la variation du score .

Étape 3 : Visualisez la ligne la mieux adaptée

Enfin, nous pouvons utiliser le package de visualisation de données matplotlib pour visualiser la ligne de régression ajustée sur les points de données réels :

import matplotlib.pyplot as plt

#find line of best fit
a, b = np.polyfit(df['hours'], df['score'], 1)

#add points to plot
plt.scatter(df['hours'], df['score'], color='purple')

#add line of best fit to plot
plt.plot(df['hours'], a*df['hours']+b)

#add fitted regression equation to plot
plt.text(1, 90, 'y = ' + '{:.3f}'.format(b) + ' + {:.3f}'.format(a) + 'x', size=12)

#add axis labels
plt.xlabel('Hours Studied')
plt.ylabel('Exam Score')

Les points violets représentent les points de données réels et la ligne bleue représente la ligne de régression ajustée.

Nous avons également utilisé la fonction plt.text() pour ajouter l’équation de régression ajustée dans le coin supérieur gauche du tracé.

En regardant le graphique, il semble que la droite de régression ajustée capture assez bien la relation entre la variable des heures et la variable du score .

Ressources additionnelles

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

Comment effectuer une régression logistique en Python
Comment effectuer une régression exponentielle en Python
Comment calculer l’AIC des modèles de régression en Python

Ajouter un commentaire

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