基于显著性检验分析两个样本分布相似度及Python实现—— t检验、拟合优度检验、KS检验、Wilcoxon符号秩检验、H检验、Mann-Whitney秩检验、P值的意义、API汇总

显著性检验


抽样实验会产生抽样误差,对实验资料进行比较分析时,不能仅凭两个结果(平均数或率)的不同就作出结论,而是要进行统计学分析,鉴别出两者差异是抽样误差引起的,还是由特定的实验处理引起的。

显著性检验(significance test)就是事先对总体(随机变量)的参数或总体分布形式做出一个假设,然后利用样本信息来判断这个假设(备择假设)是否合理,即判断总体的真实情况与原假设是否有显著性差异。或者说,显著性检验要判断样本与我们对总体所做的假设之间的差异是纯属机会变异,还是由我们所做的假设与总体真实情况之间不一致所引起的。 显著性检验是针对我们对总体所做的假设做检验,其原理就是“小概率事件实际不可能性原理”来接受或否定假设。

下文简述各种差异性检验思想(两组样本差异),同时结合scipy.stats文档中的描述进行python实践。

参数检验


在下文中,我们给出了两个样本,它们可以来自相同或不同的分布,我们想检验这些样本是否具有相同的统计特性:

比较均值


t检验

t检验适用于:正态分布、方差具有齐性的两组间小样本比较;对于大样本不满足正态分布的数据而言t-检验还是相当精确有效的手段。
检验:两个平均数的差异是否显著。

均值相同的两组样本测试:

from scipy import stats

rvs1 = stats.norm.rvs(loc=5, scale=10, size=500)
rvs2 = stats.norm.rvs(loc=5, scale=10, size=500)
stats.ttest_ind(rvs1, rvs2)

#Ttest_indResult(statistic=1.3361991573958927, pvalue=0.18178876551839254)

均值不同的两组样本测试:

rvs3 = stats.norm.rvs(loc=8, scale=10, size=500)
stats.ttest_ind(rvs1, rvs3)

#Ttest_indResult(statistic=-4.5208184543856769, pvalue=6.8983225888305648e-06)

note:如果我们观察来自相同或不同人群的两个独立样本,例如男孩和女孩或两个种族的考试分数,我们可以使用该测试。该测试测量样本之间的平均(预期)值是否显着不同。如果我们观察到大的p值,例如大于0.05或0.1,那么我们不能拒绝相同平均分数的零假设。如果p值小于阈值,例如1%,5%或10%,那么我们拒绝相等平均值的零假设。

# In[t检验]
import numpy as np
from scipy import stats
np.random.seed(12345678)

#用相同的方法测试样品:
rvs1 = stats.norm.rvs(loc=5,scale=10,size=500)
rvs2 = stats.norm.rvs(loc=5,scale=10,size=500)
stats.ttest_ind(rvs1,rvs2)
#Ttest_indResult(statistic=0.26833823296238857, pvalue=0.78849443369565098)
stats.ttest_ind(rvs1,rvs2, equal_var = False)
# 参数equal_var = False表示:Welch's t-test:不考虑方差相等的t'检验
# 应用条件与t检验大致相同,但t′检验用于两组间方差不齐时,t′检验的计算公式实际上是方差不齐时t检验的校正公式。
#Ttest_indResult(statistic=0.26833823296238857, pvalue=0.78849452749501059)

#ttest_ind 低估了不等方差的p:
rvs3 = stats.norm.rvs(loc=5, scale=20, size=500)
stats.ttest_ind(rvs1, rvs3)
#Ttest_indResult(statistic=-0.46580283298287956, pvalue=0.64145827413435608)
stats.ttest_ind(rvs1, rvs3, equal_var = False)
#Ttest_indResult(statistic=-0.46580283298287956, pvalue=0.64149646246568737)

