DBSCAN : clustering basé sur la densité en R

Trouvez des regroupements de forme arbitraire et signalez les valeurs aberrantes comme bruit — sans choisir k

Un guide pratique de DBSCAN en R : voyez pourquoi k-means échoue sur les formes non sphériques, choisissez le rayon eps à partir d’un graphique des distances aux k plus proches voisins, exécutez dbscan() avec eps et MinPts, et visualisez les regroupements et les points de bruit avec fviz_cluster() de factoextra. Mis en œuvre sur le jeu de données multishapes.

Date de publication

24 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • DBSCAN (Density-Based Spatial Clustering of Applications with Noise) trouve des regroupements de n’importe quelle forme en regroupant les régions denses, et étiquette les points de faible densité comme bruit (valeurs aberrantes).
  • Contrairement à k-means, vous ne spécifiez pas à l’avance le nombre de regroupements — DBSCAN les découvre à partir de la densité des données.
  • Il a besoin de deux paramètres : eps (le rayon de voisinage) et MinPts (le minimum de points pour former une région dense).
  • Choisissez eps à partir d’un graphique des distances aux k plus proches voisins (dbscan::kNNdistplot()) — le « coude » (cassure nette) de la courbe est une bonne valeur.
  • Exécutez-le avec dbscan(df, eps, minPts) du package dbscan, puis visualisez avec fviz_cluster() de factoextra — les points de bruit sont dessinés en noir.
  • DBSCAN surpasse k-means sur les regroupements non sphériques et les données bruitées ; k-means est plus rapide et meilleur pour des groupes compacts et à peu près sphériques.
Obtenez le livre — Practical Guide to Cluster Analysis in R (PDF)

Introduction

DBSCANDensity-Based Spatial Clustering of Applications with Noise (Ester et al., 1996) — est un algorithme de clustering basé sur la densité qui peut identifier des regroupements de n’importe quelle forme dans des données contenant du bruit et des valeurs aberrantes. L’intuition est humaine : regardez un nuage de points et vous y voyez naturellement des regroupements comme des régions denses séparées par des espaces plus clairsemés, avec quelques points isolés n’appartenant à rien. DBSCAN formalise exactement cela.

C’est ce qui le distingue des méthodes que vous avez vues jusqu’ici. Les méthodes de partitionnement (k-means, PAM) et la classification hiérarchique ne fonctionnent bien que pour des regroupements compacts, bien séparés, à peu près sphériques, et sont facilement perturbées par les valeurs aberrantes — chaque point doit atterrir dans un regroupement. DBSCAN possède deux avantages que ces méthodes n’ont pas :

  • vous ne choisissez pas le nombre de regroupements à l’avance — il les trouve à partir de la densité ;
  • il peut retrouver des formes arbitraires (linéaires, ovales, en S) et signale explicitement les valeurs aberrantes comme bruit.

Cette leçon fait partie de la série Analyse de clusters en R. Nous montrerons d’abord pourquoi k-means échoue sur des données non sphériques, puis nous construirons les paramètres de DBSCAN, choisirons eps correctement, et lirons le résultat.

Pourquoi k-means échoue sur les formes arbitraires

Les données réelles sont rarement un ensemble bien rangé de blobs ronds. Pour le démontrer, nous utiliserons le jeu de données simulé multishapes du package factoextra. Il contient cinq regroupements de formes véritablement différentes — plus des valeurs aberrantes éparses — exactement la situation qui met k-means en échec.

Chargez-le et regardez d’abord les points bruts (nous utilisons les deux premières colonnes, les coordonnées x–y) :

library(factoextra)
data("multishapes", package = "factoextra")
df <- multishapes[, 1:2]

# Visualize the raw data
ggplot(df, aes(x, y)) +
  geom_point() +
  theme_minimal()

Scatter plot of the multishapes data set showing two concentric oval clusters, two parallel linear clusters, one compact round cluster, and scattered outlier points.

À l’œil nu, il y a 5 regroupements plus des valeurs aberrantes : deux regroupements ovales (les anneaux concentriques à gauche), deux regroupements linéaires (les deux bandes parallèles), et un regroupement rond compact — avec un saupoudrage de bruit. Un humain les voit instantanément à cause des différences de densité.

Confiez maintenant les mêmes données à k-means et demandez-lui 5 regroupements. fviz_cluster() de factoextra dessine le résultat :

library(factoextra)
data("multishapes", package = "factoextra")
df <- multishapes[, 1:2]

set.seed(123)
km.res <- kmeans(df, centers = 5, nstart = 25)

