2  Tri libre

Pour les étudiants utilisant leur ordinateur personnel il faut installer le package TeachFreeSortR :

Voir le code R
remotes::install_github("GALHARRET/TeachFreeSortR",upgrade = "always",force = TRUE,dependencies =NA)

Ensuite charger le package :

Voir le code R
library(TeachFreeSortR)

On va étudier un premier exemple de tri libre de 16 arômes proposés à 31 sujets.

Cette base de données est disponible ici.

Voir le code R
df<-read.csv("aroma.csv",header = T,sep=";",row.names=1)
Données brutes
29 individus, 16 produits
S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 S11 S12 S13 S14 S15 S16 S17 S18 S19 S20 S21 S22 S23 S24 S25 S26 S27 S28 S29
Lemon 5.00 1.00 4.00 1.00 1.00 1.00 1.00 2.00 3.00 1.00 1.00 1.00 1.00 4.00 2.00 1.00 2.00 2.00 2.00 3.00 3.00 4.00 3.00 1.00 2.00 6.00 1.00 2.00 8.00
Grapefruit 5.00 3.00 5.00 1.00 2.00 1.00 2.00 2.00 3.00 1.00 1.00 1.00 1.00 4.00 2.00 1.00 1.00 2.00 1.00 2.00 3.00 6.00 3.00 1.00 2.00 6.00 1.00 2.00 2.00
Pineapple 4.00 1.00 5.00 1.00 5.00 1.00 2.00 1.00 1.00 1.00 5.00 1.00 1.00 1.00 1.00 1.00 1.00 3.00 1.00 2.00 2.00 4.00 1.00 3.00 7.00 6.00 3.00 3.00 4.00
Pear 5.00 1.00 5.00 1.00 1.00 3.00 2.00 2.00 1.00 2.00 1.00 1.00 1.00 1.00 1.00 1.00 2.00 2.00 1.00 3.00 5.00 4.00 2.00 3.00 6.00 1.00 1.00 3.00 4.00
Honey 4.00 2.00 3.00 2.00 3.00 6.00 3.00 5.00 2.00 3.00 7.00 2.00 1.00 4.00 5.00 5.00 3.00 1.00 5.00 4.00 4.00 3.00 1.00 2.00 2.00 7.00 5.00 4.00 12.00
Butter 1.00 4.00 5.00 2.00 3.00 5.00 3.00 5.00 4.00 4.00 4.00 5.00 2.00 4.00 9.00 5.00 6.00 4.00 3.00 5.00 4.00 2.00 1.00 6.00 4.00 5.00 3.00 5.00 9.00
Grilledbread 1.00 2.00 3.00 5.00 5.00 5.00 3.00 3.00 2.00 3.00 9.00 2.00 3.00 2.00 3.00 2.00 3.00 1.00 4.00 1.00 4.00 2.00 4.00 6.00 4.00 4.00 2.00 1.00 1.00
Grilledhazelnut 5.00 2.00 3.00 2.00 5.00 5.00 3.00 3.00 4.00 3.00 6.00 2.00 3.00 2.00 3.00 2.00 3.00 5.00 5.00 1.00 4.00 2.00 3.00 4.00 4.00 5.00 2.00 7.00 6.00
Strawberry 5.00 1.00 5.00 1.00 1.00 2.00 2.00 1.00 1.00 2.00 1.00 1.00 1.00 1.00 6.00 1.00 2.00 3.00 1.00 3.00 6.00 6.00 1.00 3.00 1.00 1.00 3.00 3.00 3.00
Raspberry 3.00 3.00 4.00 4.00 1.00 2.00 2.00 1.00 4.00 4.00 1.00 1.00 1.00 1.00 1.00 1.00 2.00 2.00 2.00 3.00 5.00 2.00 2.00 3.00 1.00 1.00 3.00 3.00 4.00
Cherry 3.00 3.00 5.00 3.00 5.00 6.00 1.00 1.00 1.00 2.00 2.00 1.00 3.00 3.00 7.00 8.00 2.00 4.00 6.00 7.00 7.00 4.00 3.00 2.00 8.00 2.00 3.00 3.00 7.00
Blackcurrant 3.00 4.00 4.00 3.00 4.00 5.00 2.00 5.00 4.00 3.00 7.00 1.00 2.00 4.00 1.00 1.00 4.00 3.00 6.00 5.00 4.00 1.00 2.00 1.00 4.00 7.00 1.00 3.00 9.00
Greenpepper 4.00 3.00 1.00 4.00 4.00 3.00 3.00 4.00 2.00 5.00 8.00 2.00 1.00 3.00 4.00 7.00 3.00 1.00 3.00 2.00 2.00 2.00 5.00 4.00 7.00 4.00 1.00 6.00 11.00
Smoked 2.00 2.00 2.00 4.00 3.00 4.00 3.00 4.00 7.00 3.00 3.00 3.00 5.00 2.00 4.00 3.00 5.00 1.00 5.00 9.00 1.00 5.00 6.00 2.00 3.00 3.00 2.00 1.00 10.00
Pepper 2.00 2.00 2.00 1.00 2.00 3.00 1.00 2.00 6.00 5.00 5.00 4.00 4.00 3.00 8.00 6.00 4.00 4.00 6.00 8.00 3.00 3.00 3.00 5.00 2.00 8.00 4.00 4.00 11.00
Licorice 2.00 4.00 3.00 4.00 2.00 4.00 3.00 3.00 5.00 4.00 7.00 3.00 5.00 3.00 5.00 4.00 3.00 1.00 4.00 6.00 3.00 5.00 2.00 2.00 5.00 9.00 4.00 4.00 5.00

