十大假设检验,超完整总结 !!

文摘   2024-09-05 15:36   北京  

哈喽,我是cos大壮!~

前几天,咱们已经分享了关于假设检验的一些内容,今天针对一些细节问题,又进行了细化分享给大家。

假设检验方法用于通过统计手段判断样本数据是否支持某个假设,帮助决策者做出基于数据的推断。它为数据分析提供了系统的验证工具,有助于避免仅凭样本结果得出误导性的结论。通过假设检验,可以在不确定性中评估数据的显著性,确保分析结果的科学性和可靠性。

老规矩如果大家伙觉得近期文章还不错!欢迎大家点个赞、转个发,文末赠送《机器学习学习小册》
文末可取本文PDF版本~

先给大家列举10种假设检验方法,以及核心关键:

  • t 检验:适用于均值差异的假设检验。
  • Z 检验:用于大样本或已知总体方差的均值差异检验。
  • 卡方检验:适用于分类变量的独立性或拟合优度检验。
  • 方差分析(ANOVA):用于多个组均值的比较。
  • Mann-Whitney U 检验:用于比较两个独立样本的非正态分布数据。
  • Kruskal-Wallis 检验:用于比较三个或更多组的非正态分布数据。
  • Wilcoxon 符号秩检验:用于成对样本的非参数检验。
  • Kolmogorov-Smirnov 检验(K-S Test):用于检验样本分布与理论分布的一致性。
  • Friedman 检验:用于比较多个相关样本的分布差异。
  • McNemar 检验:用于比较两个配对样本的二分类数据。

具体细节,咱们下面详细聊聊~

1. t 检验(t-test)

原理

 检验用于比较两个样本均值之间是否有显著差异。其背后的假设是,两个样本来自同一分布,如果它们的均值差异显著,则表明两者可能属于不同的分布。

  • 原假设(H0):两个样本均值没有差异,即 
  • 备择假设(H1):两个样本均值有显著差异,即 

核心公式

t检验的核心是计算t统计量,并通过它判断样本均值之间的差异。公式如下:

对于独立样本t检验(双样本t检验):

其中:

  •    分别为两个样本的均值。
  •    为两个样本的方差。
  •    为两个样本的样本数。

t值通过查找t分布表来得到p值,p值越小,越说明样本间差异显著。如果p值小于显著性水平(通常是0.05),则拒绝原假设。

推导过程:
  1. 首先假设两个样本来自同一分布,计算样本均值。
  2. 根据中心极限定理,样本均值的分布是正态分布。
  3. 计算样本之间的标准误差,并通过公式计算t值。
  4. 通过查表或计算获得p值,判断是否可以拒绝原假设。

优缺点

  • 优点:t检验简单易用,适用于正态分布的数据。
  • 缺点:对于非正态分布、样本量较小时,结果不够稳定。t检验还要求样本的方差近似相等。
  • 适用场景:当我们需要比较两个样本的均值差异时,例如实验组和控制组的表现差异。

案例代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats

# 生成两个不同均值的样本数据
np.random.seed(42)
group1 = np.random.normal(5010100)  # 均值为50,标准差为10
group2 = np.random.normal(5512100)  # 均值为55,标准差为12

# t-test 两组数据的均值
t_stat, p_value = stats.ttest_ind(group1, group2)
print(f"T-statistic: {t_stat}, P-value: {p_value}")

# 数据可视化
plt.figure(figsize=(106))

# 密度图
sns.kdeplot(group1, label="Group 1 (Mean=50)", color="blue", shade=True)
sns.kdeplot(group2, label="Group 2 (Mean=55)", color="red", shade=True)

# 箱线图
plt.subplot(122)
sns.boxplot(data=[group1, group2], palette=["blue""red"])
plt.xticks([01], ["Group 1""Group 2"])

plt.suptitle("t-Test Analysis: Group Comparison", fontsize=16)
plt.tight_layout()
plt.show()

