1 Prédiction des Prix de l’Immobilier

1.1 Introduction

L’objectif de cette première partie du projet est de construire un modèle de régression linéaire multiple capable d’expliquer et de prédire le prix final d’une maison à partir de six variables explicatives : la surface, le nombre de pièces, la distance au centre-ville, le temps de trajet, le numéro dans la rue et l’âge du vendeur. L’objectif est de comprendre quels facteurs influencent réellement le prix et de construire un modèle fiable.

1.2 Chargement des données

library(tidyverse)
library(corrplot)

immobilier <- read.csv("immobilier.csv")

Le fichier immobilier.csv contient 100 observations et 7 variables.
Les variables présentes sont : surface, nb_pieces, distance_centre, temps_trajet, numero_rue, age_vendeur, prix.
Le contrôle des valeurs manquantes montre qu’il n’y a aucune valeur manquante, ce qui permet d’estimer directement le modèle sans étape d’imputation.

1.2.1 Statistiques descriptives

stats_desc <- data.frame(
  Moyenne = sapply(immobilier, mean),
  Ecart_type = sapply(immobilier, sd),
  Minimum = sapply(immobilier, min),
  Mediane = sapply(immobilier, median),
  Maximum = sapply(immobilier, max)
)

knitr::kable(round(stats_desc, 2), caption = "Statistiques descriptives")
Statistiques descriptives
Moyenne Ecart_type Minimum Mediane Maximum
surface 122.71 27.38 50.72 121.85 185.62
nb_pieces 4.81 1.24 2.00 5.00 8.00
distance_centre 15.60 4.75 6.22 15.18 26.47
temps_trajet 36.10 9.86 14.60 34.89 60.38
numero_rue 71.48 41.68 2.00 72.00 143.00
age_vendeur 53.48 10.42 26.00 53.50 84.00
prix 355.13 89.29 114.36 350.56 595.64

Le prix moyen observé est de 355.13 milliers d’euros. La surface moyenne est de 122.71 m², pour 4.81 pièces en moyenne.
La dispersion des prix (89.29 milliers d’euros) indique que l’échantillon est suffisamment hétérogène pour justifier une modélisation explicative.

1.2.2 Hypotheses:

La régression linéaire multiple repose sur plusieurs hypothèses essentielles :

  • la relation entre la variable à expliquer (le prix) et les variables explicatives est supposée linéaire
  • les erreurs ont une variance constante (homoscédasticité)
  • les résidus sont indépendants et suivent une loi normale
  • les variables explicatives ne doivent pas être fortement corrélées entre elles

1.3 Analyse exploratoire

1.3.1 Analyse des corrélations

library(corrplot)

# Matrice de corrélation
mat_cor <- cor(immobilier)

# Heatmap
corrplot(mat_cor,
         method = "color",
         type = "upper",
         addCoef.col = "black",
         tl.col = "black",
         tl.srt = 45,
         number.cex = 0.7)

La variable la plus corrélée au prix est la surface (0.933), suivie du nombre de pièces (0.828).
À l’inverse, la corrélation entre le prix et la distance au centre est négative (-0.343), ce qui est cohérent avec l’intuition économique.
Enfin, distance_centre et temps_trajet sont très fortement corrélés (0.949), ce qui laisse anticiper un problème de multicolinéarité.

1.3.2 Graphiques ciblés

par(mfrow = c(1, 3))

plot(immobilier$surface, immobilier$prix,
     xlab = "Surface (m²)", ylab = "Prix (k€)",
     main = "Prix et surface", pch = 19)
abline(lm(prix ~ surface, data = immobilier), lwd = 2)

plot(immobilier$distance_centre, immobilier$prix,
     xlab = "Distance au centre (km)", ylab = "Prix (k€)",
     main = "Prix et distance", pch = 19)
abline(lm(prix ~ distance_centre, data = immobilier), lwd = 2)

plot(immobilier$distance_centre, immobilier$temps_trajet,
     xlab = "Distance au centre (km)", ylab = "Temps de trajet (min)",
     main = "Distance et temps", pch = 19)
abline(lm(temps_trajet ~ distance_centre, data = immobilier), lwd = 2)

par(mfrow = c(1, 1))

