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

本文深入探讨了统计学中的显著性检验方法,包括参数检验和非参数检验,详细讲解了t检验、Kolmogorov-Smirnov检验、Wilcoxon符号秩检验、Kruskal-Wallis H检验和Mann-Whitney U检验的应用场景和使用条件,并通过Python的Scipy.stats库进行了实践演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

显著性检验


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

显著性检验(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)

<think>嗯,用户现在想了解假设检验的类型或组成部分。根据之前的对话,用户已经询问过除了相关性分析、回归分析等之外的其他分析方法,并且现在转向假设检验的具体类型。首先,我需要确认用户的基础知识水平,是否需要从基础开始解释,还是直接列举类型。 用户的上一个问题涉及到统计分析方法大全,其中提到了假设检验作为推断性统计的一部分,包括t检验、卡方检验、ANOVA等。因此,用户可能已经对这些方法有初步了解,现在需要更详细的分类组成部分。 接下来,我需要结合用户提供的引用内容。引用[1]提到了t检验、ANOVA卡方检验Python中的实现,而引用[2]详细说明了假设检验的步骤。用户现在的问题是关于类型或组成部分,所以需要将两者结合起来,既列出不同的检验方法,又可能涉及到假设检验的结构,比如原假设、备择假设等组成部分。 用户可能需要区分假设检验的类型(如参数检验非参数检验)以及具体的检验方法(如t检验、卡方检验等)。此外,组成部分可能包括原假设、备择假设、显著性水平、检验统计量、p、决策规则等。需要确定用户是想了解方法类型,还是假设检验流程的组成部分,或者两者都要。 考虑到用户之前的问题是关于统计分析方法的关系,可能更倾向于类型或方法,但为了全面性,应该同时涵盖类型组成部分。不过用户明确提问的是“类型或组成部分”,所以需要分两部分回答:一是假设检验的类型(不同的检验方法),二是假设检验的组成部分(步骤或结构)。 需要确保回答结构清晰,分点列出,并给出每个类型的适用场景,可能的话,结合之前的引用内容中的步骤,如引用[2]提到的步骤,可以对应到组成部分部分。同时,用户可能需要Python代码示例,但根据当前问题,可能更偏向理论,但之前的回答中有代码示例,所以可以适当添加代码链接或简单提及。 另外,用户提供的引用[1][2]中的信息需要被合理引用,例如在解释假设检验步骤时,引用[2]的步骤可以作为参考。同时,在类型部分,引用[1]提到的t检验、ANOVA、卡方检验可以作为主要例子。 需要检查是否覆盖了常见的假设检验类型,例如参数检验中的z检验、t检验、ANOVA、卡方检验,以及非参数检验中的Mann-Whitney U检验Wilcoxon检验、Kruskal-Wallis检验等。同时,可能还需要提到单样本、双样本、配对样本等不同场景的应用。 在组成部分方面,应包括原假设备择假设的设定、显著性水平α的选择、检验统计量的计算、p的解释、决策规则(拒绝或无法拒绝原假设)以及最终结论的得出。这些都需要分点说明,可能结合引用[2]的步骤。 最后,确保回答符合用户之前的要求:使用中文,行内公式用$...$,独立公式用$$...$$,结构清晰,真实可靠。同时生成相关问题,帮助用户进一步学习。 现在需要组织这些思考点,形成结构化的回答,确保涵盖类型组成部分,并正确引用之前的资料,同时语言简洁明了。</think>### 假设检验的类型与核心组成部分详解 假设检验是统计推断的核心工具,用于通过样本数据判断总体参数的假设是否成立。以下从 **类型分类** **组成部分** 两个维度系统解析,结合应用场景与Python实现示例。 --- #### 一、假设检验的主要类型(方法) 假设检验可分为 **参数检验**(依赖总体分布假设) **非参数检验**(不依赖分布假设)两大类。 ##### 1. **参数检验** 适用于数据符合特定分布(如正态分布)的情况: - **单样本t检验** - **目的**:检验单个样本均是否等于理论 - **公式**:$$ t = \frac{\bar{x} - \mu_0}{s/\sqrt{n}} $$ - **示例**:检验某班级平均分是否为80分 - **Python实现**:`scipy.stats.ttest_1samp` - **双样本t检验** - **独立样本t检验**:比较两组独立样本均 - **公式**:$$ t = \frac{\bar{x}_1 - \bar{x}_2}{\sqrt{\frac{s_1^2}{n_1} + \frac{s_2^2}{n_2}}} $$ - **Python实现**:`scipy.stats.ttest_ind` - **配对样本t检验**:比较同一组样本前后差异(如药物效果) - **Python实现**:`scipy.stats.ttest_rel` - **方差分析(ANOVA)** - **目的**:检验三个及以上组别均差异 - **类型**:单因素/多因素ANOVA - **公式**:$$ F = \frac{\text{组间方差}}{\text{组内方差}} $$ - **Python实现**:`scipy.stats.f_oneway` - **卡方检验** - **拟合优度检验**:判断观测频数是否符合理论分布 - **独立性检验**:判断两分类变量是否独立 - **公式**:$$ \chi^2 = \sum \frac{(O_i - E_i)^2}{E_i} $$ - **Python实现**:`scipy.stats.chisquare`(拟合优度)或 `scipy.stats.chi2_contingency`(独立性) - **Z检验** - **适用场景**:大样本($n \geq 30$)均检验,已知总体方差 - **公式**:$$ Z = \frac{\bar{x} - \mu_0}{\sigma/\sqrt{n}} $$ ##### 2. **非参数检验** 适用于分布未知或数据为等级的情况: - **Mann-Whitney U检验**:比较两组独立样本中位数 - **Python实现**:`scipy.stats.mannwhitneyu` - **Wilcoxon符号检验**:配对样本中位数差异 - **Python实现**:`scipy.stats.wilcoxon` - **Kruskal-Wallis H检验**:多组独立样本差异(非参数版ANOVA) - **Python实现**:`scipy.stats.kruskal` - **Spearman相关**:检验变量间的单调关系 - **Python实现**:`scipy.stats.spearmanr` --- #### 二、假设检验的核心组成部分 假设检验的流程遵循标准化步骤[^2],具体如下: 1. **提出假设** - **原假设($H_0$)**:默认无差异或无效应(如 $\mu_1 = \mu_2$) - **备择假设($H_1$)**:研究者希望证实的假设(如 $\mu_1 \neq \mu_2$) 2. **选择检验方法** - 根据数据类型(连续/分类)、样本数量、分布假设等选择检验类型(如t检验Mann-Whitney U) 3. **确定显著性水平($\alpha$)** - 常用 $\alpha = 0.05$,表示接受5%的误拒原假设风险 4. **计算检验统计量** - 通过样本数据计算统计量(如t、F、$\chi^2$) 5. **确定p** - **p定义**:在原假设成立时,观察到当前或更极端结果的概率 - **决策规则**:若 $p < \alpha$,拒绝 $H_0$;否则不拒绝 6. **结论与解释** - 结合p与实际问题,给出统计学结论(如“两组均存在显著差异”) --- #### 三、方法选择流程图(简化版) ``` 选择检验方法 ├─ 数据类型 │ ├─ 连续型 → 参数检验(正态性检验通过) │ └─ 分类/等级 → 非参数检验 └─ 样本情况 ├─ 单样本 → 单样本t检验 / Wilcoxon符号 ├─ 两独立样本 → 独立t检验 / Mann-Whitney U └─ 多组样本 → ANOVA / Kruskal-Wallis ``` --- #### 四、Python代码示例(独立样本t检验) ```python from scipy import stats # 生成示例数据(两组独立样本) group1 = [28, 30, 25, 33, 29] group2 = [22, 24, 26, 20, 23] # 执行独立样本t检验 t_stat, p_value = stats.ttest_ind(group1, group2) print(f"t统计量: {t_stat:.2f}, p: {p_value:.4f}") # 输出示例:t统计量: 4.06, p: 0.0032 → 拒绝H0(α=0.05) ``` ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值