在生成的图中:

  • 左侧显示两个组的核密度估计(KDE)曲线,显示了数据分布情况。
  • 右侧为箱线图,比较了两个组的中位数和四分位数。通过这两个图表,可以直观地观察到两个组在均值上的差异。

从代码输出的t统计量和p值可以判断,如果p值小于0.05,则可以拒绝原假设,即认为两个样本的均值有显著差异。通过数据分析图,KDE图和箱线图可以看出,group1和group2的均值有所不同。

2. z 检验(z-test)

原理

z检验类似于t检验,主要用于样本量较大且已知总体标准差的情况。它可以用于检验单样本与总体均值的差异,也可以比较两个样本的均值差异。

  • 原假设(H0):样本均值与总体均值无显著差异,或两个样本均值无显著差异。
  • 备择假设(H1):样本均值与总体均值有显著差异,或两个样本均值有显著差异。

核心公式

z检验的核心公式为:

其中:

  •  为样本均值。
  •  为总体均值。
  •  为已知的总体标准差。
  •  为样本数量。
推导过程:
  1. 在大样本的情况下,样本均值的分布近似正态分布。
  2. 计算样本均值与总体均值的差异,并标准化为z分布。
  3. 根据z值在标准正态分布中查找p值。

优缺点

  • 优点:z检验适用于大样本数据,计算简单,并且适用性广泛。
  • 缺点:要求已知总体标准差,适用于大样本,且不适合小样本数据。
  • 适用场景:适用于已知总体方差的大样本数据。

案例代码

# z-test示例,使用一个标准的正态分布数据集
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from scipy import stats

# 生成数据:一个已知均值和方差的总体
np.random.seed(42)
population_mean = 100
population_std = 15
n = 50

# 从该总体中抽取样本
sample = np.random.normal(population_mean, population_std, n)

# 假设总体均值为105,进行单样本z检验
sample_mean = np.mean(sample)
sample_std = np.std(sample, ddof=1)
z_stat = (sample_mean - 105) / (population_std / np.sqrt(n))
p_value = 2 * (1 - stats.norm.cdf(abs(z_stat)))

print(f"Z-statistic: {z_stat}, P-value: {p_value}")

# 数据可视化
plt.figure(figsize=(106))

# 核密度估计(KDE)显示样本的分布
sns.kdeplot(sample, label="Sample Distribution", color="green", shade=True)

# 添加总体均值和假设均值的竖线
plt.axvline(np.mean(sample), color='blue', linestyle='--', label='Sample Mean')
plt.axvline(105, color='red', linestyle='--', label='Hypothetical Mean')

plt.legend()
plt.title("Z-Test: Sample vs Hypothetical Mean")
plt.tight_layout()
plt.show()
  • 核密度估计(KDE)展示了抽样数据的分布。
  • 红色竖线表示假设的总体均值,蓝色虚线表示样本均值。这可以直观地看到样本均值与假设均值的偏差情况。

通过z统计量和p值,我们可以判断样本均值与假设均值是否有显著差异。如果p值小于0.05,则拒绝原假设。

3. 卡方检验(Chi-Square Test)

原理

卡方检验用于分类变量的统计推断,主要用于检验变量之间的独立性或分类分布的拟合度。其基本思想是比较观察到的频数和期望的频数之间的差异,从而判断变量之间是否独立。

  • 原假设(H0):变量之间相互独立(没有关联)。
  • 备择假设(H1):变量之间不独立(有显著关联)。

核心公式

卡方检验的统计量公式为:

其中:

  •  是观察值。
  •  是期望值。
推导过程:
  1. 根据原假设计算每个组合的期望频数。
  2. 使用公式计算卡方统计量,即观察值与期望值之间的平方差除以期望值。
  3. 查找卡方分布表,根据自由度和显著性水平判断是否拒绝原假设。

优缺点

  • 优点:适用于分类数据,操作简单。特别适合用于样本频率的显著性检验。
  • 缺点:需要足够大的样本量,小样本时可能导致错误的结论;同时,当期望频数较小时,卡方检验效果不佳。
  • 适用场景:常用于检验两个类别变量之间的独立性或拟合优度。