fviz_cluster(km.res, df, geom = "point",
             ellipse = FALSE, show.clust.cent = FALSE,
             palette = "jco", ggtheme = theme_minimal())

factoextra cluster plot of k-means with five clusters on the multishapes data, slicing the rings and bands into wedge-shaped groups that ignore the true shapes.

Nous savons qu’il y a 5 regroupements, mais k-means les obtient de travers. Il découpe les anneaux et les bandes linéaires en morceaux en forme de coin, car il suppose des regroupements sphériques, de taille égale et affecte chaque point au centre le plus proche. Les formes ici sont non convexes, donc aucun ensemble de centres ne peut les décrire — et les valeurs aberrantes sont forcées dans un regroupement au lieu d’être reconnues comme bruit.

C’est précisément là que DBSCAN excelle.

Les concepts : eps, MinPts et trois sortes de points

DBSCAN mesure la densité comme le nombre de points proches d’un point donné. « Proche » et « assez » sont fixés par deux paramètres :

  • eps (epsilon, \(\epsilon\)) — le rayon du voisinage autour d’un point. Les points situés à moins de eps du point x forment son \(\epsilon\)-voisinage.
  • MinPts — le nombre minimum de points qui doivent se trouver à l’intérieur de ce rayon pour qu’une région soit considérée comme dense.

Avec ceux-ci, chaque point des données est de l’un de trois types :

  • un point central — a au moins MinPts voisins à l’intérieur de eps (il se situe à l’intérieur d’une région dense) ;
  • un point de bordure — a moins de MinPts voisins, mais se trouve dans le eps-voisinage d’un point central (il est sur le bord d’un regroupement) ;
  • un point de bruit (valeur aberrante) — ni central ni de bordure ; il se situe dans une région clairsemée et n’appartient à aucun regroupement.

Un regroupement est alors un groupe de points connectés par la densité : partez d’un point central et continuez à absorber chaque point atteignable par des chaînes de voisinages denses qui se chevauchent. Les points qu’aucune chaîne n’atteint restent du bruit. Ce seul mécanisme explique pourquoi DBSCAN suit des formes arbitraires — il fait croître les regroupements le long de la densité propre des données, et non vers des centres fixes — et pourquoi il n’a besoin d’aucun k.

NoteLes trois avantages de DBSCAN sur k-means
  1. Aucun k à spécifier — le nombre de regroupements découle de la densité.
  2. N’importe quelle forme — les regroupements n’ont pas besoin d’être circulaires ou convexes.
  3. Les valeurs aberrantes sont de première classe — les points clairsemés sont étiquetés comme bruit, et non forcés dans un groupe.

Choisir eps avec le graphique des distances k-NN

MinPts est le paramètre le plus facile : plus les données sont grandes et bruitées, plus il doit être grand, avec un plancher d’environ 3 (une valeur par défaut courante pour des données en 2-D est MinPts = 5). Le paramètre sensible est eps — trop petit et les regroupements denses se fragmentent en bruit ; trop grand et des regroupements distincts fusionnent.

La recette standard pour eps est un graphique des distances aux k plus proches voisins. L’idée : pour chaque point, calculer la distance à son k-ième plus proche voisin (avec k = MinPts), trier ces distances par ordre croissant, et les tracer. Les points à l’intérieur d’un regroupement ont de petites distances k-NN ; les points dans les régions clairsemées en ont de grandes, donc la courbe reste basse puis se cambre nettement vers le haut à la frontière entre regroupement et bruit. Ce coude est une bonne valeur pour eps.

kNNdistplot() du package dbscan le dessine :

library(dbscan)
data("multishapes", package = "factoextra")
df <- multishapes[, 1:2]

# k = MinPts; the knee marks a good eps
kNNdistplot(df, k = 5)
abline(h = 0.15, lty = 2)

k-nearest-neighbor distance plot for the multishapes data with k equals 5, showing a flat curve that bends sharply upward near a distance of 0.15, marked by a dashed horizontal line.

La courbe est plate pour la plupart des points, puis monte brusquement. Le coude se situe à une distance d’environ 0.15 — nous utiliserons donc eps = 0.15 avec MinPts = 5.

Exécuter DBSCAN

Nous calculerons DBSCAN avec le package dbscan, qui est une ré-implémentation rapide et moderne de l’algorithme, et nous visualiserons avec factoextra. Installez-les une fois si nécessaire :

install.packages("dbscan")
install.packages("factoextra")
NoteUne note sur le choix du package

