Menu
CoddyTech

La règle du score Z

Fait partie de la section Statistiques pour le ML du Journey Machine Learning de Coddy. Leçon 26 sur 64.

Une ferme a pesé 300 œufs, puis en a saisi deux à la main : 6.2 g et 94.6 g, tous deux étant des erreurs de saisie. Leurs scores z (distances par rapport à la moyenne, en écarts-types) les trahissent :

Histogramme des poids de 300 œufs exprimés en scores z, tous compris entre -3 et 3 dans une bande ombrée indiquant une plage de 3 écarts-types. Deux points rouges se trouvent bien à l’extérieur : 6.2 g à z = -9.9 et 94.6 g à z = 6.3

np.abs supprime les signes moins, donc une seule comparaison détecte les deux côtés :

rng = np.random.default_rng(3)
eggs = np.concatenate([rng.normal(60, 4, size=300), np.array([6.2, 94.6])])
z = (eggs - eggs.mean()) / eggs.std()
print(np.abs(np.array([-4, 2, -1])))
print(eggs[np.abs(z) > 3])

Cela affiche :

[4 2 1]
[ 6.2 94.6]

Dans des données en forme de cloche, 99,7 % des valeurs se situent à moins de 3 écarts-types, donc np.abs(z) > 3 signale les valeurs rares à vérifier avant l’entraînement.

Mais une valeur aberrante augmente l’écart-type utilisé pour la mesurer, si bien que les petits échantillons la masquent : utilisez la règle de l’IQR dans ce cas.

challenge icon

Défi

Moyen

La balance d’une boulangerie a pesé 250 pains dans loaves, et 3 autres ont été saisis à la main. Le programme lit un seuil.

  1. Calcule le score z de chaque pain avec .mean() et .std() du tableau.
  2. Dans l’ordre des positions, affiche chaque pain dont le score z est à une distance de 0 supérieure au seuil : sa position, son poids (1 décimale) et son score z (2 décimales).
  3. Affiche combien tu en as listés.

Pour un autre jour et le seuil 3 :

Loaf 200: 702.5 g, z = -5.38
Loaf 201: 889.3 g, z = 4.91
Loaves to re-weigh: 2

Essayez vous-même

import numpy as np

# Ne modifiez pas les lignes ci-dessous : 250 pains pesés par la balance, puis 3 poids saisis à la main
rng = np.random.default_rng(25)
loaves = np.concatenate([rng.normal(800, 15, size=250), np.array([731.4, 868.9, 912.3])])
cutoff = float(input())

# Écrivez votre code ci-dessous
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Statistiques pour le ML

Entraînez-vous par vous-même : Compilateur Python en ligne