案例代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import chi2_contingency

# 创建列联表(例如性别和是否购买)
data = {'Gender': ['Male''Male''Female''Female''Male''Female''Female''Male'],
        'Purchased': ['Yes''No''Yes''No''Yes''Yes''No''No']}

df = pd.DataFrame(data)

# 创建列联表
contingency_table = pd.crosstab(df['Gender'], df['Purchased'])
print(contingency_table)

# 卡方检验
chi2, p, dof, expected = chi2_contingency(contingency_table)
print(f"Chi2 Statistic: {chi2}, P-value: {p}")

# 数据可视化
plt.figure(figsize=(86))
sns.heatmap(contingency_table, annot=True, cmap="YlGnBu", fmt="d")
plt.title("Contingency Table Heatmap")
plt.show()

图中显示了一个性别和是否购买的列联表(交叉表),并用热图可视化两个变量的频数分布。通过此表和图,可以观察到不同性别下是否购买的频率分布。

通过卡方统计量和p值,可以判断是否拒绝原假设(即变量是否独立)。如果p值小于0.05,则表明性别与购买行为之间存在显著关联。

4. 方差分析(ANOVA, Analysis of Variance)

原理

方差分析(ANOVA)用于比较多个组的均值,判断这些组之间是否存在显著差异。它通过比较组间方差与组内方差的比值,来评估不同组的均值是否相同。

  • 原假设(H0):多个样本组的均值相等。
  • 备择假设(H1):至少有一个样本组的均值不相等。

核心公式

ANOVA 使用的统计量是 F 值,公式为:

其中:

  •  是第  组的均值。
  •  是总体均值。
  •  是第  组的样本数。
  •  是总样本数。
  •  是组数。
推导过程:
  1. 计算每组均值与总体均值之间的方差(组间方差)。
  2. 计算每组内部数据与组均值的方差(组内方差)。
  3. 通过F统计量的比值,查找F分布表,判断是否拒绝原假设。

优缺点

  • 优点:可以同时比较多个组,适用于多个样本组的均值差异检验。
  • 缺点:要求样本数据满足正态性,且各组之间的方差相等。
  • 适用场景:用于比较三个或更多组之间的均值差异,常用于实验设计分析。

案例代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats

# 生成三个组的数据
np.random.seed(42)
group1 = np.random.normal(501030)
group2 = np.random.normal(551030)
group3 = np.random.normal(601030)

# 方差分析
f_stat, p_value = stats.f_oneway(group1, group2, group3)
print(f"F-statistic: {f_stat}, P-value: {p_value}")

# 数据可视化
plt.figure(figsize=(126))

# 箱线图显示各组的分布
sns.boxplot(data=[group1, group2, group3], palette="Set3")
plt.xticks([012], ['Group 1''Group 2''Group 3'])
plt.title("ANOVA Analysis: Group Comparison")
plt.show()

箱线图展示了三个组的分布情况,包括每个组的中位数和四分位数。通过箱线图,可以直观地观察各组之间均值和数据分布的差异。

通过F统计量和p值,我们可以判断是否拒绝原假设。如果p值小于0.05,说明至少有一个组的均值与其他组不同。

5. Mann-Whitney U 检验

原理

Mann-Whitney U 检验是一种非参数检验,适用于比较两个独立样本的分布是否相同,尤其适用于数据不满足正态分布的情况。

  • 原假设(H0):两个样本的分布相同。
  • 备择假设(H1):两个样本的分布不同。

核心公式

Mann-Whitney U 检验的统计量为 U 值,计算公式为:

其中:

  •    分别是两个样本的样本量。
  •  是样本1的秩和。
推导过程:
  1. 将两个样本的数据排序,并分配秩次。
  2. 计算每个样本的秩和,进而计算U值。
  3. 通过U值查找标准正态分布或U分布表,判断是否拒绝原假设。