#当样本数量n1!=n2时,等方差t-statistic不再等于不等方差t-statistic:
rvs4 = stats.norm.rvs(loc=5, scale=20, size=100)
stats.ttest_ind(rvs1, rvs4)
#Ttest_indResult(statistic=-0.99882539442782847, pvalue=0.31828327091038783)
stats.ttest_ind(rvs1, rvs4, equal_var = False)
#Ttest_indResult(statistic=-0.69712570584654354, pvalue=0.48716927725401871)

#使用不同均值,方差和n进行T检验:
rvs5 = stats.norm.rvs(loc=8, scale=20, size=100)
stats.ttest_ind(rvs1, rvs5)
#Ttest_indResult(statistic=-1.4679669854490669, pvalue=0.14263895620529113)
stats.ttest_ind(rvs1, rvs5, equal_var = False)
#Ttest_indResult(statistic=-0.94365973617133081, pvalue=0.34744170334794089)

拟合优度检验


Kolmogorov-Smirnov test (KS检验)

适用:连续分布,拟合优度
思想:依据总体分布状况,计算出分类变量中各类别的期望频数,与分布的观察频数进行对比,判断期望频数与观察频数是否有显著差异,从而达到从分类变量进行分析的目的。

对于两个样本都来自同一分布的例子,

stats.ks_2samp(rvs1, rvs2)
#Ks_2sampResult(statistic=0.025999999999999995, pvalue=0.9954119517306488)

pvalue=0.9954119517306488,我们不能拒绝零假设,因为pvalue很高。

不同均值的两个分布为例,

 stats.ks_2samp(rvs1, rvs3)
 #Ks_2sampResult(statistic=0.11399999999999999, pvalue=0.002713210366128314)

pvalue低于1%,,拒绝零假设。

非参数检验


以上的参数检验都基于共同的两个假设:正态性假定和方差齐性假定 。但是,我们在实际工作中,不可能总是遇到满足这两个假定的统计数据,这时候,如果强行采用参数检验就会造成错误。此时,可以采用基于秩和的非参数检验,如Kruskal-Wallis检验。

Wilcoxon符号秩检验(t检验的非参数版本)


点击Wilcoxon符号秩检验详细了解。
非参数原假设(零假设):检验了两个相关配对样本x,y来自同一分布的。
非参数检验具有无需对总体分布作假定的优点,而就成对观察值作的参数方式的T检验,必须假定有关的差别总体服从正态分布。
思想:

  • 检验x-y的分布是否关于零对称。它是两样本t检验的非参数版本。

使用条件:

  • 由于正态近似用于计算,因此使用的样本应该很大。一般是要求n> 20。
  • 成对检验,数据是配对的。(x,y长度一致)。

scipy.stats函数:wilcoxon(x[, y, zero_method, correction])

from scipy import stats
x = [1, 3, 5, 7, 9]
y = [2, 4, 6, 8, 10]
stats.wilcoxon(x,y)
#  UserWarning: Warning: sample size too small for normal approximation.
#  warnings.warn("Warning: sample size too small for normal approximation.")
#WilcoxonResult(statistic=0.0, pvalue=0.025347318677468252)

规则是要求n> 20,样本过少会告警。

Kruskal-Wallis H检验(它是ANOVA的非参数版本)


点击Kruskal-Wallis H检验详细了解。
思想:假设两个分布的样本中位数相等,用于检验样本是否来源于相同的分布。它用于比较两个或多个相同或不同样本大小的独立样本。它扩展了Mann-Whitney U检验,该检验仅用于比较两组。Kruskal-Wallis检验的参数等价物是单因素方差分析 (ANOVA)。

使用条件:

  • 具有卡方分布的假设,每组中的样本数量不能太小。(n>5)
  • 比较没有配对的两个独立样本,样本可具有不同的大小。(x,y长度可以不一致)

scipy.stats函数:kruskal(*args, **kwargs)

from scipy import stats
x = [1, 3, 5, 7, 9]
y = [2, 4, 6, 8, 10]
stats.kruskal(x, y)
#KruskalResult(statistic=0.27272727272727337, pvalue=0.60150813444058948)

Mann-Whitney秩检验