Les graphiques confirment trois résultats simples.
D’abord, la relation entre le prix et la surface est globalement croissante et quasi linéaire. Ensuite, le prix tend à diminuer quand la distance au centre augmente. Enfin, le temps de trajet croît fortement avec la distance au centre, ce qui confirme l’existence d’une information redondante entre ces deux variables.

1.4 Premier Modèle

Dans un premier temps, nous estimons un modèle de régression linéaire utilisant l’ensemble des variables explicatives disponibles.

Une validation croisée à 10 groupes est utilisée afin d’évaluer la performance du modèle sur des données non utilisées lors de l’estimation. Ce choix permet d’obtenir une estimation fiable de l’erreur tout en conservant un bon équilibre entre biais et variance. Dans un premier temps, nous estimons un modèle de régression linéaire multiple reliant le prix aux variables explicatives.

Le modèle s’écrit sous la forme :

\[ prix_i = \beta_0 + \beta_1 surface_i + \beta_2 nb\_pieces_i + \beta_3 distance\_centre_i + \beta_4 temps\_trajet_i + \beta_5 numero\_rue_i + \beta_6 age\_vendeur_i + \varepsilon_i \]

set.seed(2026)
immobilier$groupe <- sample(rep(1:10, length.out = nrow(immobilier)))

1.4.1 Estimation du modèle

premier_model <- lm(prix ~ . - groupe, data = immobilier)
library(knitr)

# Résumé du modèle
sum_mod <- summary(premier_model)

# Création du tableau des coefficients
df_coefs <- as.data.frame(sum_mod$coefficients)
df_coefs$Variable <- rownames(df_coefs)
rownames(df_coefs) <- NULL

# Renommer colonnes
colnames(df_coefs) <- c("Coefficient", "Erreur_std", "t_stat", "p_value", "Variable")

# Réorganiser
df_coefs <- df_coefs[, c("Variable", "Coefficient", "p_value")]

# Affichage propre
kable(df_coefs, digits = 3, caption = "Coefficients estimés du modèle")
Coefficients estimés du modèle
Variable Coefficient p_value
(Intercept) 63.210 0.005
surface 3.072 0.000
nb_pieces -3.059 0.512
distance_centre -5.351 0.003
temps_trajet 0.557 0.512
numero_rue 0.002 0.979
age_vendeur -0.133 0.596

Une augmentation de 1 m² de la surface entraîne en moyenne une augmentation du prix de 3.072 milliers d’euros, ce qui confirme que la taille du bien est le facteur le plus déterminant.

À l’inverse, une augmentation de 1 km de la distance au centre-ville réduit le prix d’environ 5.351 milliers d’euros, ce qui reflète l’importance de la localisation.

Le coefficient associé au nombre de pièces est négatif, ce qui peut sembler contre-intuitif, mais s’explique par sa forte corrélation avec la surface : cette dernière capte déjà l’essentiel de l’information liée à la taille du logement.

Le temps de trajet a un effet positif mais non significatif, probablement en raison de sa forte corrélation avec la distance au centre.

Enfin, les variables numéro de rue et âge du vendeur ont un impact très faible et non significatif sur le prix, ce qui suggère qu’elles n’apportent pas d’information pertinente dans le modèle.

1.4.2 Qualité globale du modèle

immobilier$groupe <- sample(rep(1:10, length.out = nrow(immobilier)))

mse <- numeric(10)

for(i in 1:10){
  train <- immobilier[immobilier$groupe != i, ]
  test  <- immobilier[immobilier$groupe == i, ]
  
  mod <- lm(prix ~ . - groupe, data = train)
  pred <- predict(mod, newdata = test)
  
  mse[i] <- mean((test$prix - pred)^2)
}

# Tableau détaillé
df_cv <- data.frame(
  Groupe = paste("Groupe", 1:10),
  MSE = round(mse, 2)
)

# Moyennes
mse_moy <- mean(mse)
rmse_moy <- sqrt(mse_moy)

# R² du modèle global
r2 <- summary(premier_model)$r.squared
r2_adj <- summary(premier_model)$adj.r.squared

# Ligne finale
df_final <- rbind(
  df_cv,
  data.frame(Groupe = "Moyenne",
             MSE = round(mse_moy, 2))
)