Le tutoriel SThDA d’origine utilisait fpc::dbscan(). Nous utilisons ici la fonction dbscan() du package dbscan — elle est plus rapide et c’est le choix maintenu aujourd’hui, et elle donne les mêmes regroupements. La seule différence d’orthographe est le nom de l’argument : dbscan() prend minPts (m minuscule), là où fpc::dbscan() prenait MinPts.

L’appel tient en une ligne — dbscan(data, eps, minPts) :

library(dbscan)
data("multishapes", package = "factoextra")
df <- multishapes[, 1:2]

# Compute DBSCAN with the eps from the kNN plot
set.seed(123)
db <- dbscan::dbscan(df, eps = 0.15, minPts = 5)

# Print a summary of the result
db
DBSCAN clustering for 1100 objects.
Parameters: eps = 0.15, minPts = 5
Using euclidean distances and borderpoints = TRUE
The clustering contains 5 cluster(s) and 31 noise points.

  0   1   2   3   4   5 
 31 410 405 104  99  51 

Available fields: cluster, eps, minPts, metric, borderPoints

L’affichage raconte toute l’histoire : DBSCAN a trouvé 5 regroupements et 31 points de bruit — exactement les cinq formes que nous pouvions voir à l’œil nu, avec les valeurs aberrantes éparses correctement mises de côté. Aucun k n’a été fourni ; le nombre de regroupements a émergé de la densité. Les tailles des regroupements le confirment :

library(dbscan)
data("multishapes", package = "factoextra")
df <- multishapes[, 1:2]
set.seed(123)
db <- dbscan::dbscan(df, eps = 0.15, minPts = 5)

# Cluster membership counts: cluster 0 = noise/outliers
table(db$cluster)

  0   1   2   3   4   5 
 31 410 405 104  99  51 

L’appartenance est stockée dans db$cluster, un vecteur d’entiers. Le regroupement 0 est réservé au bruit (les 31 valeurs aberrantes) ; les regroupements 15 sont les vrais groupes. Un coup d’œil rapide sur un échantillon aléatoire :

library(dbscan)
data("multishapes", package = "factoextra")
df <- multishapes[, 1:2]
set.seed(123)
db <- dbscan::dbscan(df, eps = 0.15, minPts = 5)

# Cluster of a random subset of points (0 = noise)
set.seed(42)
db$cluster[sample(seq_len(nrow(df)), 20)]
 [1] 2 1 5 2 1 1 1 1 2 2 3 2 4 4 2 3 1 2 5 1

Visualiser les regroupements

Voici maintenant la figure emblématique. fviz_cluster() trace les points colorés par regroupement — et surtout dessine les points de bruit en noir, afin que vous puissiez voir ce que DBSCAN a choisi d’ignorer. Nous passons stand = FALSE (les coordonnées sont déjà à la bonne échelle) et geom = "point" :

library(dbscan)
library(factoextra)
data("multishapes", package = "factoextra")
df <- multishapes[, 1:2]
set.seed(123)
db <- dbscan::dbscan(df, eps = 0.15, minPts = 5)

# Black points are noise/outliers
fviz_cluster(db, data = df, stand = FALSE,
             ellipse = FALSE, show.clust.cent = FALSE,
             geom = "point", palette = "jco",
             ggtheme = theme_minimal())

factoextra cluster plot of DBSCAN on the multishapes data: the two oval rings, two linear bands and one compact cluster are each recovered as a distinct colored cluster, with outlier noise points drawn in black.

C’est le résultat que k-means ne pouvait pas produire. Chacune des cinq formes — les deux anneaux concentriques, les deux bandes parallèles et le blob compact — est retrouvée comme son propre regroupement, suivant la véritable géométrie des données. Les points noirs sont le bruit : les valeurs aberrantes éparses que DBSCAN a correctement refusé d’affecter. fviz_cluster() utilise aussi des symboles légèrement différents pour les points centraux (germes) et de bordure au sein de chaque regroupement.

Interpréter le résultat, et DBSCAN vs k-means

Lire un résultat DBSCAN se résume à trois choses :

  • Le nombre de regroupements est une sortie, pas une entrée — ici, 5. S’il ne correspond pas à ce que vous attendez, ce sont vos eps/MinPts qui sont mal réglés, pas votre k.
  • Le regroupement 0 est du bruit. Sa taille (31 ici) vous dit combien de points étaient trop clairsemés pour appartenir à quoi que ce soit — un rapport de valeurs aberrantes intégré.
  • eps est le levier. Trop petit, il fragmente les regroupements denses en bruit ; trop grand, il fusionne des regroupements distincts. DBSCAN y est sensible, surtout lorsque les regroupements ont des densités différentes — un seul eps peut ne pas leur convenir à tous (voir Problèmes courants).

