Évaluer la tendance au regroupement en R

Vérifiez si vos données sont réellement regroupables avant d’exécuter le k-means — avec la statistique de Hopkins et VAT

Les algorithmes de regroupement renvoient des regroupements même quand il n’en existe aucun. Avant d’exécuter un k-means ou une classification hiérarchique, évaluez la tendance au regroupement en R : la statistique de Hopkins avec get_clust_tendency() de factoextra, et l’image de dissimilarité ordonnée de l’évaluation visuelle de la tendance au regroupement (VAT) avec fviz_dist().

Date de publication

24 juin 2026

Modifié

11 juillet 2026

AstucePoints clés
  • Les algorithmes de regroupement renvoient toujours des regroupements — même sur des données aléatoires uniformes sans aucune structure réelle. Vérifiez donc la tendance au regroupement avant de regrouper.
  • La statistique de Hopkins mesure à quel point vos données s’éloignent d’une distribution aléatoire uniforme. Avec factoextra actuel (formule corrigée de Wright), H proche de 1 signifie regroupable, H proche de 0.5 signifie aléatoire.
  • VAT (Visual Assessment of cluster Tendency) trace l’image de dissimilarité ordonnée — de sombres blocs le long de la diagonale révèlent d’un coup d’œil les regroupements réels.
  • get_clust_tendency() calcule Hopkins ; fviz_dist() dessine l’image VAT — toutes deux issues de factoextra.
  • Comparez un jeu de données pertinent (iris) à un jeu uniforme simulé de même étendue, et le contraste saute aux yeux : structure contre bruit.
Obtenez le livre — Practical Guide to Cluster Analysis in R (PDF)

Introduction

Vous êtes sur le point d’exécuter un k-means sur un nouveau jeu de données — fiches clients, profils d’expression génique, fleurs d’iris. Avant de le faire, posez-vous une question que les débutants sautent presque toujours : ces données contiennent-elles seulement des regroupements ?

Cela compte à cause d’un piège inhérent à toute méthode de regroupement : les algorithmes de regroupement renvoient des regroupements, qu’il en existe ou non. Donnez du bruit purement aléatoire au k-means et il le découpera consciencieusement en k groupes — parce que partitionner les données est précisément ce qu’on lui demande. Ces groupes n’ont aucun sens, mais rien dans la sortie ne vous met en garde. Les groupes semblent donc réels, vous les nommez, vous bâtissez un récit autour d’eux — et tout cela n’est qu’un artefact de l’algorithme.

Évaluer la tendance au regroupement est le garde-fou. Cela vérifie si vos données contiennent une structure significative (non aléatoire) avant que vous ne vous engagiez dans un regroupement. Cette leçon vous offre deux outils complémentaires :

  1. Un test statistique — la statistique de Hopkins, qui mesure à quel point les données s’éloignent d’une distribution aléatoire uniforme.
  2. Une méthode visuelleVAT (Visual Assessment of cluster Tendency), une image de dissimilarité ordonnée où les regroupements apparaissent comme de sombres blocs sur la diagonale.

Nous exécuterons les deux sur un jeu de données qui possède une structure et sur un jeu aléatoire qui n’en a pas, afin que vous voyiez exactement à quoi ressemble chaque outil dans le cas regroupable et le cas non regroupable.

Les données

La façon la plus claire de voir ce qu’est la tendance au regroupement consiste à placer un vrai jeu de données à côté d’un faux. Nous en utiliserons deux :

  • iris — le jeu de données intégré de fleurs, connu pour contenir trois regroupements réels d’espèces (les données pertinentes).
  • un jeu de données aléatoire simulé tiré d’une distribution uniforme sur la même étendue qu’iris (le témoin sans structure).

Construire le second à partir du premier garde la comparaison équitable — même nombre de points, mêmes étendues de variables, seule la structure est retirée. Nous supprimons l’étiquette Species, générons les données uniformes colonne par colonne avec runif(), puis standardisons les deux pour que les distances soient comparables :

# iris without the Species label
df <- iris[, -5]