# Affichage principal
knitr::kable(df_final, caption = "Validation croisée (MSE par groupe)")
Validation croisée (MSE par groupe)
Groupe MSE
Groupe 1 626.44
Groupe 2 1309.24
Groupe 3 534.87
Groupe 4 1315.99
Groupe 5 775.41
Groupe 6 772.85
Groupe 7 347.33
Groupe 8 830.70
Groupe 9 403.12
Groupe 10 606.85
Moyenne 752.28
# Tableau résumé
resume_modele <- data.frame(
  R2 = round(r2, 4),
  R2_ajuste = round(r2_adj, 4),
  RMSE_CV = round(rmse_moy, 2)
)

knitr::kable(resume_modele, caption = "Indicateurs globaux du modèle")
Indicateurs globaux du modèle
R2 R2_ajuste RMSE_CV
0.9223 0.9173 27.43

La validation croisée montre que les valeurs de MSE restent relativement proches d’un groupe à l’autre, ce qui indique une bonne stabilité du modèle. La moyenne du MSE est d’environ 761, ce qui correspond à une erreur de prédiction d’environ 27 600 € (RMSE). Par ailleurs, les coefficients \(R^2\) et \(R^2\) ajusté sont élevés, confirmant que le modèle explique bien la variabilité du prix. Globalement, le modèle présente donc de bonnes performances prédictives.

1.4.3 Diagnostic des residus

library(ggplot2)
library(patchwork)

# Création des résidus
df_res <- data.frame(
  Ajustes = fitted(premier_model),
  Residus = rstudent(premier_model)
)

# 1. Q-Q plot (normalité)
p1 <- ggplot(df_res, aes(sample = Residus)) +
  stat_qq() +
  stat_qq_line(color = "red") +
  labs(title = "Q-Q plot des résidus") +
  theme_minimal()

# 2. Résidus vs valeurs ajustées (homoscédasticité)
p2 <- ggplot(df_res, aes(x = Ajustes, y = Residus)) +
  geom_point(alpha = 0.5) +
  geom_hline(yintercept = 0, color = "red") +
  labs(title = "Résidus vs valeurs ajustées",
       x = "Valeurs ajustées",
       y = "Résidus") +
  theme_minimal()

# Affichage combiné

p1 + p2

Les résidus sont globalement bien distribués autour de zéro et suivent approximativement une loi normale. Aucune structure particulière n’apparaît, ce qui suggère que les hypothèses du modèle sont globalement respectées.

1.4.4 Distance de cook

library(ggplot2)

# Calcul des distances de Cook
cook <- cooks.distance(premier_model)

# Création du data frame
df_cook <- data.frame(
  Observation = 1:length(cook),
  Cook = cook
)

# Graphique
ggplot(df_cook, aes(x = Observation, y = Cook)) +
  geom_col(fill = "steelblue") +
  geom_hline(yintercept = 4/length(cook), color = "red", linetype = "dashed") +
  labs(title = "Distance de Cook",
       x = "Observation",
       y = "Influence") +
  theme_minimal()

Le graphique des distances de Cook montre que la majorité des observations ont une influence faible sur le modèle. Toutefois, quelques points dépassent le seuil, dont un particulièrement élevé, indiquant une forte influence sur l’estimation des coefficients. Malgré cela, ces observations restent peu nombreuses, ce qui suggère que le modèle demeure globalement stable, même si ces points méritent une attention particulière.

1.4.5 Facteurs d’inflation de variance

# Fonction VIF corrigée
calcul_vif <- function(modele){
  
  X <- model.matrix(modele)
  
  # enlever intercept
  X <- X[, colnames(X) != "(Intercept)", drop = FALSE]
  
  vif_vals <- numeric(ncol(X))
  names(vif_vals) <- colnames(X)
  
  for(i in seq_along(vif_vals)){
    y <- X[, i]
    x <- X[, -i, drop = FALSE]
    
    # éviter bug si une seule variable
    if(ncol(x) == 0){
      vif_vals[i] <- NA
    } else {
      reg <- lm(y ~ ., data = as.data.frame(x))
      vif_vals[i] <- 1 / (1 - summary(reg)$r.squared)
    }
  }
  
  return(vif_vals)
}

