双样本t检验(Two-sample t-test)是一种统计方法,用于比较两个独立样本的均值是否存在显著差异。
这种检验在以下情况下适用:
数据独立性:两个样本之间没有关联,即一个样本的观测结果不影响另一个样本的观测结果。 正态分布:样本数据应该近似地服从正态分布,尤其是当样本量较小时(通常n<30)。 方差齐性:两个样本的方差应该相等。如果方差不相等,可以使用Welch's t-test,它不要求方差相等。 随机抽样:数据应该是通过随机抽样获得的。
数据说明
# - 加载数据集
data = pd.read_csv("./data.csv")
print(data.shape)
data.head()
(325, 12)
双样本t检验
理论步骤
双样本t检验是一种统计方法,用于比较两组独立样本的均值是否存在显著差异。以下是进行双样本t检验的一般步骤:
-
提出假设:
2. 检查数据:
- 确保数据满足t检验的基本条件,包括独立性、正态性和方差齐性(如果使用方差相等的t检验)。
- 清理数据,处理缺失值和异常值。
-
选择适当的t检验类型:
- 如果两个样本的方差相等,可以使用Student’s t-test(方差相等的t检验)。
- 如果两个样本的方差不等,可以使用Welch’s t-test(方差不等的t检验)。
-
计算检验统计量:
-
确定自由度:
- 对于Student’s t-test,自由度 ( df = n_1 + n_2 - 2 )。
- 对于Welch’s t-test,自由度的计算更为复杂,可以使用以下公式:
-
计算p值:
- 根据t统计量和自由度,使用t分布表或统计软件计算p值。
-
做出决策:
- 如果p值小于显著性水平(通常为0.05),则拒绝原假设,认为两组样本的均值存在显著差异。
- 如果p值大于或等于显著性水平,则不能拒绝原假设,认为两组样本的均值没有显著差异。
-
报告结果:
- 报告t统计量、p值、置信区间等结果,并根据研究背景解释这些结果的意义。
-
可视化结果(可选):
- 使用散点图、箱线图或小提琴图等可视化方法展示两组数据的分布和差异。
在Python中,可以使用scipy.stats
模块中的ttest_ind
函数来执行双样本t检验。此外,Seaborn库也提供了boxplot
和violinplot
等函数,用于可视化两组数据的分布情况。
python步骤
在Python中,可以使用scipy.stats模块中的ttest_ind函数来执行双样本t检验。 但是如何判断是Student’s t-test还是Welch’s t-test?
在Python中使用scipy.stats
模块的ttest_ind
函数执行双样本t检验时,可以通过设置函数的参数来决定执行的是Student’s t-test(假设方差相等)还是Welch’s t-test(不假设方差相等)。
ttest_ind
函数的原型如下:
scipy.stats.ttest_ind(a, b, axis=0, equal_var=True, ... )
其中:
-
a
和b
是要比较的两个独立样本。 -
axis
参数指定沿着哪个轴比较样本(默认为0,即沿着列)。 -
equal_var
参数非常关键,它用来指定是否假设两个样本具有相等的方差。 -
如果
equal_var=True
(默认值),则ttest_ind
执行的是Student's t-test
,即假设两个样本具有相等的方差。 -
如果
equal_var=False
,则ttest_ind
执行的是Welch's t-test
,即不假设两个样本具有相等的方差。
通常,在执行t检验之前,可以使用Levene检验来评估两个样本的方差是否相等。
根据Levene检验的p值来决定使用哪种t检验:
from scipy import stats
from scipy.stats import levene
# 假设沿海和内陆是两个独立样本的数据
coastal = data[data["Coastal"] == "是"]["AQI"]
inland = data[data["Coastal"] == "否"]["AQI"]
# 执行Levene检验来评估方差是否相等
stat, p = levene(coastal, inland)
# 如果Levene检验的p值大于显著性水平(例如0.05),则假设方差相等
if p > 0.05:
# 使用Student's t-test
t_stat, p_val = stats.ttest_ind(coastal, inland, equal_var=True)
else:
# 使用Welch's t-test
t_stat, p_val = stats.ttest_ind(coastal, inland, equal_var=False)
print(f"t统计量: {t_stat}, p值: {p_val}")
在这段代码中,我们首先执行Levene检验,然后根据其p值来决定使用哪种t检验方法。这种方法可以确保我们在t检验中对方差齐性的假设是合理的。
独立双样本T-Test 前 为什么要先进行列文检验(Levene‘s Test)
实际问题
进行双样本t检验,来查看沿海城市与内陆城市的均值差异是否显著
from scipy import stats
coastal = data[data["Coastal"] == "是"]["AQI"]
inland = data[data["Coastal"] == "否"]["AQI"]
# 进行方差齐性检验,为后续进行双样本t检验服务
# 方差反映了一组数据与其平均值的偏离程度,
# 方差齐性检验用以检验两组或多组数据与其均值偏离程度是否存在差异,
# 也是很多检验和算法的先决条件
stats.levene(coastal, inland)
# 这行代码执行了 Levene 检验,以比较 coastal 和 inland 两个样本的方差是否相等。
# levene 函数返回两个值:检验统计量(W)和对应的 p 值。
# 执行这段代码后,如果 p 值小于您选择的显著性水平(通常是 0.05),则可以拒绝原假设,认为两个样本的方差不相等。
# 如果 p 值大于显著性水平,则不能拒绝原假设,即没有足够的证据表明两个样本的方差不同。
LeveneResult(statistic=0.08825036641952543, pvalue=0.7666054880248062)
- 结果分析
根据您提供的 Levene 检验结果:
检验统计量(W):0.08825036641952543
p值:0.7666054880248062
-------------------------------------------------------------------------
我们可以这样解释这个结果:
p值远大于0.05:通常,我们使用0.05作为显著性水平。这里的p值为0.7666,远大于0.05,这意味着我们没有足够的证据拒绝原假设。
原假设:原假设是两个样本(沿海和内陆)的方差相等。 ---->由于p值大于0.05,我们不能拒绝原假设。
结论:基于Levene检验的结果,我们没有足够的证据表明沿海和内陆的AQI数据的方差存在显著差异。
因此,我们可以认为这两个样本的方差相等。
在这种情况下,使用假设方差齐性的双样本t检验(如Student’s t-test)来进一步分析两个样本的均值是否存在显著差异。
这是因为Levene检验表明方差齐性假设成立。
结论:基于Levene检验的结果,我们没有足够的证据表明沿海和内陆的AQI数据的方差存在显著差异。因此,我们可以认为这两个样本的方差相等。
在这种情况下,您可以使用假设方差齐性的双样本t检验(Student’s t-test)来进一步分析两个样本的均值是否存在显著差异。这是因为Levene检验表明方差齐性假设成立。 因此执行Student’s t-test校验
# 进行两样本t检验
# 两样本的方差相同与不同,其t检验结果是不同的
r = stats.ttest_ind(coastal, inland, equal_var=True)
print(r)
# 这行代码执行了双样本t检验,比较两个独立样本 coastal 和 inland 的均值是否存在显著差异。
# equal_var=True 参数指定了假设两个样本具有相等的方差。
# 如果您之前进行了Levene检验,并且p值大于显著性水平(例如0.05),则可以假设方差相等。
p = stats.t.sf(r.statistic, df=len(coastal) + len(inland) - 2)
print(p)
# sf 表示“survival function”,这里用于计算单尾检验的p值。
# r.statistic 是从t检验结果中获取的t统计量。
# df 是自由度,计算为两个样本的样本量之和减去2(len(coastal) + len(inland) - 2)
Ttest_indResult(statistic=-2.7303827520948905, pvalue=0.006675422541012958)
0.9966622887294936
- 结果分析
r值结果分析:
返回结果的第一个值为统计量,statistic=-2.73038275为负,
即coastal其AQI值比inland的AQI值要小
第二个值为p-value:pvalue=0.0066754225410,比指定的显著水平(一般为5%)小,即拒绝原假设,两组数据之间有差异。
p值结果分析:
p=0.9966622887294936,即有超过99%的几率,可以认为沿海城市的空气质量普遍优于内陆城市
Levene 检验
Levene检验是一种统计检验,用于检查两组或多组数据的方差是否相等,这是很多参数检验(如ANOVA、t检验)的一个关键假设。【也就是在很多校验之前先使用的假设校验
】如果方差不等,这些参数检验的结果可能不可靠。Levene检验是一种稳健的检验方法,它对数据的分布形态不敏感,特别是当数据不是正态分布时。
Levene检验的基本步骤:
-
提出原假设和备择假设:
- 原假设(H0):
所有组的方差相等
。 - 备择假设(H1):至少有两组的方差不相等。
- 原假设(H0):
-
计算检验统计量:
Levene检验的检验统计量是基于各组数据的中位数绝对偏差(MAD)的。对于每个组,首先计算中位数,然后计算每个数据点与该中位数的绝对偏差。接着,计算这些绝对偏差的平均值,得到每个组的MAD。最后,使用这些MAD来计算检验统计量。 -
确定自由度:
Levene检验的自由度取决于组的数量和每个组的样本量。 -
计算p值:
根据计算出的检验统计量和自由度,可以查找F分布表或使用统计软件来确定p值。 -
做出决策:
如果p值小于显著性水平(例如0.05),则拒绝原假设,认为至少有两组的方差不相等。否则,不能拒绝原假设,认为所有组的方差相等。
- Python中的Levene检验:
在Python中,可以使用scipy.stats
模块中的levene
函数来执行Levene检验。例如:
from scipy import stats
# 假设data是一个pandas DataFrame,其中包含"Group"和"Value"两列
# "Group"列包含分类变量,表示不同的组
# "Value"列包含数值变量,表示各组的观测值
# 提取不同组的数据
group1 = data[data["Group"] == "A"]["Value"]
group2 = data[data["Group"] == "B"]["Value"]
group3 = data[data["Group"] == "C"]["Value"]
# 执行Levene检验
statistic, p_value = stats.levene(group1, group2, group3)
# 打印结果
print(f"Levene检验统计量: {statistic}, p值: {p_value}")
如果p值小于显著性水平,您可能需要使用不假设方差齐性的检验方法,例如Welch’s t-test或非参数检验。如果p值大于显著性水平,您可以继续使用假设方差齐性的检验方法。