2.1 Matrice de dissimilarités individuelle

On note \(D^{(n)}=(d^{(n)}_{i,j})_{i,j}\) la matrice de dissimilarités obtenue à partir de la partition du \(n\)-ième individu. On a

  • \(d^{(n)}_{i,j}=0\) si \(i,j\) sont dans la même partition,

  • \(d^{(n)}_{i,j}=1\) sinon.

Remarque La matrice \(D^{(n)}\) est une matrice symétrique dont la diagonale est nulle.

2.1.1 Exemple individu 1 :

Voir le code R
dissP<-dissim_partition(df)
tab<-dissP$S1

Ceci donne la matrice de dissimilarité pour l’individu

Matrice de dissimilarité
Individu 1
Lemon Grapefruit Pineapple Pear Honey Butter Grilledbread Grilledhazelnut Strawberry Raspberry Cherry Blackcurrant Greenpepper Smoked Pepper Licorice
Lemon 0 0 1 0 1 1 1 0 0 1 1 1 1 1 1 1
Grapefruit 0 0 1 0 1 1 1 0 0 1 1 1 1 1 1 1
Pineapple 1 1 0 1 0 1 1 1 1 1 1 1 0 1 1 1
Pear 0 0 1 0 1 1 1 0 0 1 1 1 1 1 1 1
Honey 1 1 0 1 0 1 1 1 1 1 1 1 0 1 1 1
Butter 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1
Grilledbread 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1
Grilledhazelnut 0 0 1 0 1 1 1 0 0 1 1 1 1 1 1 1
Strawberry 0 0 1 0 1 1 1 0 0 1 1 1 1 1 1 1
Raspberry 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1
Cherry 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1
Blackcurrant 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1
Greenpepper 1 1 0 1 0 1 1 1 1 1 1 1 0 1 1 1
Smoked 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
Pepper 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
Licorice 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0

2.2 Matrice de dissimilarités à l’échelle du panel

  • On ajoute toutes les matrices de dissimilarités individuelles. On obtient la matrice \(D\) de coefficients : \[\delta_{i,j}=\sum_{n=1}^N d^{(n)}_{i,j}\]

  • Cette matrice est symétrique et sa diagonale est nulle.

  • Tous les coefficients de cette matrice sont des entiers inférieurs ou égaux à \(N\).

2.2.1 Retour sur l’exemple

Voir le code R
DissTotal<-total_dissim(df)

On obtient la matrice de dissimilarité totale :

Matrice de dissimilarité
Individu 1
Lemon Grapefruit Pineapple Pear Honey Butter Grilledbread Grilledhazelnut Strawberry Raspberry Cherry Blackcurrant Greenpepper Smoked Pepper Licorice
Lemon 0 9 20 15 26 28 29 27 19 19 24 23 27 29 23 28
Grapefruit 9 0 17 17 26 27 29 27 19 22 25 23 25 29 23 27
Pineapple 20 17 0 14 26 26 28 28 13 18 21 23 24 29 27 29
Pear 15 17 14 0 28 28 29 28 10 12 22 22 26 29 26 28
Honey 26 26 26 28 0 21 20 20 27 28 27 23 22 22 25 21
Butter 28 27 26 28 21 0 22 21 26 25 26 19 26 27 28 26
Grilledbread 29 29 28 29 20 22 0 11 29 28 27 25 22 22 28 23
Grilledhazelnut 27 27 28 28 20 21 11 0 28 27 26 24 24 23 27 25
Strawberry 19 19 13 10 27 26 29 28 0 13 21 24 28 29 28 29
Raspberry 19 22 18 12 28 25 28 27 13 0 22 20 25 28 29 26
Cherry 24 25 21 22 27 26 27 26 21 22 0 24 27 28 24 27
Blackcurrant 23 23 23 22 23 19 25 24 24 20 24 0 27 28 27 26
Greenpepper 27 25 24 26 22 26 22 24 28 25 27 27 0 24 25 24
Smoked 29 29 29 29 22 27 22 23 29 28 28 28 24 0 26 20
Pepper 23 23 27 26 25 28 28 27 28 29 24 27 25 26 0 23
Licorice 28 27 29 28 21 26 23 25 29 26 27 26 24 20 23 0

