source("../../utils/requirements.R")
library(AmesHousing); library(broom); library(performance); library(car); library(GGally); library(dplyr)
set.seed(123)
ames <- make_ames()Mission 1 — Ames: modéliser le prix
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()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))À 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
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-PaganNon-constant Variance Score Test
Variance formula: ~ fitted.values
Chisquare = 4219.156, Df = 1, p = < 2.22e-16
Questions de réflexion :
Que remarquez-vous sur le QQ-plot? Les résidus sont-ils approximativement normaux?
Y a-t-il des indices de variance non constante? Quelles en seraient les conséquences?
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
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
Quelle variable a l’effet le plus fort ? Justifiez via les coefficients standardisés.
Y a-t-il des signes inattendus ? Proposez une explication.
Que raconte le QQ-plot des résidus ?
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
Proposez une transformation (log, standardisation, polynomial) pour un prédicteur et justifiez-la.
Identifiez un point potentiellement influent et discutez s’il faut l’exclure (et pourquoi).
Imaginez un scénario où une variable est très significative statistiquement mais peu pertinente dans la réalité. Que faites-vous?