Introduction
L’analyse des vins est un sujet de recherche qui a suscité l’intérêt de nombreux scientifiques depuis des décennies. La détermination de l’origine des vins est une question clé qui a été étudiée à travers différentes approches comme par exemple l’analyse sensorielle. L’industrie viticole est l’un des secteurs les plus importants dans le monde de l’agriculture et du commerce international. Dans ce contexte, la question de la traçabilité et de la qualité des produits est indispensable.
L’analyse des vins par des techniques chimiques est une méthode largement utilisée pour caractériser et différencier les vins produits dans différentes régions. L’objectif de cette étude est d’explorer si les analyses chimiques peuvent fournir des informations fiables sur l’origine des vins. Cette question est importante car elle peut contribuer à la réglementation du commerce des vins et à la protection des indications géographiques, tout en offrant des informations aux producteurs pour améliorer la qualité de leurs produits.
Dans la suite de cette étude, nous présentons les méthodes d’analyse statistique que nous avons utilisées pour traiter le jeu de données, les résultats obtenus et les conclusions que nous avons tirées quant à la possibilité de déterminer l’origine des vins à l’aide d’analyses chimiques.
Choix des données
Les données ont été collectées à partir d’analyses chimiques effectuées sur les échantillons de vins, et sont disponibles sur le site de l’UCI Machine Learning Repository. (https://archive.ics.uci.edu/ml/datasets/wine)
Le jeu de données contient un total de 178 échantillons de vins, avec 13 variables chimiques mesurées pour chaque échantillon. Les variables sont les suivantes :
- Region : la région d’origine (1 = Barolo, 2 = Grignolino, 3 = Barbera).
- Alcohol : la teneur en alcool en pourcentage.
- Malic_acid : la teneur en acide malique en g/L.
- Ash : la teneur en cendres en g/L.
- Alcalinity_of_ash : l’alcalinité des cendres en mEq/L.
- Magnesium : la teneur en magnésium en mg/L.
- Total_phenols : la teneur totale en phénols en mg/L.
- Flavanoids : la teneur en flavonoïdes en mg/L.
- Nonflavanoid_phenols : la teneur en phénols non-flavonoïdes en mg/L.
- Proanthocyanins : la teneur en proanthocyanidines en mg/L.
- Color_intensity : l’intensité de la couleur en absorbance à 280 nm.
- Hue : la teinte, mesurée à 1,0 cm de profondeur à 420 nm.
- Proline : la teneur en proline en mg/L.
library(DBI)
c=dbConnect(RPostgreSQL::PostgreSQL(),dbname="iut2202290") # connexion a la base de données
#dbWriteTable(c, "vin",vin ,row.names = FALSE) #importation des données a la base de données
query='SELECT * FROM public.vin;' #requête sql
vin = dbGetQuery(c,query) #récupration des données
Statistique Multivariée
Grâce à l’analyse statistique multivariée, nous allons pouvoir étudier les liens potentiels entre chaque variable, avant de continuer l’analyse nous devons nous assurer qu’il n’y est pas de valeurs manquantes et aberrantes qui pourraient tout fausser.
Résumé de chaque variables:
Il n’y a aucune valeur manquante et aberrante, les écart-types correspondent au minimum, maximum et a la moyenne. On remarque que le vin est principalement composé de Magnésium de Proline et d’Alcool. Le magnésium est un élément nutritif essentiel pour les plantes et est souvent présent dans le sol où poussent les vignes. La proline est un acide aminé non-essentiel présent dans les raisins, elle peut jouer un rôle important dans le développement des arômes et des saveurs du vin. L’alcool est produit lors de la fermentation des sucres présents dans le jus de raisin.
En analysant la matrice de corrélation, il est possible de constater que certaines variables sont fortement corrélées entre elles négativement ou positivement.library(corrplot)
## corrplot 0.92 loaded
X = vin[c(-1,-13)]
corrplot(cor(X), method = 'number',type = "lower",diag=F,number.cex=0.5)
Dans notre cas, la variable Total_phenols est corrélée très significativement et positivement avec la variable Flavanoids (avec 0.86) , cela s’explique par le fait que les flavonoïdes sont une sous-classe de composés phénoliques. Les deux variables sont importantes pour le goût, la couleur et la stabilité du vin, ainsi que pour leur propriétés antioxydantes. Leur corrélation peut aider à identifier l’origine des vins. La variable Proanthocyanins est corrélée avec la variable Flavanoids (avec 0.65) car elles sont toutes deux liées à la teneur en composés phénoliques du vin qui influence la couleur, le goût, la texture, la stabilité et la qualité. Ces observations suggèrent qu’il peut y avoir des relations entre ces variables qui pourraient être explorées plus en détail.
Nous avons une seule variable catégorielle, qui est les régions, et plusieurs variables numériques. Nous allons utiliser une analyse de variance (ANOVA) pour comparer les moyennes des variables numériques pour chaque région. Cela nous permettra de déterminer s’il y a des différences significatives entre les régions et les composés chimiques du vin. Si notre p-value se rapproche de 0, on rejette alors H0 qui est l’hypothèse que les régions n’ont pas d’influence sur la variable numérique étudiée, car on déduit qu’au moins deux espaces partielles sont différentes. Nous allons également utiliser des graphiques boxplot pour visualiser la distribution des variables numériques pour chaque région et détecter d’éventuelles différences.Y = vin
Y$Region_classe = gsub("\\..*", "", Y$Region_classe) #On renome nos Region en trois niveau différent
summary(aov(Y$Alcohol~Y$Region_classe)) #H0 rejette (p-value<0)
## Df Sum Sq Mean Sq F value Pr(>F)
## Y$Region_classe 2 70.79 35.40 135.1 <2e-16 ***
## Residuals 175 45.86 0.26
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
boxplot(Y$Alcohol~Y$Region_classe)#boxplot distribution
#
# summary(aov(Y$Malic_acid~Y$Region_classe)) #H0 rejette
# boxplot(Y$Malic_acid~Y$Region_classe)
#
# summary(aov(Y$Magnesium~Y$Region_classe)) #H0 rejette
# boxplot(Y$Magnesium~Y$Region_classe)
#
# summary(aov(Y$Total_phenols~Y$Region_classe)) #H0 rejette
# boxplot(Y$Total_phenols~Y$Region_classe)
#
# summary(aov(Y$Flavanoids~Y$Region_classe)) #H0 rejette
boxplot(Y$Flavanoids~Y$Region_classe)
#
# summary(aov(Y$Nonflavanoid_phenols~Y$Region_classe)) #H0 rejette
# boxplot(Y$Nonflavanoid_phenols~Y$Region_classe)
#
# summary(aov(Y$Proanthocyanins~Y$Region_classe)) #H0 rejette
# boxplot(Y$Proanthocyanins~Y$Region_classe)
# summary(aov(Y$Ash~Y$Region_classe)) #H0 rejette
boxplot(Y$Ash~Y$Region_classe)
#
# summary(aov(Y$Alcalinity_of_ash~Y$Region_classe)) #H0 rejette
boxplot(Y$Alcalinity_of_ash~Y$Region_classe)
#
# summary(aov(Y$Color_intensity~Y$Region_classe)) #H0 rejette
# boxplot(Y$Color_intensity~Y$Region_classe)
#
# summary(aov(Y$Hue~Y$Region_classe)) #H0 rejette
# boxplot(Y$Hue~Y$Region_classe)
#
# summary(aov(Y$Proline~Y$Region_classe)) #H0 rejette
# boxplot(Y$Proline~Y$Region_classe)
On remarque qu’on rejette H0 pour toutes nos variables cela signifie que toutes les variables à ont une influence significative ou non différente en fonction de la région. Grâce au boxplot nous avons observé que certaines variables présentent des différences marquées entre les régions, tandis que d’autres variables ont des distributions similaires.
La variable Alcohol a des distribution différentes entre les régions, ce qui suggère que la teneur en alcool peut varier selon la région d’origine du vin. De même, les variables Total_phenols et Flavanoids ont des distributions différentes entre les régions, indiquant que ces composés phénoliques peuvent également être influencés par la région d’origine.
Les variables Ash et Nonflavanoid_phenols ont des distributions similaires entre les régions, ce qui suggère que la région d’origine n’a pas un impact significatif sur ces variables.
En conclusion, l’analyse nous dit que la région d’origine peut avoir un effet sur certaines variables chimiques du vin, mais pas sur toutes.Classification
Dans le cadre de notre analyse des données de vins, nous allons utiliser la classification pour regrouper les vins en fonction de leurs caractéristiques chimiques.
rownames(X) = vin$Region_classe
X = scale(X)
cah = hclust(dist(X),method="ward.D2")
plot(cah)
rect.hclust(cah,3)
classif = cutree(cah,3)
Le dendrogramme obtenu nous permet de visualiser la hiérarchie de groupes créée par l’algorithme de classification. Nous pouvons voir que les individus sont regroupés en deux grands groupes, qui peuvent être eux-mêmes divisés en 3 sous-groupes plus petits. On remarque qu’à partir des 3 sous-groupes le saut est bien trop important, on peut déjà émettre comme hypothèse 3 classes pour nos données.
plot(rev(cah$height),type="b")
Avec le graphique du coude, nous observons que notre droite à partir de 3 classes ne suit plus la même trajectoire ce qui confirme notre hypothèse du dendrogramme.
On compare à SAS, on remarque que le dendrogramme émet la même hypothèse, la courbe du graphique critère pour le nombre de classe confirme notre hypothèse et atteint 0 à partir de 3 classes. On choisira alors 3 classes pour la suite de notre étude.
table(classif)
## classif
## 1 2 3
## 63 61 54
Les effectifs sont assez homogènes ce qui est bon signe pour la suite.
sort(classif)
On remarque que le groupe 1 est majoritairement composé de vins de la région 1, le groupe 2 de la région 2 et le groupe 3 de la région 3 donc on pourrait peut-être déterminer la provenance selon les composants du vin.
Nous allons maintenant établir un individu type pour chaque groupe grâce a notre graphique.moyennes=aggregate(X,list(classif),mean)[,-1]
matplot(t(moyennes),type="b")
abline(h=0)
abline(h=c(-1,1),lty=2)
text(1:ncol(X),max(moyennes)*1.1,colnames(X),xpd=NA,srt=-20)
On regarde pour chaque groupe sa position par rapport à la moyenne de chaque classe, les points situés au-dessus de 0 indiquent que la classe est au-dessus de la moyenne pour cette variable et vice-versa pour les points en dessous de 0. Les points situés à une distance supérieure à 1 (ou inférieure à -1) de la moyenne représentent des valeurs significativement différentes de la moyenne. Groupe 1: majoritairement composé de vins de la région 1, avec une teneur significativement élevée en alcool, proline, flavanoïdes et magnesium. Une teneur en anthocyanes plutôt élevée, le tout caractériser par un vin puissant, riche en arômes, complexe et structuré en bouche. Groupe 2 : majoritairement composé de vins de la région 2, avec une teneur très faible en alcool, proline et couleur qui peut présenter une texture plus fine et moins corsée avec une acidité élevé Groupe 3 : majoritairement composé de vins de la région 3, est un vin qui a une couleur intense, une forte teneur en composés phénoliques non-flavanoides, une faible teneur en Proanthocyanins et une acidité plutôt faible. Cela pourrait indiquer que ce type de vin est plus fruité et moins complexe que les autres groupes, avec une saveur plus douce et moins amère.
Les outliers sont les valeurs qui se situent en dehors de la plage interquartile (IQR), soit à plus de 1,5 fois l’écart interquartile en dessous du premier quartile (Q1) ou au-dessus du troisième quartile (Q3). Les valeurs qui dépassent ces bornes sont considérées comme des outliers. Ces valeurs extrêmes peuvent fausser les analyses statistiques et doivent donc être traitées de manière appropriée.# outliers = function(x_var) {
# limite_inf <- mean(x_var) - 3*sd(x_var)
# limite_sup <- mean(x_var) + 3*sd(x_var)
# valeurs_problematiques <- x_var[which(x_var < limite_inf | x_var > limite_sup)]
#
# }
# x = outliers(vin)
# outliers = c(123, 155, 158, 159, 163, 166, 173, 183, 185, 196, 198, 204) # liste des lignes contenant les outliers
X_outliers = X[-c(123, 155, 158, 159, 163, 166, 173, 183, 185, 196, 198, 204),]
Après avoir analysé toutes les variables, notre jeu de données possède 12 outliers. On refait alors notre analyse sans les outliers, on remarque que cela ne change en rien nos résultats.
ACP
L’Analyse en Composantes Principales (ACP) est une technique de réduction de dimensionnalité qui permet de transformer un ensemble de variables en un nombre réduit de composantes, tout en préservant autant que possible l’information contenue dans les données. L’objectif est de mettre en évidence des structures et des relations entre les variables qui ne sont pas visibles à partir des données brutes. Dans le cas de notre étude sur les données des vins, l’ACP nous permettra d’identifier les variables les plus importantes pour expliquer la variabilité des données et de visualiser les relations entre ces variables.
X=as.matrix(X)
if (sum(ls()=="L")==0) L=2
n=nrow(X)
p=ncol(X)
X=scale(X)*sqrt(n/(n-1))
V=cor(X)
d=eigen(V,symmetric=T)
for (j in 1:p) d$vectors[,j]=ifelse(d$vectors[1,j]>0,1,-1)*d$vectors[,j]
cp=X%*% d$vectors
colnames(cp)=paste("cp",1:p,sep="")
contributions=d$values
g=barplot(contributions,main="Graphique des contributions",
names.arg=round(contributions,2),col=rainbow(p),cex.names = 0.8)
text(g,contributions,paste(round(100*contributions/p),"%"),pos=3,cex=0.8,xpd=NA)
Grâce au graphique des contributions, on remarque 3 super variables pouvant résumer nos données avec une variance significativement supérieur a 1 pour chaque CP, la CP1 contient 34% de l’information initiale, la CP2 20% et la CP3 12% pour un totale de 66% de l’information initiale avec nos super variables, ce qui est bien, mais on perd quand même 34% de l’information.
On s’intéresse maintenant à la matrice de corrélation qui va nous permettre de déterminer quelle information sont contenue dans chaque CP (on retient celle supérieure à 0,65 et inférieur a -0,65)cor_var_init_cp= d$vectors %*% diag(sqrt(d$values))
rownames(cor_var_init_cp)=colnames(X)
colnames(cor_var_init_cp)=paste("cp",1:p,sep="")
round(cor_var_init_cp[,c(1,2,3)],2)
## cp1 cp2 cp3
## Alcohol 0.40 0.72 0.29
## Malic_acid -0.52 0.44 -0.01
## Ash 0.02 0.54 -0.73
## Alcalinity_of_ash -0.55 0.08 -0.71
## Magnesium 0.37 0.43 -0.19
## Total_phenols 0.85 0.02 -0.20
## Flavanoids 0.89 -0.09 -0.22
## Nonflavanoid_phenols -0.64 0.12 -0.17
## Proanthocyanins 0.68 -0.01 -0.21
## Color_intensity -0.08 0.84 0.21
## Hue 0.60 -0.52 -0.18
## Proline 0.69 0.49 0.14
Pour la CP1 on remarque une corrélation significative positive avec les variables Total_phenols (0.85) et Flavanoids (0.89), une corrélation positive avec les variables Proline (0.69) et Proanthocyanins (0.68), ces composés sont associés à des vins rouges de qualité supérieure. La CP2 est significativement et positivement corrélé aux variables Alcohol (0.72) et Color_intensity (0.84), qui sont donc les vins ayant une forte concentration en alcool et en intensité de couleur. La CP3, elle est corrélée significativement et négativement aux variables Ash (-0.73) et Alcalinity_of_ash (-0.71) qui permet de distinguer les vins ayant des caractéristiques minérales différentes.
plot(cor_var_init_cp[,1],cor_var_init_cp[,2],asp=1,main="Cercle des correlations",xlim=c(-1,1),ylim=c(-1,1),xlab="cp1",ylab="cp2")
abline(h=c(-0.6,0.6),v=c(0.7,-0.7),col = "blue")
arrows(0,0,cor_var_init_cp[,1],cor_var_init_cp[,2],col="purple",length=0.1)
text(cor_var_init_cp[,1]*1.1,cor_var_init_cp[,2]*1.15,colnames(X),cex=0.8,col="red",xpd=NA)
plot(cor_var_init_cp[,1],cor_var_init_cp[,3],asp=1,main="Cercle des correlations",xlim=c(-1,1),ylim=c(-1,1),xlab="cp1",ylab="cp3")
abline(h=c(-0.6,0.6),v=c(0.7,-0.7),col = "blue")
arrows(0,0,cor_var_init_cp[,1],cor_var_init_cp[,3],col="purple",length=0.1)
text(cor_var_init_cp[,1]*1.1,cor_var_init_cp[,3]*1.15,colnames(X),cex=0.8,col="red",xpd=NA)
Le cercle de corrélation permet de visualiser la corrélation entre les variables et les composantes principales, ce qui aide à interpréter les résultats de l’ACP et à identifier les variables qui ont le plus d’impact sur chaque composante principale. On remarque que cela confirme nos résultats obtenus lors de la matrice de corrélations.
plot(cp[,1],cp[,2],
xlab=paste("CP 1 - ",round(100*contributions[1]/p,2)," %",sep=""),
ylab=paste("CP 2 - ",round(100*contributions[2]/p,2)," %",sep=""),asp=1)
abline(h=0,v=0)
text(cp[,1],cp[,2],rownames(X),pos=3,cex=0.5,xpd=NA)
L’axe des abscisses représentant la première composante principale (CP1) et l’axe des ordonnées représentant la deuxième composante principale (CP2).
Ce graphique permet de visualiser les données dans un espace à deux dimensions, qui est créé en combinant les deux premières composantes principales qui expliquent la plus grande variabilité dans les données.
On remarque trois groupes qui se distinguent, en regardant les individus de plus près, on en déduit que chaque groupe appartient à une région et donc avec t’es caractéristique différente on rappelle que la cp1 est corréler positivement avec la teneur en Total_phenols, Flavanoids, Proline et Proanthocyanins et la cp2 corréler positivement a l’intensité de la couleur et la teneur en Alcool. Avec ses informations, nous pouvons créer un mapping en entourant les 3 groupes visibles et ajouter les caractéristiques des CP.
On peut donc conclure que les vins de la région 1 ont tendance à avoir une teneur élevée en Flavanoids,Proline,Proanthocyanins,Alcool et Phenols ainsi qu’une couleur intense. (caractéristique du vin rouge) Les vins de la région 2 eux ont une teneur modérer en Flavanoids,Proline,Proanthocyanins,Phenols et ont tendance à avoir une inférieure concentration d’alcool ainsi qu’une couleur très discrète Pour finir les vins de la régions 3 ont une faible teneur en Flavanoids,Proline,Proanthocyanins et Phenols, mais une teneur élevée en Alcool ainsi qu’une couleur vive. Les trois régions produisent des vins qui se différencient.
On fait pareil cette fois si entre la cp1 et cp3 :plot(cp[,1],cp[,3],
xlab=paste("CP 1 - ",round(100*contributions[1]/p,2)," %",sep=""),
ylab=paste("CP 3 - ",round(100*contributions[3]/p,2)," %",sep=""),asp=1)
abline(h=0,v=0)
text(cp[,1],cp[,3],rownames(X),pos=3,cex=0.5,xpd=NA)
Le graphique est beaucoup moins lisible que le précédent néanmoins, on remarque que la région 1 est plus présente à droite et la région 3 plus présente à gauche. Les vins de la région 1 ne semble pas posséder de caractéristique minérale significative contrairement à la région 3 (corrélation négative).
Nous devons vérifier si les outliers ne fausse pas notre étude sur les CP, dans notre cas les outliers ne changer en rien les graphiques ou les résultats.Conclusion
En conclusion, notre étude statistique a permis de mettre en évidence plusieurs informations intéressantes sur les vins de trois régions différentes. Nous avons constaté des différences significatives entre les trois régions en termes de caractéristiques chimiques et physiques des vins.
En utilisant des techniques d’analyse multivariée, nous avons pu identifier les variables les plus importantes dans la différenciation des régions. Nous avons également mis en évidence des profils types pour chaque région en utilisant l’ACP et la classification.
Enfin, nous avons identifié des outliers et proposé des mesures pour les traiter, afin d’améliorer la qualité des données et la robustesse de nos résultats.
Dans l’ensemble, cette étude a permis qu’il était possible de déterminer l’origine des vins à l’aide d’analyses chimiques et peut-être utiliser pour l’industrie vinicole dans le développement de stratégies de marketing et de production.Annexes
Code SAS: /* IMPORTATION */ %web_drop_table(VIN); FILENAME REFFILE ‘/home/u62403656/vin.csv’;
PROC IMPORT DATAFILE=REFFILE DBMS=CSV OUT=VIN; GETNAMES=YES; DELIMITER=“,”; ; RUN;
PROC CONTENTS DATA=VIN; RUN;
/* Sommaire */ proc summary data=VIN print; VAR Alcohol Malic_acid Ash Alcalinity_of_ash Magnesium Total_phenols Flavanoids Nonflavanoid_phenols Proanthocyanins Color_intensity Hue Proline; run;
/* Scale */ proc standard data=VIN out=vin_standard mean=0 std=1; VAR Alcohol Malic_acid Ash Alcalinity_of_ash Magnesium Total_phenols Flavanoids Nonflavanoid_phenols Proanthocyanins Color_intensity Hue Proline; run;
/* Classif */ proc cluster data=vin_standard method=WARD ccc outtree=tree ; run;
proc tree data=tree n=3 out=tree_out ; run;
/* Outliers */ proc univariate data= VIN noprint; VAR Alcohol Malic_acid Ash Alcalinity_of_ash Magnesium Total_phenols Flavanoids Nonflavanoid_phenols Proanthocyanins Color_intensity Hue Proline; output out=outliers pctlpre=lo pctlpts=1,99.5,99.9 pctlname=percentiles; run;
/* Normalité */ proc univariate data=VIN normal; VAR Alcohol Malic_acid Ash Alcalinity_of_ash Magnesium Total_phenols Flavanoids Nonflavanoid_phenols Proanthocyanins Color_intensity Hue Proline; histogram / normal; qqplot / normal (MU=EST SIGMA=EST); run;
/* CORR */ PROC CORR DATA=VIN; VAR Alcohol Malic_acid Ash Alcalinity_of_ash Magnesium Total_phenols Flavanoids Nonflavanoid_phenols Proanthocyanins Color_intensity Hue Proline; RUN;
/* ACP */ PROC PRINCOMP DATA =VIN out = ACPCIC prefix = ACP outstat = ACPCIC2 PLOTS =PATTERN(VECTOR); VAR Alcohol Malic_acid Ash Alcalinity_of_ash Magnesium Total_phenols Flavanoids Nonflavanoid_phenols Proanthocyanins Color_intensity Hue Proline; RUN;