この記事で分かること
- pythonで「外れ値検定(スミルノフ=グラブス検定)」を実装したい人に向けた記事です。
- 検定の中身は知っていることを前提にコードだけ載せます。
目次
コード
import numpy as np
from scipy import stats
def func_tau(x, alpha):
n = x.size
t = stats.t.isf((alpha/n)/2, n-2) #両側
tau = (n-1)/np.sqrt(n) * np.sqrt(t**2/(n-2 + t**2))
return tau
def Smirnov_Grubbs(x, alpha):
x_ini = x
while(True):
mean = np.mean(x)
std = np.std(x, ddof=1)
imax, imin = np.argmax(x), np.argmin(x)
itest = imax if np.abs(x[imax] - mean) > np.abs(x[imin] - mean) else imin
test = np.abs(x[itest] -mean)/std
tau = func_tau(x, alpha)
if(test > tau):
x = np.delete(x, itest)
else:
break
x_outlier = np.setdiff1d(x_ini,x)
return x, x_outlier
x = np.array([1, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 1000])
print(Smirnov_Grubbs(x, 0.05)) #入力データx、有意水準5%
このコードを実行すると、次の結果が得られます。1つ目が外れ値を除外したもので、2つめが外れ値です。
(array([100, 101, 102, 103, 104, 105, 106, 107, 108, 109]), array([ 1, 1000]))
使い方
入力データxは一次元のnumpy ndarrayです。(pythonのリストよりも扱いやすいと思います。)
もしリストのデータの場合は、下記のようにnumpy ndarrayに変換しましょう。
list = [1, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 1000]
x = np.array(list)
スミルノフグラブス検定自体の解説は下記外部サイトをご参照ください。
スミルノフグラブス検定
スミルノフグラブス検定. GitHub Gist: instantly share code, notes, and snippets.
コメント