优缺点

  • 优点:适用于非正态分布数据,不要求方差相等。
  • 缺点:不能精确评估均值,只能比较分布。
  • 适用场景:当两个独立样本的数据不满足正态分布时,常用于社会科学实验和非正态分布数据分析。

案例代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import mannwhitneyu

# 生成两个非正态分布的数据
np.random.seed(42)
group1 = np.random.exponential(scale=2, size=100)
group2 = np.random.exponential(scale=3, size=100)

# Mann-Whitney U 检验
u_stat, p_value = mannwhitneyu(group1, group2)
print(f"U-statistic: {u_stat}, P-value: {p_value}")

# 数据可视化
plt.figure(figsize=(106))

# KDE 图显示分布差异
sns.kdeplot(group1, label="Group 1", color="blue", shade=True)
sns.kdeplot(group2, label="Group 2", color="orange", shade=True)
plt.title("Mann-Whitney U Test: Group Distributions")
plt.legend()
plt.show()

KDE图展示了两个组的分布差异,数据明显呈现非正态分布。通过这些图,可以观察两个组在分布形状上的不同。

根据U统计量和p值,如果p值小于0.05,则可以拒绝原假设,说明两个样本的分布不同。

6. Kruskal-Wallis 检验

原理

Kruskal-Wallis 检验是一个非参数检验,用于比较多个样本组的分布差异。它是Mann-Whitney U 检验的扩展,适用于三个或更多组的比较。

  • 原假设(H0):所有样本组的分布相同。
  • 备择假设(H1):至少有一个样本组的分布不同。

核心公式

Kruskal-Wallis检验的核心统计量H值公式为:

其中:

  •  是总样本数。
  •  是第  组的样本数。
  •  是第  组的秩和。
推导过程:
  1. 将所有数据按大小顺序排列并分配秩次。
  2. 计算各组的秩和,使用公式计算H值。
  3. 根据H值查找卡方分布表,判断是否拒绝原假设。

优缺点

  • 优点:适用于非正态分布数据,不要求各组方差相等。
  • 缺点:只能判断分布差异,不能评估具体的均值差异。
  • 适用场景:当数据不满足正态性且需要比较三个或更多组时,适合社会科学和生物学实验。

案例代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import kruskal

# 生成三组非正态分布的数据
np.random.seed(42)
group1 = np.random.gamma(2150)
group2 = np.random.gamma(2250)
group3 = np.random.gamma(2350)

# Kruskal-Wallis 检验
h_stat, p_value = kruskal(group1, group2, group3)
print(f"H-statistic: {h_stat}, P-value: {p_value}")

# 数据可视化
plt.figure(figsize=(126))

# KDE 图显示三组数据的分布
sns.kdeplot(group1, label="Group 1", color="blue", shade=True)
sns.kdeplot(group2, label="Group 2", color="green", shade=True)
sns.kdeplot(group3, label="Group 3", color="red", shade=True)
plt.title("Kruskal-Wallis Test: Group Distributions")
plt.legend()
plt.show()

通过KDE图可以清晰地看到三个样本组的分布差异,这些数据明显不是正态分布,可以通过Kruskal-Wallis 检验进行分析。

根据H统计量和p值,如果p值小于0.05,说明至少有一个样本组的分布与其他组显著不同。

7. Wilcoxon 符号秩检验(Wilcoxon Signed-Rank Test)

原理

Wilcoxon符号秩检验是一种非参数检验,用于检验两个配对样本之间的差异,通常用于替代配对样本t检验。它比较的是成对数据的符号秩次和,而非直接比较均值。

  • 原假设(H0):配对样本的中位数差异为0。
  • 备择假设(H1):配对样本的中位数差异不为0。

核心公式

Wilcoxon检验的统计量公式为:

其中  是每个样本对的符号秩次和。

推导过程:
  1. 计算每对数据的差值。
  2. 对差值进行排序,计算正负符号的秩和。
  3. 通过秩和的绝对值来判断是否可以拒绝原假设。

