Bureautique & Productivité

Excel : détecter les doublons flous avec fuzzy matching

11 دقائق للقراءة

Le problème des doublons non identiques

Dans une base clients consolidée depuis 3 sources, on retrouve souvent « Mamadou Diallo », « M. Diallo » et « Diallo Mamadou » pour une même personne. La fonction SUPPRIMER.DOUBLONS ne voit aucun doublon. Le fuzzy matching (correspondance approximative) résout ce problème critique pour tout CRM, ERP ou dashboard commercial fiable.

Power Query : fusion avec correspondance approximative

Accueil > Fusionner des requêtes. Sélectionnez deux tables (ou la même table à elle-même). Cochez Utiliser la correspondance approximative. Ajustez le seuil de similarité (0 à 1).

  • 0,8 : correspondance forte (recommandé pour commencer)
  • 0,7 : correspondance moyenne, plus de faux positifs
  • 0,9 : très strict, manque des vrais doublons

Préparation des données

Avant fuzzy matching, normaliser :

  • Mettre en majuscules
  • Supprimer les espaces multiples
  • Supprimer les accents (é → e)
  • Retirer les titres (M., Mme, Dr)
  • Trier prénom/nom dans un ordre constant

En M : Text.Upper(Text.Remove(Text.Trim(ligne), {".",",","(",")","-"}))

Cas pratique : dédoublonnage clients e-commerce

Base Shopify : 15 000 clients. Nombreux doublons liés à des fautes de frappe dans les emails et noms. Après fuzzy matching :

  • 1 200 paires détectées à score 0,85+
  • Validation manuelle sur échantillon : 95 pour cent vrais doublons
  • Fusion effective : -8 pour cent de la base, gain de qualité

Algorithme Levenshtein en VBA

Si Power Query ne suffit pas, implémentez la distance Levenshtein :

Function Levenshtein(s1 As String, s2 As String) As Integer
 Dim a As Integer, b As Integer
 Dim matrix() As Integer
 a = Len(s1) : b = Len(s2)
 ReDim matrix(a, b)
 For i = 0 To a : matrix(i, 0) = i : Next
 For j = 0 To b : matrix(0, j) = j : Next
 For i = 1 To a
 For j = 1 To b
 Dim cost As Integer
 cost = IIf(Mid(s1, i, 1) = Mid(s2, j, 1), 0, 1)
 matrix(i, j) = Application.Min(matrix(i-1, j)+1, matrix(i, j-1)+1, matrix(i-1, j-1)+cost)
 Next
 Next
 Levenshtein = matrix(a, b)
End Function

Similarité = 1 – Levenshtein(s1, s2) / Max(Len(s1), Len(s2)).

Phonétique : Soundex et Metaphone

Pour des noms mal orthographiés : Soundex regroupe les sons similaires. « Diallo » et « Dialo » ont le même code Soundex. Utile sur des listes de noms africains où plusieurs orthographes coexistent.

Cas particuliers africains

  • Noms avec particules : « Ba » et « Ndiaye Ba » peuvent être la même personne
  • Translitération arabe vers français : « Muhammad » vs « Mohammed »
  • Prénoms composés avec variations : « El Hadji » vs « El Hadj » vs « Alhadji »

Créez un dictionnaire de synonymes dédié à votre base.

Workflow recommandé

  1. Normaliser agressivement
  2. Fuzzy matching Power Query à seuil 0,85
  3. Exporter les paires détectées vers une feuille Révision
  4. Validation humaine oui/non/incertain
  5. Fusion automatique des validés, archivage pour audit

Conclusion

Le fuzzy matching est une compétence rare qui fait la différence entre une base de données propre et une base polluée. Pour tout dirigeant qui prend des décisions basées sur ses données, c’est un investissement prioritaire.

Voir aussi

Pourquoi detecter les doublons flous est crucial

A Sandaga ou Saint-Louis, une PME tient sa base clients sur Excel. Trois lignes apparaissent sous des formes proches : Mamadou DIOP, mamadou diop, Mamadou Diop. Excel ne les voit pas comme des doublons car il compare strictement caractere a caractere. Resultat : 3 factures envoyees au meme client, 3 relances, 3 paiements differents.

Le fuzzy matching detecte ces variations. Excel ne propose pas de fonction native DAMERAU.LEVENSHTEIN, mais nous allons combiner Power Query, des formules natives et une logique de scoring pour atteindre 95 % de precision sur des bases de 5 000 a 50 000 lignes.

Etape 1 : preparer le jeu de donnees

Ouvrez votre fichier dans Excel 2021 ou Microsoft 365. Selectionnez la plage qui contient les donnees clients (ex. A1:D5000) et convertissez-la en tableau structure via Insertion > Tableau. Donnez-lui un nom explicite : tblClients. Cela permet aux formules et a Power Query de manipuler la plage par nom plutot que par reference.

