本文的假设检验从数据出发,直接检验数据的某些性质。
p值,即在确定的样本观测值下,给出能够拒绝原假设的最小显著性水平。p值越小,越能拒绝原假设。
以下为本次学习的总体框架图(摘自Gitmodel统计分析):
开门见山,我们直接开搞作业题,以下为4道作业题:
三台车床生产同一种滚珠,我们从中各抽取13、14、16个产品,测得直径分别为:
甲车床:15.0,14.5,15.2,15.5,14.8,15.1,15.2,14.8,13.9,16.0,15.1,14.5,15.2
乙车床:15.2,15.0,14.8,15.2,15.0,15.0,14.8,15.1,14.8,15.0,13.7,14.1,15.5,15.9
丙车床:14.6,15.0,14.7,13.9,13.8,15.5,15.5,16.2,16.1,15.3,15.4,15,9,15.2,16.0,14.8,14.9
假设显著性水平为 = 0.01,问:
1. 甲/乙车床生产的滚珠直径是否服从正态分布?
2. 甲/乙车床生产的滚珠直径的方差是否存在显著性差异?
3. 甲/乙车床生产的滚珠直径是否存在显著性差异?
4. 三台车床生产的滚珠直径是否存在显著性差异?在单因素方差分析中,本题的因素是什么?
问题一:
1. 甲/乙车床生产的滚珠直径是否服从正态分布?
待分析数据(甲、乙)-->数值型数据-->一元数值-->正态性检验
A = np.array([15.0,14.5,15.2,15.5,14.8,15.1,15.2,14.8,13.9,16.0,15.1,14.5,15.2])
B = np.array([15.2,15.0,14.8,15.2,15.0,15.0,14.8,15.1,14.8,15.0,13.7,14.1,15.5,15.9])
C = np.array([14.6,15.0,14.7,13.9,13.8,15.5,15.5,16.2,16.1,15.3,15.4,15,9,15.2,16.0,14.8,14.9])
from statsmodels.stats.diagnostic import lilliefors
from typing import List
def check_normality(data: np.ndarray, show_flag: bool=True) -> List[float]:
"""
输入参数
----------
data : numpy数组或者pandas.Series
show_flag : 是否显示概率图
Returns
-------
两种检验的p值;概率图
"""
if show_flag:
_ = stats.probplot(data, plot=plt)
plt.show()
pVals = pd.Series(dtype='float64')
# D'Agostino's K-squared test
_, pVals['Omnibus'] = stats.normaltest(data)
# Shapiro-Wilk test
_, pVals['Shapiro-Wilk'] = stats.shapiro(data)
print(f'数据量为{len(data)}的数据集正态性假设检验的结果 : ----------------')
print(pVals)
check_normality(A,show_flag=True)
check_normality(B,show_flag=True)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/7457bdeeaf245eaa86668db496824152.png)
![](https://i-blog.csdnimg.cn/blog_migrate/93aab834bc12e510f5d34d48b92d747e.png)
答:由于 ,因此甲/乙车床生产的滚珠直径服从正态分布。
2. 甲/乙车床生产的滚珠直径的方差是否存在显著性差异?
待分析数据(甲、乙)-->数值型数据-->一元数值-->样本的方差检验->多组样本的同方差检验->levene检验
from typing import Tuple
def anova_oneway() -> Tuple[float, float]:
pVal=pd.Series(dtype='float64')
# 先做方差齐性检验
_,pVal['levene'] = stats.levene(A, B)
if pVal['levene']<0.01: #这里假设显著性水平为0.01
print('警告: 方差齐性检验的p值小于0.01: p={},方差分析结果在小样本下可能不准确'.format(pVal['levene']))
print('-------------------------------')
# 单因素方差分析-假设样本服从正态分布
_, pVal['anova_oneway_normal'] = stats.f_oneway(A, B) # 在这里输入待分析的数据
print('若样本服从正态分布,单因素方差分析的p值为{}'.format(pVal['anova_oneway_normal']))
if pVal['anova_oneway_normal'] < 0.01:
print('检验在0.05的显著性水平下显著,多组样本中至少存在一组样本均值与其它样本的均值不相等。')
print('---------------------------------')
# 单因素方差分析-假设样本不服从正态分布
_, pVal['anova_oneway_notnormal'] = stats.mstats.kruskalwallis(A, B) # 在这里输入待分析的数据
print('若样本不服从正态分布,单因素方差分析的p值为{}'.format(pVal['anova_oneway_notnormal']))
if pVal['anova_oneway_notnormal'] < 0.01:
print('检验在0.05的显著性水平下显著,多组样本中至少存在一组样本均值与其它样本的均值不相等。')
return pVal
anova_oneway()
输出结果如下:
答:如图所示,levene的p值大于,因此可以判断甲/乙车床生产的滚珠直径的方差不存在显著性差异。
3. 甲/乙车床生产的滚珠直径是否存在显著性差异?
待分析数据(甲、乙)-->数值型数据-->一元数值-->样本均值的检验-->两组样本的均值相等性检验-->组别间独立
# 定义一个单组样本均值检验函数,使它可以同时输出t检验与mannwhitneyu检验的p值
def unpaired_data(group1:np.ndarray,group2:np.ndarray,confidence=0.05,alternative='two-sided'):
"""
输入参数
----------
group1/2 : 用于比较的两组数据
confidence : 显著性水平
alternative : 检验类型,这取决于我们备择假设的符号:two-sided为双侧检验、greater为右侧检验、less为左侧检验
输出
-------
在两种检验下的p值
在显著性水平下是否拒绝原假设
"""
pVal=pd.Series(dtype='float64')
# 先进行两组数据的方差齐性检验
_,pVal['levene']=stats.levene(group1,group2)
# t检验-若数据服从正态分布
if pVal['levene']<confidence:
print('在显著性水平{0:}下,两组样本的方差不相等(p={1:.4f}),因此需要使用方差不等的t检验'.format(confidence,pVal['levene']))
print('------------------------------------')
_, pVal['t-test'] = stats.ttest_ind(group1, group2,equal_var=False,alternative=alternative) # 因为方差不相等,因此是False
print('t检验p值:{}'.format(pVal['t']))
else:
print('在显著性水平{0:}下,不能拒绝两组样本方差相等的假设(p={1:.4f}),因此需要使用方差相等的t检验'.format(confidence,pVal['levene']))
print('------------------------------------')
_, pVal['t-test'] = stats.ttest_ind(group1, group2,equal_var=True,alternative=alternative) # 因为方差相等,因此是True
print('t检验p值:{:.3f}'.format(pVal['t-test']))
# mannwhitneyu检验-数据不服从正态检验
_, pVal['mannwhitneyu'] = stats.mannwhitneyu(group1, group2,alternative=alternative)
print('Mann-Whitney检验p值:{:.3f}'.format(pVal['mannwhitneyu']))
# --- >>> STOP stats <<< ---
# 两组样本均值的散点图可视化
print('------------------------------------')
print('两组样本均值的散点图可视化')
plt.plot(group1, 'bx', label='group1')
plt.plot(group2, 'ro', label='group2')
plt.legend(loc=0)
plt.show()
return pVal
unpaired_data(A,B)
输出结果:
答:甲/乙车床生产的滚珠直径不存在显著性差异。
4. 三台车床生产的滚珠直径是否存在显著性差异?在单因素方差分析中,本题的因素是什么?
待分析数据(甲、乙)-->数值型数据-->一元数值-->样本均值的检验-->多组样本的均值相等性检验:方差分析-->单个因素影响
group1 = A
group2 = B
group3 = C
from typing import Tuple
def anova_oneway() -> Tuple[float, float]:
pVal=pd.Series(dtype='float64')
# 先做方差齐性检验
_,pVal['levene'] = stats.levene(group1, group2, group3)
if pVal['levene']<0.01: #这里假设显著性水平为0.01
print('警告: 方差齐性检验的p值小于0.01: p={},方差分析结果在小样本下可能不准确'.format(pVal['levene']))
print('-------------------------------')
# 单因素方差分析-假设样本服从正态分布
_, pVal['anova_oneway_normal'] = stats.f_oneway(group1, group2, group3) # 在这里输入待分析的数据
print('若样本服从正态分布,单因素方差分析的p值为{}'.format(pVal['anova_oneway_normal']))
if pVal['anova_oneway_normal'] < 0.01:
print('检验在0.01的显著性水平下显著,多组样本中至少存在一组样本均值与其它样本的均值不相等。')
print('---------------------------------')
# 单因素方差分析-假设样本不服从正态分布
_, pVal['anova_oneway_notnormal'] = stats.mstats.kruskalwallis(group1, group2, group3) # 在这里输入待分析的数据
print('若样本不服从正态分布,单因素方差分析的p值为{}'.format(pVal['anova_oneway_notnormal']))
if pVal['anova_oneway_notnormal'] < 0.01:
print('检验在0.01的显著性水平下显著,多组样本中至少存在一组样本均值与其它样本的均值不相等。')
return pVal
anova_oneway()
输出结果如下:
答:三台车床生产的滚珠直径不存在显著性差异。在单因素方差分析中,本题的因素是三台车床的工艺程度的一致性。