优缺点

  • 优点:适用于非正态分布的成对数据。
  • 缺点:不能用于无序或分类数据。
  • 适用场景:当两个配对样本数据不满足正态性时,用于替代配对样本t检验。

案例代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import wilcoxon

# 生成配对样本数据
np.random.seed(42)
before = np.random.normal(20550)
after = before + np.random.normal(-2250)

# Wilcoxon 符号秩检验
w_stat, p_value = wilcoxon(before, after)
print(f"W-statistic: {w_stat}, P-value: {p_value}")

# 数据可视化
plt.figure(figsize=(106))

# KDE 图显示成对样本的分布
sns.kdeplot(before, label="Before", color="blue", shade=True)
sns.kdeplot(after, label="After", color="red", shade=True)
plt.title("Wilcoxon Signed-Rank Test: Paired Sample Distributions")
plt.legend()
plt.show()

通过KDE图可以观察到处理前后两个配对样本的分布差异,直观显示数据的变化趋势。

根据W统计量和p值,可以判断配对样本的中位数差异是否显著。如果p值小于0.05,则可以拒绝原假设,说明成对数据之间有显著差异。

8. Kolmogorov-Smirnov 检验(K-S Test)

原理

Kolmogorov-Smirnov检验是一种非参数检验,常用于比较样本分布与某个理论分布是否一致,或比较两个样本的分布是否相同。

  • 原假设(H0):样本分布与理论分布相同,或两个样本的分布相同。
  • 备择假设(H1):样本分布与理论分布不同,或两个样本的分布不同。

核心公式

K-S 检验的统计量为 ,表示两个累积分布函数之间的最大差值:

其中    是两个分布的累积分布函数。

推导过程:
  1. 计算样本和理论分布或两个样本的累积分布函数。
  2. 计算两个分布函数之间的最大差异。
  3. 通过K-S统计量判断是否可以拒绝原假设。

优缺点

  • 优点:不依赖分布的具体形式,适用于任意分布的数据。
  • 缺点:对尾部差异更敏感,容易受极值影响。
  • 适用场景:用于检验样本分布是否与理论分布一致,或比较两个样本的分布差异。

案例代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import kstest, norm

# 生成数据,假设数据应该服从正态分布
np.random.seed(42)
data = np.random.normal(01100)

# Kolmogorov-Smirnov 检验
ks_stat, p_value = kstest(data, 'norm')
print(f"K-S Statistic: {ks_stat}, P-value: {p_value}")

# 数据可视化
plt.figure(figsize=(106))

# KDE 图显示样本数据与理论分布的对比
sns.kdeplot(data, label="Sample Data", color="blue", shade=True)
sns.lineplot(x=np.linspace(-33100), y=norm.pdf(np.linspace(-33100)), label="Normal Distribution", color="red")
plt.title("Kolmogorov-Smirnov Test: Sample vs Normal Distribution")
plt.legend()
plt.show()

KDE图和正态分布曲线对比显示了样本数据与理论分布的差异。可以通过目视化观察和K-S检验结果来判断样本分布是否符合正态分布。

如果K-S统计量的p值小于0.05,则可以拒绝原假设,说明样本分布与理论分布之间存在显著差异。

9. Friedman 检验

原理

Friedman 检验是一种非参数的方差分析方法,主要用于比较多个相关样本(即重复测量或配对样本)之间的差异。它是方差分析(ANOVA)的一种非参数替代方法,适合数据不满足正态分布的情况。

  • 原假设(H0):多个样本的中位数相同。
  • 备择假设(H1):至少有一个样本的中位数不同。

核心公式

Friedman 检验的统计量  的公式为:

其中:

  •  是实验组的数量。
  •  是每组的样本数。
  •  是第  组的秩和。
推导过程:
  1. 对每个重复测量样本进行排序并分配秩次。
  2. 计算每个样本的秩和,使用公式计算Friedman统计量。
  3. 查找卡方分布表,判断是否拒绝原假设。