Alors, vers quelle méthode se tourner ?

Utilisez DBSCAN quand… Utilisez k-means quand…
les regroupements sont non sphériques (anneaux, bandes, formes en S) les regroupements sont compacts et à peu près sphériques
les données ont des valeurs aberrantes/du bruit que vous voulez signaler les données sont propres, chaque point doit être affecté
vous ne connaissez pas le nombre de regroupements vous pouvez choisir / estimer k
les densités sont similaires entre les regroupements les regroupements sont de taille similaire

En bref : DBSCAN échange le problème « choisir k » contre un problème « choisir eps », et en contrepartie il gère les formes arbitraires et les valeurs aberrantes qui mettent en échec les méthodes par centroïdes.

Essayez en direct

Modifiez et exécutez le code ci-dessous dans votre navigateur — aucune installation nécessaire. Essayez de changer eps (par ex. à 0.1 ou 0.3) ou minPts, puis ré-exécutez et observez comment le nombre de regroupements et de points de bruit change.

🟢 Avec un agent IA

Vous ne savez pas si vos données relèvent de DBSCAN ou de k-means ? Demandez à Prova « mes données ont-elles des regroupements non sphériques ou des valeurs aberrantes, et quel eps devrais-je utiliser ? » — elle répond avec du code R que vous pouvez exécuter sur votre propre jeu de données, en traçant le graphique des distances kNN et en lisant le coude pour vous. The runtime is the judge. Demander à Prova →

Problèmes courants

  • Choisir eps et MinPts. Ne devinez pas eps. Tracez le graphique des distances kNN (kNNdistplot(df, k = MinPts)) et lisez le coude. Pour MinPts, commencez à 5 pour des données en 2-D et augmentez-le pour des jeux plus grands ou plus bruités (une règle empirique est MinPts ≥ dimensions + 1, au moins 3). Rappelez-vous que l’argument est minPts dans le package dbscan, MinPts dans fpc::dbscan().
  • Tout est du bruit, ou tout forme un seul regroupement. C’est un problème d’eps. Si presque tous les points reviennent dans le regroupement 0 (bruit), eps est trop petit — augmentez-le. Si les données entières s’effondrent en un seul regroupement, eps est trop grand — diminuez-le. Le coude des distances kNN est le correctif.
  • Regroupements de densité variable. DBSCAN utilise un seul eps global, donc lorsque certains regroupements sont bien plus denses que d’autres, aucune valeur unique ne convient à tous : un petit eps scinde les regroupements clairsemés en bruit, un grand fusionne les denses. Si vos regroupements ont des densités très différentes, envisagez HDBSCAN (dbscan::hdbscan()), qui adapte le seuil de densité par regroupement.
  • Données en haute dimension. Les distances deviennent moins significatives à mesure que les dimensions augmentent (le fléau de la dimension), donc un seul eps sépare mal. Réduisez d’abord les dimensions avec la PCA, ou mettez vos variables à l’échelle pour qu’aucune caractéristique ne domine la distance.

Questions fréquentes

DBSCAN (Density-Based Spatial Clustering of Applications with Noise) est un algorithme non supervisé qui regroupe les points concentrés dans des régions denses et marque les points des régions clairsemées comme bruit (valeurs aberrantes). Il peut trouver des regroupements de forme arbitraire et, contrairement à k-means, ne vous oblige pas à choisir le nombre de regroupements à l’avance — ils émergent de la densité des données.

Utilisez un graphique des distances aux k plus proches voisins : dbscan::kNNdistplot(df, k = MinPts). Il trie la distance de chaque point à son k-ième plus proche voisin et les trace. La courbe se cambre nettement (le « coude ») là où les points cessent d’être à l’intérieur des regroupements et commencent à être du bruit — cette distance est une bonne valeur pour eps. Sur les données multishapes, le coude se situe près de 0.15.

K-means vous oblige à fixer le nombre de regroupements k, affecte chaque point au centre le plus proche, et suppose des regroupements à peu près sphériques, de taille égale — donc il échoue sur les anneaux, les bandes et les valeurs aberrantes. DBSCAN découvre le nombre de regroupements à partir de la densité, suit des formes arbitraires, et étiquette les valeurs aberrantes comme bruit. Utilisez k-means pour des groupes sphériques compacts ; utilisez DBSCAN pour des regroupements non sphériques ou des données bruitées.

