当サイトには広告・プロモーションが含まれています。

外れ値検定(スミルノフ=グラブス検定)pythonの実装

この記事で分かること
  • 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)

スミルノフグラブス検定自体の解説は下記外部サイトをご参照ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次