参考资料:python统计分析【托马斯】
一些常见的连续型分布和正态分布分布关系紧密。
t分布:正态分布的总体中,样本均值的分布。通常用于小样本数且真实的均值/标准差不知道的情况。
卡方分布:用于描述正态分布数据的变异程度。
F分布:用于比较两组正态分布的变异程度。
1、t分布
1908年,在都柏林的吉尼斯啤酒厂工作的W. S. Gosset被小样本的问题所在吸引,比如说大麦的化学性质,其样本量经常低至3左右。由于这些测量中,均值的真实方差并不知道,所以必须用均值的标准误来近似。样本均值和标准误之间的比例服从一个未知的分布,直到笔名为“Student”的Gosset解决了这个问题。对应的分布就是t分布,并在大样本量时收敛于正态分布。由于Gosset的笔名叫“Student”,该分布又叫做“Student”分布。
由于大多数情况下,总体的均值和方差是未知的,我们在分析样本数据时一般都是处理t分布。t统计量可表示为:
t分布的一个非常常见的应用就是计算均值的置信区间。95%置信区间(CI)的宽度,也就是说,这个区间在95%的情况下包含了真实的均值,该置信区间和包含95%样本均值的总体均值的宽度相同。
下面的例子展示了对于n=20来说,如何计算t值并求其95%置信区间。95%置信区间的下限是大于分布2.5%的值;而其上限值是小于分布的97.5%的值。这些只可以通过百分点函数或逆生存函数获得。作为对比,我们也计算出正态分布对应的值。
# 导入库
import numpy as np
from scipy import stats
# 设置样本容量
n=20
# 计算自由度
df=n-1
# 设置显著性水平
alpha=0.05
# 利用逆生存函数获取t分布对应的位点值
stats.t(df).isf(alpha/2)
# 正态分布对应的位点值
stats.norm.isf(alpha/2)
# 当然在python可以用一行代码获得执行区间
# 比如计算样本容量为20,样本均值为10,标准差为5对应的均值置信区间
ci=stats.t.interval(alpha,df=19,loc=10,scale=10/5)
ci
2、卡方分布
卡方分布以一种很简单的方式和正态分布产生关联:如果一个随机变量X服从正态分布,那么X^2服从卡方分布,其自由度是1。n个独立的标准正态随机变量平方和有n个自由度。
示例:
一个药品制造商街道一个药品订单,需要发货的药片的标准差为σ=0.05。从下一批次的药品开始,n=13的随机样本的重量为3.04g、2.94g、3.01g、3.00g、2.94g、2.91g、3.02g、3.04g、3.09g、2.95g、2.99g、3.10g、3.02g。
问:标准差是否高于准许值?
答:由于卡方分布描述了来自标准正态分布的随机变量的平方和,我们不得不在计算相应的CDF值之前正态化我们的数据:
解释:如果这一批药来自标准差为0.05的一个分布,那么得到一个大于等于我们观察到的卡方值的可能性大约是19%。所以这并不反常。换句话说,这批药符合期望的标准差。
代码如下:
# 导入库
import numpy as np
from scipy import stats
# 录入数据
data=np.r_[3.04,2.94,3.01,3.00,2.94,2.91,3.02,3.04,3.09,2.95,2.99,3.10,3.02]
# 设置目标标准差
sigma=0.05
# 设置卡方分布
chi2Dist=stats.chi2(len(data)-1)
# 计算统计量
statistic=sum(((data-np.mean(data))/sigma)**2)
# 计算统计量对应的生存函数
chi2Dist.sf(statistic)
3、F分布
该分布以Ronald Fisher先生的名字命名,他发明了F分布来决定ANOVA(方差分析)中的关键值。
如果想要调查两个组别是否具有相同的方差,我们就必须计算两组标准差平方的比值:
其中,S_x是第一个样本的样本标准差,S_y是第二个样本的样本标准差。
这个统计量的分布就是F分布。在ANOVA中的应用来说,F分布的临界值经常通过3个变量计算得到:
①ANOVA分子自由度,
②ANOVA分母自由度,
③显著性水平。
ANOVA比较了两个不同样本之间的方差大小,是用大的方差除以小的方差来完成的。最终的F统计量的公式如下:
其中和分别是样本1和样本2的卡方统计量,r1和r2是他们的自由度。
示例
我们想比较两种测量眼睛运动的方法的精确度。这两种方法有不同的精确度和准确度。精确度描述了真实值和测量值之间的差异,而准确度由测量的变异程度决定。我们想用这个检验来决定两种方法的准确度是否相同,还是其中一种方法比另一种方法更准确。
方法1数据:[20.7,20.3,20.3,20.3,20.7,19.9,19.9,19.9,20.3,20.3,19.7,20.3]
方法2数据:[19.7,19.4,20.1,18.6,18.8,20.2,18.7,19.0]
计算代码如下:
# 导入库
import numpy as np
from scipy import stats
# 录入数据
method1=np.array([20.7,20.3,20.3,20.3,20.7,19.9,19.9,19.9,20.3,20.3,19.7,20.3])
method2=np.array([19.7,19.4,20.1,18.6,18.8,20.2,18.7,19.0])
# 计算f值
f_val=np.var(method1,ddof=1)/np.var(method2,ddof=1)
# 设置F分布
fd=stats.f(len(method1)-1,len(method2)-1)
p_onetail=fd.cdf(f_val)
print(p_onetail)
代码运行结果可知,p=0.019,所以我们拒绝原假设(两种方法有相同的准确度)。