点击Mann-Whitney秩检验,U检验详细了解。
它假设两个样本分别来自除了总体均值以外完全相同的两个总体,目的是检验这两个总体的均值是否有显著的差别。
思想:

  • 首先,混合两组数据,对所有数据排序。
  • 按照数值大小给定一个值叫做秩。最小的值秩为1,最大的为N(假定两个样本总共有N个观察值)。 如果有相同的值,就得到相同的秩。相同的值的秩是他们的秩的平均值。
  • 如果两组的秩的和差距比较大,就会得出较小的p值,认为这两组间有显著差异。

使用条件:

  • 比较没有配对的两个独立样本,样本可具有不同的大小。(x,y长度可以不一致)
  • 仅在每个样本中的观察次数> 20且您有2个独立的等级样本时使用。

scipy函数:mannwhitneyu(x, y[, use_continuity, alternative])

from scipy import stats
x = [1, 3, 5, 7, 9]
y = [2, 4, 6, 8, 10]
stats.mannwhitneyu(x, y)
#MannwhitneyuResult(statistic=10.0, pvalue=0.33805165701157347)

P值的意义


不得不提的P值
P 值(pvalue),就是当原假设为真时所得到的样本观察结果或更极端结果出现的概率。如果 P 值很小,说明这种情况的发生的概率很小,而如果出现了,根据小概率原理,我们就有理由拒绝原假设,P 值越小,我们拒绝原假设的理由越充分。
总之,P 值越小,表明结果越显著。但是检验的结果究竟是 “显著的”、“中度显著的” 还是 “高度显著的” 需要我们自己根据 P 值的大小和实际问题来解决。

Scipy.stats中关于两样本差异假设检验的API汇总


API汇总

  • T检验: ttest_ind(a, b[, axis, equal_var, nan_policy])

  • Kolmogorov-Smirnov检验拟合优度: kstest(rvs, cdf[, args, N, alternative, mode])

  • Mann-Whitney秩检验,U检验: mannwhitneyu(x, y[, use_continuity, alternative])

  • Wilcoxon符号秩检验: wilcoxon(x[, y, zero_method, correction]) 执行

  • Kruskal-Wallis H检验: kruskal(*args, **kwargs)

  • 19
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
拟合优度检验和F检验是统计学中常用的两种假设检验方法,可以用于判断模型的拟合优度和变量之间的相关性。下面是用Python实现拟合优度检验和F检验的代码示例: 拟合优度检验: ```python from scipy.stats import chi2 # 计算拟合优度检验的统计量和p def goodness_of_fit(observed, expected): n = len(observed) k = len(expected) df = n - k chi2_statistic = sum((observed - expected) ** 2 / expected) p_value = 1 - chi2.cdf(chi2_statistic, df) return chi2_statistic, p_value, df # 示例 observed = [10, 20, 30, 40] expected = [15, 15, 30, 40] chi2_statistic, p_value, df = goodness_of_fit(observed, expected) print("拟合优度检验的统计量为:", chi2_statistic) print("拟合优度检验的p为:", p_value) ``` F检验: ```python import numpy as np from scipy.stats import f # 计算F检验的统计量和p def f_test(x, y): n = len(x) k = 2 df1 = k - 1 df2 = n - k x_mean = np.mean(x) y_mean = np.mean(y) x_sum_sq = sum((x - x_mean) ** 2) y_sum_sq = sum((y - y_mean) ** 2) ssr = (x_mean - y_mean) ** 2 sse = x_sum_sq + y_sum_sq - ssr f_statistic = (ssr / df1) / (sse / df2) p_value = 1 - f.cdf(f_statistic, df1, df2) return f_statistic, p_value, df1, df2 # 示例 x = [10, 20, 30, 40] y = [15, 25, 35, 45] f_statistic, p_value, df1, df2 = f_test(x, y) print("F检验的统计量为:", f_statistic) print("F检验的p为:", p_value) ``` 以上是两种方法的Python实现代码,可以根据实际需要进行调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值