# Random uniform data with the SAME range as each iris column
set.seed(123)
random_df <- apply(df, 2, function(x) {
  runif(length(x), min(x), max(x))
})
random_df <- as.data.frame(random_df)

# Standardize both (mean 0, sd 1 per column)
df <- scale(df)
random_df <- scale(random_df)

head(df, 3)
     Sepal.Length Sepal.Width Petal.Length Petal.Width
[1,]   -0.8976739   1.0156020    -1.335752   -1.311052
[2,]   -1.1392005  -0.1315388    -1.335752   -1.311052
[3,]   -1.3807271   0.3273175    -1.392399   -1.311052

Chaque étape ci-dessous part de ce df standardisé (réel) et de random_df (aléatoire).

Inspection visuelle : structure contre bruit

Avant tout test formel, regardez simplement les deux jeux de données. Tous deux ont quatre variables, nous les réduisons donc à deux dimensions par analyse en composantes principales (prcomp()) et traçons les individus avec fviz_pca_ind(). Côte à côte, la différence est immédiate :

library(factoextra)
df <- iris[, -5]
set.seed(123)
random_df <- apply(df, 2, function(x) runif(length(x), min(x), max(x)))
random_df <- as.data.frame(random_df)
df <- scale(df); random_df <- scale(random_df)

# Real data: coloured by the known species
p_iris <- fviz_pca_ind(prcomp(df), title = "PCA - Iris data",
                       habillage = iris$Species, palette = "jco",
                       geom = "point", ggtheme = theme_classic(),
                       legend = "bottom")

# Random data: no labels to colour by
p_rand <- fviz_pca_ind(prcomp(random_df), title = "PCA - Random data",
                       geom = "point", ggtheme = theme_classic())

cowplot::plot_grid(p_iris, p_rand, ncol = 2)

Two PCA scatter plots side by side. The iris data on the left separates into three coloured species groups; the random data on the right is a single diffuse cloud with no groups.

Les données iris se séparent en trois groupes nets (les espèces). Les données aléatoires forment un seul nuage diffus — aucun groupe. C’est la signature visuelle de données regroupables contre non regroupables.

Pourquoi s’en soucier ? Le regroupement « fonctionne » aussi sur des données aléatoires

Voici le problème rendu concret. Exécutez un k-means avec k = 3 sur les deux jeux de données et tracez le résultat avec fviz_cluster() :

library(factoextra)
df <- iris[, -5]
set.seed(123)
random_df <- apply(df, 2, function(x) runif(length(x), min(x), max(x)))
random_df <- as.data.frame(random_df)
df <- scale(df); random_df <- scale(random_df)

set.seed(123)
km_iris <- kmeans(df, 3)
km_rand <- kmeans(random_df, 3)

c_iris <- fviz_cluster(list(data = df, cluster = km_iris$cluster),
                       ellipse.type = "norm", geom = "point", stand = FALSE,
                       palette = "jco", ggtheme = theme_classic(),
                       main = "k-means on Iris")
c_rand <- fviz_cluster(list(data = random_df, cluster = km_rand$cluster),
                       ellipse.type = "norm", geom = "point", stand = FALSE,
                       palette = "jco", ggtheme = theme_classic(),
                       main = "k-means on Random data")

cowplot::plot_grid(c_iris, c_rand, ncol = 2)

Two k-means cluster plots. The iris data on the left forms three compact, well-separated clusters; the random data on the right is sliced into three arbitrary wedges with no real separation.

Regardez le graphique de droite : le k-means a imposé trois regroupements aux données aléatoires alors qu’il n’y en a aucun. L’algorithme ne peut pas refuser — il découpe le nuage en trois quartiers et les rapporte avec autant d’assurance que les vrais regroupements d’iris à gauche. Une classification hiérarchique des mêmes données aléatoires ferait exactement pareil — nous ne le traçons donc pas séparément ; la leçon sur la visualisation des dendrogrammes montre cette voie.