# Calcul
vif_vals <- calcul_vif(premier_model)

# Tableau propre
table_vif <- data.frame(
  Variable = names(vif_vals),
  VIF = round(as.numeric(vif_vals), 2)
)

# Supprimer éventuels doublons (sécurité)
table_vif <- table_vif[!duplicated(table_vif$Variable), ]
knitr::kable(table_vif, caption = "Facteurs d'inflation de variance (VIF)")
Facteurs d’inflation de variance (VIF)
Variable VIF
surface 4.99
nb_pieces 4.97
distance_centre 10.53
temps_trajet 10.46
numero_rue 1.03
age_vendeur 1.02

Les valeurs du VIF mettent en évidence la présence de colinéarité entre certaines variables explicatives. En particulier, distance_centre (10.53) et temps_trajet (10.46) présentent des VIF élevés, supérieurs à 10, ce qui indique une forte redondance d’information entre ces deux variables.

Les variables surface et nb_pieces ont des VIF proches de 5, suggérant une colinéarité modérée. En revanche, numero_rue et age_vendeur ont des VIF proches de 1, ce qui signifie qu’elles ne sont pas corrélées avec les autres variables.

Ainsi, ces résultats confirment que certaines variables apportent une information similaire, ce qui peut expliquer l’instabilité de certains coefficients dans le modèle.

1.4.6 Tests statistiques

library(lmtest)
library(knitr)

# Tableau des tests
tests <- data.frame(
  Test = c("Shapiro-Wilk", "Breusch-Pagan", "Durbin-Watson", "RESET"),
  p_value = round(c(
    shapiro.test(residuals(premier_model))$p.value,
    bptest(premier_model)$p.value,
    dwtest(premier_model)$p.value,
    resettest(premier_model)$p.value
  ), 4),
  stringsAsFactors = FALSE
)

# Affichage
kable(tests, caption = "Tests de diagnostic du modele")
Tests de diagnostic du modele
Test p_value
Shapiro-Wilk 0.2662
Breusch-Pagan 0.0248
Durbin-Watson 0.2324
RESET 0.8992

Les tests de diagnostic montrent que la majorité des hypothèses du modèle sont respectées. Le test de Shapiro-Wilk (p-value = 0.2662) indique que les résidus suivent une distribution normale. Le test de Durbin-Watson (p-value = 0.2324) confirme l’indépendance des résidus, et le test RESET (p-value = 0.8992) ne met en évidence aucun problème de spécification du modèle.

En revanche, le test de Breusch-Pagan (p-value = 0.0248) révèle la présence d’une hétéroscédasticité, ce qui signifie que la variance des erreurs n’est pas parfaitement constante.

1.5 Conclusion

Dans cette partie, nous avons construit un modèle de régression linéaire multiple permettant de prédire le prix d’un bien immobilier en fonction de six variables explicatives.

Le modèle estimé est le suivant :

\[ \hat{prix} = 63.210 + 3.072 \cdot surface - 3.059 \cdot nb\_pieces - 5.351 \cdot distance\_centre + 0.557 \cdot temps\_trajet + 0.002 \cdot numero\_rue - 0.133 \cdot age\_vendeur \]

Ce modèle explique environ 92.23% de la variabilité du prix (\(R^2 = 0.9223\)), ce qui indique une très bonne qualité d’ajustement. La validation croisée montre une erreur de prédiction moyenne d’environ 27 400 €, ce qui reste raisonnable compte tenu du niveau des prix.

Les résultats mettent en évidence que la surface et la distance au centre sont les variables les plus influentes, tandis que les autres variables ont un impact plus limité une fois les effets principaux pris en compte.

2 Évaluation empirique du biais d’optimisme

2.1 Objectif et stratégie

L’objectif de cette deuxième partie est de vérifier empiriquement le théorème du biais d’optimisme de la log-vraisemblance dans le cas des modèles linéaires.

Lorsqu’un modèle est estimé puis évalué sur les mêmes données, sa performance est généralement surestimée. En effet, le modèle a déjà utilisé ces observations pour estimer ses paramètres. La log-vraisemblance calculée sur l’échantillon d’apprentissage est donc trop optimiste par rapport à la performance que l’on obtiendrait sur de nouvelles données.

