Détection de transactions atypiques dans un jeu de 2 400 commandes, sans données labellisées, avec analyse critique des résultats obtenus.
Jeu de données synthétique, construit pour cet exercice.
Aucune commande n'était étiquetée « anormale ». Sans labels, un modèle supervisé est impossible — et c'est la situation la plus courante en pratique : les anomalies sont rares, souvent inconnues à l'avance, et les annoter coûte cher.
Pourquoi Isolation Forest plutôt qu'un clustering. KMeans cherche des groupes et affecte chaque point à un cluster : une anomalie serait absorbée par le cluster le plus proche au lieu d'être signalée. Isolation Forest attaque directement la bonne question — ce point est-il facile à isoler du reste ? Le modèle construit des arbres de découpes aléatoires ; un point atypique se retrouve isolé en peu de coupes, un point au milieu de la masse en demande beaucoup.
Variables retenues : Quantite, Remise, Ventes, Profit.
Normalisation obligatoire. Les ventes se comptent en centaines ou milliers
d'euros, la remise vaut entre 0 et 1. Sans StandardScaler, la variable
Ventes écraserait complètement les autres dans les découpes, et le modèle ne
regarderait en pratique qu'une seule dimension.
Le paramètre contamination est fixé à 0,02, et chaque observation reçoit un
score continu d'anormalité via decision_function.
Le modèle a remonté 48 cas. Premier point d'honnêteté : ce nombre n'est pas une découverte. 2 % de 2 400 font exactement 48 — le nombre découle du paramètre choisi, pas des données.
Le second point est plus instructif. En comparant les cas signalés à la population générale :
| Variable | Anomalies | Population | Rapport |
|---|---|---|---|
| Montant moyen | 2 669 € | 651 € | ×4,1 |
| Quantité moyenne | 7,3 | 3,1 | ×2,3 |
| Profit moyen | 244 € | 70 € | ×3,5 |
| Remise moyenne | 0,070 | 0,057 | ×1,2 |
85 % des cas remontés appartiennent au top 5 % des montants. Autrement dit, le modèle a isolé les grosses commandes — pas des comportements suspects. La remise, elle, est quasiment identique à la moyenne, et seuls 4 cas sur 48 présentent un profit négatif.
C'est logique : en fournissant des valeurs absolues (montant, quantité, profit), on obtient mécaniquement les valeurs extrêmes. Or une grosse commande légitime n'est pas une anomalie métier.
- Construire des variables de rapport plutôt que des valeurs brutes : taux de marge, remise rapportée au segment client, montant rapporté à l'historique du client. C'est là qu'une anomalie de comportement devient visible.
- Choisir le seuil sur la distribution des scores plutôt qu'en imposant un pourcentage a priori, afin de repérer une rupture naturelle.
- Faire valider un échantillon par le métier. Sans labels, aucune mesure objective de précision n'est possible : la validation humaine est le seul recours.
| Fichier | Rôle |
|---|---|
anomalies.py |
normalisation, entraînement, scoring, export |
ventes_propres.csv |
jeu d'entrée (2 400 transactions nettoyées) |
anomalies_detectees.csv |
les 48 cas signalés, triés par score |
pip install pandas scikit-learn
python anomalies.pyPython · pandas · scikit-learn (IsolationForest, StandardScaler)