如何在 Python 中执行 Grubbs 检验
简介
Grubbs 检验是一种统计假设检验方法,用于检测数据集中的异常值。异常值是指分散数据分布的观察值,也称为异常。包含异常值的数据集往往比服从正态/高斯分布的数据更容易过拟合。因此,在进行机器学习建模之前,必须处理异常值。在处理之前,我们必须检测并定位数据集中存在的异常值。最流行的异常值检测技术有 QQ 图、四分位距和 Grubbs 统计检验。但是,本文将仅讨论 Grubbs 检验来检测异常值。您将学习:什么是 Grubbs 检验以及如何在 Python 中实现它。
什么是异常值?
异常值是指数值上与其他数据值存在较大差异的数据观测值。这些值存在于正态分布数据的范围之外。数据集必须包含 67% 的记录在第一个标准差内,95% 的数据在第二个标准差内,以及 99.7% 的点在均值的第三个标准差内,才能达到正态分布。换句话说,数据点应该出现在第一和第三四分位数范围内。我们将第一四分位数以下和第三四分位数以上的记录视为异常值或异常。
Grubbs 统计假设检验
Grubbs 检验与任何其他统计假设检验一样,也批准或拒绝零假设 (H0) 或备择假设 (H1)。Grubbs 检验是一种检测数据集中异常值的检验。
我们可以通过两种方式执行 Grubbs 检验:对于具有至少七个变量的单变量数据集或近似正态分布的样本,可以使用**单侧检验**和**双侧检验**。此检验也称为极端学生化偏差检验或最大归一化残差检验。
Grubbs 检验使用以下假设:
零假设 (H0):数据集没有异常值。
备择假设 (H1):数据集正好有一个异常值。
Python 中的 Grubbs 检验
Python 凭借其庞大的库集合,能够应对任何编程挑战。这些库提供了可以直接使用的内置方法,用于执行任何操作、统计检验等等。类似地,Python 中有一个库包含用于执行 Grubbs 检验以检测异常值的方法。但是,我们将探索在 Python 中实现 Grubbs 检验的两种方法:库中的内置函数以及从头开始实现公式。
Outliers 库和 Smirnov_grubbs
首先,让我们使用以下命令安装 outlier_utils 库。
!pip install outlier_utils
现在,让我们创建一个包含异常值的数据集并执行 Grubbs 检验。
双侧 Grubbs 检验
语法
grubbs.test(data, alpha=.05)
参数
data − 数据值的数字向量。
alpha − 检验的显著性水平。
说明
在这种方法中,用户必须使用 outliers 包中的 smirnov_grubbs.test() 函数,并将必要的数据作为输入传递,以便运行 Grubbs 检验。
示例
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() 函数以从提供的数据集中获取最大异常值,以获取单侧 Grubbs 检验。
示例
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 for minimum value is an outlier print(grubbs.min_test(data, alpha=.05)) #perform Grubbs' test for minimum value is an outlier 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]) ## implement Grubbs test 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 Calculated Value:",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 Critical Value:",g_critical) if g_critical > g_calculated: print("We can see from the Grubbs test that the calculated value is less than the crucial value. Recognize the null hypothesis and draw the conclusion that there are no outliers\n") else: print("We see from the Grubbs test that the estimated value exceeds the critical value. Reject the null theory and draw the conclusion that there are outliers\n") grubbs_test(x) grubbs_test(y)
输出
Grubbs Calculated Value: 1.4274928542926593 Grubbs Critical Value: 1.887145117792422 We can see from the Grubbs test that the calculated value is less than the crucial value. Recognize the null hypothesis and draw the conclusion that there are no outliers Grubbs Calculated Value: 2.2765147221587774 Grubbs Critical Value: 2.019968507680656 We see from the Grubbs test that the estimated value exceeds the critical value. Reject the null theory and draw the conclusion that there are outliers
Grubbs 检验的结果表明,数组 x 没有异常值,但 y 有 1 个异常值。
结论
在本文中,我们学习了 Python 中的异常值和 Grubbs 检验。让我们用一些要点总结本文。
异常值是存在于四分位数范围之外的记录。
异常值位于数据集的正态分布之外。
我们可以使用 Grubbs 假设统计检验来检测异常值。
我们可以使用 outlier_utils 库中提供的内置方法来执行 Grubbs 检验。
双侧 Grubbs 检验从左右两侧检测并删除异常值。
但是,单侧 Grubbs 检验将从任一侧检测异常值。