Mission 1 — Ames: modéliser le prix

source("../../utils/requirements.R")
library(AmesHousing); library(broom); library(performance); library(car); library(GGally); library(dplyr)
set.seed(123)
ames <- make_ames()

Objectifs

  • Réaliser une EDA rapide — identifier les variables candidates
  • Construire un modèle de régression linéaire lm() avec ≤ 6 prédicteurs pertinents
  • Vérifier les diagnostics — résidus, normalité, homoscédasticité, VIF
  • Interpréter les coefficients \(\beta\)

Étapes guidées

1) Nettoyage minimal

ames <- ames %>% janitor::clean_names()
Note

Réflexion : Pourquoi est-il important de nettoyer les noms de variables avant de travailler? Quels problèmes cela pourrait-il éviter?


2) EDA éclair

GGally::ggpairs(ames %>% dplyr::select(sale_price, gr_liv_area, year_built, overall_qual, full_bath, garage_cars))

Note

À faire (équipe):

  • Quelles variables semblent corrélées avec sale_price? Notez les plus pertinentes.

  • Quelles relations semblent linéaires? Lesquelles paraissent non linéaires?

  • Identifiez au moins une variable qui pourrait nécessiter une transformation.

Astuce : pensez aux transformations si une relation paraît non linéaire (p. ex. log(sale_price)).


3) Modèle de base

Essayez de construire votre premier modèle à partir de 4 à 6 variables qui vous semblent pertinentes.

mod <- lm(sale_price ~ gr_liv_area + overall_qual + year_built + full_bath + garage_cars, data = ames)
summary(mod)

Call:
lm(formula = sale_price ~ gr_liv_area + overall_qual + year_built + 
    full_bath + garage_cars, data = ames)

Residuals:
    Min      1Q  Median      3Q     Max 
-442829  -17192    -901   14649  225492 

Coefficients:
                             Estimate Std. Error t value Pr(>|t|)    
(Intercept)                -9.190e+05  6.013e+04 -15.284  < 2e-16 ***
gr_liv_area                 5.690e+01  1.897e+00  29.993  < 2e-16 ***
overall_qualPoor            1.965e+04  1.964e+04   1.000 0.317338    
overall_qualFair            2.906e+04  1.802e+04   1.612 0.107034    
overall_qualBelow_Average   3.808e+04  1.733e+04   2.198 0.028046 *  
overall_qualAverage         5.348e+04  1.723e+04   3.105 0.001923 ** 
overall_qualAbove_Average   6.070e+04  1.727e+04   3.515 0.000446 ***
overall_qualGood            7.858e+04  1.735e+04   4.530 6.12e-06 ***
overall_qualVery_Good       1.230e+05  1.744e+04   7.053 2.17e-12 ***
overall_qualExcellent       2.013e+05  1.773e+04  11.356  < 2e-16 ***
overall_qualVery_Excellent  2.424e+05  1.862e+04  13.022  < 2e-16 ***
year_built                  4.686e+02  2.968e+01  15.789  < 2e-16 ***
full_bath                  -4.496e+03  1.670e+03  -2.692 0.007140 ** 
garage_cars                 1.318e+04  1.136e+03  11.600  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 34330 on 2916 degrees of freedom
Multiple R-squared:  0.8162,    Adjusted R-squared:  0.8154 
F-statistic: 996.1 on 13 and 2916 DF,  p-value: < 2.2e-16
Note

Réflexion :

  • Quels sont les coefficients estimés? Que signifient-ils dans le contexte du prix des maisons?

  • Quels prédicteurs sont significatifs? Comment l’interprétez-vous?

  • Quelle est la valeur du \(R^2\)? Est-elle satisfaisante?


4) Diagnostics

par(mfrow=c(2,2)); plot(mod); par(mfrow=c(1,1))

performance::check_collinearity(mod)
# Check for Multicollinearity