Le théorème étudié en cours indique que ce biais d’optimisme converge vers le nombre de paramètres du modèle, noté \(k\), lorsque la taille de l’échantillon \(n\) augmente.

On cherche donc à observer empiriquement que :

\[ \mathbb{E}\left[\ell_{\text{train}}(\hat{\theta}_{MLE})\right] + n\mathbb{E}\left[H(p_{\text{vrai}},p_{\hat{\theta}_{MLE}})\right] \xrightarrow[n\to\infty]{} k \]

Dans notre étude, nous utilisons des simulations de Monte Carlo. Nous générons plusieurs jeux de données selon un modèle linéaire connu, nous estimons le modèle, puis nous comparons la log-vraisemblance obtenue sur l’échantillon d’apprentissage à celle obtenue sur un grand échantillon test indépendant.

Cette démarche est répétée pour plusieurs tailles d’échantillon \(n\) et plusieurs nombres de variables explicatives \(p\), afin d’observer si le biais moyen estimé se rapproche bien du nombre de paramètres \(k\).

2.2 Génération des données

Nous considérons un modèle linéaire gaussien de la forme :

\[ Y = X\beta + \varepsilon \]

avec :

\[ \varepsilon \sim \mathcal{N}(0,\sigma^2) \]

Les variables explicatives sont simulées selon une loi normale centrée réduite. Le bruit aléatoire suit également une loi normale. Ce cadre correspond aux hypothèses classiques du modèle linéaire gaussien.

Dans les simulations, le vrai modèle est connu, ce qui permet de comparer la performance du modèle estimé sur les données d’apprentissage avec sa performance attendue sur de nouvelles observations.

Si le modèle contient \(p\) variables explicatives, le nombre total de paramètres estimés est :

\[ k = p + 2 \]

Le terme \(p\) correspond aux coefficients des variables explicatives, le premier \(+1\) correspond à l’intercept, et le second \(+1\) correspond à la variance de l’erreur \(\sigma^2\).

set.seed(2026)

# Fonction de log-vraisemblance gaussienne totale
loglik_gaussian <- function(y, X, beta_hat, sigma2_hat) {
  mu_hat <- as.vector(X %*% beta_hat)
  sum(dnorm(y, mean = mu_hat, sd = sqrt(sigma2_hat), log = TRUE))
}

2.3 Méthodologie de simulation

Pour chaque couple \((n,p)\), nous appliquons la procédure suivante.

D’abord, nous générons un échantillon d’apprentissage de taille \(n\). Ensuite, nous estimons un modèle linéaire sur cet échantillon et nous calculons la log-vraisemblance d’apprentissage \(\ell_{\text{train}}\).

Puis, nous générons un grand échantillon test indépendant. Ce grand échantillon test permet d’approcher la performance attendue du modèle sur de nouvelles données. On calcule alors la log-vraisemblance moyenne par observation sur cet échantillon test, puis on la multiplie par \(n\) afin d’obtenir une quantité comparable à la log-vraisemblance d’apprentissage.

Le biais d’optimisme est donc estimé par :

\[ \ell_{\text{train}} - n \times \overline{\ell}_{\text{test}} \]

\(\overline{\ell}_{\text{test}}\) désigne la log-vraisemblance moyenne par observation sur l’échantillon test.

Cette procédure est répétée \(B = 1000\) fois pour chaque couple \((n,p)\), afin d’obtenir un biais moyen stable.

