用Python实现统计假设测试
假设检验是对人口样本的假设进行分析。换句话说,它涉及检查一个假设是否应该被接受。
假设检验改善了包括商业在内的不同部门的决策。今天,由于全球范围内产生了大量的数据,各组织都依赖假设检验。
前提条件
为了跟上进度,读者应该有一些Python编程的基本知识。他们还应该了解如何使用[Pandas]和[Numpy]进行数据分析。
目标
在本教程结束时,读者应该能够。
- 了解统计假设检验。
- 使用Python和一个新的数据集进行t检验、卡方检验和方差分析。
- 区分两种类型的无效假设错误。
- 解释无效假设的置信度。
- 使用Pandas函数进行数据分析,以及
- 确定应用t检验、卡方检验和方差检验的最佳领域。
了解假设检验
假设检验的两种类型是无效假设和备用假设。
空白假设是关于一个事件的初始假设(也被称为基本事实)。
替代假设是反驳初始假设的假设。
考虑这样一种情况:一位七十岁的妇女的肚子上有一个明显的凸起。医务人员可能会假设这个凸起是纤维瘤。
在这种情况下,我们的初始结论(或称无效假设)是她有一个纤维瘤,而我们的另一个假设是她没有纤维瘤。
为了进行假设检验,我们将无效假设(初始假设)称为H0假设,而备用假设(反假设)称为H1假设。
后续行动是收集可用的数据样本以支持无效假设。
我们应该收集与假设有关的数据,并对其进行分析,以决定H0是否可以被接受或拒绝。
在这样做的同时,有可能会发生以下事件。
-
基础事实(H0)是真的,所以H0被接受。
-
地面真相(H0)不是真的,所以H0被拒绝,H1被接受。
以上两种情况是希望的可能性。要么我们的无效假设是正确的并被采纳,要么我们的无效假设是错误的并被拒绝。
其余的可能性概述如下。
-
空白假设(H0)是真的,但我们拒绝了它。
-
空白假设(H0)不是真的,但我们没有拒绝它。
这些情况是不可取的,因为我们没有认识到正确的假说。
[第一类错误]发生在我们拒绝无效假设时,即使它是真的。
[第二类错误]涉及接受无效假设,尽管它是错误的。
第一类和第二类错误的严重程度取决于手头的任务。因此,数据分析员应该确定可能对结果产生负面影响的错误。
基于上面的例子,由于涉及到巨大的风险,所以必须要确定。例如,可以认为病人没有子宫肌瘤,而在现实生活中她却受到影响。更安全的结论是,在这种情况下,犯第一类错误的后果比犯第二类错误要严重得多。
在做假设时,使用P值来确定是接受还是否定无效假设是至关重要的。
无效假设的置信度
p值解释了基于无效假设的假设为真的可能性。它是概率值的一个缩写。
从技术上讲,我们接受或拒绝我们的无效假设的唯一方法是确定我们的p值之后。
我们的p值越小,相信我们的无效假设就越微妙。
为了计算我们的P值,对最初的假设应该有一定的显著性。
然而,p值通常在0和1的范围内。在大多数情况下,为了避免偏差,在实验前将阈值设定为0.05。
我们也可以有一个大于0.05的p值,例如0.1,p值的大小,取决于手头的任务,以及我们对无效假设的信心有多大。
α水平使我们能够确定是否考虑接受或拒绝无效假设。它也指的是如果基本事实(H0)为真,做出错误选择的概率。
阿尔法水平由以下公式确定。
alpha = 1 - confidence level
我们对无效假设的信心水平是以百分比来衡量的,有100%的信心是说这个陈述是一个事实,但是一旦信心水平跌出100,就意味着对它有一定程度的怀疑,这时就需要对它进行假设检验。
如果从我们的数据中看到的confidence level 是95%,那么alpha 将是0.05。
alpha = 1 - 0.95
正确建立阿尔法水平是很重要的,以避免有偏见的决定,特别是当我们否定无效假设的时候。标准或首选水平是5%。
假设检验的统计技术
有三种流行的假设检验方法。
它们是
- 智方检验
- T检验
- 方差分析检验
卡方检验
当需要分析数据集中的两个分类元素时,可以采用卡方检验。它的重点是这两个分类变量之间的关系。例如,比较疟疾药物A和疟疾药物B的后效应。
卡方检验是在检查观察到的频率与预期结果的分歧程度时使用的一种工具。
在卡方检验中,当两个变量A和B不存在因果关系或它们之间没有关系时,我们承认无效假设。
如果变量A依赖于变量B,或者反之亦然,我们就称之为另一个假设。
卡方检验的计算公式如下所示。
请看下面的例子。
一位数学老师为一个班级的20名学生进行了一次测试。他预计有5人得了好分数,7人得了一般分数,8人不合格。最终,当结果出来时,5人不及格,6人得了平均分,而9人得了好分数。
我们可以用卡方检验来分析这个班的成绩。
| 良好 | 平均分 | 不及格 | 总分 | |
|---|---|---|---|---|
| 观察到的 | 9 | 6 | 5 | 20 |
| 预期的 | 5 | 7 | 8 | 20 |
从上表来看,学生分为三类,从预期的到最终记录的都有。主要类别是:good ,average ,和fail 。
让我们用字母来表示预期值和观察值,以使它们更容易理解。
让
-
观察到的好处是
A,预期的好处是a。 -
观察到的平均数是
B,预期的平均数是b。 -
观察到的失败是
C,预期的失败是c。
然后我们找出预期值和观察值之间的差异,如下图所示。
对于巨大的数据集,数学计算不能用手来完成。下一节将讨论Python中的卡方检验的实现。
用Python实现的Chi-square检验
我们需要导入pandas,numpy,scipy 和matplotlib ,如下图所示。
import numpy as np
import pandas as pd
import scipy.stats as stats
import matplotlib.pyplot as plt
import statsmodels.api as sm
from scipy.stats import f_oneway
from scipy.stats import chi2_contingency
from statsmodels.formula.api import ols
import warnings
warnings.filterwarnings( "ignore" )
导入的库是用于任何数据分析项目的最重要的库。
f_oneway 和 库在实现单因素方差分析和卡方检验时分别使用。chi2_contigency
在本教程中,我们将使用流行的Iris数据集。
下一个阶段是将数据加载到笔记本中。
在将数据集读入笔记本时,重要的是为其添加列名,以便更好地理解我们正在处理的数据。因此,我们继续检查前五个,以确认我们的格式化工作。
df = pd.read_csv("/content/drive/MyDrive/IRIS.csv")
df.columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species']
df.head()
让我们运行df.sample() ,从我们的数据框架中随机抽取样本进行可视化。
df.sample(10)
始终检查缺失值,以避免错误,并确保今后有一致性。
df.isnull().sum()
sepal_length 0
sepal_width 0
petal_length 0
petal_width 0
species 0
dtype: int64
确认目标类中的类别。
print(df["species"].unique())
array(['Iris-setosa', 'Iris-versicolor', 'Iris-virginica'], dtype=object)
我们现在可以确定有3类物种,并且没有缺失值。
让我们继续进行数据处理。
让我们使用petal_width ,为我们的卡方检验比较物种。
第一招是检查petal_width 的摘要。然后我们利用这些信息将其转化为一个分类变量。
print(df.petal_width.describe())
输出。
count 150.000000
mean 1.198667
std 0.763161
min 0.100000
25% 0.300000
50% 1.300000
75% 1.800000
max 2.500000
Name: petal_width, dtype: float64
卡方检验有助于确定在一个或多个类别中观察到的频率和正常频率之间是否存在明显的差异。
petal_width 的值必须用50%的百分位数改变为零和一的类别。
在计算百分位数时,有两个条件必须满足。
-
数据必须按升序排列。
-
如果指数不是整数,则必须向上舍入。
print(np.percentile(df.petal_width, 50))
输出。
1.3
四分位数是另一个与百分位数有关的术语。
实现一个函数来创建新的花瓣宽度到数据框架中,并计算出百分位数。
def petal_cat(df):
if df['petal_width'] <= 1.3:
return 0
elif df['petal_width'] > 1.3:
return 1
else:
return 'Indifferent'
df['petal_width_new'] = df.apply(petal_cat, axis=1)
species 类的数据格式必须转化为0、1和2,这是一种机器可读的格式,以方便测试。
因此,通过[标签编码],将给类中的每个类别提供一个数值表示。
def species_cat(df):
if df["species"] == "Iris-virginica":
return 0
elif df["species"] == "Iris-versicolor":
return 1
else:
return 2
df["species"] = df.apply(species_cat, axis=1)
通过随机打印5个样本,确认该函数完美工作。
print(df.sample(5))
除了我们需要的两列,即species 和petal_width_new 列之外,丢掉所有其他列。
df_new = df.drop(columns=["sepal_width", "sepal_length", "petal_length", "petal_width"])
print(df_new.head())
让我们利用我们导入项目中的chic2_contigency 库。
stat, p, dof, expected = chi2_contingency(df_new)
print("The degree of freedom is: ", dof)
输出。
The degree of freedom is: 149
检验统计中的三个输出将包括自由度、P值和预期值。
检验统计量是卡方检验中显著性的一个特征。它有助于确定在同意无效假设为真的前提下,结果可能有多不常见。
我们所能接触到的特征或变量的数量根据自由度的不同而不同。
置信概率与前面解释的置信度相似,它是关于我们的假设有多接近于事实,它是我们对无效假设的置信度,因此它被设定为95%。
prob = 0.95
alpha = 1.0 - prob
print('The alpha/significance level = %.3f' % alpha)
print('The p-value is = %.2f' % p)
if p <= alpha:
print('Reject the Null Hypothesis (Reject H0)')
else:
print('Accept the Null Hypothesis (Do not reject H0)')
输出。
The alpha/significance level = 0.050
The p-value is = 0.10
Accept the Null Hypothesis (Do not reject H0)
在上面的结果中,P值超过了设定为0.05的α值。我们将承认无效假设,并否定另一个假设。
这意味着花瓣宽度和花的种类不相互依赖,也就是说,它们之间没有联系。
用Python实现T检验
当我们计划评估两组样本的平均值之间的差异时,可以使用T检验。与卡方检验不同,T检验是用于连续变量的。
T检验有三种基本类型。
- 单一样本T检验:它检查人口是否与样本的平均值不同。
其数学表达式为。
其中。
观察到的群体平均数是a 。
假定的群体平均数是B 。
数据组的标准差是X ,并且
该组的观察值的数量是N 。
- 双样本t检验:它检查和并列两个互不相干的组的平均值,并比较群体的平均值,以确定是否存在巨大差异。
其数学表达式为:
其中,数据样本A的平均值为Ma ,数据样本B的平均值为Mb ,样本A的大小为Na ,样本B的大小为Nb ,而方差为v 。
- 成对的t检验:它用于检查和比较一个组中不同样本的平均值。
在数学上,它可以用以下方式解决。
其中,成对观测值的样本平均数之差为D ,假定平均数之差为m ,标准差为xd ,组内观测值的数量为V 。
进行单样本T检验
为了进行单样本T检验,我们将把花瓣宽度这一栏重新分配到一个数据框架中,以便于使用。
df_ = df.petal_width
这里也使用了pandas dataframesample() 函数,以便对我们的数据框架进行随机查看。
print(df_.sample(5))
103 1.8
131 2.0
114 2.4
35 0.2
38 0.2
Name: petal_width, dtype: float64
应用数据框架的单样本t检验功能。
print(stats.ttest_1samp(a=df_, popmean=1.199))
Ttest_1sampResult(statistic=-0.0053494404016899925, pvalue=0.9957389399651244)
-
H0:花瓣宽度的平均值是1.199
-
H1:花瓣宽度的平均值不是1.199
分析单样本t检验,可以发现假设的平均数是否与组的平均数相似或不同。从上面的例子中,我们选择了petal_width 作为群体样本来进行检验。
从测试结果来看,由于p值超过了设定为0.05的α水平,我们承认无效假设,因为我们没有足够的证据来证明。
此外,如果你检查,p值非常接近1.0,这意味着petal_width 的平均值很可能是1.199。
证据太强大了,几乎是准确无误的拒绝。
进行双样本T检验
双样本T检验的标准是,我们所抽查的两个独立组的方差相等。只有[当高方差与低方差的比例小于4:1]时,我们才能知道方差是相同的[。]
检查方差只是为了确保两个种群可能是分散的或正常分布的,这将有助于防止偏见。
因此,无效假设将假设既然两组是正态分布,它们很可能应该有相同的平均值。
class1 = df.petal_width
class2 = df.sepal_length
找到每组的方差。
print(np.var(class1), np.var(class2))
0.5785315555555559 0.6811222222222222
进行比率检查以了解它是否满足双样本t检验的条件。对方差进行比率检查是为了确保两个种群都是正态分布。
ratio_check = np.var(class2)/np.var(class1)
print(ratio_check)
1.1773294225379805
显然,比率小于4:1,因此方差被认为是相等的。
在我们的类上应用双样本t检验功能。
print(stats.ttest_ind(a=class1, b=class2, equal_var=True))
Ttest_indResult(statistic=-50.51520141387464, pvalue=3.7974378831185126e-148)
评估这一点。
-
H0:两个样本(花瓣_宽度和萼片_长度)的平均值相等。
-
H1:两个样本(花瓣_宽度和萼片_长度)的平均值不相等。
我们的p-value (p=3.7974378831185126e-148)远远小于alpha = 0.05。
然而,解释任何形式的t检验在很大程度上取决于p-value ,上面的结果说明两个样本(petal_width 和sepal_length )的平均值是不同的。
因此,我们将否定无效假设,即两个样本的平均值是相同的,因为它们的变异被假定为相等。
没有足够的证据可以证明这两个种群的平均数是相同的。然而,H1(另一个假设)是真的。
用Python实现方差分析
ANOVA是由 "方差分析 "创造的一个词。它是一个统计学概念,显示两个以上独立组的平均值之间的差异,使用对这些组的样本进行方差分析。
它用于用一个测试来检查三个或更多样本之间的对比。特别是当分类类有两个以上的类别时。
为什么是方差分析?
通过方差分析,你可以发现独立特征的平均值之间的明显差异。在对这些差异有了更清楚的认识后,你可以了解它们中的每一个与因变量的联系。你可以看到这种关系的影响因素是什么。
一个通用的例子可以是这样的。
某公司的增长部门发现某种特定产品的销售量增加了。在最近一段时间,他们已经尝试了几个广告渠道,所以很难说哪一个产生的销售增长是最多的。
他们做了网上海报、广告牌、电视广告、口耳相传和赞助。通过对这几个广告渠道进行方差分析测试,他们将能够更好地了解在所有的渠道中,哪一个最有效(自变量),它与销售增长的关系,这是因变量。
在方差分析测试中,假设是。
-
H0:当所有样本的平均值相同时。
-
H1:当一个或多个样本有很大的不同。
单向方差分析测试
这是用于通过比较一个或两个变量的平均值来确定一个变量对其他变量的影响。使用相同的花瓣例子,我们将使用单因素方差检验来检查petal width ,是否对petal length 和sepal length 有影响。
class1 = df.petal_width
class2 = df.sepal_length
class3 = df.petal_length
print(f_oneway(class1, class2, class3))
F_onewayResult(statistic=555.8702565323317, pvalue=5.738282463819433e-122)
由于我们的p-value (5.738282463819433e-122)远远小于alpha (0.05),我们否定了无效假设,因为不存在足以接受的证据。
这意味着样本的平均数是非常不同的。意味着我们的H1(另一个假设)是真的。
双向方差分析测试
当我们处理三个或更多的变量,试图将它们的平均值相互比较时,就会用到这个方法。
petal = df.petal_width
sepal = df.sepal_length
species = df.species
model = ols('species ~ C(petal) + C(sepal) + C(petal):C(sepal)', data=df).fit()
print(sm.stats.anova_lm(model, typ=2))
petal_width 的p值大于0.05,这增加了我们的无效假设被接受的概率。
sepal_length 的p值小于0.05,这增加了我们拒绝无效假设的概率。
同样,petal_width 和sepal_length 的p值都低于0.05,我们就会否定无效假设,因为很明显一个或多个样本的平均值相差很大。这就等于说,所有数据样本的平均值是不相等的。
总结
在本教程的最后,我相信读者应该更好地掌握了统计假设检验的概念以及如何用Python实现它。
要进行假设检验,第一步是形成一个初始假设并将其标记为H0。下一步将是收集所有可用于支持我们假设的数据样本,收集所有的碎片证据并分析数据,然后做出决定是接受H0还是拒绝它。
当我们拒绝基本事实但它是真实的,我们就会遇到第一类错误。反过来说,当我们不拒绝基础事实,尽管它不是真的时候,我们就会遇到第二类错误。