Low Correlation

         Term  VIF   VIF 95% CI adj. VIF Tolerance Tolerance 95% CI
  gr_liv_area 2.29 [2.16, 2.42]     1.51      0.44     [0.41, 0.46]
 overall_qual 2.63 [2.48, 2.79]     1.06      0.38     [0.36, 0.40]
   year_built 2.00 [1.90, 2.12]     1.42      0.50     [0.47, 0.53]
    full_bath 2.12 [2.01, 2.24]     1.46      0.47     [0.45, 0.50]
  garage_cars 1.86 [1.77, 1.96]     1.36      0.54     [0.51, 0.57]
car::ncvTest(mod) # test d'homoscédasticité de Breusch-Pagan
Non-constant Variance Score Test 
Variance formula: ~ fitted.values 
Chisquare = 4219.156, Df = 1, p = < 2.22e-16
Note

Questions de réflexion :

  1. Que remarquez-vous sur le QQ-plot? Les résidus sont-ils approximativement normaux?

  2. Y a-t-il des indices de variance non constante? Quelles en seraient les conséquences?

  3. Le VIF suggère-t-il de la multicolinéarité?


5) Interprétation

  • Exemple : \(\beta_{gr\_liv\_area}\) indique la variation moyenne du prix pour +1 pi².
  • Pour comparer les effets entre variables, testez un modèle standardisé.
mod_std <- lm(scale(sale_price) ~ scale(gr_liv_area) + scale(as.numeric(overall_qual)) + scale(year_built) + scale(full_bath) + scale(garage_cars),
 data = ames)
broom::tidy(mod_std)
# A tibble: 6 × 5
  term                             estimate std.error statistic    p.value
  <chr>                               <dbl>     <dbl>     <dbl>      <dbl>
1 (Intercept)                      5.63e-16   0.00891  6.32e-14 1.000e+  0
2 scale(gr_liv_area)               4.03e- 1   0.0132   3.04e+ 1 9.73 e-177
3 scale(as.numeric(overall_qual))  4.24e- 1   0.0136   3.11e+ 1 2.55 e-183
4 scale(year_built)                1.67e- 1   0.0125   1.33e+ 1 3.21 e- 39
5 scale(full_bath)                -7.63e- 2   0.0127  -6.02e+ 0 1.92 e-  9
6 scale(garage_cars)               1.44e- 1   0.0121   1.19e+ 1 6.12 e- 32
Note

Réflexion :

  • Quelle variable a le plus grand effet relatif? Est-ce cohérent avec vos attentes?

  • Comment interprétez-vous les coefficients standardisés?

  • Y a-t-il des signes inattendus? Comment les expliqueriez-vous?


Travail d’équipe

  1. Quelle variable a l’effet le plus fort ? Justifiez via les coefficients standardisés.

  2. Y a-t-il des signes inattendus ? Proposez une explication.

  3. Que raconte le QQ-plot des résidus ?

  4. Proposez une variable que vous auriez pu inclure mais que vous avez laissée de côté. Pourquoi?


Discussion collective

  • Sélection raisonnée vs. pas à pas (pourquoi éviter l’automatisme aveugle)

  • Variables corrélées et VIF: seuils et bons réflexes

  • Comment présenter un modèle imparfait à un non-spécialiste?


Points de discussion — approfondis

  • Justification avec un expert des variables incluses ou exclues (au-delà des p-valeurs).

  • Stabilité des coefficients : colinéarité, sous-échantillonnage répété (validation).

  • Éthique & communication : comment présenter l’incertitude à un public non technique.

  • Reproductibilité : graine aléatoire, sessionInfo(), versionnage du code.


Questions bonus

  1. Proposez une transformation (log, standardisation, polynomial) pour un prédicteur et justifiez-la.

  2. Identifiez un point potentiellement influent et discutez s’il faut l’exclure (et pourquoi).

  3. Imaginez un scénario où une variable est très significative statistiquement mais peu pertinente dans la réalité. Que faites-vous?