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.

1 Données

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 :

  • Qualite : son évaluation sensorielle par les experts (“bad”,“medium”,“good”),
  • Type : son type (1 pour un vin rouge, 0 pour un vin blanc),
  • AcidVol : la teneur en acide volatile (en g/dm3 d’acide acétique),
  • AcidCitr : la teneur en acide citrique (en g/dm3),
  • SO2lbr : le dosage du dioxyde de soufre libre (en mg/dm3),
  • SO2tot : le dosage du dioxyde de soufre total (en mg/dm3),
  • Densite : la densité (en g/cm3),
  • Alcool : le degré d’alcool (en % Vol.).

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 blancet 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  

2 Présentation de 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

  • pour définir un mappage (relation entre les valeurs d’une variable et un attribut graphique), on le déclare dans aes()
  • pour modifier un attribut graphique de la même manière pour tous les points, on le définit en-dehors de la fonction 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 xet l’axe y respectivement
  • scale_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 dessin
  • scale_fill() pour modifier les couleurs de remplissage

Pour 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 titre
  • xlab()et ylab() pour modifier l’intituler de l’axe des abscisses et des ordonnées respectivement

En 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 :

3 Etude statistique unidimensionnelle

3.1 Pour une variable qualitative

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)
Description de la variable Qualite
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)

3.2 Pour une variable quantitative

Pour cette section, on se focalise sur la variable Alcool.

3.2.1 Indicateurs statistiques

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 

3.2.2 Représentations graphiques

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)

4 Statistiques descriptives bidimensionnelles

4.1 Entre 2 variables quantitatives

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")

4.2 Entre une variable quantitative et une variable qualitative

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

4.3 Entre deux variables qualitatives

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")