library(MASS)
library(car)
## Warning: le package 'car' a été compilé avec la version R 4.4.3
## Le chargement a nécessité le package : carData
## Warning: le package 'carData' a été compilé avec la version R 4.4.3
#install.packages("ISLR2")
library(ISLR2)
## Warning: le package 'ISLR2' a été compilé avec la version R 4.4.3
##
## Attachement du package : 'ISLR2'
## L'objet suivant est masqué depuis 'package:MASS':
##
## Boston
Nous utiliserons dans ce travail les données sur les maisons à Boston.
boston_data = Boston
#?Boston
str(boston_data)
## 'data.frame': 506 obs. of 13 variables:
## $ crim : num 0.00632 0.02731 0.02729 0.03237 0.06905 ...
## $ zn : num 18 0 0 0 0 0 12.5 12.5 12.5 12.5 ...
## $ indus : num 2.31 7.07 7.07 2.18 2.18 2.18 7.87 7.87 7.87 7.87 ...
## $ chas : int 0 0 0 0 0 0 0 0 0 0 ...
## $ nox : num 0.538 0.469 0.469 0.458 0.458 0.458 0.524 0.524 0.524 0.524 ...
## $ rm : num 6.58 6.42 7.18 7 7.15 ...
## $ age : num 65.2 78.9 61.1 45.8 54.2 58.7 66.6 96.1 100 85.9 ...
## $ dis : num 4.09 4.97 4.97 6.06 6.06 ...
## $ rad : int 1 2 2 3 3 3 5 5 5 5 ...
## $ tax : num 296 242 242 222 222 222 311 311 311 311 ...
## $ ptratio: num 15.3 17.8 17.8 18.7 18.7 18.7 15.2 15.2 15.2 15.2 ...
## $ lstat : num 4.98 9.14 4.03 2.94 5.33 ...
## $ medv : num 24 21.6 34.7 33.4 36.2 28.7 22.9 27.1 16.5 18.9 ...
head(boston_data)
## crim zn indus chas nox rm age dis rad tax ptratio lstat medv
## 1 0.00632 18 2.31 0 0.538 6.575 65.2 4.0900 1 296 15.3 4.98 24.0
## 2 0.02731 0 7.07 0 0.469 6.421 78.9 4.9671 2 242 17.8 9.14 21.6
## 3 0.02729 0 7.07 0 0.469 7.185 61.1 4.9671 2 242 17.8 4.03 34.7
## 4 0.03237 0 2.18 0 0.458 6.998 45.8 6.0622 3 222 18.7 2.94 33.4
## 5 0.06905 0 2.18 0 0.458 7.147 54.2 6.0622 3 222 18.7 5.33 36.2
## 6 0.02985 0 2.18 0 0.458 6.430 58.7 6.0622 3 222 18.7 5.21 28.7
summary(boston_data)
## crim zn indus chas
## Min. : 0.00632 Min. : 0.00 Min. : 0.46 Min. :0.00000
## 1st Qu.: 0.08205 1st Qu.: 0.00 1st Qu.: 5.19 1st Qu.:0.00000
## Median : 0.25651 Median : 0.00 Median : 9.69 Median :0.00000
## Mean : 3.61352 Mean : 11.36 Mean :11.14 Mean :0.06917
## 3rd Qu.: 3.67708 3rd Qu.: 12.50 3rd Qu.:18.10 3rd Qu.:0.00000
## Max. :88.97620 Max. :100.00 Max. :27.74 Max. :1.00000
## nox rm age dis
## Min. :0.3850 Min. :3.561 Min. : 2.90 Min. : 1.130
## 1st Qu.:0.4490 1st Qu.:5.886 1st Qu.: 45.02 1st Qu.: 2.100
## Median :0.5380 Median :6.208 Median : 77.50 Median : 3.207
## Mean :0.5547 Mean :6.285 Mean : 68.57 Mean : 3.795
## 3rd Qu.:0.6240 3rd Qu.:6.623 3rd Qu.: 94.08 3rd Qu.: 5.188
## Max. :0.8710 Max. :8.780 Max. :100.00 Max. :12.127
## rad tax ptratio lstat
## Min. : 1.000 Min. :187.0 Min. :12.60 Min. : 1.73
## 1st Qu.: 4.000 1st Qu.:279.0 1st Qu.:17.40 1st Qu.: 6.95
## Median : 5.000 Median :330.0 Median :19.05 Median :11.36
## Mean : 9.549 Mean :408.2 Mean :18.46 Mean :12.65
## 3rd Qu.:24.000 3rd Qu.:666.0 3rd Qu.:20.20 3rd Qu.:16.95
## Max. :24.000 Max. :711.0 Max. :22.00 Max. :37.97
## medv
## Min. : 5.00
## 1st Qu.:17.02
## Median :21.20
## Mean :22.53
## 3rd Qu.:25.00
## Max. :50.00
pairs(boston_data, upper.panel = NULL)
La variable d’intérêt est medv: Le prix médian de la maison Elle semble
plus corrélé à la variable lstat qui représente le pourcentage de maison
ayant un statut économique faible.
On va commencer par un modèle de régression linéaire simple pour expliquer le prix des maison à Boston.
#Régression linéaire simple: medv en fonction de lstat
attach(boston_data)
model_reg_simple = lm(medv~lstat)
summary(model_reg_simple)
##
## Call:
## lm(formula = medv ~ lstat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -15.168 -3.990 -1.318 2.034 24.500
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 34.55384 0.56263 61.41 <2e-16 ***
## lstat -0.95005 0.03873 -24.53 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6.216 on 504 degrees of freedom
## Multiple R-squared: 0.5441, Adjusted R-squared: 0.5432
## F-statistic: 601.6 on 1 and 504 DF, p-value: < 2.2e-16
Le modèle est globalement significatif (avec une p valeur inférieur à 5%). Tous les coefficients estimés sont significatif. Et la variable lstat explique 54,41% de la variabilité du prix des maisons. Et si la valeur de la variable lstat augmente d’un point de pourcentage alors le prix médian des maisons de la zone concernée baisse de 95$.
names(model_reg_simple) # les objets sauvegarder dans model_reg_simple
## [1] "coefficients" "residuals" "effects" "rank"
## [5] "fitted.values" "assign" "qr" "df.residual"
## [9] "xlevels" "call" "terms" "model"
coef(model_reg_simple) # coefficients estimés
## (Intercept) lstat
## 34.5538409 -0.9500494
confint(model_reg_simple)
## 2.5 % 97.5 %
## (Intercept) 33.448457 35.6592247
## lstat -1.026148 -0.8739505
On peut également vérifier qu’un coefficient est significatif en regardant l’intervalle de confiance.
attach(boston_data)
## Les objets suivants sont masqués depuis boston_data (pos = 3):
##
## age, chas, crim, dis, indus, lstat, medv, nox, ptratio, rad, rm,
## tax, zn
plot(lstat,medv,pch = "+")
abline(model_reg_simple, lwd=3, col = 'red')
par(mfrow = c(2,2))
plot(model_reg_simple)
La spécification du modèle semble ne pas être valide. les résidus ne
sont pas normalement distribués. Et note la présence des points
influents et leviers.
On va commencer par explorer le problème de spécifiaction du modèle
model2 = lm(medv~lstat + I(lstat^2))
summary(model2)
##
## Call:
## lm(formula = medv ~ lstat + I(lstat^2))
##
## Residuals:
## Min 1Q Median 3Q Max
## -15.2834 -3.8313 -0.5295 2.3095 25.4148
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 42.862007 0.872084 49.15 <2e-16 ***
## lstat -2.332821 0.123803 -18.84 <2e-16 ***
## I(lstat^2) 0.043547 0.003745 11.63 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.524 on 503 degrees of freedom
## Multiple R-squared: 0.6407, Adjusted R-squared: 0.6393
## F-statistic: 448.5 on 2 and 503 DF, p-value: < 2.2e-16
Le modele est globalement significatif avec chaque coefficient qui est significatif. De plus 64% de la variabilité du prix des maisons est expliquée par le pourcentage de familles ayant statut socio économique faible.
Utiliser l’ANOVA \(H_0\): Les deux modèles ont les mêmes performances \(H_1\): Le modèle complet est méilleur
anova(model_reg_simple, model2)
## Analysis of Variance Table
##
## Model 1: medv ~ lstat
## Model 2: medv ~ lstat + I(lstat^2)
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 504 19472
## 2 503 15347 1 4125.1 135.2 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Il y’a assez d’évidence pour conclure que ce nouveau modèle est meilleur.
par(mfrow = c(2,2))
plot(model2)
# Ajout d’autres variables: régression linéaire multiples
model_multiple1 = lm(medv~lstat+ I(lstat^2)+rm)
summary(model_multiple1)
##
## Call:
## lm(formula = medv ~ lstat + I(lstat^2) + rm)
##
## Residuals:
## Min 1Q Median 3Q Max
## -18.1427 -3.2429 -0.4829 2.3607 27.0256
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 11.68964 3.13810 3.725 0.000217 ***
## lstat -1.84863 0.12213 -15.136 < 2e-16 ***
## I(lstat^2) 0.03634 0.00348 10.443 < 2e-16 ***
## rm 4.22727 0.41172 10.267 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.027 on 502 degrees of freedom
## Multiple R-squared: 0.7031, Adjusted R-squared: 0.7013
## F-statistic: 396.2 on 3 and 502 DF, p-value: < 2.2e-16
modele_mul_2 = lm(medv~ ., data = boston_data)
summary(modele_mul_2)
##
## Call:
## lm(formula = medv ~ ., data = boston_data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -15.1304 -2.7673 -0.5814 1.9414 26.2526
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 41.617270 4.936039 8.431 3.79e-16 ***
## crim -0.121389 0.033000 -3.678 0.000261 ***
## zn 0.046963 0.013879 3.384 0.000772 ***
## indus 0.013468 0.062145 0.217 0.828520
## chas 2.839993 0.870007 3.264 0.001173 **
## nox -18.758022 3.851355 -4.870 1.50e-06 ***
## rm 3.658119 0.420246 8.705 < 2e-16 ***
## age 0.003611 0.013329 0.271 0.786595
## dis -1.490754 0.201623 -7.394 6.17e-13 ***
## rad 0.289405 0.066908 4.325 1.84e-05 ***
## tax -0.012682 0.003801 -3.337 0.000912 ***
## ptratio -0.937533 0.132206 -7.091 4.63e-12 ***
## lstat -0.552019 0.050659 -10.897 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4.798 on 493 degrees of freedom
## Multiple R-squared: 0.7343, Adjusted R-squared: 0.7278
## F-statistic: 113.5 on 12 and 493 DF, p-value: < 2.2e-16
modele_mul_2 = lm(medv ~ . -age, data= boston_data)
summary(modele_mul_2)
##
## Call:
## lm(formula = medv ~ . - age, data = boston_data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -15.1851 -2.7330 -0.6116 1.8555 26.3838
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 41.525128 4.919684 8.441 3.52e-16 ***
## crim -0.121426 0.032969 -3.683 0.000256 ***
## zn 0.046512 0.013766 3.379 0.000785 ***
## indus 0.013451 0.062086 0.217 0.828577
## chas 2.852773 0.867912 3.287 0.001085 **
## nox -18.485070 3.713714 -4.978 8.91e-07 ***
## rm 3.681070 0.411230 8.951 < 2e-16 ***
## dis -1.506777 0.192570 -7.825 3.12e-14 ***
## rad 0.287940 0.066627 4.322 1.87e-05 ***
## tax -0.012653 0.003796 -3.333 0.000923 ***
## ptratio -0.934649 0.131653 -7.099 4.39e-12 ***
## lstat -0.547409 0.047669 -11.483 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4.794 on 494 degrees of freedom
## Multiple R-squared: 0.7343, Adjusted R-squared: 0.7284
## F-statistic: 124.1 on 11 and 494 DF, p-value: < 2.2e-16
summary(lm(medv ~ lstat+rm + I(lstat^2)+lstat:age))
##
## Call:
## lm(formula = medv ~ lstat + rm + I(lstat^2) + lstat:age)
##
## Residuals:
## Min 1Q Median 3Q Max
## -18.1368 -3.1809 -0.5079 2.3656 26.8627
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 12.3506685 3.3346919 3.704 0.000236 ***
## lstat -1.9110194 0.1617279 -11.816 < 2e-16 ***
## rm 4.1607163 0.4272046 9.739 < 2e-16 ***
## I(lstat^2) 0.0362632 0.0034843 10.408 < 2e-16 ***
## lstat:age 0.0005690 0.0009661 0.589 0.556152
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.03 on 501 degrees of freedom
## Multiple R-squared: 0.7033, Adjusted R-squared: 0.7009
## F-statistic: 296.9 on 4 and 501 DF, p-value: < 2.2e-16