如何在Python中执行Grubbs测试
介绍
Grubbs测试是一种用于检测数据集中异常值的统计假设检验方法。异常值是偏离数据分布的观测值,也称为异常。具有异常值的数据集倾向于过度拟合,而不像具有正态/高斯分布的数据。因此,在进行机器学习建模之前,有必要处理异常值。在处理之前,我们必须检测并定位数据集中的异常值。最流行的异常值检测技术是QQPlot、四分位极差和Grubbs统计测试。但是,本文仅讨论Grubbs测试以检测异常值。您将学习:什么是Grubbs测试以及如何在Python中实现它。
什么是异常值?
异常值是数值上与其他数据值有差异的数据观测值。这些值存在于正常分布数据范围之外。数据集必须包含第一个标准差下的67%记录,第二个标准差下的95%数据和均值下的第三个标准差下的99.7%点,才能达到正常分布。换句话说,数据点应在第一四分位数和第三四分位数范围内。我们认为位于第一四分位数以下和第三四分位数以上的记录为异常值或异常点。
Grubbs统计假设检验
Grubbs测试与其他统计假设检验一样,也批准或拒绝零假设(H0)或备择假设(H1)。Grubbs测试是一种检测数据集中异常值的测试方法。
我们可以通过两种方式进行Grubbs测试: 单侧测试和双侧测试,用于具有至少七个变量的单变量数据集或接近正常分布的样本。此测试也称为极端标准化偏差测试或最大标准化残差测试。
Grubbs测试使用以下假设 –
-
零假设(H0):数据集没有异常点。
-
备择假设(H1):数据集存在一个异常值。
Python中的Grubbs测试
Python具有其庞大的库收藏品,可以处理任何编程挑战。这些库提供了内置方法,可以直接使用以执行任何操作,统计测试等。类似地,Python具有一种使用方法来执行Grubbs测试以检测异常值的库。但是,我们将探讨两种在Python中实现Grubbs测试的方法:来自库的内置函数和从头开始实现公式。
异常值库和Smirnov_grubbs
首先,让我们使用以下命令安装outlier_utils库。
!pip install outlier_utils
现在让我们创建具有异常值的数据集并执行Grubbs测试。
双侧Grubbs测试
语法
grubbs.test(data, alpha=.05)
参数
data − 数据值的数值向量。
alpha − 测试的置信水平。
解释
在这种方法中,用户必须使用来自异常值包的smirnov_grubbs.test()函数,将必要的数据作为输入传递,以运行Grubb’s测试。
示例
import numpy as np
from outliers import smirnov_grubbs as grubbs
#define data
data = np.array([ 5, 14, 15, 15, 14, 19, 17, 16, 20, 22, 8, 21, 28, 11, 9, 29, 40])
#perform Grubbs' test
grubbs.test(data, alpha=.05)
输出
array([ 5, 14, 15, 15, 14, 19, 17, 16, 20, 22, 8, 21, 28, 11, 9, 29])
上述代码仅仅是加载库和数据,并最终使用“test”方法对该数据执行 Grubbs 测试。该测试检测左侧和右侧的异常值,或者第一四分位数以下和第三四分位数以上的值。该数据只有一个单一的异常值 40,通过 Grubbs 测试移除了该值。
单边 Grubbs 测试
语法
grubbs.max_test(data, alpha=.05)
解释
在这种方法中,用户必须调用 grubbs.min_test() 函数,以从提供的数据集中获取最小的异常值,或者调用 grubbs.max_test() 函数,以从提供的数据集中获取最大的异常值,从而获得单侧 Grubb 的测试。
示例
import numpy as np
from outliers import smirnov_grubbs as grubbs
#define data
data = np.array([5, 14, 15, 15, 14, 19, 17, 16, 20, 22, 8, 21, 28, 11, 9, 29, 40])
# 执行 Grubbs 的测试来判断最小值是否为异常值
print(grubbs.min_test(data, alpha=.05))
# 执行 Grubbs 的测试来判断最大值是否为异常值
grubbs.max_test(data, alpha=.05)
输出
[ 5 14 15 15 14 19 17 16 20 22 8 21 28 11 9 29 40]
array([ 5, 14, 15, 15, 14, 19, 17, 16, 20, 22, 8, 21, 28, 11, 9, 29])
单边的 Grubbs 测试会检测第一四分位数以下或第三四分位数以上的异常值。我们可以看到 min_test 方法从最小值的一侧移除了异常值,而 max_test 方法从数据的顶端移除异常值。
公式实现
在此,我们将使用 Python 实现以下 Grubbs 测试公式。我们将使用 Numpy 和 Scipy 库进行实现。
语法
g_calculated = numerator/sd_x
g_critical = ((n - 1) * np.sqrt(np.square(t_value_1))) / (np.sqrt(n) * np.sqrt(n - 2 + np.square(t_value_1)))
算法
实现的步骤如下:
-
计算该数据集的平均值。
-
计算该数据集的标准差。
-
为实现 Grubbs 测试公式,通过从数据集中减去其平均值得到分子的值。
-
将分子的值除以标准差,以得到计算出的分数。
-
计算相同值的关键分数。
-
如果关键值大于计算值,则数据集中没有异常值,否则存在异常值。
示例
import numpy as np
import scipy.stats as stats
## define data
x = np.array([12,13,14,19,21,23])
y = np.array([12,13,14,19,21,23,45])
## 执行 Grubbs 测试
def grubbs_test(x):
n = len(x)
mean_x = np.mean(x)
sd_x = np.std(x)
numerator = max(abs(x-mean_x))
g_calculated = numerator/sd_x
print("Grubbs 计算值:",g_calculated)
t_value_1 = stats.t.ppf(1 - 0.05 / (2 * n), n - 2)
g_critical = ((n - 1) * np.sqrt(np.square(t_value_1))) / (np.sqrt(n) * np.sqrt(n - 2 + np.square(t_value_1)))
print("Grubbs 关键值:",g_critical)
if g_critical > g_calculated:
print("从 Grubbs 测试中可以看出,计算值小于关键值。接受零假设,得出结论:没有异常值\n")
else:
print("从 Grubbs 测试中可以看出,计算值大于关键值。拒绝零假设,得出结论:存在异常值\n")
grubbs_test(x)
grubbs_test(y)
输出
Grubbs计算值:1.4274928542926593
Grubbs临界值:1.887145117792422
从Grubbs检验中我们可以看到计算值小于关键值。接受零假设并得出结论:没有异常值。
Grubbs计算值:2.2765147221587774
Grubbs临界值:2.019968507680656
从Grubbs检验中我们发现计算值超过了关键值。拒绝零假设并得出结论:有异常值。
Grubb检验的结果表明,数组x没有任何异常值,但y有一个异常值。
结论
本文介绍了在Python中如何使用异常值和Grubbs测试。下面总结一下本文的几个要点。
-
异常值是超出四分位范围的记录。
-
异常值位于数据集的正常分布之外。
-
我们可以使用Grubbs假设统计测试来检测异常值。
-
我们可以使用outlier_utils库中提供的内置方法来执行Grubbs测试。
-
双侧Grubbs测试会检测和删除左右两侧的异常值。
-
然而单侧Grubbs测试只会检测一个方向上的异常值。