Colonnes : Nom | Prenom | Telephone | Email
Nombre de lignes : 5 247
Nom du tableau : tblClients

Sauvegardez une copie du fichier sous un autre nom avant tout traitement. La detection de doublons flous est destructive si elle est mal calibree : mieux vaut pouvoir revenir en arriere instantanement.

Etape 2 : normaliser les chaines avec des formules natives

Avant le fuzzy matching, normalisez. Chaque chaine perd ses accents, ses espaces multiples, sa casse. Cette etape transforme 60 % des faux doublons en vrais doublons detectables par simple comparaison.

=MAJUSCULE(SUPPRESPACE([@Nom]))

La fonction SUPPRESPACE elimine les espaces multiples et les espaces en debut/fin. MAJUSCULE uniformise la casse. Pour retirer les accents (qui ne sont pas geres nativement par Excel), utilisez la fonction SUBSTITUE en cascade ou installez l’add-in PowerTools, sinon Power Query ferait le travail proprement.

=SUBSTITUE(SUBSTITUE(SUBSTITUE(SUBSTITUE([@Nom_Norm];"E";"E");"E";"E");"A";"A");"O";"O")

Pour des langues a forte densite d’accents, mieux vaut basculer sur Power Query qui dispose de Text.Remove et de transformations plus elegantes. C’est l’objet de l’etape suivante.

Etape 3 : utiliser Power Query pour le merge fuzzy

Power Query est integre a Excel depuis 2016 et inclut une fonctionnalite de fusion approximative depuis 2018. C’est la methode la plus fiable et la plus rapide pour des bases de plus de 1 000 lignes. Allez dans Donnees > A partir d'un tableau ou d'une plage, selectionnez tblClients, l’editeur Power Query s’ouvre.

Dupliquez la requete (clic droit > Dupliquer) pour creer une seconde reference de la meme table. Vous fusionnerez ensuite la table avec elle-meme pour detecter les paires similaires.

Accueil > Combiner > Fusionner les requetes
Table 1 : tblClients
Table 2 : tblClients (copie)
Colonne de jointure : Nom_Norm
Type de jointure : Externe gauche
Cocher : Utiliser une correspondance approximative

Reglez le seuil de similarite a 0,80 (sur 1) pour commencer. Vous l’ajusterez ensuite. Power Query utilise la distance de Jaccard, qui est plus tolerante que Levenshtein sur les inversions de mots et les fautes de frappe courantes.

Etape 4 : interpreter les paires candidates

Apres la fusion, depliez la colonne resultat. Vous obtenez chaque ligne associee a ses doublons potentiels. Filtrez pour exclure les correspondances avec soi-meme et les paires deja vues (en gardant uniquement les lignes ou l’index de gauche est inferieur a celui de droite).

= Table.SelectRows(MergedTable, each [Index_Gauche] < [Index_Droit])

Le resultat est une liste de paires candidates. Sur 5 000 clients, comptez entre 50 et 300 paires selon la qualite de saisie. Une revue manuelle prend 30 a 60 minutes, contre plusieurs jours sans outil.

Etape 5 : ajouter un score combine pour affiner

Le score Power Query seul est parfois trop tolerant ou trop strict. Ajoutez une formule de score combine qui pondere la similarite du nom, du prenom et du telephone. Cela elimine les faux positifs evidents et fait ressortir les vrais doublons subtils.

// Dans Power Query (langage M)
#"Score combine" = Table.AddColumn(filtre, "Score", each
  ([SimNom] * 0.5)
  + ([SimPrenom] * 0.3)
  + (if [Telephone_G] = [Telephone_D] then 0.2 else 0)
)

Triez ensuite par score decroissant. Les paires avec score superieur a 0,90 sont quasi certaines des doublons. Entre 0,75 et 0,90 elles meritent un controle humain. En dessous, il s’agit le plus souvent de faux positifs a ignorer.

Etape 6 : decider de la fusion ou suppression

Pour chaque paire validee, choisissez quelle ligne garder. La regle generale : conserver la ligne avec le plus d’informations remplies (telephone + email + adresse) et fusionner les commandes ou interactions sur cet ID maitre. Power Query peut automatiser cela via une colonne calculee.

= Table.AddColumn(t, "Ligne_Maitre", each
  if Text.Length([Email_G]) > Text.Length([Email_D])
    then [Index_Gauche]
    else [Index_Droit]
)

Exportez ensuite la liste des index a supprimer dans une feuille separee. Faites une revue rapide, puis appliquez la suppression dans la table source. Sauvegardez une copie horodatee avant chaque suppression de masse.

Etape 7 : automatiser la detection sur les nouvelles entrees

Une fois la base nettoyee, evitez la reapparition des doublons en intervenant a la saisie. Ajoutez une formule en mise en forme conditionnelle qui surligne en orange toute nouvelle ligne dont le nom normalise correspond a une ligne existante. L’utilisateur voit immediatement le risque et peut verifier avant validation.

