Exercice 1 : R


Introduction

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:

  • Chargement et description des données
  • Classification automatique : cah
  • Interprétation des groupes
  • Pistes pour mesuer la performance d’une classification



Importation des packages

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)



Chargement et description des données

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



Classification automatique : CAH

  • 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



Interprétation des groupes

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



Pistes pour mesurer la performance d’une classification

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






Exercice 1 : Python

#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]))

Exercice 2 :

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

Joseph LARMARANGE