Zスコアルール
CoddyのMachine Learningジャーニー「機械学習のための統計」セクションの一部。レッスン 26/64。
ある農場で卵300個の重さを量り、その後、2個を手入力しました。6.2 gと94.6 gで、どちらも入力ミスです。これらのzスコア(平均からの距離を標準偏差単位で表したもの)を見れば、それとわかります。
np.absはマイナス記号を取り除くため、1つの比較で両側を検出できます。
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])これは次のように出力されます:
[4 2 1]
[ 6.2 94.6]釣鐘型のデータでは、値の99.7%が3標準偏差以内にあるため、np.abs(z) > 3は、学習前に確認すべきまれな値にフラグを立てます。
ただし、外れ値はそれを測定する際の標準偏差を大きくするため、小さなサンプルでは見つかりにくくなります。その場合はIQRルールを使いましょう。
チャレンジ
中級パン屋のはかりで250個のパンを計量してloavesに格納し、さらに3個を手入力しました。プログラムはしきい値を読み取ります。
- 配列の
.mean()と.std()を使って、各パンのzスコアを計算します。 - 位置の順に、zスコアが0からしきい値より離れているパンそれぞれについて、位置、重さ(小数点以下1桁)、zスコア(小数点以下2桁)を出力します。
- 一覧にしたパンの数を出力します。
別の日に、しきい値を3にした場合:
Loaf 200: 702.5 g, z = -5.38
Loaf 201: 889.3 g, z = 4.91
Loaves to re-weigh: 2自分で試してみよう
import numpy as np
# 以下の行は変更しないでください:はかりで測定したパン250個分の重さに続き、手入力した3個分の重さがあります
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())
# 以下にコードを書いてください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
機械学習のための統計のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