2.3 MDS (Multi Dimensionnal Scaling)

On considère \(N\) points \(x_1,...,x_N\) dans un espace de dimension \(P\) caractérisés par la matrice de dissimilarité \(D=(\delta_{ij})_{1\leq i\leq j\leq N}\).

BUT représenter ces points dans un espace de dimension \(k<P\) par \(N\) points \(y_1,...,y_N\) en conservant les proximités entre les points initiaux.

Cela suppose :

  • l’existence de variables latentes (ie qui permettent de résumer des dissimilarités entre produits)

  • le choix d’un indice de qualité de la projection des dissimilarités dans l’espace latent (\(\leadsto\) S : Fonction de coût appelée Stress). Le but sera de trouver \(y_1,...,y_N\) tels que \(S(y_1,...,y_N)\) est minimale.

2.3.1 MDS Métrique

Dans ce cas le stress est défini par \[S(y_1,...,y_N)=\sum_{i< j} \left( \delta_{ij}-\Vert y_i-y_j\Vert\right)^2\] Dans ce cas on veut représenter les points initiaux en conservant la valeur absolue et relative de leurs dissimilarités.

2.3.2 MDS non Métrique

Dans ce cas le stress est défini par \[S(y_1,...,y_N)=\sum_{i< j} \left( \delta_{ij}-f(\Vert y_i-y_j\Vert)\right)^2\]\(f\) est une fonction monotone de \((i,j)\). La fonction \(f\) s’adapte durant la phase d’optimisation.

On veut préserver uniquement l’ordre entre les proximités des points initiaux.

2.4 Le stress normalisé

La fonction de coût utilisé en pratique est une version normalisée du stress :

\[S_{norm}(y_1,...,y_N)=\displaystyle \frac{\sum_{i<j}(\delta_{i,j}-f(\Vert y_i-y_j\Vert))^2}{\sum_{i<j}\delta_{i,j}^2}\]

\(f\) est l’identité pour la MDS métrique.

2.5 Choix du nombre de dimension du MDS

Comme souvent en analyse de données, on peut utiliser la règle du coude pour déterminer le nombre de dimensions :

Voir le code R
stress<-rep(NA,6)
# getStress donne le stress de Kruskal (ie normalisé)
for(i in 1:6){
  
  stress[i]<-compute_mds(DissTotal,k = i)$stress  
}
library(ggplot2)
dim_choice<-data.frame(k=1:6,stress=stress)
ggplot(dim_choice,aes(x=k,y=stress))+
  geom_point()+
  geom_line()+
  theme_bw()+
  labs(title="Choix du nombre de dimension",
  x="Nb de Dimensions")

2.6 Représentation obtenue

Voir le code R
k=3
mds_plot(df,k=3,n_boot = 0)

2.7 Ellipses de confiance

  • On se pose la question de la stabilité de la configuration. D’autres individus proposeraient d’autres partitions \(\leadsto\) autre configuration.

  • Pseudo-individus à partir des individus de l’échantillon (Bootstrap) : on tire des individus avec remise dans l’échantillon et on construit la configuration obtenue (en général \(B=500\) tirages).

  • Construction d’ellipses de confiance à partir de ces \(B=500\) configurations (par défaut dans la fonction mds_plot).

Voir le code R
mds_plot(df,k=3)

Voir le code R
mds_plot(df,k=3,dim=c(1,3))

2.8 Informations additionnelles

On propose aux 31 sujets une liste de 36 descripteurs pour les 16 produits considérés. On obtient la table de contingence suivante :