Voilà pourquoi l’évaluation de la tendance au regroupement existe : un résultat de regroupement n’est fiable que si les données étaient regroupables au départ. Deux méthodes vous permettent de le vérifier.

La statistique de Hopkins

La statistique de Hopkins [Lawson & Jurs, 1990] teste le caractère aléatoire spatial de vos données — elle mesure la probabilité que les données aient été générées par une distribution uniforme. En clair : à quel point mes données s’éloignent-elles du bruit aléatoire ?

L’idée est de comparer deux ensembles de distances au plus proche voisin :

  • prenez de vrais points de vos données et mesurez la distance de chacun à son plus proche voisin réel ;
  • générez le même nombre de points aléatoires uniformes et mesurez la distance de chacun à son plus proche voisin réel ;
  • la statistique se construit à partir du rapport de ces distances.

Si les données sont uniformément distribuées, les deux ensembles de distances se ressemblent. Si les données contiennent des regroupements serrés, les points réels se trouvent bien plus proches les uns des autres que ne le sont les points aléatoires — et la statistique se déplace vers son extrême regroupable.

NoteHypothèses
  • H₀ (nulle) : les données sont uniformément distribuées — aucun regroupement significatif.
  • Hₐ (alternative) : les données ne sont pas uniformément distribuées — elles contiennent des regroupements significatifs.

La calculer avec get_clust_tendency()

get_clust_tendency() de factoextra calcule la statistique de Hopkins. Passez-lui les données standardisées et n (le nombre de points à échantillonner — un choix courant est nrow - 1) ; fixez graph = FALSE pour ne renvoyer que le nombre :

library(factoextra)
df <- iris[, -5]
set.seed(123)
random_df <- apply(df, 2, function(x) runif(length(x), min(x), max(x)))
random_df <- as.data.frame(random_df)
df <- scale(df); random_df <- scale(random_df)

# Hopkins statistic for the real (iris) data
set.seed(123)
get_clust_tendency(df, n = nrow(df) - 1, graph = FALSE)$hopkins_stat
[1] 0.9980637
# Hopkins statistic for the random data
set.seed(123)
get_clust_tendency(random_df, n = nrow(random_df) - 1, graph = FALSE)$hopkins_stat
[1] 0.4747677

Lire la valeur (attention à la convention !)

Voici le point le plus important — et le plus déroutant — à propos de Hopkins. Les implémentations utilisent des conventions opposées, de sorte que les mêmes données peuvent vous donner 0.99 dans un paquet et 0.01 dans un autre. Avec factoextra actuel (qui utilise la formule corrigée de Wright, le standard moderne) :

Hopkins H Signification
proche de 1.0 structure de regroupement forte — regroupable
proche de 0.5 indistinguable de l’aléatoire — non regroupable
proche de 0.0 espacement régulier/uniforme (pas de regroupements non plus)

Donc dans la sortie ci-dessus :

  • iris → H ≈ 0.99 — bien au-dessus de 0.5, iris est donc hautement regroupable (comme nous l’avons déjà vu — trois espèces réelles).
  • aléatoire → H ≈ 0.47 — juste autour de 0.5, les données aléatoires sont donc non regroupables, exactement comme il se doit.

Le verdict est sans ambiguïté : iris a une structure, les données aléatoires non — et Hopkins le rapporte sous la forme d’un nombre unique que vous pouvez seuiller. (En règle générale avec cette convention, H > 0.75 signale une tendance au regroupement digne d’être explorée.)

Soit \(x_i\) la distance de chaque point réel échantillonné à son plus proche voisin réel, et \(y_i\) la distance de chaque point aléatoire uniforme à son plus proche voisin réel, sur \(n\) points échantillonnés. La statistique de Hopkins classique est

\[ H = \frac{\sum_{i=1}^{n} y_i^d}{\sum_{i=1}^{n} x_i^d + \sum_{i=1}^{n} y_i^d} \]

\(d\) est le nombre de dimensions. Sous l’hypothèse d’uniformité, \(\sum x_i\) et \(\sum y_i\) sont comparables, donc \(H \approx 0.5\). Lorsque des regroupements sont présents, les points réels se trouvent proches les uns des autres (petit \(\sum x_i\)), poussant \(H\) vers 1.

