这里需要安装scipy和numpy, 如果没有安装,可以使用以下方法:


pip install scipy -i https://mirrors.aliyun.com/pypi/simple


t检验用于统计两组或多组样本是否有显著差异时,需要首先计算平均值,标准差,标准误等


首先看一个题目

有某一个工厂生产的零件, 其口径X(单位:毫米)服从正态分布N(u, σ^2), 现在从某一天生产的零件中随机抽出9个, 计算样本均值, 求μ的置信度为0.95的置信区间

正态分布N(μ,σ2)中,μ表示均值,就是钟形曲线的对称轴, σ^2为方差,σ为标准差。μ决定正态曲线的中心位置,标准差σ决定正态曲线的陡峭或扁平程度。

记这组数据为A = [ 14.6, 14.7, 15.1, 14.9, 14.8, 15.0, 15.1, 15.2, 14.7 ]

首先我们求平均值和标准差,有三种常用方法:

  1. scipy
求平均值

import scipy.stats as st

st.describe(A).mean

14.899999999999999

求标准差

st.tstd(A)

0.21213203435596423

  1. numpy
求平均值和标准差

import numpy as np

np.mean(np.array(A))

14.899999999999999


np.std(np.array(A), ddof=1)

0.21213203435596423

  1. pandas
求平均值和标准差

import pandas as pd

df = pd.DataFrame(A, columns=["A_value"])

df["A_value"].std(ddof=1)

0.21213203435596423


df["A_value"].mean()

14.899999999999999

如果需要求相对标准偏差, 也就是变异系数,

以scipy为例,可以直接使用variation函数


st.variation(A, axis=None, ddof=1)


以numpy的计算为例,


np.std(np.array(A), ddof=1)/np.mean(np.array(A))


假如这批产品服从的正态分布为N(μ,σ^2), 新生产的一个零件口径为14.5 , 那么这个新的零件合格吗?

合格的零件在置信水平为95%范围内,口径有一个上下区间范围, 需要求的是这个新零件是否落在区间内, 如果在这个区间内,那么就说明零件合格

求95%置信水平上下区间范围


st.t.interval(0.95, 9- 1, loc=np.mean(np.array(A)), scale=st.tstd(A)/np.sqrt(len(A)) )

#或者

st.t.interval(0.95, 9- 1, loc=np.mean(np.array(A)), scale=st.sem(A) )


也可以用st.t.ppf方式求这个区间范围

t_critical = st.t.ppf(1-0.025, df=8 )

confidence_upper = np.mean(np.array(A)) + t_critical * st.tstd(A)/np.sqrt(9)

confidence_lower = np.mean(np.array(A)) - t_critical * st.tstd(A)/np.sqrt(9)

confidence_upper

15.06305911613263

confidence_lower

14.736940883867367

可以看出来14.5不在这个范围内, 所以14.5不合格。


接下来我们看看Z检验和T检验

Z检验(Z-test)是一种用于检验一个样本的均值是否与已知的总体均值相等的统计方法。它通常用于以下情况:

总体参数已知: 当总体的均值和标准差已知时,可以使用Z检验来确定样本均值是否与总体均值相等

大样本: Z检验在样本容量较大(通常大于30)时表现最佳,因为它依赖于正态分布的性质。

连续数据: Z检验适用于连续型数据, 例如测量值, 而不适用于分类数据。

假设有另外两组零件, B和C组

## 用Z检验判断A组和C组是否有显著差异

C = [ 14.6, 14.6, 15.2, 14.9, 14.8, 15.0, 15.3, 15.2, 14.9 ]

mean_A, mean_C = np.mean(np.array(A)), np.mean(np.array(C))

stdevA, stdevC = np.std(np.array(A), ddof=1), np.std(np.array(A), ddof=1)

standard_err = np.sqrt((stdevA**2/len(A)) + (stdevC**2/len(C)))

z = mean_A - mean_C/standard_err

alpha= 0.5

critical_value = st.norm.ppf(1-alpha/2)

if np.abs(z) > critical_value:

    print("拒绝原假设: 两组零件的均值不相等或有显著差异")

else:

    print("接受原假设: 两组零件的均值相等或无显著差异")


我们这几批零件,由于抽样样本量较小,其实更适合采用t检验

t检验的方法

对于A组和B组,用t检验看他们两组是否有显著差异

B = [ 14.8, 14.7, 15.1, 14.9, 14.8, 15.0, 15.1, 15.0, 14.7 ]

st.ttest_ind(A,B,equal_var = True)


## 假设还有一组数据D

D = [ 14.3, 14.2, 15.1, 14.4, 14.8, 14.8, 15.1, 14.1, 14.1]

st.ttest_ind(A,D,equal_var = True)

TtestResult(statistic=2.3124139952957488, pvalue=0.03439504969031764, df=16.0)

ttest_ind函数返回的结果t统计量为2.31, p值为0.03, 显著性水平为0.05, 可知p值小于显著性水平,因此两组数据之间的平均值存在显著性差异。


参考: 

【Python-统计数学】如何在 Z/t 检验中快速计算真实 p 值? (zhihu.com)

95%置信区间计算方法,完全讲清楚stats.t.interval的用法-CSDN博客

python 根据样本 估计总体分布 python求样本标准差_mob6454cc714ea1的技术博客_51CTO博客