library(factoextra)
data("multishapes", package = "factoextra")
df <- multishapes[, 1:2]
# Visualize the raw data
ggplot(df, aes(x, y)) +
geom_point() +
theme_minimal()
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.
24 juin 2026
7 juillet 2026
eps (le rayon de voisinage) et MinPts (le minimum de points pour former une région dense).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.dbscan(df, eps, minPts) du package dbscan, puis visualisez avec fviz_cluster() de factoextra — les points de bruit sont dessinés en noir.DBSCAN — Density-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 :
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.
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) :

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

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.
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 :
MinPts voisins à l’intérieur de eps (il se situe à l’intérieur d’une région dense) ;MinPts voisins, mais se trouve dans le eps-voisinage d’un point central (il est sur le bord d’un 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.
k à spécifier — le nombre de regroupements découle de la densité.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 :

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.
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 :
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) :
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 :
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 1–5 sont les vrais groupes. Un coup d’œil rapide sur un échantillon aléatoire :
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())
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.
Lire un résultat DBSCAN se résume à trois choses :
eps/MinPts qui sont mal réglés, pas votre k.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.
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.
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 →
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().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.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.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.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().
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.
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.
k lorsque vous utilisez réellement une méthode de partitionnement. · Clustering basé sur un modèle — une autre façon de gérer les groupes non sphériques, via les modèles de mélange. · Analyse de clusters en R — la série complète.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.
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.
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
✓ Vous êtes Pro — continuez. The runtime is the judge.
Prêt à passer à la vitesse supérieure ?
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.
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.
@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}
}