本文共 4750 字,大约阅读时间需要 15 分钟。
很多人只知道假设检验的步骤而不知道其中的原理。本文主要讲一下假设检验的原理及在python中的应用,以单样本t检验和配对样本t检验为例。
假设检验的原理
在参数检验的基本原理—小概率原理中,事件发生概率小于0.05,即可认为该事件为小概率事件。小概率事件在一次试验中是基本没可能发生的,如果发生了,那就会让人产生质疑。根据这个原理,假设检验把不能轻易否定的假设作为原假设,把不能轻易肯定的假设作为备择假设。原假设是在一次试验中有大概率发生的事件,而备择假设是在一次试验中基本不可能发生的小概率事件,两者的地位是不对等的。然后通过反证法进行判断。如果备择假设发生了,则拒绝原假设,反之接受原假设。
两类错误
第Ⅰ类错误 : 第Ⅰ类错误又叫弃真错误。是指当原假设为真时,却拒绝原假设的错误。犯第一类错误的概率用α表示。α又称为显著性水平。
第Ⅱ类错误 : 第Ⅱ类错误又叫取伪错误。是指当备择假设为真时,却接受原假设的错误。犯第Ⅱ类错误的概率用β表示。
假设检验又称为显著性检验 : 我们把这种只限制犯第一类错误的概率α,而不考虑犯第二类错误的概率β的统计假设检验问题称为显著性检验。
决策
使用拒绝域决策 :
3.给定显著性水平α(双侧检验时α要除以2),计算出拒绝域
4.根据样本数据计算出检验统计量,通过检验统计量与拒绝域进行比较,当检验统计量取拒绝域中的值时,拒绝原假设
使用P值进行决策 :
置信区间
置信区间是对产生这个样本的总体的参数分布中的某一个未知参数值,以区间形式给出的估计。如置信度为95%的置信区间表示有95%的区间包含总体参数的真值。在假设检验中,置信区间提供了总体均值的区间估计,通过建立置信区间提供估计精度的信息(根据置信区间大小判断,置信区间越窄,精度越高)。
效应量
P值只能判断总体未知特征是否具有统计显著性。若发现研究结果有统计显著性,只能表示其中有效应存在,但不能度量效应的大小。我们要知道的是效应有多大,如果效应很小,统计显著性的结果可能只有理论意义,没有实际意义。样本很小时,即便效应很大,也有可能得不到统计显著性的结果。所以在使用P值的同时,还要用效应量来辅助判断结果的实际意义。
Cohen's d :
Cohen's d用于反映效应的大小,d=0.2小效应,d=0.5中效应,d=0.8大效应。
在python中的应用
单样本t检验
抽查16只电子元件的寿命,问是否有理由认为元件的平均寿命显著地大于225小时(α=0.05)?
读取文件&选择适当的参数检验
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as snsfrom scipy import stats#样本数据集data_ser = pd.Series([ 159, 280, 101, 212, 224, 379, 179, 264, 222, 362, 168, 250, 149, 260, 485, 170])#查看数据集分布sns.distplot(data_ser)plt.title('数据集分布')
样本近似服从正态分布,使用单样本t检验。
建立假设
H0 : μ≤225,
H1 : μ>225
计算样本的基本描述统计量
data_ser.describe()
样本均值=241.50,样本标准差=98.73
单样本t检验
#μpop_mean = 225#样本均值sample_mean = 241.5#标准误差se = stats.sem(data_ser)#t值t = (sample_mean - pop_mean) / se#返回双侧检验的P值t, p_two = stats.ttest_1samp(data_ser, pop_mean)#双侧检验的P值除以2得单侧检验的P值p_one = p_two / 2print('t=' + str(t) + 'tP值=' + str(p_one))#结论if (p_one < alpha): print('p <α,拒绝原假设,有理由认为元件的平均寿命显著地大于225小时。')else: print('p> α,不能拒绝原假设,没有理由认为元件的平均寿命显著地大于225小时。') α,拒绝原假设,有理由认为元件的平均寿命显著地大于225小时。')else:>
置信区间
#查表得t临界值t_cv = 1.7531#置信区间下限a = sample_mean - t_cv * se#置信区间上限b = sample_mean + t_cv * seprint('置信水平为95%%的置信区间为(%f,%f)' % (a, b))
效应量
不存在统计显著,没必要计算效应量。
APA格式
描述统计
M=241.50, SD=98.73
假设检验
t(15) = 0.67,P=.257(α=0.05) 右单侧检验
不能拒绝原假设,没有理由认为元件的平均寿命显著地大于225小时。
置信区间
95%置信水平的置信区间[198.23, 284.77]
配对样本t检验
为研究课程辅导效果,学校在辅导前后根据量表对30个学生害怕考试程度进行统计,请问进行课程辅导后,学生对测试的恐惧是否有所下降?
fost1 : 辅导前学生恐惧考试程度 fost2 : 辅导后学生恐惧考试程度
读取文件&选择适当的参数检验
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as snsfrom scipy import stats#读取文件data = pd.read_csv('experim.csv')#差值数据集。配对样本t检验需要差值数据符合正态分布data['差值'] = data['fost1'] - data['fost2']#查看数据集分布sns.distplot(data['差值'])plt.title('差值数据集分布')plt.show()
由上面的分布图可看出差值样本近似服从正态分布,可以使用两配对样本t检验。
建立假设
H0 : μ1-μ2=0
H1 : μ1-μ2≠0
计算样本的基本描述统计量
data.describe()
辅导前学生恐惧考试程度样本均值为40.17,样本标准差为5.16
辅导后学生恐惧考试程度样本均值为37.50,样本标准差为5.15
辅导前后样本的均值有一定差异,辅导后学生恐惧考试程度均值小于辅导前学生恐惧考试程度。
数据可视化
#两个样本数据集对比fig = plt.figure(figsize=(20, 10))ax = fig.add_subplot()#绘制柱状图data[['fost1', 'fost2']].plot(kind='bar', ax=ax, color=['#48A0FC', 'lightcoral'])#设置plt.title('辅导前后学生恐惧考试程度柱状图', fontsize=18)plt.legend(['辅导前', '辅导后'], fontsize=15)plt.yticks(fontsize=15)ax.set_xticklabels([ '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30'], fontsize=15, rotation=0)plt.show()
皮尔逊相关系数检验
#皮尔逊相关系数检验a, b = stats.pearsonr(data['fost1'], data['fost2'])print('相关系数=' + str(a))print('P值=' + str(b))
在显著水平α=0.05下,学生进行辅导前后存在明显的线性变化,辅导前和辅导后的恐惧考试程度的线性相关程度强。
配对样本t检验
alpha = 0.05#返回双侧检验的P值t, p_two = stats.ttest_rel(data['fost1'], data['fost2'])print('t=' + str(t) + 'tP值=' + str(p_two))#结论if p_two < alpha: print('P <α,拒绝原假设,辅导前后学生对测试的恐惧有显著差异。')else: print('p> α,不能拒绝原假设,辅导前后学生对测试的恐惧无显著差异。') α,拒绝原假设,辅导前后学生对测试的恐惧有显著差异。')else:>
又因为差值样本均值为2.67,可以认为辅导后学生对测试的恐惧有一定程度的降低。
置信区间
t_cv = 2.0452#差值数据集平均值sample_mean = data['差值'].mean()#标准误差se = stats.sem(data['差值'])#置信区间上限a = sample_mean - t_cv * se#置信区间下限b = sample_mean + t_cv * seprint('置信水平为95%%的置信区间为(%f,%f)' % (a, b))
效应量Cohen's d
con1_mean = data['fost1'].mean()con1_std = data['fost1'].std()con2_mean = data['fost2'].mean()con2_std = data['fost2'].std()n1 = 30n2 = 30#合并标准差计算pooled_s2 = ((n1 - 1) * np.square(con1_std) + (n2 - 1) * np.square(con2_std)) / (n1 + n2 - 2)pooled_std = np.sqrt(pooled_s2)d = (con1_mean - con2_mean) / pooled_stdprint('d=' + str(d))
d>0.5,有一定的效应。
APA格式
描述统计
第一组样本数据 : 辅导前学生恐惧考试程度(M=40.17, SD=5.16)
第二组样本数据 : 辅导后学生恐惧考试程度(M=37.50, SD=5.15)
辅导前后样本的均值有一定差异,辅导后学生恐惧考试程度均值小于辅导前学生恐惧考试程度。
假设检验
t(29) = 5.39,P=.000(α=0.05)
拒绝原假设,辅导前后学生对测试的恐惧有显著差异。
置信区间
95%置信水平的置信区间[1.66, 3.68]
效应量
d = 0.52
如有错误,敬请指正。
转载地址:http://okcpo.baihongyu.com/