Librairie utile

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

Données utiles

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.

Visualisation

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

Régression linéaire multiple: tenir compte de la non linéarité

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.

Analyser les performances des deux modèles

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