Les anciennes versions de factoextra rapportaient \(1 - H\) (de sorte que des données regroupables donnaient une valeur proche de 0), conformément à la définition de clustertend::hopkins(). Le factoextra actuel adopte la formule corrigée de Wright (2022) et la convention « proche de 1 = regroupable » montrée ci-dessus — c’est pourquoi une valeur que vous reteniez comme 0.18 pour iris se lit désormais 0.99. Vérifiez toujours quelle convention votre version de paquet utilise avant de seuiller.

VAT : Visual Assessment of cluster Tendency

La statistique de Hopkins vous donne un nombre. VAT vous donne une image — et les images sont souvent plus faciles à croire. L’algorithme VAT :

  1. Calcule la matrice de dissimilarité entre toutes les observations (distance euclidienne).
  2. La réordonne pour que les objets semblables soient voisins → une matrice de dissimilarité ordonnée.
  3. Affiche cette matrice ordonnée sous forme d’image — l’image de dissimilarité ordonnée (ODI).

Dans l’image, la couleur à la ligne i, colonne j encode la distance entre les observations i et j. Lorsque des regroupements réels existent, le réordonnancement aligne consécutivement les membres d’un regroupement, qui forment donc de sombres blocs carrés le long de la diagonale — un bloc par regroupement. Pas de blocs signifie pas de structure.

fviz_dist() de factoextra calcule la matrice de dissimilarité et dessine l’image VAT en un seul appel. Passez-lui dist() de vos données :

library(factoextra)
df <- iris[, -5]
set.seed(123)
random_df <- apply(df, 2, function(x) runif(length(x), min(x), max(x)))
random_df <- as.data.frame(random_df)
df <- scale(df); random_df <- scale(random_df)

v_iris <- fviz_dist(dist(df), show_labels = FALSE) + labs(title = "Iris data")
v_rand <- fviz_dist(dist(random_df), show_labels = FALSE) + labs(title = "Random data")

cowplot::plot_grid(v_iris, v_rand, ncol = 2)

Two ordered dissimilarity images. The iris image shows distinct dark square blocks along the diagonal marking real clusters; the random image is a smooth gradient with no blocks.

Comment la lire : rouge = forte similarité (faible dissimilarité), bleu = faible similarité. Un rouge pur signifie dist(xᵢ, xⱼ) = 0 ; la couleur monte vers le bleu à mesure que la distance grandit.

  • Iris (à gauche) montre de nets blocs carrés rouge sombre sur la diagonale — les observations d’un même bloc sont très semblables entre elles, l’empreinte visuelle de regroupements réels. Vous pouvez pratiquement les compter.
  • Aléatoire (à droite) est un dégradé lisse sans blocs — aucun groupe d’observations n’est systématiquement plus semblable à lui-même qu’au reste. Aucune structure.

Pour estimer visuellement le nombre de regroupements, comptez les blocs carrés sombres le long de la diagonale de l’image VAT.

Astuce

L’image VAT confirme ce que Hopkins nous a dit numériquement : il y a une structure de regroupement dans iris, et il n’y en a pas dans les données aléatoires. Quand la statistique et l’image concordent, vous pouvez regrouper en toute confiance.

Essayez en direct

Les graphiques ci-dessus ont été rendus au moment de la compilation. Vous voulez tester vous-même un jeu de données ? Modifiez le code et appuyez sur Run — il s’exécute dans votre navigateur via webR (aucune installation). Ici, nous calculons la statistique de Hopkins et dessinons l’image VAT pour iris :

🟢 Avec un agent IA

Demandez à Prova « mes données sont-elles regroupables, et comment lire la statistique de Hopkins et l’image VAT ? » — elle répond avec du code get_clust_tendency() et fviz_dist() que vous pouvez exécuter sur vos propres données, puis vous aide à interpréter la valeur (attention à la convention !) et les blocs de dissimilarité. The runtime is the judge. Demandez à Prova →

