左右T检验都是用于比较两组数据之间的差异,但它们的应用场景和假设略有不同。
左尾T检验(One-tailed T-test)用于检查一个样本是否显著地小于另一个样本。它的零假设是一个样本的平均值小于或等于另一个样本的平均值。
右尾T检验(One-tailed T-test)则用于检查一个样本是否显著地大于另一个样本。它的零假设是一个样本的平均值大于或等于另一个样本的平均值。
如果你想查看两组数据之间是否存在任何显著的差异,而不限定于是大还是小,你应该使用双尾T检验(Two-tailed T-test)。
stats.t.sf 是Scipy库中用于计算学生t分布的生存函数(Survival Function)的函数。生存函数是一个概率密度函数的补函数,它表示随机变量大于某个值的概率。具体来说,stats.t.sf(x, df) 计算了自由度为 df 的t分布中,随机变量大于 x 的概率。
stats.t.cdf 是Scipy库中用于计算学生t分布的累积分布函数(Cumulative Distribution Function)的函数。累积分布函数给出了随机变量小于或等于某个值的概率。具体来说,stats.t.cdf(x, df) 计算了自由度为 df 的t分布中,随机变量小于或等于 x 的概率。
在下列代码中,我们首先生成了两组示例数据。然后使用 stats.ttest_ind 执行了独立样本的T检验,得到了t统计量和p值。接下来,我们计算了自由度,并使用 stats.t.cdf 计算了t统计量在t分布中的位置。最后,我们使用 stats.t.sf 计算了右尾的p值。
- import numpy as np
- import scipy.stats as stats
-
- # 生成示例数据
- group1 = np.random.normal(5, 2, 30) # 第一组数据
- group2 = np.random.normal(6, 2, 30) # 第二组数据
-
- # 执行独立样本T检验
- t_stat, p_value = stats.ttest_ind(group1, group2)
-
- # 计算自由度
- df = len(group1) + len(group2) - 2
-
- # 计算t统计量在t分布中的位置
- # stats.t.cdf(x, df) 计算了自由度为 df 的t分布中,随机变量小于或等于 x 的概率
- t_cdf = stats.t.cdf(t_stat, df)
-
- # 计算t统计量右侧的概率(p-value)
- # stats.t.sf(x, df) 计算了自由度为 df 的t分布中,随机变量大于 x 的概率。
- p_right = stats.t.sf(t_stat, df)
-
- # 输出结果
- print(f"独立样本T检验结果:t_stat = {t_stat}, p_value = {p_value}")
- print(f"t统计量在t分布中的位置 (CDF):{t_cdf}")
- print(f"p-value (右尾):{p_right}")
-
- # 独立样本T检验结果:t_stat = -3.9177011382620153, p_value = 0.0002382448506984628
- # t统计量在t分布中的位置 (CDF):0.0001191224253492314
- # p-value (右尾):0.9998808775746508
-----------
我们首先生成了两组示例数据(group1 和 group2)。然后,分别执行了左尾和右尾T检验,并打印了检验的结果。最后,通过Matplotlib库绘制了两组数据的直方图,以便直观地比较它们的分布。
- import numpy as np
- import scipy.stats as stats
- import matplotlib.pyplot as plt
-
- # 生成示例数据
- group1 = np.random.normal(5, 2, 30) # 第一组数据
- group2 = np.random.normal(6, 2, 30) # 第二组数据
-
- # 执行左尾T检验
- t_stat_left, p_value_left = stats.ttest_ind(group1, group2, alternative='less')
-
- # 执行右尾T检验
- t_stat_right, p_value_right = stats.ttest_ind(group1, group2, alternative='greater')
-
- # 打印结果
- print(f"左尾T检验结果:t_stat = {t_stat_left}, p_value = {p_value_left}")
- print(f"右尾T检验结果:t_stat = {t_stat_right}, p_value = {p_value_right}")
-
- # 绘制两组数据的直方图
- plt.hist(group1, alpha=0.5, label='Group 1', color='blue')
- plt.hist(group2, alpha=0.5, label='Group 2', color='green')
- plt.legend(loc='upper right')
- plt.title('Histogram of Group 1 and Group 2')
- plt.show()
----------
在这个示例中,我们首先设置了自由度为10,然后生成了一系列x值,计算了自由度为10的T分布的概率密度函数。最后,使用Matplotlib绘制了T分布的曲线图。
- import numpy as np
- import matplotlib.pyplot as plt
- import scipy.stats as stats
- plt.rcParams['font.sans-serif'] = ['SimHei'] # 防止中文标签乱码
- plt.rcParams['axes.unicode_minus'] = False
- # 设定自由度
- df = 10
-
- # 生成x值范围
- # np.linspace 是NumPy库中用于创建等间隔的一维数组的函数
- x = np.linspace(-4, 4, 1000)
-
- # 计算T分布的概率密度函数
- pdf = stats.t.pdf(x, df)
-
- # 绘制T分布曲线图
- plt.plot(x, pdf, label=f'T分布 (df={df})', color='blue')
- plt.xlabel('x')
- plt.ylabel('Probability Density')
- plt.title(f'T分布 (df={df})')
- plt.legend()
- plt.show()