Objet du TP

Etude de la pollution à l’ozone à partir du jeu de données airquality

library(caret)
## Loading required package: lattice
## Loading required package: ggplot2

Chargement du dataset

data("airquality")
dataset <- airquality

Préparation et étude du dataset

# dimensions du dataset
dim(dataset)
## [1] 153   6
# liste des types pour chaque attribut
sapply(dataset, class)
##     Ozone   Solar.R      Wind      Temp     Month       Day 
## "integer" "integer" "numeric" "integer" "integer" "integer"
# visualisation des 5 premières lignes des données
head(dataset)
##   Ozone Solar.R Wind Temp Month Day
## 1    41     190  7.4   67     5   1
## 2    36     118  8.0   72     5   2
## 3    12     149 12.6   74     5   3
## 4    18     313 11.5   62     5   4
## 5    NA      NA 14.3   56     5   5
## 6    28      NA 14.9   66     5   6
# On établit des corrélations entre l’ensemble des différentes variables présentes dans le jeu de données sous forme d’un tableau.
cor(dataset)
##         Ozone Solar.R       Wind       Temp        Month          Day
## Ozone       1      NA         NA         NA           NA           NA
## Solar.R    NA       1         NA         NA           NA           NA
## Wind       NA      NA  1.0000000 -0.4579879 -0.178292579  0.027180903
## Temp       NA      NA -0.4579879  1.0000000  0.420947252 -0.130593175
## Month      NA      NA -0.1782926  0.4209473  1.000000000 -0.007961763
## Day        NA      NA  0.0271809 -0.1305932 -0.007961763  1.000000000
# on supprime les valeurs N/A du jeu de données initial.
dataset = na.omit(dataset)
# dimensions du dataset après suppression des valeurs NA
dim(dataset)
## [1] 111   6
# On vérifie les corrélations après suppression des valeurs NA
cor(dataset)
##                Ozone     Solar.R        Wind       Temp        Month
## Ozone    1.000000000  0.34834169 -0.61249658  0.6985414  0.142885168
## Solar.R  0.348341693  1.00000000 -0.12718345  0.2940876 -0.074066683
## Wind    -0.612496576 -0.12718345  1.00000000 -0.4971897 -0.194495804
## Temp     0.698541410  0.29408764 -0.49718972  1.0000000  0.403971709
## Month    0.142885168 -0.07406668 -0.19449580  0.4039717  1.000000000
## Day     -0.005189769 -0.05775380  0.04987102 -0.0965458 -0.009001079
##                  Day
## Ozone   -0.005189769
## Solar.R -0.057753801
## Wind     0.049871017
## Temp    -0.096545800
## Month   -0.009001079
## Day      1.000000000

Regression linéaire simple

Nous constatons une forte dispersion des données autour de la droite de regression pour les températures supérieures à 80. Le modèle n’est donc pas complètement adapté à notre jeu de données.

mod <- lm(Ozone ~ Temp, data = dataset)
summary(mod)
## 
## Call:
## lm(formula = Ozone ~ Temp, data = dataset)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -40.922 -17.459  -0.874  10.444 118.078 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -147.6461    18.7553  -7.872 2.76e-12 ***
## Temp           2.4391     0.2393  10.192  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 23.92 on 109 degrees of freedom
## Multiple R-squared:  0.488,  Adjusted R-squared:  0.4833 
## F-statistic: 103.9 on 1 and 109 DF,  p-value: < 2.2e-16
ggplot(dataset, aes(x = Temp, y = Ozone)) + 
  geom_point() +
  stat_smooth(method = "lm", col = "red")

n = nrow(dataset)
p = ncol(dataset)
Ind.test = sample(n,n/3)
Learn = dataset[-Ind.test,]
Test = dataset[Ind.test,]
mod1 = lm(Ozone ~ ., data=Learn)
prev = predict(mod1,newdata=Test)
summary(prev-Test$Ozone)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## -45.08498   0.05801   7.05035   5.65477  14.77527  36.05011
plot(prev-Test$Ozone)

# compute Mean Squared error of prediction
mse = mean((prev-dataset$Ozone)^2)
print(sqrt(mse))
## [1] 43.32135

## Régression polynomiale

Avec le modèle polynomiale, nous limitons un peu la dispersion constatée précédemment.

mod2 = lm(Ozone ~ Temp + I(Temp^2), data=Learn)
prev2 = predict(mod2,newdata=Test)
summary(prev2-Test$Ozone)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -75.196  -7.037   3.378   4.525  15.167  42.332
plot(prev2-Test$Ozone)

ggplot(Test, aes(x = Temp, y = Ozone)) + 
  geom_point() +
  stat_smooth(method = "lm", formula = y ~ x + I(x^2), col = "red")

# compute Mean Squared error of prediction
mse = mean((prev2-Test$Ozone)^2)
print(sqrt(mse))
## [1] 20.27042

Conclusion

Il semble qu’il n’y ait pas suffisamment de données, pour les températures inférieures à 80, nous permettant de tirer des conclusions. Les données sont proches de la droite de regression mais insuffisamment nombreuses.

Le polynome de second degré semble être plus fidèle à la droite de régression. Les données sont plus nombreuses et plus fidèles et à la droite de regression. Nous pouvons conclure qu’il est plus adapté.

Il semble que les coefficients soient très différents entre les deux modèles.

Courbes: Fitted = valeur ajustée. Residual vs Fitted: pondération des erreurs en fonction de la valeur de y.