GitModel 统计分析假设检验之方法论与一元数值检验

3 篇文章 0 订阅
3 篇文章 0 订阅

本文的假设检验从数据出发,直接检验数据的某些性质。

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

假设显著性水平为 \alpha = 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)

输出结果:

对于甲数据
对于乙数据

 

 答:由于 p > \alpha ,因此甲/乙车床生产的滚珠直径服从正态分布。

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值大于\alpha,因此可以判断甲/乙车床生产的滚珠直径的方差不存在显著性差异。

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()

 输出结果如下:

 答:三台车床生产的滚珠直径不存在显著性差异。在单因素方差分析中,本题的因素是三台车床的工艺程度的一致性。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周好蠢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值