Un point de bruit est une valeur aberrante que DBSCAN n’affecte à aucun regroupement : ce n’est ni un point central (≥ MinPts voisins à l’intérieur de eps) ni un point de bordure (dans le voisinage d’un point central). Dans le résultat, les points de bruit sont codés comme regroupement 0 (db$cluster == 0) et fviz_cluster() les dessine en noir.

Généralement oui, lorsque vos variables sont sur des échelles différentes — DBSCAN utilise des distances et un seul eps global, donc une variable de grande magnitude dominerait. Standardisez d’abord avec scale(). Les coordonnées x–y de multishapes ici sont déjà comparables, c’est pourquoi nous passons stand = FALSE à fviz_cluster().

Testez vos connaissances

Exécutez DBSCAN sur les données multishapes avec un rayon plus grand, eps = 0.3 (gardez minPts = 5). Affichez le résultat et les tailles des regroupements. Combien de regroupements trouve-t-il maintenant, et combien de points de bruit, par rapport à eps = 0.15 ? Tracez ensuite le graphique des regroupements.

Chargez dbscan et factoextra, construisez df <- multishapes[, 1:2], puis appelez dbscan::dbscan(df, eps = 0.3, minPts = 5). Utilisez table(db$cluster) pour les tailles (regroupement 0 = bruit) et fviz_cluster() pour tracer.

library(dbscan)
library(factoextra)
data("multishapes", package = "factoextra")
df <- multishapes[, 1:2]

set.seed(123)
db <- dbscan::dbscan(df, eps = 0.3, minPts = 5)
db
table(db$cluster)

fviz_cluster(db, data = df, stand = FALSE,
             ellipse = FALSE, show.clust.cent = FALSE,
             geom = "point", palette = "jco",
             ggtheme = theme_minimal())

Un eps plus grand fusionne les regroupements et absorbe le bruit : vous obtenez moins de regroupements et bien moins de points de bruit qu’avec eps = 0.15, parce qu’un rayon plus large relie des groupes qui étaient séparés et attire les valeurs aberrantes en leur sein. C’est exactement pourquoi le coude des distances kNN importe — il empêche eps d’être trop grand.

Vérification rapide. Un collègue exécute DBSCAN et presque chaque point revient dans le regroupement 0. Qu’est-ce que le regroupement 0, et quel est le seul paramètre à ajuster ?

Le regroupement 0 est du bruit (valeurs aberrantes affectées à aucun regroupement). Si presque tout est du bruit, eps est trop petit — les voisinages ne contiennent pas MinPts points, donc aucune région dense ne se forme. Augmentez eps (lisez-le sur le coude de kNNdistplot()), ou baissez MinPts.

Conclusion

Vous avez vu pourquoi k-means échoue sur les données non sphériques multishapes, appris les deux paramètres de DBSCAN (eps et MinPts) et ses types de points central/bordure/bruit, choisi eps à partir du coude du graphique des distances kNN, exécuté dbscan(df, eps = 0.15, minPts = 5) pour retrouver 5 regroupements et 31 points de bruit, et visualisé le tout avec fviz_cluster(). DBSCAN est la méthode vers laquelle se tourner lorsque les regroupements ont des formes arbitraires ou que les données portent des valeurs aberrantes — les cas qui mettent en échec le clustering par centroïdes. Lorsque les regroupements ont des densités très différentes, regardez du côté de HDBSCAN ; lorsqu’ils sont compacts et sphériques, k-means est plus rapide et plus simple.

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
Note

Cette leçon est reproductible : chaque figure a été produite par le code montré — modifiez n’importe quel bloc et exécutez, et le bac à sable + le quiz se ré-exécutent en direct dans votre navigateur. The runtime is the judge.

Références

  • Ester, M., Kriegel, H.-P., Sander, J., & Xu, X. (1996). A density-based algorithm for discovering clusters in large spatial databases with noise. Actes de la 2ᵉ conférence internationale sur la découverte de connaissances et l’exploration de données (KDD-96), 226–231.

Réutilisation

Citation

BibTeX
@online{2026,
  author = {},
  title = {DBSCAN : clustering basé sur la densité en R},
  date = {2026-06-24},
  url = {https://www.datanovia.com/learn/machine-learning/clustering/dbscan},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“DBSCAN : clustering basé sur la densité en R.” 2026. June 24. https://www.datanovia.com/learn/machine-learning/clustering/dbscan.