Deux règles de statistique descriptive pour signaler les valeurs extrêmes d'une variable. Le score z mesure l'écart à la moyenne en écarts-types ; la règle IQR place des bornes autour des quartiles, comme les moustaches d'une boîte à moustaches. À tester avant tout algorithme : elles sont immédiates, explicables, et suffisent parfois.
Un contrôleur de gestion qui trie les notes de frais : tout ce qui dépasse largement la dépense habituelle part en vérification, sans modèle ni boîte noire.
z = (valeur - moyenne) / écart-type. Au-delà de 3 en valeur absolue, la valeur est signalée. Sur une loi normale, cela concerne environ 0,3 % des données.
L'écart interquartile (IQR) sépare le 1er et le 3e quartile. Toute valeur au-delà de Q3 + 1,5 x IQR ou en deçà de Q1 - 1,5 x IQR est signalée. C'est la règle des moustaches de Tukey.
Montants, distances et durées ont une longue traîne : les règles brutes y signalent trop ou trop peu. On les applique alors au logarithme de la variable.
5 000 paiements par carte, avec la distance entre le lieu d'achat et le domicile du porteur. La plupart se font à quelques kilomètres, quelques-uns à des milliers. Les 40 fraudes confirmées du jeu servent seulement à évaluer les règles.
Sur le jeu d'exemple, le score z sur la distance brute signale 34 transactions, toutes frauduleuses, mais laisse passer 6 fraudes. L'IQR brut attrape les 40 fraudes, noyées dans 269 alertes. Appliqués au logarithme de la distance, score z et IQR signalent 40 et 41 transactions, dont les 40 fraudes.
Une règle se juge sur deux chiffres : la part des fraudes attrapées et le nombre d'alertes à traiter. Le score z brut rate des fraudes parce que les distances extrêmes gonflent l'écart-type qui sert à les détecter : c'est l'effet de masque. Le logarithme règle les deux problèmes.
Aucun package nécessaire : R base et pandas suffisent. Les décisions portent sur le seuil et la préparation.
3 est l'usage courant. Sur de grands volumes, même une variable parfaitement normale produit des dépassements : sur 5 000 lignes, on en attend environ 13 au-delà de 3 par pur hasard.
1,5 donne les moustaches classiques de la boîte à moustaches. 3 ne garde que les valeurs très éloignées, dites extrêmes. On ajuste selon le nombre d'alertes que l'équipe peut traiter.
Remplacer moyenne et écart-type par la médiane et l'écart absolu médian (MAD) donne un score z robuste, qui ne se laisse pas masquer par les extrêmes. Le seuil usuel est alors 3,5.
# Contrôle de premier niveau : score z et IQR en R
transactions <- read.csv("transactions.csv")
fraude <- transactions$fraude_confirmee # sert seulement à évaluer les règles
regle_z <- function(x, seuil = 3) abs((x - mean(x)) / sd(x)) > seuil
regle_iqr <- function(x, k = 1.5) {
q <- quantile(x, c(0.25, 0.75))
x < q[1] - k * (q[2] - q[1]) | x > q[2] + k * (q[2] - q[1])
}
distance <- transactions$distance_km
regles <- list("z brut" = regle_z(distance), "IQR brut" = regle_iqr(distance),
"z sur log" = regle_z(log1p(distance)), "IQR sur log" = regle_iqr(log1p(distance)))
# Nombre d'alertes et fraudes attrapées pour chaque règle
for (nom in names(regles)) {
alerte <- regles[[nom]]
cat(sprintf("%-12s : %4d alertes, %d fraudes sur %d\n", nom, sum(alerte), sum(fraude[alerte]), sum(fraude)))
}
# Contrôle de premier niveau : score z et IQR en Python
import numpy as np
import pandas as pd
transactions = pd.read_csv("transactions.csv")
fraude = transactions["fraude_confirmee"] # sert seulement à évaluer les règles
def regle_z(x, seuil=3):
z = (x - x.mean()) / x.std()
return z.abs() > seuil
def regle_iqr(x, k=1.5):
q1, q3 = x.quantile(0.25), x.quantile(0.75)
return (x < q1 - k * (q3 - q1)) | (x > q3 + k * (q3 - q1))
distance = transactions["distance_km"]
regles = {"z brut": regle_z(distance), "IQR brut": regle_iqr(distance),
"z sur log": regle_z(np.log1p(distance)), "IQR sur log": regle_iqr(np.log1p(distance))}
# Nombre d'alertes et fraudes attrapées pour chaque règle
for nom, alerte in regles.items():
print(f"{nom:12s} : {alerte.sum():4d} alertes, {fraude[alerte].sum()} fraudes sur {fraude.sum()}")
Le score z repose sur la moyenne et l'écart-type, eux-mêmes tirés par les valeurs extrêmes. La règle IQR repose sur les quartiles, insensibles aux extrêmes, ce qui la rend plus robuste. En contrepartie, sur une variable asymétrique, l'IQR signale beaucoup de valeurs simplement situées dans la longue traîne.
3 en valeur absolue est l'usage le plus courant, parfois 2,5 pour être plus sensible. Pour un score z robuste, fondé sur la médiane et le MAD, le seuil recommandé est 3,5. Le bon seuil dépend surtout du nombre d'alertes que l'on peut traiter.
Pas automatiquement. Une valeur aberrante peut être une erreur de saisie à corriger, ou justement le cas intéressant : une fraude, une panne, un gros client. On les examine, on corrige les erreurs avérées et on documente la règle appliquée.
Généralise le score z à plusieurs variables en tenant compte de leurs corrélations.
Voir la fiche → l'étape suivanteDétecte des anomalies sur toutes les variables à la fois, sans hypothèse de distribution.
Voir la fiche → pour les anomalies localesRepère les points isolés par rapport à leur voisinage, là où une règle globale ne voit rien.
Voir la fiche →Dataistudio forme les équipes au machine learning et à l'IA, sur des cas concrets.
Nous utilisons des cookies de mesure d'audience et de suivi publicitaire pour comprendre la fréquentation du site et l'efficacité de nos annonces. Rien n'est déposé sans votre accord. En savoir plus