Formation ML / Apprentissage supervisé - Régression

Régression linéaire

Débutant 30 min 13 sections

Une droite ajustée par moindres carrés sur des prix immobiliers, et ce que MSE et R² en disent.

Objectifs d'apprentissage

  • Comprendre le principe de la régression linéaire
  • Implémenter un modèle avec scikit-learn
  • Évaluer les performances avec MSE et R²
  • Visualiser la droite de régression

Prérequis

Notions de base en Python (variables, fonctions)

Le code de cette page s'exécute dans votre navigateur. Le premier lancement télécharge Python et ses bibliothèques.

Théorie

Qu'est-ce que la régression linéaire?

La régression linéaire est une méthode statistique qui permet de modéliser la relation entre une variable dépendante ($y$) et une ou plusieurs variables indépendantes ($X$).

L'idée est simple: trouver une droite qui passe "au mieux" à travers les points de données.

Équation du modèle:

$$y = a \cdot x + b$$

Ou:

  • $y$ = valeur prédite (ex: prix)
  • $x$ = variable explicative (ex: surface)
  • $a$ = pente (coefficient directeur)
  • $b$ = ordonnée à l'origine (intercept)

L'algorithme cherche les valeurs de $a$ et $b$ qui minimisent l'erreur entre les prédictions et les valeurs réelles.

Théorie

Schéma: Comment fonctionne la régression linéaire

Visualisation du concept:

Les points représentent les données réelles. La droite de régression $y = ax + b$ passe "au mieux" à travers les points pour minimiser les erreurs.

Décomposition de l'équation $y = ax + b$:

flowchart LR P["Pente (a)
3500 EUR/m2"] X["Surface (x)
80 m2"] B["Intercept (b)
50000 EUR"] R["Prix prédit
330000 EUR"] P -->|"×"| M["280000"] X -->|"×"| M M -->|"+"| R B -->|"+"| R class R ml-node-accent

Exemple concret - Estimation d'un appartement:

Un agent immobilier veut estimer le prix d'un appartement de $\textcolor{#3498db}{80 m^2}$. Le modèle a appris: $\textcolor{#e67e22}{a = 3500}$ EUR/m2 (pente) et $\textcolor{#9B7AC4}{b = 50000}$ EUR (intercept).

Calcul du prix:

$$\text{Prix} = \textcolor{#e67e22}{a} \times \textcolor{#3498db}{x} + \textcolor{#9B7AC4}{b} = \textcolor{#e67e22}{3500} \times \textcolor{#3498db}{80} + \textcolor{#9B7AC4}{50000}$$

$$\text{Prix} = \textcolor{#e67e22}{280000} + \textcolor{#9B7AC4}{50000} = \textcolor{#27ae60}{\mathbf{330000}} \text{ EUR}$$

Légende des couleurs:

  • $\textcolor{#3498db}{Bleu}$ : surface de l'appartement ($\textcolor{#3498db}{80 m^2}$)
  • $\textcolor{#e67e22}{Orange}$ : contribution de la surface ($\textcolor{#e67e22}{3500 \times 80 = 280000}$ EUR)
  • $\textcolor{#9B7AC4}{Violet}$ : prix de base/intercept ($\textcolor{#9B7AC4}{50000}$ EUR)
  • $\textcolor{#27ae60}{Vert}$ : prix final estime ($\textcolor{#27ae60}{330000}$ EUR)

Interprétation: Chaque m2 supplémentaire ajoute $\textcolor{#e67e22}{3500}$ EUR au prix. Le $\textcolor{#9B7AC4}{50000}$ EUR représente un "prix de base" (frais fixes, terrain, etc.).

Objectif de l'algorithme - Minimiser les erreurs:

L'algorithme cherche les valeurs de $a$ et $b$ qui minimisent la somme des erreurs au carré (moindres carrés).

flowchart TD D["Données
(x, y)"] M["Modèle
y = ax + b"] E["Erreur
(y_réel - y_prédit)²"] O["Optimisation
Minimiser Σ erreurs²"] R["Meilleurs a et b"] D --> M --> E --> O --> R class R ml-node-accent
Avancé Exercice manuel: À vous de calculer!

Objectif: Maîtriser les calculs de la régression linéaire multi-variable à la main.

Prenez une feuille et un stylo. Résolvez chaque partie AVANT de regarder la solution !

CONTEXTE

Un modèle de régression linéaire a été entraîné sur des données immobilières avec deux variables explicatives : la surface et le nombre de pièces.

Équation du modèle :

$$\hat{y} = \textcolor{#e67e22}{a_1} \cdot x_1 + \textcolor{#e67e22}{a_2} \cdot x_2 + \textcolor{#9B7AC4}{b}$$

Paramètres appris par le modèle :

  • $\textcolor{#e67e22}{a_1 = 2\,450}$ EUR/m² (coefficient pour la surface)
  • $\textcolor{#e67e22}{a_2 = 8\,500}$ EUR/pièce (coefficient pour le nombre de pièces)
  • $\textcolor{#9B7AC4}{b = 32\,000}$ EUR (intercept)

PARTIE 1 : Prédictions multi-variables (3 calculs)

Calculez le prix prédit $\hat{y}$ pour chacun des biens suivants :

BienSurface (x1)Nb pièces (x2)
A55 m²2 pièces
B78 m²3 pièces
C120 m²5 pièces

Rappel : $\hat{y} = 2\,450 \times x_1 + 8\,500 \times x_2 + 32\,000$

PARTIE 2 : Calcul des erreurs

Voici les prix réels de vente pour ces 3 biens :

BienPrix prédit (Partie 1)Prix réel (y)
A(votre réponse)190 000 EUR
B(votre réponse)248 000 EUR
C(votre réponse)378 000 EUR

Question 2.1 : Calculez l'erreur de prédiction pour chaque bien : $e_i = y_i - \hat{y}_i$

Question 2.2 : Calculez l'erreur au carré pour chaque bien : $e_i^2$

PARTIE 3 : Métriques de performance

Question 3.1 - MSE : Calculez le Mean Squared Error.

$$MSE = \frac{1}{n} \sum_{i=1}^{n} e_i^2$$

Question 3.2 - RMSE : Calculez le Root Mean Squared Error.

$$RMSE = \sqrt{MSE}$$

Question 3.3 - MAE : Calculez le Mean Absolute Error.

$$MAE = \frac{1}{n} \sum_{i=1}^{n} |e_i|$$

PARTIE 4 : Interprétation des coefficients

Question 4.1 : D'après les coefficients du modèle, quelle variable a le plus d'impact sur le prix : la surface ou le nombre de pièces ? Justifiez.

Question 4.2 : Un propriétaire hésite entre deux rénovations :

  • Option A : Agrandir de 10 m² (sans ajouter de pièce)
  • Option B : Diviser une grande pièce en 2 (sans changer la surface)

Quelle option augmentera le plus la valeur estimée du bien ? De combien ?

Question 4.3 : Le RMSE représente environ quel pourcentage du prix moyen des 3 biens ?

Avancé Solution de l'exercice manuel

SOLUTION DÉTAILLÉE

Prenez le temps de comparer avec vos réponses. Vérifiez chaque étape !

RAPPEL DU MODÈLE

$$\hat{y} = \textcolor{#e67e22}{a_1} \cdot x_1 + \textcolor{#e67e22}{a_2} \cdot x_2 + \textcolor{#9B7AC4}{b}$$

Avec : $\textcolor{#e67e22}{a_1 = 2\,450}$, $\textcolor{#e67e22}{a_2 = 8\,500}$, $\textcolor{#9B7AC4}{b = 32\,000}$

PARTIE 1 : Prédictions multi-variables

Bien A ($x_1 = \textcolor{#3498db}{55}$ m², $x_2 = \textcolor{#3498db}{2}$ pièces) :

$$\hat{y}_A = \textcolor{#e67e22}{2\,450} \times \textcolor{#3498db}{55} + \textcolor{#e67e22}{8\,500} \times \textcolor{#3498db}{2} + \textcolor{#9B7AC4}{32\,000}$$

Décomposition :

  • Contribution surface : $2\,450 \times 55 = \textcolor{#e67e22}{134\,750}$ EUR
  • Contribution pièces : $8\,500 \times 2 = \textcolor{#e67e22}{17\,000}$ EUR
  • Intercept : $\textcolor{#9B7AC4}{32\,000}$ EUR

$$\hat{y}_A = 134\,750 + 17\,000 + 32\,000 = \textcolor{#F7E64D}{\mathbf{183\,750}} \text{ EUR}$$

$\boxed{\hat{y}_A = \textcolor{#F7E64D}{183\,750} \text{ EUR}}$

Bien B ($x_1 = \textcolor{#3498db}{78}$ m², $x_2 = \textcolor{#3498db}{3}$ pièces) :

$$\hat{y}_B = \textcolor{#e67e22}{2\,450} \times \textcolor{#3498db}{78} + \textcolor{#e67e22}{8\,500} \times \textcolor{#3498db}{3} + \textcolor{#9B7AC4}{32\,000}$$

Décomposition :

  • Contribution surface : $2\,450 \times 78 = \textcolor{#e67e22}{191\,100}$ EUR
  • Contribution pièces : $8\,500 \times 3 = \textcolor{#e67e22}{25\,500}$ EUR
  • Intercept : $\textcolor{#9B7AC4}{32\,000}$ EUR

$$\hat{y}_B = 191\,100 + 25\,500 + 32\,000 = \textcolor{#F7E64D}{\mathbf{248\,600}} \text{ EUR}$$

$\boxed{\hat{y}_B = \textcolor{#F7E64D}{248\,600} \text{ EUR}}$

Bien C ($x_1 = \textcolor{#3498db}{120}$ m², $x_2 = \textcolor{#3498db}{5}$ pièces) :

$$\hat{y}_C = \textcolor{#e67e22}{2\,450} \times \textcolor{#3498db}{120} + \textcolor{#e67e22}{8\,500} \times \textcolor{#3498db}{5} + \textcolor{#9B7AC4}{32\,000}$$

Décomposition :

  • Contribution surface : $2\,450 \times 120 = \textcolor{#e67e22}{294\,000}$ EUR
  • Contribution pièces : $8\,500 \times 5 = \textcolor{#e67e22}{42\,500}$ EUR
  • Intercept : $\textcolor{#9B7AC4}{32\,000}$ EUR

$$\hat{y}_C = 294\,000 + 42\,500 + 32\,000 = \textcolor{#F7E64D}{\mathbf{368\,500}} \text{ EUR}$$

$\boxed{\hat{y}_C = \textcolor{#F7E64D}{368\,500} \text{ EUR}}$

PARTIE 2 : Calcul des erreurs

Question 2.1 - Erreurs de prédiction :

BienPrix réelPrix préditErreurInterprétation
A190 000 €183 750 €+6 250 €Sous-estime
B248 000 €248 600 €-600 €Sur-estime
C378 000 €368 500 €+9 500 €Sous-estime

Calculs détaillés :

  • $e_A = 190\,000 - 183\,750 = \textcolor{#3498db}{+6\,250}$ EUR
  • $e_B = 248\,000 - 248\,600 = \textcolor{#e74c3c}{-600}$ EUR
  • $e_C = 378\,000 - 368\,500 = \textcolor{#3498db}{+9\,500}$ EUR

Question 2.2 - Erreurs au carré :

BienErreurErreur²
A+6 25039 062 500
B-600360 000
C+9 50090 250 000

PARTIE 3 : Métriques de performance

Question 3.1 - MSE :

$$MSE = \frac{1}{n} \sum_{i=1}^{n} e_i^2 = \frac{1}{3} \times (e_A^2 + e_B^2 + e_C^2)$$

$$MSE = \frac{1}{3} \times (\textcolor{#e67e22}{39\,062\,500} + \textcolor{#e67e22}{360\,000} + \textcolor{#e67e22}{90\,250\,000})$$

$$MSE = \frac{\textcolor{#9B7AC4}{129\,672\,500}}{3} = \textcolor{#27ae60}{\mathbf{43\,224\,167}} \text{ EUR}^2$$

$\boxed{MSE = \textcolor{#27ae60}{43\,224\,167} \text{ EUR}^2}$

Question 3.2 - RMSE :

$$RMSE = \sqrt{MSE} = \sqrt{43\,224\,167} \approx \textcolor{#27ae60}{\mathbf{6\,575}} \text{ EUR}$$

Interprétation : En moyenne, le modèle se trompe d'environ 6 575 EUR sur le prix.

$\boxed{RMSE \approx \textcolor{#27ae60}{6\,575} \text{ EUR}}$

Question 3.3 - MAE :

$$MAE = \frac{1}{n} \sum_{i=1}^{n} |e_i| = \frac{1}{3} \times (|e_A| + |e_B| + |e_C|)$$

$$MAE = \frac{1}{3} \times (|\textcolor{#3498db}{6\,250}| + |\textcolor{#e74c3c}{-600}| + |\textcolor{#3498db}{9\,500}|)$$

$$MAE = \frac{1}{3} \times (6\,250 + 600 + 9\,500) = \frac{16\,350}{3} = \textcolor{#27ae60}{\mathbf{5\,450}} \text{ EUR}$$

$\boxed{MAE = \textcolor{#27ae60}{5\,450} \text{ EUR}}$

Note : MAE < RMSE car le RMSE pénalise davantage les grandes erreurs (bien C).

PARTIE 4 : Interprétation des coefficients

Question 4.1 - Variable avec le plus d'impact :

Comparons l'impact d'une unité supplémentaire :

  • $+1$ m² $\rightarrow$ $+\textcolor{#e67e22}{2\,450}$ EUR
  • $+1$ pièce $\rightarrow$ $+\textcolor{#e67e22}{8\,500}$ EUR

$\boxed{\text{Le nombre de pièces a plus d'impact par unité } (8\,500 > 2\,450)}$

Cependant, en pratique, il est plus facile d'ajouter des m² que des pièces !

Question 4.2 - Comparaison des rénovations :

Option A - Agrandir de 10 m² :

$$\Delta y_A = \textcolor{#e67e22}{a_1} \times 10 = 2\,450 \times 10 = \textcolor{#27ae60}{\mathbf{+24\,500}} \text{ EUR}$$

Option B - Ajouter 1 pièce :

$$\Delta y_B = \textcolor{#e67e22}{a_2} \times 1 = 8\,500 \times 1 = \textcolor{#27ae60}{\mathbf{+8\,500}} \text{ EUR}$$

$\boxed{\text{Option A est meilleure : } +24\,500 \text{ EUR vs } +8\,500 \text{ EUR}}$

Conclusion : Même si une pièce individuelle vaut plus qu'un m², agrandir de 10 m² rapporte presque 3 fois plus !

Question 4.3 - RMSE en pourcentage :

Prix moyen des 3 biens :

$$\bar{y} = \frac{190\,000 + 248\,000 + 378\,000}{3} = \frac{816\,000}{3} = \textcolor{#9B7AC4}{272\,000} \text{ EUR}$$

Pourcentage d'erreur :

$$\text{Erreur \%} = \frac{RMSE}{\bar{y}} \times 100 = \frac{6\,575}{272\,000} \times 100 \approx \textcolor{#27ae60}{\mathbf{2.4\%}}$$

$\boxed{\text{Erreur relative} \approx \textcolor{#27ae60}{2.4\%}}$

Conclusion : Une erreur de ~2.4% est très bonne pour un modèle à 2 variables !

RÉSUMÉ DES RÉSULTATS

MétriqueValeurInterprétation
MSE43 224 167 EUR²Difficile à interpréter (unité carrée)
RMSE6 575 EURErreur typique de prédiction
MAE5 450 EURErreur moyenne absolue
Erreur %2.4%Très bon pour l'immobilier

Légende des couleurs :

  • $\textcolor{#3498db}{Bleu}$ : valeurs d'entrée, erreurs positives (sous-estimation)
  • $\textcolor{#e67e22}{Orange}$ : coefficients, calculs intermédiaires
  • $\textcolor{#9B7AC4}{Violet}$ : intercept, sommes, moyennes
  • $\textcolor{#F7E64D}{Jaune}$ : valeurs prédites
  • $\textcolor{#27ae60}{Vert}$ : résultats finaux, prix réels
  • $\textcolor{#e74c3c}{Rouge}$ : erreurs négatives (sur-estimation)
Code

Charger et explorer les données

# =============================================================================
# ETAPE 1 : EXPLORATION DES DONNEES
# =============================================================================
# Avant de construire un modele, nous devons COMPRENDRE nos donnees.

# Fonction pour formater les nombres au style francais (espace comme separateur)
def fmt(n, decimals=0):
    return f"{n:,.{decimals}f}".replace(",", " ")

print("=" * 70)
print("EXPLORATION DU DATASET IMMOBILIER")
print("=" * 70)
print()

# --- 1.1 Apercu des premieres lignes ---
print("1. APERCU DES DONNEES")
print("-" * 40)
print("Voici les 5 premieres lignes du dataset :")
print("(Chaque ligne = un bien immobilier vendu)")
print()
display(df.head(), title="Apercu du dataset immobilier")

# --- 1.2 Dimensions du dataset ---
n_lignes, n_colonnes = df.shape
print()
print("2. DIMENSIONS DU DATASET")
print("-" * 40)
print(f"   Nombre de biens immobiliers : {n_lignes}")
print(f"   Nombre de caracteristiques  : {n_colonnes}")
print()
print(f"   Interpretation concrete :")
print(f"   → Nous avons {n_lignes} exemples de ventes passees pour entrainer notre modele.")
print(f"   → Pour chaque vente, nous connaissons {n_colonnes} informations.")

# --- 1.3 Types de donnees ---
print()
print("3. COLONNES DISPONIBLES")
print("-" * 40)
for col in df.columns:
    dtype = df[col].dtype
    exemple = df[col].iloc[0]
    print(f"   • {col:12} | Type: {str(dtype):8} | Exemple: {exemple}")

print()
print("   Roles des colonnes :")
print("   → 'surface'  : Variable explicative (ce qu'on connait)")
print("   → 'nb_rooms' : Variable explicative (ce qu'on connait)")
print("   → 'price'    : Variable cible (ce qu'on veut predire)")

# --- 1.4 Statistiques descriptives ---
print()
print("4. STATISTIQUES DESCRIPTIVES")
print("-" * 40)
print("Voici les statistiques cles de chaque colonne :")
print()
display(df.describe().round(2), title="Statistiques descriptives")

# --- 1.5 Interpretation des statistiques ---
print()
print("5. INTERPRETATION DES STATISTIQUES")
print("-" * 40)

surface_min = df['surface'].min()
surface_max = df['surface'].max()
surface_mean = df['surface'].mean()

price_min = df['price'].min()
price_max = df['price'].max()
price_mean = df['price'].mean()

print(f"   SURFACES :")
print(f"   → Les biens vont de {surface_min:.0f} m² a {surface_max:.0f} m²")
print(f"   → Surface moyenne : {surface_mean:.0f} m²")
print(f"   → C'est un marche plutot oriente vers des appartements/maisons de taille moyenne.")
print()
print(f"   PRIX :")
print(f"   → Les prix vont de {fmt(price_min)} EUR a {fmt(price_max)} EUR")
print(f"   → Prix moyen : {fmt(price_mean)} EUR")
print(f"   → Ecart important ({price_max/price_min:.1f}x), suggere une bonne variabilite.")
print()
print("   POURQUOI C'EST IMPORTANT ?")
print("   → Une bonne variabilite dans les donnees permet au modele")
print("     d'apprendre des patterns robustes.")
print("   → Si tous les biens avaient le meme prix, impossible d'apprendre !")

# --- 1.6 Verification des valeurs manquantes ---
print()
print("6. VERIFICATION DE LA QUALITE DES DONNEES")
print("-" * 40)
missing = df.isnull().sum()
if missing.sum() == 0:
    print("   ✓ Aucune valeur manquante ! Le dataset est complet.")
else:
    print("   ⚠ Valeurs manquantes detectees :")
    for col, count in missing.items():
        if count > 0:
            print(f"     - {col}: {count} valeurs manquantes")

print()
print("=" * 70)
print("CONCLUSION : Nos donnees sont pretes pour la modelisation !")
print("=" * 70)
Ctrl+Entrée

Cliquez sur « Exécuter » pour voir le résultat.

Code

Visualiser la relation surface-prix

# =============================================================================
# ETAPE 2 : VISUALISATION DE LA RELATION
# =============================================================================
# La visualisation est ESSENTIELLE avant de modeliser.
# Elle nous permet de :
# 1) Verifier si une relation lineaire existe (prerequis de la regression)
# 2) Detecter des anomalies ou outliers
# 3) Avoir une intuition sur la force de la relation

print("=" * 70)
print("ANALYSE VISUELLE : SURFACE vs PRIX")
print("=" * 70)
print()
print("Question : Y a-t-il une relation entre la surface et le prix ?")
print("→ Si oui, la regression lineaire sera appropriee.")
print("→ Si non, il faudra envisager d'autres approches.")
print()

# Creation du graphique
plt.figure(figsize=(10, 6))
plt.scatter(df['surface'], df['price'], alpha=0.6, color='#9B7AC4', s=50)
plt.xlabel('Surface (m²)', fontsize=12)
plt.ylabel('Prix (EUR)', fontsize=12)
plt.title('Relation entre Surface et Prix des biens immobiliers', fontsize=14)
plt.grid(True, alpha=0.3)

# Ajouter des annotations explicatives
plt.annotate('Chaque point = un bien vendu', xy=(0.02, 0.98), xycoords='axes fraction',
             fontsize=10, color='gray', ha='left', va='top')

plt.tight_layout()
plt.show()

# --- Analyse de la correlation ---
print()
print("ANALYSE DE LA CORRELATION")
print("-" * 40)
correlation = df['surface'].corr(df['price'])
print(f"   Coefficient de correlation (r) : {correlation:.3f}")
print()

# Interpretation du coefficient
print("   INTERPRETATION :")
if abs(correlation) >= 0.8:
    force = "tres forte"
    emoji = "★★★"
elif abs(correlation) >= 0.6:
    force = "forte"
    emoji = "★★☆"
elif abs(correlation) >= 0.4:
    force = "moderee"
    emoji = "★☆☆"
else:
    force = "faible"
    emoji = "☆☆☆"

direction = "positive (plus grand = plus cher)" if correlation > 0 else "negative"

print(f"   → Force de la relation : {force.upper()} {emoji}")
print(f"   → Direction : {direction}")
print()
print("   GUIDE D'INTERPRETATION DU COEFFICIENT r :")
print("   |r| > 0.8  : Correlation tres forte  → Excellent pour la regression")
print("   |r| > 0.6  : Correlation forte       → Bon pour la regression")
print("   |r| > 0.4  : Correlation moderee    → Acceptable")
print("   |r| < 0.4  : Correlation faible     → Regression peu fiable")
print()
print("   CONCLUSION VISUELLE :")
print("   → Les points suivent globalement une tendance ascendante.")
print("   → La regression lineaire semble appropriee pour ces donnees.")
print("   → On peut estimer qu'un bien plus grand coute plus cher.")
Ctrl+Entrée

Cliquez sur « Exécuter » pour voir le résultat.

Contenu verrouillé
6 / 13

Continuez votre apprentissage

Vous avez exploré 6 sections de ce module. Connectez-vous pour débloquer le reste du cours, incluant les exercices pratiques et les solutions.

Ctrl ou Cmd plus Entrée exécute le code. Tab indente ; Échap puis Tab quitte l'éditeur.