Ce TP a pour objectif de mener l’étude descriptive uni- et
bi-dimensionnelle du jeu de données wine
disponible sous
Moodle. Vous rédigerez les réponses et vos observations dans le script
.Rmd du TP au fur et à mesure. Vous pourrez compiler votre script à la
fin du TP pour obtenir un compte-rendu du TP.
Remarque : pensez à enlever les “eval=F” au fur et à mesure de l’avancement dans le TP pour avoir les résultats dans votre compte-rendu final de TP.
On va étudier le jeu de données wine disponible sur la page moodle du cours. Commencez par récupérer ce jeu de données et sauvegardez le fichier dans votre dossier de travail.
Le jeu de données wine comprend des mesures physico-chimiques réalisées sur un échantillon de \(600\) vins (rouges et blancs) du Portugal. Ces mesures sont complétées par une évaluation sensorielle de la qualité par un ensemble d’experts. Chaque vin est décrit par les variables suivantes :
Dans un premier temps, commencez par charger le jeu de données à
l’aide de la fonction read.table()
.
wine <- read.table("wine.txt",header=TRUE)
Vous pouvez voir les premières lignes du jeu de données à l’aide de
la fonction head()
head(wine)
Qualite Type AcidVol AcidCitr SO2lbr SO2tot Densite Alcool
1352 medium 1 0.62 0.01 8 46 0.99332 11.8
5493 medium 0 0.34 0.10 17 63 0.99370 9.2
5153 medium 0 0.22 0.22 39 110 0.99855 9.0
5308 medium 0 0.35 0.46 61 183 0.99786 9.0
3866 medium 0 0.42 0.32 20 167 0.99479 10.6
694 medium 1 0.48 0.32 21 122 0.99840 9.4
Question : Contrôlez la dimension du jeu de données
(c’est-à-dire le nombre d’individus et le nombre de variables) ? Vous
pouvez vous aider des fonctions dim()
,
nrow()
et ncol()
.
dim(wine)
[1] 600 8
nrow(wine)
[1] 600
ncol(wine)
[1] 8
Question : Contrôlez que l’objet wine
est bien de type data.frame (commande is.data.frame()
) ?
Remarquons que l’on peut obtenir les noms des variables grâce à la
commande names(wine)
ou colnames(wine)
. Plus
largement, on peut utiliser la commande attributes()
.
is.data.frame(wine)
[1] TRUE
names(wine)
[1] "Qualite" "Type" "AcidVol" "AcidCitr" "SO2lbr" "SO2tot" "Densite"
[8] "Alcool"
colnames(wine)
[1] "Qualite" "Type" "AcidVol" "AcidCitr" "SO2lbr" "SO2tot" "Densite"
[8] "Alcool"
Question : Quelle est la nature de chaque variable ?
Vous pouvez vous aider de la commande str()
.
str(wine)
'data.frame': 600 obs. of 8 variables:
$ Qualite : chr "medium" "medium" "medium" "medium" ...
$ Type : int 1 0 0 0 0 1 0 0 0 0 ...
$ AcidVol : num 0.62 0.34 0.22 0.35 0.42 0.48 0.21 0.28 0.3 0.4 ...
$ AcidCitr: num 0.01 0.1 0.22 0.46 0.32 0.32 0.32 0.14 0.25 0.42 ...
$ SO2lbr : num 8 17 39 61 20 21 39 64 21 41 ...
$ SO2tot : int 46 63 110 183 167 122 113 159 124 176 ...
$ Densite : num 0.993 0.994 0.999 0.998 0.995 ...
$ Alcool : num 11.8 9.2 9 9 10.6 9.4 10.2 10 10.8 9.4 ...
Attention, il faut bien préciser à R les variables qui doivent être
considérées comme qualitatives. On utilise donc la fonction
as.factor()
sur les variables Qualite et
Type. On va aussi en profiter pour renommer les modalités de la
variable Type en blanc
et rouge
.
wine$Qualite<-as.factor(wine$Qualite)
wine$Type<-factor(wine$Type,labels=c("blanc","rouge"))
head(wine)
Qualite Type AcidVol AcidCitr SO2lbr SO2tot Densite Alcool
1352 medium rouge 0.62 0.01 8 46 0.99332 11.8
5493 medium blanc 0.34 0.10 17 63 0.99370 9.2
5153 medium blanc 0.22 0.22 39 110 0.99855 9.0
5308 medium blanc 0.35 0.46 61 183 0.99786 9.0
3866 medium blanc 0.42 0.32 20 167 0.99479 10.6
694 medium rouge 0.48 0.32 21 122 0.99840 9.4
On peut obtenir un résumé rapide du jeu de données à l’aide de la
fonction summary()
summary(wine)
Qualite Type AcidVol AcidCitr SO2lbr
bad : 19 blanc:425 Min. :0.1000 Min. :0.0000 Min. : 2.00
good :110 rouge:175 1st Qu.:0.2400 1st Qu.:0.2400 1st Qu.: 15.75
medium:471 Median :0.3000 Median :0.3000 Median : 27.00
Mean :0.3512 Mean :0.3141 Mean : 29.41
3rd Qu.:0.4300 3rd Qu.:0.3900 3rd Qu.: 41.00
Max. :1.0400 Max. :1.0000 Max. :112.00
SO2tot Densite Alcool
Min. : 7.0 Min. :0.9875 Min. : 8.00
1st Qu.: 68.0 1st Qu.:0.9925 1st Qu.: 9.50
Median :114.5 Median :0.9949 Median :10.40
Mean :111.2 Mean :0.9947 Mean :10.49
3rd Qu.:154.0 3rd Qu.:0.9970 3rd Qu.:11.30
Max. :278.0 Max. :1.0030 Max. :14.00
ggplot2
Avant de commencer l’analyse uni- et bi-dimensionnelle du jeu de
données, on va ici donner quelques notions sur les graphiques avec
ggplot2
pour comprendre la suite.
ggplot2 est une extension dédiée aux graphiques. Elle est basée sur une syntaxe particulière (il faut oublier les graphiques de base de R) mais robuste et efficace pour la construction de graphiques complexes. Elle part du principe (comme tout package de tidyverse) que les données relatives au graphique sont stockées dans un tableau (data.frame ou tibble).
Un graphique en ggplot2
s’initialise avec la fonction
ggplot()
qui prend en argument le jeu de données étudié.
Par exemple,
gEx <- ggplot(data=wine)
Pour l’instant, on ne voit rien mais pourtant l’objet
gEx
contient des informations:
summary(gEx)
data: Qualite, Type, AcidVol, AcidCitr, SO2lbr, SO2tot, Densite, Alcool
[600x8]
faceting: <ggproto object: Class FacetNull, Facet, gg>
compute_layout: function
draw_back: function
draw_front: function
draw_labels: function
draw_panels: function
finish_data: function
init_scales: function
map_data: function
params: list
setup_data: function
setup_params: function
shrink: TRUE
train_scales: function
vars: function
super: <ggproto object: Class FacetNull, Facet, gg>
names(gEx)
[1] "data" "layers" "scales" "mapping" "theme"
[6] "coordinates" "facet" "plot_env" "labels"
gEx$layers
list()
mais pour l’instant son layers
est vide.
On ajoute ensuite des éléments graphiques, appelés geom
,
à l’objet graphique grâce à l’opérateur +
et on précise à
l’aide de la fonction aes()
les données à utiliser en
argument du geom
. Par exemple, si on veut tracer le nuage
de points entre les variables Densite
et
Alcool
:
ggplot(data=wine,aes(x=Densite,y=Alcool))+
geom_point()
Parmi les geom
les plus utilisés, on peut citer
geom_point()
(nuage de points)geom_line()
(trace des lignes)geom_bar()
(représentation en bâtons)geom_boxplot()
(boxplot)geom_violin()
(violin plot)geom_histogram()
(histogramme)geom_density()
(densité)geom_smooth()
On peut ajouter un mappage, c’est à dire une mise en
relation entre un attribut graphique d’un geom
et une
variable du tableau de données. Par exemple, on peut mettre des couleurs
à un nuage de points en fonction d’une variable qualitative, … Il faut
bien distinguer un mappage d’une modification d’un attribut graphique
sans lien avec une variable. Une règle importante à retenir est donc
aes()
aes()
.Par exemple,
ggplot(data=wine)+
geom_point(aes(x=Densite,y=Alcool,color=Type))
ggplot(data=wine)+
geom_point(aes(x=Densite,y=Alcool),color="blue")
On peut représenter plusieurs geom
sur un même graphique
simultanément, il suffit d’utiliser l’opérateur +
pour les
ajouter au fur et à mesure. Par exemple,
ggplot(data=wine)+
geom_violin(aes(x=Qualite,y=Alcool))+
geom_point(aes(x=Qualite,y=Alcool), col = "blue", alpha = 0.2,position="jitter")
Les scales permettent de modifier la façon dont un attribut
graphique est lié aux valeurs d’une variable. Pour les modifier, on
ajoute un nouvel élément de la forme
scale_<attribut>_<type>
à l’objet graphique
ggplot2 avec +
. Les fonctions scale les plus
connues sont :
scale_size()
(avec son argument range
)
pour modifier les tailles minimales, maximales, …scale_x()
et scale_y()
pour modifier l’axe
x
et l’axe y
respectivementscale_x_continuous()
(resp.
scale_x_discrete()
) pour modifier l’axe des x
dans le cas d’une variable quantitative (resp. une variable
qualitative)scale_y_continuous()
(resp.
scale_y_discrete()
) pour modifier l’axe des y
dans le cas d’une variable quantitative (resp. une variable
qualitative)scale_color()
pour modifier les couleurs de dessinscale_fill()
pour modifier les couleurs de
remplissagePour les couleurs, on peut spécifier un gradient de couleur sur une
variable quantitative avec scale_color_gradient()
, modifier
manuellement la palette de couleur avec
scale_color_manual()
, faire appel à une palette de couleur
prédéfinie (par exemple en utilisant le package viridis avec scale_color_viridis
, en
s’appuyant sur les palettes disponibles dans ColorBrewer avec scale_color_brewer()
),
…
ggplot(data=wine)+
geom_point(aes(x=Alcool,y=Densite,size=AcidVol,color=Type))+
scale_size("Acide vol.", range = c(0,1.5),breaks=seq(0,1.5,0.2)) +
scale_x_continuous("Alcool",limits=c(8,16)) +
scale_y_continuous("Densité",limits=c(0.985,1.01))
Remarque : on peut modifier certains éléments avec une commande spécifique comme
ggtitle()
pour modifier le titrexlab()
et ylab()
pour modifier l’intituler
de l’axe des abscisses et des ordonnées respectivementEn bref, les possibles avec ggplot2
sont infinis car de
nombreux éléments sont personnalisables. Voici quelques références pour
les graphiques en ggplot2
parmi les nombreuses ressources
disponibles sur le web :
Nous nous intéressons dans cette partie aux deux variables qualitatives Type et Qualite.
Question : A l’aide des commandes
table()
, summary()
et levels()
,
donnez un résumé de la variable Type
. Quels sont les
modalités du facteur ?
# A COMPLETER
summary(wine$Type)
blanc rouge
425 175
levels(wine$Type
)
[1] "blanc" "rouge"
table(wine$Type)
blanc rouge
425 175
Question : A l’aide du code suivant, résumez
graphiquement la variable Type
par une représentation par
secteurs ou un diagramme en barres. Interprétez les résultats.
g1<-ggplot(wine, aes(x=Type))+
geom_bar()+
ylab("")+ggtitle("Effectifs")
g2<-ggplot(wine, aes(x = Type)) +
geom_bar(aes(y = (..count..)/sum(..count..)))+ylab("")+ggtitle("Frequences")
df <- data.frame(group = levels(wine$Type),
value = as.vector(table(wine$Type))/nrow(wine))
g3<-ggplot(df, aes(x="", y=value, fill=group))+
geom_bar(width = 1, stat = "identity")+
coord_polar("y", start=0)+
theme(legend.position="bottom")
grid.arrange(g3,g1,g2,ncol=3)
Question : La variable Qualite est une
variable qualitative ordinale. On peut donc utiliser les effectifs
cumulés et les fréquences cumulées. Pour tracer les fréquences cumulées,
il faut que l’ordre des modalités soit bien compris par R. Ici, on
commence par réorganiser les modalités en bad
,
medium
et good
. A l’aide des codes suivants,
étudiez la variable Qualite.
wine$Qualite <- fct_relevel(wine$Qualite,"bad","medium","good")
EffQual=as.vector(table(wine$Qualite))
FreqQual= data.frame(Eff = EffQual, Freq = EffQual/length(wine$Qualite), FreqCumul=cumsum(EffQual)/length(wine$Qualite))
rownames(FreqQual)=levels(wine$Qualite)
knitr::kable(FreqQual, caption = 'Description de la variable Qualite',booktabs = TRUE,digits=3)
Eff | Freq | FreqCumul | |
---|---|---|---|
bad | 19 | 0.032 | 0.032 |
medium | 471 | 0.785 | 0.817 |
good | 110 | 0.183 | 1.000 |
df <- data.frame(Qualite = levels(wine$Qualite), value = table(wine$Qualite),
valuecumul = 100 * cumsum(prop.table(table(wine$Qualite))))
df$Qualite <- fct_relevel(df$Qualite, "bad", "medium", "good")
df <- data.frame(df, freq = df$value.Freq/nrow(wine))
g1 <- ggplot(wine) + geom_bar(aes(x = Qualite)) + ggtitle("Effectifs")+xlab("Qualite")
g2 <- ggplot(wine) + geom_bar(aes(x = Qualite, y = ..prop.., group = 1)) + ggtitle("Frequences")+xlab("Qualite")
g3 <- ggplot(df, aes(x = Qualite, y = valuecumul)) + geom_bar(stat = "identity") +
ggtitle("Fréquences cumulées")
g4 <- ggplot(df, aes(x = "", y = freq, fill = Qualite)) + geom_bar(width = 1, stat = "identity") +
coord_polar("y", start = 0)
grid.arrange(g1, g2, g3, g4, ncol = 2)
Pour cette section, on se focalise sur la variable Alcool.
Question : Que calculent les commandes
mean()
, median()
, var()
,
sd()
, range()
? Calculez l’étendue des
données.
mean(wine$Alcool)
[1] 10.48592
median(wine$Alcool)
[1] 10.4
var(wine$Alcool)
[1] 1.316059
sd(wine$Alcool)
[1] 1.147196
range(wine$Alcool)
[1] 8 14
Question : Etudiez les sorties des commandes
summary(wine$Alcool)
et quantile(wine$Alcool)
.
Donnez également l’écart interquartile et les valeurs adjacentes.
summary(wine$Alcool)
Min. 1st Qu. Median Mean 3rd Qu. Max.
8.00 9.50 10.40 10.49 11.30 14.00
quantile(wine$Alcool,0.75,names=FALSE)-quantile(wine$Alcool,0.25,names = FALSE)
[1] 1.8
quantile(wine$Alcool)
0% 25% 50% 75% 100%
8.0 9.5 10.4 11.3 14.0
Le but de la statistique exploratoire est de synthétiser, résumer et structurer l’information contenue dans des données. On utilise pour cela des représentations de données sous forme de graphiques.
Question : On peut utiliser la représentation par
histogramme. Tapez H<-hist(wine$Alcool)
et commentez les
différents attributs de H
.
H<-hist(wine$Alcool)
Pour tracer un histogramme avec ggplot, vous pouvez utiliser le code suivant. Commentez.
g1<-ggplot(wine,aes(x=Alcool))+
geom_histogram(bins=15,color="black",fill="white")+
ggtitle("Histo. des effectifs")+
ylab("Frequency")+xlab("Alcool")
g2<-ggplot(wine,aes(x=Alcool))+
geom_histogram(aes(y=..density..),bins=15,color="black", fill="white")+
ggtitle("Histo. des frequences")+
ylab("Density")+xlab("Alcool")
grid.arrange(g1,g2,ncol=2)
Question : A l’aide du code suivant, représentez un boxplot de la variable “Alcool”. Que remarquez-vous ? Comparez avec les valeurs adjacentes calculées précédemment.
ggplot(wine,aes(y=Alcool))+geom_boxplot()
Pour tracer les boxplots de toutes les variables quantitatives en même temps, il faut réorganiser en amont le jeu de données.
wineaux<-melt(wine[,-c(1,2)])
ggplot(wineaux,aes(x=variable,y=value))+
geom_boxplot()
Question : En vous aidant de l’aide de R et des
résultats de la section précédente, tapez
B<-boxplot(wine$Alcool)
et commentez les différents
attributs de B
.
B<-boxplot(wine$Alcool)
Question : Calculez la matrice de corrélation des
variables quantitatives (commande cor()
) ou la matrice de
variance-covariance (commandes var()
ou
cov()
). Représentez graphiquement les corrélations à l’aide
de la fonction corrplot()
de la librairie
corrplot
. Vous pourrez utiliser l’option
method="ellipse"
pour une meilleure lisibilité.
print('Correlation')
[1] "Correlation"
cor(wine[,-c(1,2)])
AcidVol AcidCitr SO2lbr SO2tot Densite Alcool
AcidVol 1.00000000 -0.4107821 -0.37071293 -0.41542773 0.29814510 -0.02208799
AcidCitr -0.41078214 1.0000000 0.14764139 0.20724080 0.12360061 -0.03949990
SO2lbr -0.37071293 0.1476414 1.00000000 0.71394673 -0.03516798 -0.14830238
SO2tot -0.41542773 0.2072408 0.71394673 1.00000000 -0.03003947 -0.24679350
Densite 0.29814510 0.1236006 -0.03516798 -0.03003947 1.00000000 -0.67624598
Alcool -0.02208799 -0.0394999 -0.14830238 -0.24679350 -0.67624598 1.00000000
print('Covariance')
[1] "Covariance"
cov(wine[,-c(1,2)])
AcidVol AcidCitr SO2lbr SO2tot Densite
AcidVol 0.0268978296 -1.063582e-02 -1.077438119 -3.827641e+00 1.429567e-04
AcidCitr -0.0106358172 2.492306e-02 0.413052087 1.838032e+00 5.704787e-05
SO2lbr -1.0774381191 4.130521e-01 314.045063996 7.107860e+02 -1.822055e-03
SO2tot -3.8276406511 1.838032e+00 710.785976628 3.156124e+03 -4.933866e-03
Densite 0.0001429567 5.704787e-05 -0.001822055 -4.933866e-03 8.547444e-06
Alcool -0.0041557797 -7.153760e-03 -3.014961677 -1.590554e+01 -2.268091e-03
Alcool
AcidVol -0.004155780
AcidCitr -0.007153760
SO2lbr -3.014961677
SO2tot -15.905542015
Densite -0.002268091
Alcool 1.316059100
help(corrplot)
corrplot(cor(wine[,-c(1,2)]),method = "ellipse")
Question : Interprétez les résultats.
=> il y a une forte correlation negative entre l’Alcool et la densié
Question : Représentez graphiquement la
Densite en fonction de l’Alcool à l’aide de la
commande geom_point()
. Au vu de ce graphique, les variables
sont-elles corrélées ? Vous pourrez ajouter la commande
+geom_smooth(method="lm")
pour tracer la droite de
régression linéaire. Est-ce cohérent avec la corrélation calculée
ci-dessus ?
ggplot(data=wine)+
geom_point(aes(x=Alcool,y=Densite))+
geom_smooth(aes(x=Alcool,y=Densite),method="lm")
Question : Représentez le boxplot de la variable
Alcool
pour chaque modalité de la variable qualitative
Type. Même question avec Qualite. Interprétez les
résultats.
ggplot(wine)+
geom_boxplot(aes(x=Type,y=Alcool))
ggplot(wine)+
geom_boxplot(aes(x=Qualite,y=Alcool))
Question : Explorez les autres combinaisons de variables quantitatives avec les variables qualitatives afin de déterminer les variables fortement liées.
ggplot(wine)+
geom_boxplot(aes(x=Type,y=AcidVol))+
geom_boxplot(aes(x=Qualite,y=AcidVol))
ggplot(wine)+
geom_boxplot(aes(x=Type,y=Densite))+
geom_boxplot(aes(x=Qualite,y=Densite))
ggplot(wine)+
geom_boxplot(aes(x=Type,y=AcidCitr))+
geom_boxplot(aes(x=Qualite,y=AcidCitr))
Question : A l’aide de la fonction
eta2()
de la librairie BioStatR
, calculez le
rapport de corrélation \(\eta^2\) entre
chaque variable quantitative et la variable Type. Commentez.
Faites de même avec la variable Qualité.
eta2(x=wine$AcidVol,y=wine$Type)
[1] 0.4481639
eta2(x=wine$AcidCitr,y=wine$Type)
[1] 0.03693554
eta2(x=wine$SO2lbr,y=wine$Type)
[1] 0.2153399
eta2(x=wine$SO2tot,y=wine$Type)
[1] 0.4580193
eta2(x=wine$Alcool,y=wine$Type)
[1] 0.003022674
eta2(x=wine$Densite,y=wine$Type)
[1] 0.214444
Question : Analysez la table de contingence entre
les deux variables qualitatives Type et Qualite avec
la commande table()
. Ajoutez les effectifs marginaux avec
la commande addmargins()
.
a=table(wine$Qualite,wine$Type)
addmargins(a)
blanc rouge Sum
bad 17 2 19
medium 319 152 471
good 89 21 110
Sum 425 175 600
Question : Calculez et représentez les
profils-lignes à l’aide des fonctions
prop.table(..., margin = ...)
et mosaicplot
.
Interprétez les résultats. Faites de même avec les profils-colonnes.
prop.table(table(wine$Qualite,wine$Type), margin = 1)
blanc rouge
bad 0.8947368 0.1052632
medium 0.6772824 0.3227176
good 0.8090909 0.1909091
help("prop.table")