Etude de la pollution à l’ozone à partir du jeu de données airquality
library(caret)
## Loading required package: lattice
## Loading required package: ggplot2
data("airquality")
dataset <- airquality
# 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
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
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.