In [ ]:
### Latex :
from sympy import symbols, latex
TP5 : Régression linéaire
1. Régression linéaire.
- La régression linéaire est une méthode statistique visant à modéliser la relation entre une variable cible et une ou plusieurs variables explicatives.
- Son objectif est de prédire la valeur de la variable cible en fonction des valeurs des variables explicatives, en supposant une relation linéaire entre elles.
- Elle repose sur l’idée que cette relation peut être approximée par une droite (en régression simple) ou un hyperplan (en régression multiple).
- La méthode repose sur la minimisation des écart entre les valeurs observées et les valeurs prédites, appelé erreur résiduelle.
- Son objectif est de prédire la valeur de la variable cible en fonction des valeurs des variables explicatives, en supposant une relation linéaire entre elles.
- Elle repose sur l’idée que cette relation peut être approximée par une droite (en régression simple) ou un hyperplan (en régression multiple).
- La méthode repose sur la minimisation des écart entre les valeurs observées et les valeurs prédites, appelé erreur résiduelle.
2. Régression linéaire simple.
- La régression linéaire simple modélise la relation entre une variable cible y et une variable explicative x.
- Elle prévoit la variable y en fonction de la variable x par un modèle linéaire : $y = ax +b$
- A chaque valeur observée $y_i$ correspond la valeur $y^{*}_{i} = ax_i + b,$ estimée par le modèle de régression
- L'erreur d'estimation sur l'individu $i$ est donc égal àl'écarts entre valeur observée et valeur estimée $e_i = (y_i - y^{*}_{i} ) = y_i -( ax_i + b)$.
- Ainsi; $y_i = = ax_i + b +e_i$ et le modèle s'écrit : $y = ax +b + e$, $e$ est l'erreur sur la valeur prédite de $y$.
- Pour obtenir un modèle optimal pour l'ensemble des observations, il faut minimiser l'erreur globale : on cherche $a$ et $b$ pour lesquels l'erreur globale est minimale.
- Le critère des moindres carrés est le plus souvent utilisé pour minimiser l'erreur globale à travers la minimisation de la somme des carrés des écarts : $\sum_{i}e_i^{2}$.
- On montre que l'équation de régression $y=ax+b$ qui minimise cette somme est obtenue par les deux formules suivantes :
$$ a = r \cdot \frac{\sigma_y}{\sigma_x}=\frac{cov(x,y)}{var(x)}\quad \text{et}\quad b = \bar{y} - a \cdot \bar{x} $$ Avec : $ r $ : coefficient de corrélation entre $ x $ et $ y $ $ \sigma_x $ : écart-type de $ x $ $ \sigma_y $ : écart-type de $ y $ $ \bar{x} $ : moyenne de $ x $ $ \bar{y} $ : moyenne de $ y $
- Géométriquement, cette régression est représentée par une droite qui ajuste le mieu le nuage des points représentants les observations.
- Elle prévoit la variable y en fonction de la variable x par un modèle linéaire : $y = ax +b$
- A chaque valeur observée $y_i$ correspond la valeur $y^{*}_{i} = ax_i + b,$ estimée par le modèle de régression
- L'erreur d'estimation sur l'individu $i$ est donc égal àl'écarts entre valeur observée et valeur estimée $e_i = (y_i - y^{*}_{i} ) = y_i -( ax_i + b)$.
- Ainsi; $y_i = = ax_i + b +e_i$ et le modèle s'écrit : $y = ax +b + e$, $e$ est l'erreur sur la valeur prédite de $y$.
- Pour obtenir un modèle optimal pour l'ensemble des observations, il faut minimiser l'erreur globale : on cherche $a$ et $b$ pour lesquels l'erreur globale est minimale.
- Le critère des moindres carrés est le plus souvent utilisé pour minimiser l'erreur globale à travers la minimisation de la somme des carrés des écarts : $\sum_{i}e_i^{2}$.
- On montre que l'équation de régression $y=ax+b$ qui minimise cette somme est obtenue par les deux formules suivantes :
$$ a = r \cdot \frac{\sigma_y}{\sigma_x}=\frac{cov(x,y)}{var(x)}\quad \text{et}\quad b = \bar{y} - a \cdot \bar{x} $$ Avec : $ r $ : coefficient de corrélation entre $ x $ et $ y $ $ \sigma_x $ : écart-type de $ x $ $ \sigma_y $ : écart-type de $ y $ $ \bar{x} $ : moyenne de $ x $ $ \bar{y} $ : moyenne de $ y $
- Géométriquement, cette régression est représentée par une droite qui ajuste le mieu le nuage des points représentants les observations.
Application : prédiction de caractéristiques d'une plante
- Nous allons utiliser un fichier de données plantes1.csv- Il contient les mesures des propriétés : longueur, nombre, couleur, surface, poids de feuilles d'une série de plantes.
- Nous allons prédir le poids en fonction de la surface.
In [ ]:
import pandas as pd
import numpy as np
# Charger les données
df = pd.read_csv("C:/Users/Akharraz/PyDataAnaysis/plantes1.csv")
# Variables
x = df['surface']
y = df['poids']
# Calcul des éléments nécessaires
r = np.corrcoef(x, y)[0, 1] # Coefficient de corrélation
sx = x.std() # Écart-type de x
sy = y.std() # Écart-type de y
x_mean = x.mean() # Moyenne de x
y_mean = y.mean() # Moyenne de y
# Calcul de a (pente) et b (ordonnée à l'origine)
a = r * (sy / sx)
b = y_mean - a * x_mean
### Affichage des données
print("La table de données (dataframe df) :")
print("########################################\n")
print(df)
print("########################################")
print("Paramètres et équation de la régression")
print("########################################\n")
# Affichage des résultats
print(f"Coefficient de corrélation (r) : {r:.4f}")
print(f"Écart-type de x (surface) : {sx:.4f}")
print(f"Écart-type de y (poids) : {sy:.4f}")
print(f"Moyenne de x (surface) : {x_mean:.4f}")
print(f"Moyenne de y (poids) : {y_mean:.4f}")
print("\nÉquation de la droite de régression :")
print(f"y = {a:.4f}x + {b:.4f}")
In [ ]:
# Représentation graphique de la droite de régression
import matplotlib.pyplot as plt
import seaborn as sns
#dimensions de la figure
plt.figure(figsize=(5, 3))
# Nuage de points : points reprensentants les valeurs mesurées des deux variables
sns.scatterplot(x='surface', y='poids', data=df, color='blue', label='Données observées')
# Droite de régression
x_values = np.array([min(x), max(x)]) # Valeurs min et max de x pour tracer la droite
y_values = a * x_values + b # Calcul des y correspondants
plt.plot(x_values, y_values, color='red', linewidth=2, label=f'Droite de régression\n$y = {a:.2f}x + {b:.2f}$')
# Ajout des labels et titres
plt.title('Régression linéaire : poids en fonction de la surface')
plt.xlabel('Surface (cm²)')
plt.ylabel('Poids (g)')
plt.legend()
plt.grid(True)
# Afficher le graphique
plt.tight_layout()
plt.show()
3. Régression linéaire multiple.
- Prédiction d'une variables en fonction de plusieurs autres variables.- Modèle mathématique :
$$ y = \beta_0 + \beta_1 x_{1} + \beta_2 x_{2} + \dots + \beta_p x_{p} + e, $$ où :
- $ y$ : valeur observée de la variable cible pour l'observation,
- $ x_{1}, \dots, x_{p} $ : valeurs des $ p $ variables explicatives,
- $ \beta_0, \dots, \beta_p $ : coefficients à estimer (ordonnée à l'origine et pentes),
- $ e $ : erreur résiduelle (différence entre la valeur observée et la prédiction).
- En notation matricielle, le modèle devient :
$$ \mathbf{Y} = \mathbf{X} \boldsymbol{\beta} + \mathbf{E}, $$ où :
- $ \mathbf{Y} \in \mathbb{R}^n $ : vecteur des observations,
- $ \mathbf{X} \in \mathbb{R}^{n \times (p+1)} $ : matrice de design (avec une colonne de 1 pour $ \beta_0 $),
- $ \boldsymbol{\beta} \in \mathbb{R}^{p+1} $ : vecteur des coefficients,
- $ \mathbf{E} \in \mathbb{R}^n $ : vecteur d'erreurs.
- On utilise la méthode des moindres carrés.
- On doit trouver $\boldsymbol{\beta}$ qui minimise la somme des carrés des erreurs :$\sum (y_i - y^{*}_{i})^2$, avec $y^{*}_{i}$ la valeur prédite par le modèle.
- Ce problème a pour soluton anlytique : $ \boldsymbol{\beta} = (X^t . X)^{-1}. X^t . Y$ ( cas où $X^t . X$ est inversible).
Application : prédiction d'une caractéristiques de plantes en fonction de plusieurs autres
- Nous allons exprimer le poid d'une feuille en fonction de sa longueur, de sa surface et du nombre feuilles dans une branche.
- Nous allons appliquer la régression multiples dans les étapes suivantes :
- Charger les données.
- Construire la matrice des caractéristiques $X.$
- Construire le vecteur cible $Y$.
- Appliquer la formule : $ \boldsymbol{\beta} = (X^t . X)^{-1}. X^t . Y$
In [ ]:
import numpy as np
import pandas as pd
from numpy.linalg import inv
# Chargement des données
df = pd.read_csv("plantes1.csv")
# Variables explicatives + constante ($\beta_0$)
X = df[['longfeuil', 'surface', 'nombrefeuil']]
X = np.hstack((np.ones((X.shape[0], 1)), X)) # Ajout de la colonne de 1 pour la constante
# Variable cible
Y = df['poids'].values
# Calcul des coefficients par les moindres carrées
beta_hat = inv(X.T @ X) @ X.T @ y
#########Affichage de la matrice et des vecteurs du système.###########
#print("X=", X)
#print("X^t . X =", X.T @ X)
#print("det(X^t . X) = ", np.linalg.det(X.T @ X))
#######################################################################
# Affichage des coefficients
print("\n")
print("Coefficients estimés :")
print(f"β₀ = {beta_hat[0]:.4f}")
for i in range(1, len(beta_hat)):
print(f"β{i}= {beta_hat[i]:.4f}")
print("\n")
# Affichage du modèle de régression
print(f"Le modèle de régression est: {beta_hat[0]: .4f}, {beta_hat[1]: .4f}x1 + {beta_hat[2]: .4f}x2 {beta_hat[3]: .4f}x3")
# Prédiction manuelle{
Y_pred = X @ beta_hat
# Tableau des prédictions vs réels
results_df = pd.DataFrame({
"Vrai poids": Y,
"Poids prédit": Y_pred,
"Erreur": Y - Y_pred
})
print("\n")
print("Voici le tableau de comparant les valeurs mesurées et celles prédites par le modèle de régression :")
results_df
Aucun commentaire:
Enregistrer un commentaire