2629 字
13 分钟
数据分析-5种假设检验

t 检验:适用于均值差异的假设检验。

  • Z 检验:用于大样本或已知总体方差的均值差异检验。
  • 卡方检验:适用于分类变量的独立性或拟合优度检验。
  • 方差分析(ANOVA):用于多个组均值的比较。
  • Mann-Whitney U 检验:用于比较两个独立样本的非正态分布数据。

t 检验(t-test)

原理:t 检验主要用于判定两个样本均值之间是否存在显著差异。其基本假设为两个样本源自同一分布,若它们的均值差异明显,则暗示两者可能分属于不同的分布。

原假设(H0):两个样本的均值不存在差异,即。 备择假设(H1):两个样本的均值有显著差异,即。

核心公式:t 检验的关键在于计算 t 统计量,以此来判断样本均值间的差异。对于独立样本 t 检验(双样本 t 检验),公式如下:

其中,和分别为两个样本的均值;和为两个样本的方差;和为两个样本的样本数。通过 t 值查找 t 分布表可得到 p 值,p 值越小,就越能表明样本间差异显著。若 p 值小于显著性水平(通常为 0.05),则拒绝原假设。

推导过程:首先假定两个样本来自同一分布,接着计算样本均值。依据中心极限定理,样本均值的分布呈正态分布。然后计算样本之间的标准误差,并利用公式算出 t 值。最后通过查表或计算获取 p 值,以判断能否拒绝原假设。

优缺点:优点:t 检验操作简便,适用于正态分布的数据。缺点:在面对非正态分布数据以及样本量较小时,结果不够稳定。此外,t 检验还要求样本的方差大致相等。

适用场景:当需要比较两个样本的均值差异时,比如实验组与控制组在表现上的差异等情况。

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsfrom scipy import stats

生成两个不同均值的样本数据np.random.seed(42)group1 = np.random.normal(50, 10, 100) # 均值为50,标准差为10group2 = np.random.normal(55, 12, 100) # 均值为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=(10, 6))#

密度图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(1, 2, 2)sns.boxplot(data=[group1, group2], palette=[“blue”, “red”])plt.xticks([0, 1], [“Group 1”, “Group 2”])#

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

在生成的图示中:

左侧部分呈现了两个组的核密度估计(KDE)曲线,清晰地描绘出各自的数据分布态势。右侧部分则以箱线图的形式,直观对比了两个组的中位数及四分位数分布情况。结合这两个图表,我们能够直观地洞察到两个组在均值层面上的显著差异。

z 检验(z-test)

原理:z 检验与 t 检验类似,主要在样本量较大且已知总体标准差的情况下使用。它能够用于检验单样本与总体均值的差异,也能够对两个样本的均值差异进行比较。

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

z 检验的核心公式为:。其中,为样本均值;为总体均值;为已知的总体标准差;为样本数量。

推导过程:在大样本的情形下,样本均值的分布近似为正态分布。计算样本均值与总体均值的差异,并将其标准化为 z 分布。依据 z 值在标准正态分布中查找 p 值。

优缺点:优点:z 检验适用于大样本数据,计算较为简单,且适用性广泛。缺点:要求已知总体标准差,主要适用于大样本,不适用于小样本数据。

适用场景:适用于已知总体方差的大样本数据。

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

生成数据:一个已知均值和方差的总体np.random.seed(42)population_mean = 100population_std = 15n = 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=(10, 6))#

核密度估计(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)展示了抽样数据的分布。
  • 红色竖线表示假设的总体均值,蓝色虚线表示样本均值。这可以直观地看到样本均值与假设均值的偏差情况。

卡方检验(Chi-Square Test)

原理:卡方检验主要针对分类变量进行统计推断,其主要用途在于检验变量之间的独立性或者分类分布的拟合度。基本原理是对比观察到的频数与期望的频数之间的差异,以此来判断变量之间是否相互独立。原假设(H0):变量之间彼此独立(不存在关联)。备择假设(H1):变量之间不独立(存在显著关联)。核心公式:卡方检验的统计量公式为:(\chi ^{2}=\sum\frac{(O-E)^{2}}{E})。其中,(O)是观察值,(E)是期望值。推导过程:首先根据原假设计算出每个组合的期望频数。接着使用公式计算卡方统计量,也就是观察值与期望值之间的平方差除以期望值。然后查找卡方分布表,依据自由度和显著性水平来判断是否拒绝原假设。优缺点:优点:适用于分类数据,操作较为简单。尤其适合用于对样本频率进行显著性检验。缺点:需要有足够大的样本量,在小样本情况下可能得出错误的结论;同时,当期望频数较小时,卡方检验的效果不佳。适用场景:常常用于检验两个类别变量之间的独立性或者拟合优度。

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsfrom 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=(8, 6))sns.heatmap(contingency_table, annot=True, cmap=“YlGnBu”, fmt=“d”)plt.title(“Contingency Table Heatmap”)plt.show()#

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

方差分析(ANOVA, Analysis of Variance)

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

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

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

其中,是第组的均值;是总体均值;是第组的样本数;是总样本数;是组数。

推导过程:首先计算每组均值与总体均值之间的方差(组间方差)。接着计算每组内部数据与组均值的方差(组内方差)。然后通过 F 统计量的比值,查找 F 分布表,以判断是否拒绝原假设。

优缺点:优点:可以同时比较多个组,适用于多个样本组的均值差异检验。缺点:要求样本数据满足正态性,且各组之间的方差相等。

适用场景:用于比较三个或更多组之间的均值差异,常用于实验设计分析。

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsfrom scipy import stats

生成三个组的数据np.random.seed(42)group1 = np.random.normal(50, 10, 30)group2 = np.random.normal(55, 10, 30)group3 = np.random.normal(60, 10, 30)#

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

数据可视化plt.figure(figsize=(12, 6))#

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

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

Mann-Whitney U 检验

原理:Mann-Whitney U 检验属于一种非参数检验方法,主要用于比较两个独立样本的分布是否相同,尤其在数据不满足正态分布的情况下非常适用。

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

核心公式:Mann-Whitney U 检验的统计量为 U 值,计算公式为:,,其中和分别是两个样本的样本量,是样本 1 的秩和。

推导过程:首先将两个样本的数据进行排序,并为其分配秩次。接着计算每个样本的秩和,进而计算 U 值。然后通过 U 值查找标准正态分布或 U 分布表,以此来判断是否拒绝原假设。

优缺点:优点:适用于非正态分布的数据,不要求方差相等。缺点:不能精确地评估均值,只能对分布进行比较。

适用场景:当两个独立样本的数据不满足正态分布时,常用于社会科学实验和非正态分布数据的分析。

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsfrom 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=(10, 6))#

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