intro_to_ml/02_a_application_abalone.Rmd

118 lines
3.9 KiB
Plaintext

# Application au jeu de données `abalone`
## Récupération du jeu de données
Téléchargeons le jeu de données [`abalone`](http://archive.ics.uci.edu/ml/datasets/Abalone) depuis le répertoire de l'Université de Californie Irvine (University of California Irvine, UCI, machine learning repository).
Variable | Type | Unité | Commentaire
----------------|-------------|--------|------------------------------
Sex | nominal | - | M, F, and I (infant)
Length | continuous | mm | Longest shell measurement
Diameter | continuous | mm | perpendicular to length
Height | continuous | mm | with meat in shell
Whole weight | continuous | grams | whole abalone
Shucked weight | continuous | grams | weight of meat
Viscera weight | continuous | grams | gut weight (after bleeding)
Shell weight | continuous | grams | after being dried
Rings | integer | - | +1.5 gives the age in years
```{r cache=TRUE}
abalone.cols = c("sex", "length", "diameter", "height", "whole.wt",
"shucked.wt", "viscera.wt", "shell.wt", "rings")
url <- 'http://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data'
abalone <- read.table(url, sep=",", row.names=NULL, col.names=abalone.cols,
nrows=4177)
```
```{r}
str(abalone)
```
## Préparation du jeu de données
En cherchant des valeurs aberrantes, nous remarquons que, pour deux observations, la variable `height` a une valeur nulle.
```{r}
table(abalone$height)
```
Nous regardons les valeurs des autres attributs pour ces deux observations.
```{r}
abalone[abalone$height==0,]
```
Nous supprimons ces observations.
```{r}
abalone <- subset(abalone, height!=0)
```
Nous affichons les corrélations entre variables.
```{r}
print(as.matrix(cor(na.omit(abalone[,-1]))), digits=2)
```
Les variables sont très corrélées. Mesurons les colinéarités par les facteurs d'inflation de la variance.
```{r}
library(car)
vif(lm(rings ~ ., data = abalone))
```
Parmi les variables corrélées, nous proposons de conserver celles avec les scores VIF les plus faibles (c'est-à-dire celles dont la variance s'explique le moins par la variance d'autres variables).
## Modèle linéaire
Nous calculons un modèle linéaire.
```{r}
abalone_lm <- lm(rings ~ length + height + viscera.wt + sex, data = abalone)
```
Observons les résultats statistiques proposés par défaut.
```{r}
summary(abalone_lm)
```
## Analyse graphique du modèle linéaire
Affichons les résidus pour chaque observation.
```{r}
plot(abalone_lm, which = 1, id.n = 5)
```
L'observation d'identifiant $2052$ semble anormale. Nous observons que sa valeur `height` est anormalement élevée : `r abalone["2052","height"]`.
```{r}
abalone <- abalone[!(row.names(abalone) %in% c("2052")),]
abalone_lm <- lm(rings ~ length + height + viscera.wt + sex, data = abalone)
summary(abalone_lm)
```
```{r}
plot(abalone_lm, which = 1, id.n = 5)
```
La variance des résidus n'est pas homogène. Plus le nombre d'anneaux est grand, plus la variance des résidus est grande.
Ainsi, testons si un transformation logarithmique peut être signifique.
```{r}
abalone_lm <- lm(log(rings) ~ length + height + viscera.wt + sex, data = abalone)
summary(abalone_lm)
```
Avec les intervalles de confiance.
```{r}
confint(abalone_lm)
```
```{r}
plot(abalone_lm, which = 1, id.n = 5)
```
Observons les résidus en fonction des effets levier.
```{r}
plot(abalone_lm, which = 5, id.n = 5)
```
## Interprétation du modèle linéaire
Une augmentation de `length` de $1mm$ augmente la prédiction de $1.1$ anneaux avec un intervalle de confiance à $95\%$ qui vaut $[0.95,1.27]$.
De même pour les autres variables continues.
Un passage de la variable `sex` de la catégorie de référence F à la catégorie I entraîne une diminution du nombre d'anneaux prédits de $0.12$ avec un intervalle de confiance à $95\%$ qui vaut $[-0.14,-0.10]$.