Données aditionnelles
caractérisation des 16 produits
X Acid Smoked Heady Citrus Lemon Cake Milk Woody Grain Low Redfruit Grilled Strong Fat Vegetal Medicine Chemical Licorice Bread Alcohol Almond Caramel Coal Unpleasant Soft Pepper Flower Fresh Red Fruit Natural Spicy Sugar Hot Pleasant Candy
1 Lemon 3.00 0.00 1.00 7.00 11.00 0.00 0.00 1.00 0.00 0.00 1.00 0.00 3.00 0.00 2.00 0.00 1.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 1.00 1.00 3.00 5.00 1.00 11.00 0.00 1.00 5.00 2.00 3.00 5.00
2 Grapefruit 5.00 0.00 1.00 9.00 9.00 0.00 0.00 0.00 0.00 1.00 1.00 0.00 3.00 0.00 2.00 1.00 1.00 0.00 0.00 1.00 1.00 0.00 0.00 1.00 1.00 1.00 2.00 4.00 1.00 13.00 0.00 1.00 4.00 2.00 2.00 3.00
3 Pineapple 5.00 0.00 1.00 5.00 4.00 0.00 0.00 4.00 0.00 0.00 3.00 0.00 3.00 0.00 4.00 0.00 1.00 0.00 0.00 0.00 1.00 0.00 0.00 1.00 3.00 0.00 1.00 3.00 3.00 13.00 0.00 1.00 9.00 0.00 2.00 8.00
4 Pear 2.00 0.00 1.00 4.00 5.00 0.00 0.00 1.00 0.00 0.00 1.00 0.00 3.00 0.00 2.00 0.00 1.00 1.00 0.00 0.00 2.00 0.00 0.00 1.00 2.00 2.00 0.00 4.00 1.00 15.00 1.00 0.00 10.00 0.00 2.00 13.00
5 Honey 1.00 2.00 1.00 1.00 3.00 0.00 1.00 3.00 2.00 0.00 0.00 2.00 7.00 0.00 2.00 1.00 0.00 0.00 0.00 2.00 1.00 1.00 1.00 8.00 2.00 1.00 2.00 3.00 0.00 1.00 1.00 1.00 4.00 3.00 1.00 1.00
6 Butter 2.00 1.00 0.00 0.00 0.00 0.00 5.00 0.00 3.00 2.00 0.00 2.00 3.00 6.00 1.00 0.00 0.00 0.00 0.00 1.00 2.00 2.00 0.00 4.00 3.00 0.00 0.00 1.00 0.00 2.00 0.00 1.00 3.00 1.00 1.00 2.00
7 Grilledbread 0.00 5.00 1.00 0.00 0.00 1.00 1.00 2.00 3.00 1.00 0.00 5.00 5.00 1.00 3.00 0.00 0.00 0.00 2.00 0.00 1.00 3.00 1.00 8.00 1.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 1.00 2.00 0.00 0.00
8 Grilledhazelnut 0.00 3.00 1.00 1.00 0.00 2.00 1.00 3.00 6.00 1.00 0.00 3.00 4.00 1.00 2.00 0.00 1.00 0.00 1.00 0.00 1.00 2.00 0.00 5.00 2.00 1.00 1.00 1.00 0.00 1.00 0.00 0.00 2.00 3.00 1.00 0.00
9 Strawberry 3.00 0.00 1.00 3.00 2.00 0.00 0.00 0.00 0.00 0.00 5.00 0.00 3.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 2.00 0.00 0.00 1.00 3.00 0.00 0.00 4.00 5.00 14.00 0.00 0.00 13.00 0.00 2.00 14.00
10 Raspberry 1.00 1.00 1.00 1.00 3.00 0.00 0.00 0.00 0.00 2.00 2.00 0.00 1.00 0.00 0.00 1.00 1.00 1.00 0.00 0.00 0.00 0.00 0.00 3.00 5.00 0.00 1.00 4.00 2.00 12.00 1.00 0.00 10.00 0.00 2.00 9.00
11 Cherry 1.00 1.00 1.00 1.00 1.00 2.00 1.00 3.00 1.00 2.00 1.00 0.00 1.00 1.00 1.00 1.00 2.00 0.00 0.00 2.00 9.00 0.00 0.00 0.00 4.00 0.00 0.00 1.00 1.00 4.00 0.00 0.00 5.00 2.00 3.00 5.00
12 Blackcurrant 1.00 1.00 1.00 1.00 1.00 1.00 2.00 2.00 2.00 2.00 1.00 1.00 1.00 1.00 4.00 0.00 0.00 1.00 0.00 1.00 0.00 2.00 0.00 2.00 5.00 1.00 2.00 3.00 1.00 8.00 1.00 0.00 4.00 3.00 1.00 2.00
13 Greenpepper 3.00 3.00 0.00 1.00 1.00 1.00 0.00 6.00 0.00 1.00 0.00 2.00 1.00 0.00 8.00 1.00 0.00 0.00 0.00 1.00 0.00 2.00 1.00 5.00 0.00 1.00 2.00 4.00 0.00 1.00 1.00 0.00 2.00 2.00 1.00 0.00
14 Smoked 0.00 19.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 1.00 0.00 6.00 7.00 0.00 0.00 2.00 1.00 0.00 0.00 1.00 0.00 1.00 3.00 4.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 2.00 0.00 1.00
15 Pepper 3.00 1.00 0.00 1.00 3.00 0.00 1.00 2.00 0.00 0.00 1.00 1.00 2.00 0.00 2.00 1.00 2.00 0.00 0.00 1.00 1.00 0.00 0.00 2.00 2.00 8.00 0.00 1.00 1.00 1.00 1.00 4.00 1.00 7.00 1.00 1.00
16 Licorice 1.00 5.00 1.00 0.00 1.00 0.00 0.00 2.00 0.00 1.00 0.00 2.00 5.00 1.00 0.00 3.00 2.00 3.00 0.00 3.00 0.00 1.00 1.00 4.00 0.00 0.00 0.00 0.00 0.00 1.00 1.00 2.00 0.00 4.00 0.00 1.00