Problèmes courants

La valeur de Hopkins semble « à l’envers » (iris donne 0.99, pas 0.18). C’est la confusion n° 1 : les paquets divergent sur la convention. Factoextra actuel utilise la formule corrigée de Wright où proche de 1 = regroupable, proche de 0.5 = aléatoire. L’ancien factoextra et clustertend::hopkins() rapportent 1 − H, donc des données regroupables donnaient une valeur proche de 0. Mêmes données, échelle inversée. Vérifiez toujours la convention de votre version de paquet avant de seuiller — ne reportez pas un seuil mémorisé.

Le k-means « a trouvé des regroupements », mes données doivent donc être regroupables. Non — les algorithmes de regroupement renvoient des regroupements sur n’importe quelles données, y compris du bruit purement aléatoire (nous l’avons montré ci-dessus). Un résultat de regroupement n’est jamais une preuve de structure. Évaluez d’abord la tendance avec Hopkins et VAT ; ce n’est qu’alors que le regroupement a un sens.

VAT est illisible sur un grand jeu de données. fviz_dist() construit la matrice de dissimilarité complète n × n, il est donc lent et les blocs se brouillent pour des milliers de points. Sous-échantillonnez quelques centaines de lignes représentatives pour l’image VAT, ou appuyez-vous plutôt sur la statistique de Hopkins (un seul nombre) — le visuel est un outil de confirmation, pas le verdict complet.

La statistique de Hopkins des données aléatoires n’est pas exactement 0.5. Elle ne le sera pas — c’est une statistique d’échantillon, donc un jeu de données sans structure atterrit près de 0.5 (ici ≈ 0.47), pas dessus. Fixez une graine pour la reproductibilité et jugez-la par rapport au jeu de données pertinent (ici ≈ 0.99) ; c’est l’écart qui compte, pas un seuil magique unique.

Questions fréquentes

La statistique de Hopkins mesure à quel point un jeu de données s’éloigne d’une distribution aléatoire uniforme — elle teste le caractère aléatoire spatial. Elle compare les distances au plus proche voisin parmi vos points réels à celles de points aléatoires uniformes. Avec factoextra actuel (formule de Wright), une valeur proche de 1 signifie une structure de regroupement forte (regroupable) et proche de 0.5 signifie que les données sont essentiellement aléatoires. Calculez-la avec get_clust_tendency(df, graph = FALSE)$hopkins_stat.

Effectuez deux vérifications avant de regrouper. (1) La statistique de Hopkins : get_clust_tendency(scale(df), n = nrow(df) - 1, graph = FALSE)$hopkins_stat — proche de 1 est regroupable, proche de 0.5 est aléatoire. (2) VAT : fviz_dist(dist(scale(df))) — de sombres blocs carrés sur la diagonale signifient des regroupements réels. Si les deux disent « pas de structure », tout regroupement que vous calculerez n’aura aucun sens.

VAT affiche l’image de dissimilarité ordonnée : elle calcule la matrice de distances, la réordonne pour que les observations semblables soient adjacentes, et l’affiche sous forme de heatmap. Les regroupements réels apparaissent comme de sombres blocs carrés le long de la diagonale — vous pouvez même les compter pour estimer le nombre de regroupements. En R, fviz_dist(dist(df)) de factoextra la dessine ; rouge = semblable, bleu = dissemblable.

Parce que partitionner les données en k groupes est tout ce qu’ils font — le k-means, le PAM et la classification hiérarchique n’ont aucune notion de « il n’y a pas de regroupements ici ». Face à du bruit aléatoire uniforme, le k-means renvoie quand même k groupes et les rapporte avec autant d’assurance que les vrais. C’est exactement pourquoi vous évaluez d’abord la tendance au regroupement : la sortie ne vous met jamais en garde quand la structure n’est pas réelle.