优缺点

  • 优点:适用于不满足正态分布的相关样本数据,适合多个样本组。
  • 缺点:只能比较相关样本,不能处理独立样本。
  • 适用场景:当有多个配对样本或重复测量时,特别适用于非正态分布的数据。

案例代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import friedmanchisquare

# 生成三个相关样本数据
np.random.seed(42)
group1 = np.random.normal(501020)
group2 = np.random.normal(521020)
group3 = np.random.normal(541020)

# Friedman 检验
stat, p_value = friedmanchisquare(group1, group2, group3)
print(f"Friedman Statistic: {stat}, P-value: {p_value}")

# 数据可视化
plt.figure(figsize=(106))

# 箱线图显示三个相关样本的分布
sns.boxplot(data=[group1, group2, group3], palette="Set2")
plt.xticks([012], ['Group 1''Group 2''Group 3'])
plt.title("Friedman Test: Group Comparison")
plt.show()

箱线图展示了三个相关样本的分布情况,直观显示每个样本的中位数和四分位范围。通过箱线图,可以观察到三个组的分布是否有显著差异。

通过 Friedman 检验统计量和 p 值,可以判断多个相关样本的中位数是否相同。如果 p 值小于 0.05,则拒绝原假设,说明至少有一个样本的中位数与其他样本不同。

10. McNemar 检验

原理

McNemar 检验是针对配对名义数据(分类数据)的一种非参数检验,主要用于比较两个配对样本的分类数据差异,常用于前后对比实验或同一对象在两种条件下的二分类数据分析。

  • 原假设(H0):两组配对样本的分类结果一致。
  • 备择假设(H1):两组配对样本的分类结果不一致。

核心公式

McNemar 检验的统计量公式为:

其中:

  •  是配对样本中第一次分类为 0,第二次分类为 1 的样本数量。
  •  是配对样本中第一次分类为 1,第二次分类为 0 的样本数量。
推导过程:
  1. 构造配对数据的2x2列联表。
  2. 计算b和c值,代入公式,计算卡方统计量。
  3. 查找卡方分布表,判断是否拒绝原假设。

优缺点

  • 优点:适用于二分类数据的配对样本,尤其是前后对比实验的结果分析。
  • 缺点:只适用于二分类数据,不能处理多分类数据。
  • 适用场景:用于比较两个配对样本的二分类数据,常见于临床实验和对比实验。

案例代码

下面的代码演示如何使用 McNemar 检验来比较配对样本的二分类数据。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from statsmodels.stats.contingency_tables import mcnemar

# 构造 2x2 配对列联表
data = [[105], [2015]]
df = pd.DataFrame(data, index=["Condition 1""Condition 2"], columns=["Negative""Positive"])

# McNemar 检验
result = mcnemar(df, exact=False)
print(f"Chi2 Statistic: {result.statistic}, P-value: {result.pvalue}")

# 数据可视化
plt.figure(figsize=(86))
sns.heatmap(df, annot=True, cmap="coolwarm", fmt="d")
plt.title("McNemar Test: Contingency Table Heatmap")
plt.show()

热图展示了2x2列联表,显示配对样本在两种条件下的二分类分布情况。通过热图,可以直观地看到每个分类的配对频率。

通过 McNemar 检验统计量和 p 值,可以判断配对样本的分类结果是否一致。如果 p 值小于 0.05,则拒绝原假设,说明两组配对样本的分类结果存在显著差异。


最后

大家有问题可以直接在评论区留言即可~

喜欢本文的朋友可以收藏、点赞、转发起来!
需要本文PDF的同学,扫码备注「模型汇总」即可~ 
关注本号,带来更多算法干货实例,提升工作学习效率!
最后,给大家准备了《机器学习学习小册》PDF版本16大块的内容,124个问题总结

推荐阅读

原创、超强、精华合集
100个超强机器学习算法模型汇总
机器学习全路线
机器学习各个算法的优缺点
7大方面,30个最强数据集
6大部分,20 个机器学习算法全面汇总
铁汁,都到这了,别忘记点赞呀~

深夜努力写Python
Python、机器学习算法
 最新文章