2.9 Caractérisation des axes latents

  • On effectue la régression de chacun des descripteurs sur les composantes de la MDS.

  • Les coefficients de regression seront utilisés comme coordonnées dans les plans factoriels.

Exemple

Descripteur Acide :

Voir le code R
k=3
df2<-read.csv("AromaTerms.csv",row.names=1)
config<-compute_mds(DissTotal,k=k)
beta<-data.frame(matrix(NA,nrow=dim(df2)[2],ncol=dim(config$points)[2]))
rownames(beta)<-colnames(df2)
colnames(beta)[1:k]<-paste("Dim",1:k,sep="")
for(i in 1:dim(beta)[1]){
  beta[i,]<-coef(lm(df2[,i]~as.matrix(config$points)))[-1]
}

On obtient :

Coefficients de régression
caractérisation des Dimensions
Dim1 Dim2 Dim3
Acid −2.00 −1.66 0.22
Smoked 5.86 −2.78 −2.25
Heady −0.35 0.39 0.20
Citrus −3.60 −1.88 1.30
Lemon −3.94 −3.29 3.09
Cake 0.36 0.78 −1.38
Milk 0.66 2.01 1.34
Woody 1.01 −0.63 −2.96
Grain 1.68 3.07 0.13
Low 0.26 1.14 −0.17
Redfruit −1.93 0.10 −0.39
Grilled 3.18 0.21 −0.67
Strong 2.31 −0.55 1.61
Fat 0.75 2.26 1.21
Vegetal 0.21 −0.26 −2.21
Medicine 0.69 −1.34 0.17
Chemical −0.32 −1.06 −0.34
Licorice 0.10 −0.26 1.07
Bread 0.46 0.51 −0.41
Alcohol 0.61 −0.79 0.75
Almond −0.89 1.44 −3.66
Caramel 1.45 1.27 −0.02
Coal 1.07 −0.63 −0.36
Unpleasant 4.01 1.51 0.29
Soft −1.56 2.59 0.42
Pepper 0.24 −3.05 0.65
Flower −0.39 −0.19 0.81
Fresh −2.51 −0.15 0.52
Red −1.93 0.10 −0.39
Fruit −10.63 1.11 2.40
Natural 0.05 −0.35 0.45
Spicy 0.49 −1.89 1.20
Sugar −6.31 2.90 −1.05
Hot 1.68 −2.57 1.46
Pleasant −1.57 0.15 −0.63
Candy −7.19 1.60 −1.34

2.10 Représentation graphique

Voir le code R
library(ggrepel)
ggplot(beta, aes(x=1.05*Dim1, y=1.05*Dim2,label=rownames(beta))) +
  geom_text_repel() +
  geom_segment(data=beta,aes(x=0, y=0, xend=Dim1, yend=Dim2), arrow = arrow(length=unit(.1, 'cm')))+
  theme_minimal()+
  #theme(element_text(size=10))+
  xlab(paste("Dim1=",round(config$explain_var[1]*100,3),"%"))+
  ylab(paste("Dim2=",round(config$explain_var[2]*100,3),"%"))+
  ggtitle(paste("MDS, stress=",round(config$stress,3)))