Ce document décrit une classification automatique d’un ensemble de fromages (29 observations) décrits par leurs propriétés nutritives (ex. protéines, lipides, etc. ; 9 variables). L’objectif est d’identifier des groupes de fromages homogènes, partageant des caractéristiques similaires.
Traitements réalisés:
library(gt)
## Warning: le package 'gt' a été compilé avec la version R 4.3.3
library(knitr)
library(ggplot2)
## Warning: le package 'ggplot2' a été compilé avec la version R 4.3.3
library(GGally)
## Warning: le package 'GGally' a été compilé avec la version R 4.3.3
library(psych)
fil <- "https://raw.githubusercontent.com/armelsoubeiga/Cours/refs/heads/master/Statistiques%20et%20Probabilit%C3%A9s/fromage.txt"
#charger les données - attention aux options
fromage <- read.table(file=fil,header=T,row.names=1,sep="\t",dec=".")
#afficher les 6 premières lignes
kable(head(fromage))
| calories | sodium | calcium | lipides | retinol | folates | proteines | cholesterol | magnesium | |
|---|---|---|---|---|---|---|---|---|---|
| CarredelEst | 314 | 353.5 | 72.6 | 26.3 | 51.6 | 30.3 | 21.0 | 70 | 20 |
| Babybel | 314 | 238.0 | 209.8 | 25.1 | 63.7 | 6.4 | 22.6 | 70 | 27 |
| Beaufort | 401 | 112.0 | 259.4 | 33.3 | 54.9 | 1.2 | 26.6 | 120 | 41 |
| Bleu | 342 | 336.0 | 211.1 | 28.9 | 37.1 | 27.5 | 20.2 | 90 | 27 |
| Camembert | 264 | 314.0 | 215.9 | 19.5 | 103.0 | 36.4 | 23.4 | 60 | 20 |
| Cantal | 367 | 256.0 | 264.0 | 28.8 | 48.8 | 5.7 | 23.0 | 90 | 30 |
#stat. descriptives
summary(fromage)
## calories sodium calcium lipides retinol
## Min. : 70 Min. : 22.0 Min. : 72.6 Min. : 3.40 Min. : 37.10
## 1st Qu.:292 1st Qu.:140.0 1st Qu.:132.9 1st Qu.:23.40 1st Qu.: 51.60
## Median :321 Median :223.0 Median :202.3 Median :26.30 Median : 62.30
## Mean :300 Mean :210.1 Mean :185.7 Mean :24.16 Mean : 67.56
## 3rd Qu.:355 3rd Qu.:276.0 3rd Qu.:220.5 3rd Qu.:29.10 3rd Qu.: 76.40
## Max. :406 Max. :432.0 Max. :334.6 Max. :33.30 Max. :150.50
## folates proteines cholesterol magnesium
## Min. : 1.20 Min. : 4.10 Min. : 10.00 Min. :10.00
## 1st Qu.: 4.90 1st Qu.:17.80 1st Qu.: 70.00 1st Qu.:20.00
## Median : 6.40 Median :21.00 Median : 80.00 Median :26.00
## Mean :13.01 Mean :20.17 Mean : 74.59 Mean :26.97
## 3rd Qu.:21.10 3rd Qu.:23.40 3rd Qu.: 90.00 3rd Qu.:30.00
## Max. :36.40 Max. :35.70 Max. :120.00 Max. :51.00
#graphique - croisement deux à deux
pairs.panels(fromage,
method = "pearson", # correlation method
hist.col = "#00AFBB",
density = TRUE, # show density plots
ellipses = TRUE # show correlation ellipses
)
Ce type de graphique n’est jamais anodin. Nous constatons par exemple que (1) « lipides » est fortement corrélé avec « calories » et « cholestérol » (sans trop de surprises) (remarque : la même information va peser 3 fois dans l’analyse) ; (2) dans certaines configurations, des groupes semblent apparaître naturellement (ex. croisement de « protéines » et « cholestérol », avec une corrélation inter-groupes assez marquée).
Normalisation : centrage (soustraire la moyenne ou autre), réduction (diviser par l’écart-type, moyenne quadratique ou autre) des données. Cela pour éviter que variables à forte variance pèsent indûment sur les résultats
Matrice des distances entre individus sur les variables method = euclidean
Matrice des distances entre les groupes method = ward.D2
# scale
fromage.cr <- scale(fromage,center=T,scale=T)
#distance
d.fromage <- dist(fromage.cr, method = "euclidean")
#CAH - critère de Ward
cah.ward <- hclust(d.fromage, method="ward.D2")
#affichage dendrogramme
plot(cah.ward)
Le dendrogramme « suggère » un découpage en 4 groupes. On note qu’une classe de fromages, les « fromages frais » (tout à gauche), se démarque fortement des autres au point qu’on aurait pu envisager aussi un découpage en 2 groupes seulement.
#découpage en 4 groupes
groupes.cah <- cutree(cah.ward, k=4)
#liste des groupes
fromage$groupes.cah <- groupes.cah
head(fromage)
## calories sodium calcium lipides retinol folates proteines
## CarredelEst 314 353.5 72.6 26.3 51.6 30.3 21.0
## Babybel 314 238.0 209.8 25.1 63.7 6.4 22.6
## Beaufort 401 112.0 259.4 33.3 54.9 1.2 26.6
## Bleu 342 336.0 211.1 28.9 37.1 27.5 20.2
## Camembert 264 314.0 215.9 19.5 103.0 36.4 23.4
## Cantal 367 256.0 264.0 28.8 48.8 5.7 23.0
## cholesterol magnesium groupes.cah
## CarredelEst 70 20 1
## Babybel 70 27 1
## Beaufort 120 41 2
## Bleu 90 27 1
## Camembert 60 20 3
## Cantal 90 30 1
Pour un statisticien (ou un expert ou le conseil scientifique dans la santé) qui maitrise très bien ses données peut dèjà à ce niveau donner une catégorisation de chaque groupe.
On peut également utiliser d’autre méthodes comme : - des analyse descriptive bivariées - régression - Possibilité de faire d’abord une analyse en composante pour identifier et considerer que les variables importantes (non corréler) pour la classification.
describeBy(fromage, group="groupes.cah")
##
## Descriptive statistics by group
## groupes.cah: 1
## vars n mean sd median trimmed mad min max range skew
## calories 1 17 331.12 30.44 321.0 328.73 31.13 292.0 406.0 114.0 0.80
## sodium 2 17 262.79 81.44 252.0 259.70 69.68 140.0 432.0 292.0 0.40
## calcium 3 17 189.40 58.53 202.3 191.67 51.00 72.6 272.2 199.6 -0.51
## lipides 4 17 27.15 2.79 27.3 27.05 3.26 23.3 32.5 9.2 0.20
## retinol 5 17 60.09 12.50 60.4 60.07 13.20 37.1 83.5 46.4 0.18
## folates 6 17 9.71 8.38 6.2 8.75 1.93 3.6 30.3 26.7 1.47
## proteines 7 17 21.38 2.44 21.1 21.37 2.22 16.8 26.0 9.2 -0.07
## cholesterol 8 17 82.35 11.47 80.0 81.33 14.83 70.0 110.0 40.0 0.74
## magnesium 9 17 26.88 7.38 27.0 26.67 4.45 13.0 44.0 31.0 0.53
## groupes.cah 10 17 1.00 0.00 1.0 1.00 0.00 1.0 1.0 0.0 NaN
## kurtosis se
## calories -0.19 7.38
## sodium -0.77 19.75
## calcium -0.68 14.20
## lipides -1.25 0.68
## retinol -0.96 3.03
## folates 0.62 2.03
## proteines -0.77 0.59
## cholesterol -0.24 2.78
## magnesium 0.18 1.79
## groupes.cah NaN 0.00
## ------------------------------------------------------------
## groupes.cah: 2
## vars n mean sd median trimmed mad min max range skew
## calories 1 4 389.75 11.93 390.00 389.75 14.83 378.0 401.0 23.0 -0.01
## sodium 2 4 126.00 78.96 102.00 126.00 38.55 60.0 240.0 180.0 0.59
## calcium 3 4 280.68 50.79 283.80 280.68 55.75 220.5 334.6 114.1 -0.10
## lipides 4 4 30.65 2.68 30.90 30.65 2.89 27.5 33.3 5.8 -0.12
## retinol 5 4 64.28 17.16 56.10 64.28 1.04 54.9 90.0 35.1 0.75
## folates 6 4 2.52 1.86 1.85 2.52 0.89 1.2 5.2 4.0 0.58
## proteines 7 4 30.23 3.87 29.30 30.23 2.08 26.6 35.7 9.1 0.50
## cholesterol 8 4 107.50 18.93 115.00 107.50 7.41 80.0 120.0 40.0 -0.62
## magnesium 9 4 45.75 4.11 45.50 45.75 3.71 41.0 51.0 10.0 0.13
## groupes.cah 10 4 2.00 0.00 2.00 2.00 0.00 2.0 2.0 0.0 NaN
## kurtosis se
## calories -2.40 5.96
## sodium -1.78 39.48
## calcium -2.16 25.40
## lipides -2.23 1.34
## retinol -1.69 8.58
## folates -1.83 0.93
## proteines -1.80 1.93
## cholesterol -1.79 9.46
## magnesium -1.89 2.06
## groupes.cah NaN 0.00
## ------------------------------------------------------------
## groupes.cah: 3
## vars n mean sd median trimmed mad min max range skew
## calories 1 4 276.50 57.51 278.00 276.50 59.30 206.0 344.0 138.0 -0.05
## sodium 2 4 235.50 71.64 234.00 235.50 85.99 160.0 314.0 154.0 0.03
## calcium 3 4 127.20 64.45 110.05 127.20 44.55 72.8 215.9 143.1 0.44
## lipides 4 4 22.82 4.55 22.45 22.82 5.11 18.5 27.9 9.4 0.08
## retinol 5 4 115.00 25.99 109.70 115.00 19.50 90.1 150.5 60.4 0.39
## folates 6 4 34.05 2.73 34.40 34.05 2.89 31.0 36.4 5.4 -0.10
## proteines 7 4 17.95 5.13 18.65 17.95 4.15 11.1 23.4 12.3 -0.29
## cholesterol 8 4 65.00 12.91 65.00 65.00 14.83 50.0 80.0 30.0 0.00
## magnesium 9 4 24.25 8.66 22.50 24.25 6.67 16.0 36.0 20.0 0.38
## groupes.cah 10 4 3.00 0.00 3.00 3.00 0.00 3.0 3.0 0.0 NaN
## kurtosis se
## calories -1.96 28.76
## sodium -2.27 35.82
## calcium -1.94 32.22
## lipides -2.31 2.28
## retinol -1.91 12.99
## folates -2.33 1.36
## proteines -1.89 2.57
## cholesterol -2.08 6.45
## magnesium -1.93 4.33
## groupes.cah NaN 0.00
## ------------------------------------------------------------
## groupes.cah: 4
## vars n mean sd median trimmed mad min max range skew
## calories 1 4 101.75 33.05 97.50 101.75 33.36 70.0 142.0 72.0 0.17
## sodium 2 4 44.75 31.94 33.00 44.75 14.08 22.0 91.0 69.0 0.61
## calcium 3 4 133.75 61.85 120.55 133.75 50.48 78.2 215.7 137.5 0.34
## lipides 4 4 6.28 3.43 5.65 6.28 3.26 3.4 10.4 7.0 0.18
## retinol 5 4 55.15 10.46 56.70 55.15 10.60 42.9 64.3 21.4 -0.14
## folates 6 4 16.48 9.12 20.20 16.48 1.93 2.9 22.6 19.7 -0.71
## proteines 7 4 7.20 2.29 7.65 7.20 1.78 4.1 9.4 5.3 -0.37
## cholesterol 8 4 18.25 8.88 16.50 18.25 7.41 10.0 30.0 20.0 0.33
## magnesium 9 4 11.25 1.89 10.50 11.25 0.74 10.0 14.0 4.0 0.62
## groupes.cah 10 4 4.00 0.00 4.00 4.00 0.00 4.0 4.0 0.0 NaN
## kurtosis se
## calories -2.18 16.52
## sodium -1.80 15.97
## calcium -2.03 30.92
## lipides -2.24 1.72
## retinol -2.27 5.23
## folates -1.71 4.56
## proteines -1.93 1.14
## cholesterol -2.02 4.44
## magnesium -1.79 0.95
## groupes.cah NaN 0.00
Des mesures permettant de comparer la performance entre plusieurs méthodes de classification et également de comparer des partitions avec différents nombres de groupes pour un même méthode. SAUF le \(R^2\)
library(WeightedCluster)
tab <- tidyr::tibble(
stat = names(wcClusterQuality(d.fromage, fromage$groupes.cah)$stats),
cah = wcClusterQuality(d.fromage, fromage$groupes.cah)$stats
)
tab
## # A tibble: 10 × 2
## stat cah
## <chr> <dbl>
## 1 PBC 0.723
## 2 HG 0.899
## 3 HGSD 0.899
## 4 ASW 0.352
## 5 ASWw 0.433
## 6 CH 7.40
## 7 R2 0.470
## 8 CHsq 19.9
## 9 R2sq 0.705
## 10 HC 0.0369
On peut voir que les critères \(PBC, HG ,HGSD\) : vont messures des distances inter-groupe, donc doivent être maximiser.
Les critères \(CH, CHsq\) sont basés sur la statistique F de l’analyse de variance.
\(ASW, ASWw\) (Largeur moyenne de la silhouette) : Mesure la distance moyenne pondérée d’une observation aux autres membres de son groupe et sa distance moyenne pondérée au groupe le plus procheSi c’est faible, il signifie que les groupes ne sont pas clairement séparés ou que l’homogénéité des groupes est faible.
| ASW | Interpretation proposed |
|---|---|
| 0.71 − 1.00 | Strong structure identified. |
| 0.51 − 0.70 | Reasonable structure identified. |
| 0.26 − 0.50 | Structure is weak and could be artificial |
| 0.25 | No structure : Try other algorithms |
wcClusterQuality(d.fromage, fromage$groupes.cah)$ASW
## ASW ASWw
## 1 0.2844468 0.3251370
## 2 0.4250748 0.5688061
## 3 0.2696869 0.4522651
## 4 0.6457876 0.7343407
\(as.clustrange\) : fonction pour tester toutes les possibilités de groupe, biensûr avec \(ncl < N\)
#modification du dossier par défaut
import os
fil = "https://raw.githubusercontent.com/armelsoubeiga/Cours/refs/heads/master/Statistiques%20et%20Probabilit%C3%A9s/fromage.txt"
#importation des données
import pandas
fromage = pandas.read_table(fil,sep="\t",header=0,index_col=0)
#dimension des données
print(fromage.shape)
#6 premières lignes des données
print(fromage.iloc[0:6,:])
#statistiques descriptives
print(fromage.describe())
#graphique avec croisement deux à deux
from pandas.tools.plotting import scatter_matrix
scatter_matrix(fromage,figsize=(9,9))
#centrage réduction des données
from sklearn import preprocessing
fromage_cr = preprocessing.scale(fromage)
#librairies pour la CAH
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage, fcluster
#générer la matrice des liens
Z = linkage(fromage_cr,method='ward',metric='euclidean')
#affichage du dendrogramme
plt.title("CAH")
dendrogram(Z,labels=fromage.index,orientation='left',color_threshold=0)
plt.show()
#matérialisation des 4 classes (hauteur t = 7)
plt.title('CAH avec matérialisation des 4 classes')
dendrogram(Z,labels=fromage.index,orientation='left',color_threshold=7)
plt.show()
#découpage à la hauteur t = 7 ==> 4 identifiants de groupes obtenus
groupes_cah = fcluster(Z,t=7,criterion='distance')
print(groupes_cah)
#index triés des groupes
import numpy as np
idg = np.argsort(groupes_cah)
#affichage des observations et leurs groupes
print(pandas.DataFrame(fromage.index[idg],groupes_cah[idg]))
On peut remarquer que les fonctions de normalisation \(scale()\) et de calcul de distance \(dist()\), prennent en entrée une matrice numerique. C’est à dire que toutes la variables doivent être quantitative.
Mais lorsqu’on disposer de variables **qualitative ou mixte*, les distances classique vu en cours sont plus applicables (car dépendent de données continues), on va utiliser d’autres méthodes pour transformer les données ou pour calculer les distance, à fin de pouvoir appliquer la classification ascendante hiérarchique (CAH) :
Transformer les variables qualitatives en quantitatives avec les avantages et inconvenient ( plusieurs méthodes existent)
La distance du \(Φ²\) (basé sur la frequence des modalités) qui est celle utilisée pour l’analyse des correspondances multiples (ACM) ou dans l’analyse factorielle des données mixtes (AFDM)
La distance de Gower qui peut s’appliquer à un ensemble de variables à la fois qualitatives et quantitatives et qui se calcule avec la fonction \(daisy\) de l’extension \(cluster\).
seqdist distance sur des séquences
…