SciPy 统计显著性检验

什么是统计显著性检验?

在统计学中,统计显著性意味着产生的结果背后有一个原因,它不是随机产生的,也不是偶然产生的。

SciPy 为我们提供了一个名为 scipy.stats 的模块,该模块具有执行统计显著性测试的功能。

以下是一些在执行此类测试时非常重要的技术和关键字:

统计假设

统计假设(Statistics Hypothesis)是关于一个或多个随机变量的未知分布的假设。随机变量的分布形式已知,而仅涉及分布中的一个或几个未知参数的统计假设,称为参数假设。检验统计假设的过程称为假设检验,判别参数假设的检验称为参数检验。

零假设

零假设(Null Hypothesis),统计学术语,又称原假设,指进行统计检验时预先建立的假设。零假设成立时,有关统计量应服从已知的某种概率分布。

当统计量的计算值落入否定域时,可知发生了小概率事件,应否定原假设。

备择假设

备择假设(Alternative Hypothesis),又称为对立假设、备选假设,是统计学的基本概念之一,其包含关于总体分布的一切使原假设不成立的命题。

备择假设可以替代零假设。

例子:

对于学生的评估,我们将采取以下措施:

“学生比平均水平差” - 作为无效假设,并且:

“学生优于平均水平” - 作为替代假设。

单尾检验

单尾检验(One-tailed test),也称为单侧检验,又称单边检验,在假设检验中,用检验统计量的密度曲线和二轴所围成面积中的单侧尾部面积来构造临界区域进行检验的方法称为单边检验。

当我们的假设仅测试值的一侧时,它被称为 "单尾测试" 。

例子:

对于零假设:“平均值等于k” 我们可以有替代假设:

“平均值小于k”、 或:

“平均值大于k”

双尾检验

双尾检验(Two-tailed test),也称双侧检验、双边检验。在假设检验中,用检验统计量的密度曲线和x轴所围成的面积的左右两边的尾部面积来构造临界区域进行检验的方法。

当我们的假设测试值的两边时。

例子:

对于零假设:“平均值等于k” 我们可以有替代假设:

“平均值不等于k”

在这种情况下,平均值小于或大于 k,并且两侧都要检查。

阿尔法值

阿尔法值(Alpha)是显著性水平。

显著性水平是估计总体参数落在某一区间内,可能犯错误的概率,用 α 表示。

例子:

要拒绝零假设,数据必须接近极端值。

通常取0.01、0.05或0.1。

P 值

P 值表明数据实际接近极端的程度。

比较 P 值和阿尔法值(alpha)来确定统计显著性水平。

如果 p <= alpha,我们拒绝原假设并说数据具有统计显著性,否则我们接受原假设。


T-检验

T 检验(T-test)用于确定两个变量的均值之间是否存在显著差异,并判断它们是否属于同一分布。

这是一个双尾测试。

函数 ttest_ind() 取两个大小相同的样本,生成一个t统计量和p值的元组。

实例

查找给定值 v1 和 v2 是否来自同一分布:

  1. import numpy as np
  2. from scipy.stats import ttest_ind
  3. v1 = np.random.normal(size=100)
  4. v2 = np.random.normal(size=100)
  5. res = ttest_ind(v1, v2)
  6. print(res)
结果:
  1. Ttest_indResult(statistic=0.40833510339674095, pvalue=0.68346891833752133)

如果只想返回 p 值,请使用 pvalue 属性:

实例
  1. import numpy as np
  2. from scipy.stats import ttest_ind
  3. v1 = np.random.normal(size=100)
  4. v2 = np.random.normal(size=100)
  5. res = ttest_ind(v1, v2).pvalue
  6. print(res)
结果:
  1. 0.68346891833752133

KS-检验

KS 检验用于检查给定值是否符合分布。

该函数接收两个参数:测试的值和 CDF。

CDF 是累积分布函数(Cumulative Distribution Function),又叫分布函数。可以是字符串,也可以是返回概率的可调用函数。

它可以用作单尾或双尾测试。

默认情况下它是双尾测试。 我们可以将参数替代作为两侧、小于或大于其中之一的字符串传递。

实例

确定给定值是否符合正态分布:

  1. import numpy as np
  2. from scipy.stats import kstest
  3. v = np.random.normal(size=100)
  4. res = kstest(v, 'norm')
  5. print(res)
结果:
  1. KstestResult(statistic=0.047798701221956841, pvalue=0.97630967161777515)

数据统计说明

使用 describe() 函数可以查看数组的信息,包含以下值:

  • nobs - 观测次数
  • minmax - 最小值和最大值
  • mean - 数学平均数
  • variance - 方差
  • skewness - 偏度
  • kurtosis - 峰度
实例

显示数组中值的统计描述:

  1. import numpy as np
  2. from scipy.stats import describe
  3. v = np.random.normal(size=100)
  4. res = describe(v)
  5. print(res)
结果:
  1. DescribeResult(
  2. nobs=100,
  3. minmax=(-2.0991855456740121, 2.1304142707414964),
  4. mean=0.11503747689121079,
  5. variance=0.99418092655064605,
  6. skewness=0.013953400984243667,
  7. kurtosis=-0.671060517912661
  8. )

正态性检验(偏度和峰度)

正态性检验是利用观测数据判断总体是否服从正态分布的检验,它是统计判决中重要的一种特殊的拟合优度假设检验。

正态性检验基于偏度和峰度。

normaltest() 函数返回零假设的 p 值:

偏度:

数据对称性的度量。

对于正态分布,它是 0。

如果为负,则表示数据向左倾斜。

如果是正数,则意味着数据是正确倾斜的。

峰度:

衡量数据是重尾还是轻尾正态分布的度量。

正峰度意味着重尾。

负峰度意味着轻尾。

实例

查找数组中的峰度和偏度值:

  1. import numpy as np
  2. from scipy.stats import skew, kurtosis
  3. v = np.random.normal(size=100)
  4. print(skew(v))
  5. print(kurtosis(v))
结果:
  1. 0.11168446328610283
  2. -0.1879320563260931
实例

查找数据是否来自正态分布:

  1. import numpy as np
  2. from scipy.stats import normaltest
  3. v = np.random.normal(size=100)
  4. print(normaltest(v))
结果:
  1. NormaltestResult(statistic=4.4783745697002848, pvalue=0.10654505998635538)