simulation_biais <- function(n, p, B = 1000, sigma = 1, n_test = 10000) {
  
  biais <- numeric(B)
  
  # Nombre de paramètres : p coefficients + intercept + variance sigma^2
  k <- p + 2
  
  for (b in 1:B) {
    
    # Coefficients vrais du modèle
    beta_true <- rep(1, p + 1)
    
    # ---------------------------------------------------
    # 1. Génération de l'échantillon d'apprentissage
    # ---------------------------------------------------
    X_train_vars <- matrix(rnorm(n * p), nrow = n, ncol = p)
    X_train <- cbind(1, X_train_vars)
    
    eps_train <- rnorm(n, mean = 0, sd = sigma)
    y_train <- as.vector(X_train %*% beta_true + eps_train)
    
    # Estimation du modèle linéaire
    modele <- lm(y_train ~ X_train_vars)
    
    beta_hat <- coef(modele)
    
    # Estimateur MLE de sigma^2 : RSS / n
    residus <- residuals(modele)
    sigma2_hat <- sum(residus^2) / n
    
    # Log-vraisemblance sur l'échantillon d'apprentissage
    ll_train <- loglik_gaussian(
      y = y_train,
      X = X_train,
      beta_hat = beta_hat,
      sigma2_hat = sigma2_hat
    )
    
    # ---------------------------------------------------
    # 2. Génération d'un grand échantillon test indépendant
    # ---------------------------------------------------
    X_test_vars <- matrix(rnorm(n_test * p), nrow = n_test, ncol = p)
    X_test <- cbind(1, X_test_vars)
    
    eps_test <- rnorm(n_test, mean = 0, sd = sigma)
    y_test <- as.vector(X_test %*% beta_true + eps_test)
    
    # Log-vraisemblance moyenne par observation sur le test
    ll_test_moyenne <- loglik_gaussian(
      y = y_test,
      X = X_test,
      beta_hat = beta_hat,
      sigma2_hat = sigma2_hat
    ) / n_test
    
    # Quantité comparable à la log-vraisemblance train
    ll_test_equivalent <- n * ll_test_moyenne
    
    # Biais d'optimisme estimé
    biais[b] <- ll_train - ll_test_equivalent
  }
  
  data.frame(
    n = n,
    p = p,
    k = k,
    biais_moyen = mean(biais),
    ecart_type = sd(biais),
    difference_biais_k = mean(biais) - k,
    rapport_biais_k = mean(biais) / k
  )
}

2.4 Choix des paramètres de simulation

Afin d’étudier la convergence du biais d’optimisme, nous faisons varier deux éléments : la taille de l’échantillon \(n\) et le nombre de variables explicatives \(p\).

Les tailles d’échantillon retenues sont :

\[ n \in \{50, 100, 500, 1000\} \]

Ces valeurs permettent de comparer le comportement du biais pour des petits et grands échantillons.

Les nombres de variables explicatives retenus sont :

\[ p \in \{1, 3, 5, 10\} \]

Comme le nombre total de paramètres vaut \(k = p + 2\), ces choix permettent d’étudier des modèles de complexité croissante.

Ainsi, nous pouvons observer si le biais moyen estimé se rapproche de \(k\), et si cette approximation devient meilleure lorsque \(n\) augmente.

# Valeurs étudiées
valeurs_n <- c(50, 100, 500, 1000)
valeurs_p <- c(1, 3, 5, 10)

# Lancement des simulations
resultats <- do.call(
  rbind,
  lapply(valeurs_n, function(n) {
    do.call(
      rbind,
      lapply(valeurs_p, function(p) {
        simulation_biais(
          n = n,
          p = p,
          B = 1000,
          sigma = 1,
          n_test = 10000
        )
      })
    )
  })
)

2.5 Résultats des simulations

Le tableau suivant présente, pour chaque combinaison de \(n\) et \(p\), le biais moyen estimé par simulation. Ce biais est comparé au nombre de paramètres \(k\).

La colonne difference_biais_k mesure l’écart entre le biais moyen estimé et \(k\). Plus cette valeur est proche de zéro, plus le résultat empirique est proche du théorème.

La colonne rapport_biais_k permet également d’évaluer la proximité entre le biais moyen et \(k\). Un rapport proche de 1 indique que le biais estimé est proche du nombre de paramètres.

library(knitr)

kable(
  resultats,
  digits = 3,
  caption = "Résultats des simulations du biais d'optimisme"
)
Résultats des simulations du biais d’optimisme
n p k biais_moyen ecart_type difference_biais_k rapport_biais_k
50 1 3 3.302 6.255 0.302 1.101
50 3 5 5.913 7.356 0.913 1.183
50 5 7 9.225 8.119 2.225 1.318
50 10 12 18.599 11.470 6.599 1.550
100 1 3 3.297 8.092 0.297 1.099
100 3 5 4.916 8.351 -0.084 0.983
100 5 7 7.766 8.915 0.766 1.109
100 10 12 14.820 10.351 2.820 1.235
500 1 3 2.401 16.608 -0.599 0.800
500 3 5 4.613 16.393 -0.387 0.923
500 5 7 7.931 16.749 0.931 1.133
500 10 12 12.477 18.027 0.477 1.040
1000 1 3 2.917 23.255 -0.083 0.972
1000 3 5 5.835 23.771 0.835 1.167
1000 5 7 8.278 24.104 1.278 1.183
1000 10 12 12.920 24.375 0.920 1.077