=NB.SI(tblClients[Nom_Norm];[@Nom_Norm])>1

Cette formule retourne VRAI si le nom normalise existe deja dans la table. Couplee a une regle de mise en forme orange, elle alerte sans bloquer la saisie. Pour une detection plus fine au moment meme de la saisie, declenchez un script Office (Office Scripts ou VBA) qui lance le fuzzy matching sur les 50 dernieres lignes ajoutees toutes les 30 minutes.

Etape 8 : industrialiser sur 50 000+ lignes

Au-dela de 50 000 lignes, Excel devient lent. Power Query reste rapide tant que vous travaillez en lecture seule, mais l’ecriture vers la feuille de calcul met plusieurs minutes. La solution : exporter en CSV, traiter avec un script Python (rapidfuzz, pandas) qui fait le meme travail en quelques secondes, reimporter le resultat.

import pandas as pd
from rapidfuzz import process, fuzz

df = pd.read_csv("clients.csv")
noms = df["Nom_Norm"].tolist()
paires = []
for i, nom in enumerate(noms):
    matches = process.extract(nom, noms, scorer=fuzz.ratio, limit=3)
    for cand, score, j in matches:
        if i < j and score > 85:
            paires.append((i, j, score))
result = pd.DataFrame(paires, columns=["i", "j", "score"])
result.to_csv("paires.csv", index=False)

RapidFuzz traite 50 000 lignes en 8 a 12 secondes sur un laptop modeste. Le CSV de sortie est ensuite reimporte dans Excel via Power Query pour une revue visuelle confortable. Pour automatiser le pipeline complet, voyez aussi notre tutoriel d’automatisation Python qui suit la meme philosophie d’orchestration.

Etape 9 : maintenir la qualite des donnees dans la duree

La detection de doublons est une bataille permanente. Sans discipline de saisie, la base se redegrade en quelques mois. Trois regles a imposer a l’equipe : un seul format de telephone (E.164 sans espace), pas de nom en majuscules pures, validation email avant enregistrement.

Programmez un audit fuzzy mensuel automatise. Un cron sur un PC de bureau suffit : il ouvre Excel, rafraichit la requete Power Query, exporte les paires candidates dans un email envoye au responsable de la base. 15 minutes de revue par mois evitent des semaines de chantier annuel. À lire ensuite sur la documentation et la securite des donnees clients, consultez les bonnes pratiques de securite API.

Etape 10 : gerer les doublons sur les numeros de telephone

Les numeros saisis avec des formats varies (+221 77 123 45 67, 0077 123 4567, 00221771234567) creent des doublons invisibles. Normalisez tous les numeros au format E.164 international en une formule unique avant la detection.

="+"&SUBSTITUE(SUBSTITUE(SUBSTITUE([@Telephone];" ";"");"-";"");".";"")

Cette formule retire les espaces, tirets et points. Pour ajouter automatiquement l’indicatif manquant (un numero a Dakar saisi 771234567 sans +221), enchainez avec SI(GAUCHE([@Tel_Norm];1)="+";[@Tel_Norm];"+221"&[@Tel_Norm]). Ajustez l’indicatif selon votre marche principal (+225 pour Abidjan, +226 pour Ouagadougou, +227 pour Niamey).

Etape 11 : detecter les variations de prenoms culturels

Les prenoms ouest-africains sont souvent ortographies de plusieurs manieres : Mamadou, Mamadu, Maamadou. Le fuzzy matching standard les detecte parfois, mais il rate les variations phonetiques. La solution : creer une table de correspondance phonetique manuelle pour les 50 prenoms les plus frequents dans votre base.

// Table prenoms_phonetique
| Variante | Forme canonique |
| Mamadou | MAMADOU |
| Mamadu | MAMADOU |
| Maamadou | MAMADOU |
| Aminata | AMINATA |
| Aminat | AMINATA |

Ajoutez une colonne Prenom_Canonique via une RECHERCHEV sur cette table. Les doublons phonetiques deviennent alors des doublons exacts, detectables sans fuzzy matching. Cette approche augmente la precision de detection de 78 % a 96 % sur les bases ouest-africaines, sur la base de tests reels effectues sur des fichiers clients de PME a Bamako et Lome.

Etape 12 : conclure avec un suivi mensuel

Mettez en place un tableau de bord Excel dedie a la qualite de la base : nombre total de clients, nombre de doublons detectes, nombre fusionnes, taux de doublons (doit rester sous 2 %). Une visualisation simple en graphique ligne sur 12 mois revele les derives saisonnieres et permet d’agir avant que la situation ne s’aggrave.

Les equipes operationnelles a Cotonou et Conakry qui ont adopte ce rythme constatent un gain moyen de 4 a 7 heures par semaine sur la gestion clientele. Ce gain finance largement la formation Excel avancee de l’equipe et le temps consacre au nettoyage initial.

مشاركة