Les implémentations utilisent des conventions opposées. Le factoextra actuel utilise la formule corrigée de Wright (2022) où regroupable ≈ 1. L’ancien factoextra et clustertend::hopkins() rapportent 1 − H, donc les mêmes données regroupables donnaient ≈ 0.18 (proche de 0). Les données n’ont pas changé — l’échelle s’est inversée. Vérifiez votre version de paquet et lisez la convention avant d’appliquer un seuil.

Testez vos connaissances

Les données intégrées USArrests (taux de criminalité par État américain) possèdent une structure réelle. Complétez le code pour calculer leur statistique de Hopkins sur les données standardisées, puis décidez si elles sont regroupables selon la convention factoextra actuelle.

# graph = FALSE returns just the number (no plot).
# Under the current factoextra convention, H near 1 = clusterable, near 0.5 = random.
library(factoextra) df <- scale(USArrests) set.seed(123) get_clust_tendency(df, n = nrow(df) - 1, graph = FALSE)$hopkins_stat # H is well above 0.5 → USArrests is clusterable.
library(factoextra)
df <- scale(USArrests)

set.seed(123)
get_clust_tendency(df, n = nrow(df) - 1, graph = FALSE)$hopkins_stat
# H is well above 0.5 → USArrests is clusterable.
  1. Si le k-means renvoie trois regroupements, les données ont assurément trois groupes réels.
  2. Avec factoextra actuel, une statistique de Hopkins proche de 0.5 signifie que les données sont hautement regroupables.
  3. Dans une image VAT, de sombres blocs carrés le long de la diagonale indiquent une structure de regroupement réelle.

L’affirmation 3 est correcte. Les sombres blocs diagonaux dans l’image VAT (de dissimilarité ordonnée) marquent des groupes d’observations mutuellement semblables — des regroupements réels. L’affirmation 1 est fausse : les algorithmes de regroupement renvoient des regroupements même sur des données aléatoires. L’affirmation 2 est fausse : avec la convention factoextra actuelle (Wright), proche de 0.5 signifie aléatoire, pas regroupable — proche de 1 est regroupable.

Conclusion

Avant de regrouper iris et un jeu de données aléatoire apparié, vous avez évalué leur tendance au regroupement de deux façons : la statistique de Hopkins via get_clust_tendency() (iris ≈ 0.99 = regroupable, aléatoire ≈ 0.47 = non, selon la convention factoextra/Wright actuelle) et l’image de dissimilarité ordonnée VAT via fviz_dist() (blocs diagonaux nets pour iris, aucun pour les données aléatoires). La leçon : le regroupement renvoie toujours des regroupements, vérifiez donc d’abord que les données sont regroupables — sinon vous nommerez des groupes qui ne sont que des artefacts purs. Une fois la tendance confirmée, la question suivante est de savoir combien de regroupements.

Leçons connexes

Vous préférez un livre ? Practical Guide to Cluster Analysis in R est disponible en PDF téléchargeable — toutes les leçons de cette série, hors ligne et à vous.

Obtenir le livre (PDF) →Les leçons restent gratuites en ligne.
Cette page vous a-t-elle été utile ?

Prouvez que vous savez le faire. Maîtrisez toute la série Analyse de clustering en R — suivez votre parcours, construisez des projets et obtenez un certificat.

Commencer gratuitement →

Passez à Pro — Prova illimité sur vos propres données et un certificat vérifiable qui atteste la compétence.

dès 15 $/mois facturé annuellement

Passer à Pro →

✓ Vous êtes Pro — continuez. The runtime is the judge.

Recevez les nouvelles leçons R & Python par e-mail

Pratique, reproductible, sans spam. Désinscription à tout moment.

Double opt-in. Nous ne partageons jamais votre e-mail.

Partager cette pageXLinkedInRedditHN

Réutilisation

Citation

BibTeX
@online{2026,
  author = {},
  title = {Évaluer la tendance au regroupement en R},
  date = {2026-06-24},
  url = {https://www.datanovia.com/learn/machine-learning/clustering/clustering-tendency},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Évaluer la tendance au regroupement en R.” 2026. June 24. https://www.datanovia.com/learn/machine-learning/clustering/clustering-tendency.