Le graphique ci-dessous compare le biais moyen estimé au nombre de paramètres \(k\). La droite en pointillés représente la situation théorique idéale où le biais serait exactement égal à \(k\).

Si le théorème est vérifié empiriquement, les points doivent se situer autour de cette droite, en particulier pour les grandes tailles d’échantillon.

library(ggplot2)

ggplot(resultats, aes(x = k, y = biais_moyen, color = factor(n))) +
  geom_point(size = 3) +
  geom_line(aes(group = factor(n))) +
  geom_abline(intercept = 0, slope = 1, linetype = "dashed") +
  labs(
    title = "Convergence du biais d'optimisme vers k",
    x = "Nombre de paramètres k",
    y = "Biais moyen estimé",
    color = "Taille n"
  ) +
  theme_minimal()

2.6 Analyse et interprétation

Les résultats obtenus montrent que le biais moyen estimé est globalement proche du nombre de paramètres \(k\). Sur le graphique, les points issus des simulations se situent autour de la droite en pointillés, qui correspond à la situation théorique où le biais est exactement égal à \(k\).

On observe que les résultats sont plus stables lorsque la taille de l’échantillon augmente. Pour les grandes valeurs de \(n\), notamment \(n = 500\) et \(n = 1000\), les points sont généralement plus proches de la droite de référence. Cela est cohérent avec le théorème, car il s’agit d’un résultat asymptotique : l’approximation devient meilleure lorsque \(n\) devient grand.

Pour les petites tailles d’échantillon, comme \(n = 50\), les écarts peuvent être plus importants. Cela ne contredit pas le théorème, car celui-ci ne garantit pas une égalité exacte pour un petit échantillon. Il indique seulement une convergence lorsque la taille de l’échantillon tend vers l’infini.

Les résultats montrent également que le biais augmente avec le nombre de paramètres \(k\). Les modèles les plus complexes, c’est-à-dire ceux avec davantage de variables explicatives, présentent un biais d’optimisme plus élevé. Cela s’explique par le fait qu’un modèle avec plus de paramètres a plus de flexibilité pour s’ajuster aux données d’apprentissage.

Ainsi, les simulations confirment l’idée principale du théorème : la log-vraisemblance d’apprentissage donne une vision trop optimiste de la performance du modèle, et ce biais est approximativement égal au nombre de paramètres estimés.

2.7 Analyse et interprétation

Les résultats obtenus montrent que le biais moyen d’optimisme est proche du nombre de paramètres \(k\), en particulier lorsque la taille de l’échantillon augmente.

Pour les petites valeurs de \(n\), l’écart entre le biais moyen et \(k\) peut être plus important. Cela est normal, car le théorème est un résultat asymptotique : il devient plus précis lorsque \(n\) tend vers l’infini.

On observe également que lorsque le nombre de paramètres augmente, le biais d’optimisme augmente aussi. Cela confirme l’idée qu’un modèle plus complexe a davantage tendance à s’ajuster aux données d’apprentissage, ce qui rend sa performance apparente plus optimiste.

Ainsi, les simulations confirment empiriquement le résultat théorique étudié en cours.

2.8 Conclusion de la partie

Cette étude par simulation met en évidence le biais d’optimisme dans les modèles linéaires gaussiens. Lorsque le modèle est estimé et évalué sur les mêmes données, la log-vraisemblance d’apprentissage surestime la performance réelle du modèle.

Les résultats obtenus montrent que ce biais se rapproche du nombre de paramètres \(k\), conformément au théorème étudié. Cette conclusion justifie l’utilisation de critères comme l’AIC, qui corrigent la log-vraisemblance par une pénalisation liée au nombre de paramètres du modèle.

Ainsi, plus un modèle est complexe, plus il est nécessaire de corriger sa performance apparente afin d’éviter une évaluation trop optimiste.