7 Clustering

Objectif

~> Diviser un ensemble de données en différents groupes sans connaissance a priori sur les groupes (non supervisé).
~> Les observations d’un même groupe sont supposées partager des caractéristiques communes. La distance euclidienne est en général utilisée pour mesurer la proximité entre individus.

7.1 Fonctions utiles pour le clustering

Standardiser les données avant le clustering

Non prévu dans les options de kmeans

data <- scale(data)

Clustering ascendant hiérarchique - CAH

# Clustering hiérarchique = CAH
resCAH <- factoextra::hcut(data, k = .., hc_method = ..., 
hc_metric = "euclidean", stand = TRUE)

Méthodes de calcul des distances entre groupes hc_method: “single”, “complete”, “average”, “ward.D”, “ward.D2”.

Clustering kmeans

# Clustering non hiérarchique = K-Means
resKM <- kmeans(data, centers = .., nstart = 20)
Résultats CAH et fonctions liées
Infos sur le clustering Résultats : resCAH
~> Nb de groupes proposé par hcut (si non fourni) resCAH$nbclust
~> Taille des groupes resCAH$size
~> N° cluster pour chaque donnée resCAH$cluster
Visualiser le clustering dans l’espace des CPs factoextra::fviz_cluster(resCAH)
Dendrogramme factoextra::fviz_dend(resCAH, rect = TRUE)
Résultats K-Means et fonctions liées
Infos sur le clustering Résultats:resKM
~> Membres des clusters Groupes resKM$cluster
~> Centres des clusters resKM$centers
~> Somme totale des carrés resKM$totss
~> Sommes des carrés Within resKM$withinss
~> Total des sommes des carrés Within resKM$tot.withinss
~> Sommes des carrés Between resKM$betweenss
Visualiser le clustering dans l’espace des CPs factoextra::fviz_cluster(res, ..)

7.2 Données du chapitre Clustering

Les données iris sont communément utilisées pour illustrer les bases des méthodes multivariées. Elle fournissent, pour 150 iris, 4 variables liées aux dimensions de la fleur : Sepal.Length, Sepal.Width, Petal.Length, Petal.Width. Ces iris sont de 3 espèces : setosa, versicolor, virginica.

# Jeu de données iris disponible directement dans R dont on sélectionne aléatoirement 45 données
data <- iris[sample(1:150,45),]
# Extraire la variable qualitative avec l'espèce
groupe <- as.factor(data$Species)
# Isoler les 4 variables quantitatives (sans la 5eme colonne de iris)
data <- data[,-5] 
# Visualiser les données 
plot(data, col = groupe , main="Scatter plots des variables prises 2 à 2", oma=c(3,3,3,12), pch=20)
par(xpd = TRUE)
legend("bottomright", title = "Species", legend = levels(groupe), col = c(1,2,3), cex = 0.8, pch = c(20,20,20))

7.3 Application des fonctions hcut() et kmeans()

resCAH <- factoextra::hcut(data,  hc_method = "average", 
hc_metric = "euclidean", stand = TRUE)
resCAH

Call:
stats::hclust(d = x, method = hc_method)

Cluster method   : average 
Distance         : euclidean 
Number of objects: 45 
datas=scale(data)
resKM <- kmeans(datas, centers=3,nstart=20)
resKM
K-means clustering with 3 clusters of sizes 18, 14, 13

Cluster means:
  Sepal.Length Sepal.Width Petal.Length Petal.Width
1   -0.0635247  -0.8123590    0.2248319   0.2000685
2    1.1384947   0.2507954    1.0080508   1.0116469
3   -1.1381139   0.8547174   -1.3968989  -1.3664838

Clustering vector:
 14  50 118  43 150 148  90  91 143  92 137  99  72  26   7  78  81 147 103 117 
  3   3   2   3   1   2   1   1   1   1   2   1   1   3   3   2   1   1   2   2 
 76  32 106 109 136   9  41  74  23  27  60  53 126 119 121  96  38  89  34  93 
  1   3   2   1   2   3   3   1   3   3   1   2   2   2   2   1   3   1   3   1 
 69 138 130  63  13 
  1   2   2   1   3 

Within cluster sum of squares by cluster:
[1] 15.29246 12.59662 10.97006
 (between_SS / total_SS =  77.9 %)

Available components:

[1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
[6] "betweenss"    "size"         "iter"         "ifault"      

7.4 Aide au choix du nombre de clusters

factoextra offre 3 méthodes (wss, silhouette et gap_stat) pour aider au choix du nombre idéal de clusters pour les données analysées. Le dendogramme peut aussi aider en CAH. La fonction Nbclust de la librairie Nbclust offre aussi une panoplie de critères supplémentaires pour répondre à la question.

7.4.1 CAH

factoextra::fviz_nbclust(data, FUNcluster =factoextra::hcut, method = "silhouette",hc_method = "average", hc_metric = "euclidean", stand = TRUE)

Et avec le package NbClust (sans sorties)

NbClust::NbClust(data, distance = "euclidean", method = "average")

7.4.2 K-means

factoextra::fviz_nbclust(data, FUNcluster =kmeans, method = "silhouette")

7.5 Utiliser fviz_dend()

factoextra::fviz_dend(resCAH,rect=TRUE)

7.6 Utiliser fviz_cluster()

Présente une projection des données des clusters dans l’espace des premières composantes principales.

Avec CAH avec 2 clusters

fviz_cluster(resCAH, geom = "point", ellipse = TRUE)

Avec kmeans avec 3 clusters (il faut fournir les données comme argument)

fviz_cluster(resKM, datas)