格拉布斯离群值检验——理论与 Python 实现
文章目錄
- 原理
- Python 代碼
參考文章: https://en.wikipedia.org/wiki/Grubbs%27s_test
原理
格拉布斯檢驗1是一種假設檢驗方法(顯著檢驗法),其原假設為:
H0:H_0:H0?: 數據集中沒有離群值
H1:H_1:H1?: 數據集中存在離群值
設數據集為:x1,x2,?,xnx_1, x_2, \cdots, x_nx1?,x2?,?,xn?計算 Grubbs 檢驗的檢驗統計量如下:
G=max?∣xi?xˉ∣sG=\frac{\max |x_i-\bar{x}|}{s} G=smax∣xi??xˉ∣?
其中 sss 為樣本的標準差:
s=∑i=1n(xi?xˉ)2n?1s=\sqrt{\frac{\sum_{i=1}^{n} (x_i-\bar{x})^2}{n-1}} s=n?1∑i=1n?(xi??xˉ)2??
其中檢驗統計量 G 服從:
G~n?1n×t(1?α)/2n2(n?2)n?2+t(1?α)/2n2(n?2)G\sim \frac{n-1}{\sqrt{n}} \times \sqrt{\frac{t^2_{(1-\alpha)/2n}(n-2)}{n-2+t^2_{(1-\alpha)/2n}(n-2)}} G~n?n?1?×n?2+t(1?α)/2n2?(n?2)t(1?α)/2n2?(n?2)??
取顯著水平為 α=0.95\alpha=0.95α=0.95,若:
G>n?1n×t(1?α)/2n2(n?2)n?2+t(1?α)/2n2(n?2)G > \frac{n-1}{\sqrt{n}} \times \sqrt{\frac{t^2_{(1-\alpha)/2n}(n-2)}{n-2+t^2_{(1-\alpha)/2n}(n-2)}} G>n?n?1?×n?2+t(1?α)/2n2?(n?2)t(1?α)/2n2?(n?2)??
則拒絕原假設,意味著樣本中存在離群值,而離群值就是那個離 xˉ\bar{x}xˉ 最遠的樣本,一般只要將其從樣本中刪除即可。
于是,對樣本 x1,x2,?,xnx_1, x_2, \cdots, x_nx1?,x2?,?,xn?,重復上述過程,直到 格拉布斯 檢驗無法檢驗的離群值為止。
Python 代碼
def grubbs_test(x, alpha=0.95):'''格拉布斯檢驗Parameters----------x : array, series樣本.alpha : float, optional置信水平. The default is 0.95.Returns-------x : np.array移除了 outliers 后的樣本.'''# https://en.wikipedia.org/wiki/Grubbs%27s_testif isinstance(x, pd.Series) or isinstance(x, pd.DataFrame):x = x.astype('float').valueselif isinstance(x, list):x = np.array(x)# 樣本個數p = len(x)beta = 1-alphawhile True:# 格拉布斯法算出離群值if p > 2:# 求均值和方差mean, std, _ = mean_standard(x)G_arr = np.abs(x-mean)/std# 最有可能是離群值的樣本的 indexG_idx = G_arr.argmax()# 求出 Grubbs test 的能力統計量 GG = G_arr[G_idx]t_crital = t.ppf(beta/(2*p), p-2)# 求檢驗統計量在顯著性水平中的臨界值criteria = (p-1)/np.sqrt(p)*np.sqrt(t_crital**2/(p-2+t_crital**2))if G > criteria:# 若樣本中有離群值, 刪除離群值x = np.delete(x, G_idx)# 重新求取參加者個數p = len(x)else:# 若樣本中沒有離群值,則返回return xelse:return x這里介紹的方法是雙邊(two-sides)格拉布斯檢驗法。也即同時檢驗兩個方向的離群值,若需要單邊,則只需把 (1?α)/2n(1-\alpha)/2n(1?α)/2n 換做 (1?α)/n(1-\alpha)/n(1?α)/n,把 G 換成 (xmax?xˉ)/s(x_{max}-\bar{x})/s(xmax??xˉ)/s 或 (xˉ?xmin)/s(\bar{x}-x_{min})/s(xˉ?xmin?)/s 即可。 ??
總結
以上是生活随笔為你收集整理的格拉布斯离群值检验——理论与 Python 实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql和oracle的索引类型
- 下一篇: Turbo编译码Matlab仿真解读 -