每天学习一点,每天进步一点。
声明:本人所有的原创,都是自己在学习过程中的记录点滴,不一定都是对的,肯定也会有一些错误的想法。所以大家看一看就好,不可尽信。当然也欢迎指出。
T分布
定义,有来自标准正态分布的样本X ~ N(0,1),和来自卡方n分布的Y ~ X2(n),
那么有 Z= X/√(Y/n) 成为符合自由度为n的T分布
我们用Python代码画一下他的图形
# 给一个自由度,返回这个自由度的卡方分布 X²(n)
def product(n):
n = np.ceil(n).astype(int)
if n <=0:return None
y = np.power(np.random.randn(1000),2)
for i in range(1,n):
y += np.power(np.random.randn(1000),2)
return y
x = np.random.randn(1000)
df = 3
y = product(df)
# 根据公式生成T分布
z = x/(np.sqrt(y/df))
# plt.hist(z,bins=100,density=True)
pd.Series(x,name="正态分布").plot(kind="kde",figsize=(12,5),legend="best")
z = pd.Series(z,name="T分布")
z.plot(kind="kde",legend="best")
plt.grid()
plt.show()
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201230173405486.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1BZX3NtYWxsSA==,size_16,color_FFFFFF,t_70#pic_center)
大概的图形如上,可以看出T的密度函数是一个偶函数,并且当n无限大(一般大于40以后),T分布的密度函数,就会无限接近正态分布的密度函数了。所以当样本量大于40以后,T检验一般就转成了正态检验。因为差别就不大了。
n不大时,他和正态分布的密度函数还是有区别的,他的两边会比较厚,没有像正态分布那样一下就收。当然这就导致了他的头部比较低。因为总面积是1,不会变的。
所以n越大,两边越薄,收的越快,相对的头也就越高,当然两边不会收的比正态还要快。因为他的样本来自于正态。最终只会向正态分布趋近。
T检验方法
T检验是通过比较不同数据的均值,研究两组数据之间是否存在显著差异。
他是有前提条件的,T是用来检验标准差未知,服从标准正态分布的总体的均值。
T检验也分成三种
1.单样本T检验。
比较样本的均值avg(X),和给定的检验值μ,是否存在显著性差异。当总体分布是正态分布,如总体标准差未知且样本容量小于30,那么样本平均数与总体平均数的离差统计量呈t分布。
单总体t检验统计量为:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201230195952707.JPG#pic_center)
μ是给定的检验值。s是样本的标准差。
至于他为什么符合n-1的T分布。在最后的附一,已经写了证明的过程。
单样本的检验,零假设都是样本的均值和给定的检验值没有差异。即相等,然后根据上面公式算出一个t值,对应T分布的概率密度函数上找到这个值是不是在置信区间或者在可拒绝阈。
比如我们想知道这一组数据[15.6,16.2,22.5,20.5,16.4,19.4,16.6,17.9,12.7,13.9],他是随机抽样产生的某汽车厂生产汽车的排放标准数,那么这个汽车厂生产的汽车排放标准是不是超过了20?
Python代码:
from scipy import stats
# 假设均值等于20。
# 这里用的函数是单样本函数
stats.ttest_1samp([15.6,16.2,22.5,20.5,16.4,19.4,16.6,17.9,12.7,13.9],20.0)
out:Ttest_1sampResult(statistic=-3.001649525885985, pvalue=0.014916414248897527)
对于这个结果,第一个值时计算的t值,第二个是这个值对应的p值(双尾)。
这里的P不大于5%,所以拒绝原假设。而且由公式知道给定的检验值越大,t值越小,概率也就会越小。所以我们的样本数据的平均值应该小于20,再进一步我们可以知道他的平均值范围在16到19范围内。
如下:
16—p=0.24599052278154576
17—p=0.8609030589711943
18—p=0.40156982970353694
19—p=0.08417468488443326
# 这个函数也可以传入一个要验证的结果的数组。他会每一个都给一个t和一个p
stats.ttest_1samp([15.6,16.2,22.5,20.5,16.4,19.4,16.6,17.9,12.7,13.9],
[15.0,16.0,17.0,18.0,19.0])
out:Ttest_1sampResult(
statistic=array([ 2.30161819, 1.24096464, 0.1803111 , -0.88034244, -1.94099598]),
pvalue=array([0.0468751 , 0.24599052, 0.86090306, 0.40156983, 0.08417468])
)
2.独立样本T检验。
用于检验两个服从正态分布的独立样本的均值是否有显著性差异。
- 前提:这两个样本服从正态分布,且方差相等,那么这两个分布和总样本分布的方差会在推导的过程中消掉。
最终公式:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201230205215166.JPG#pic_center)
很多时候都会假设这两个样本均值相等,也就是零假设。那么μ1 - μ2 = 0。
公式变为:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201230205727915.JPG#pic_center)
S1和S2是两个样本的方差。自由度是n1+n2-2
对于这两个样本计算出来的t值,有对应的P值,这个值决定我们能不能拒绝原假设。
那么问题来了,方差如果不等呢?
- 当这两个样本方差不相等的时候,要用到不等方差t检验。这个时候公式比较复杂,就不赘述。我找了一篇帖子。很详细。看完肯定有收获。一文详解t分布
当然对于我们来说,有程序,不必记那么多繁琐的公式,只要你脑子里有这个印象就行。
比如有两组数
s1 = [620.16,866.50,641.22,812.91,738.96,899.38,760.78,694.95,749.92,793.94]
s2 = [958.47,838.42,788.90,815.20,783.17,910.92,758.49,870.80,826.26,805.48]
我们要检验他们的均值是否有差异。
# 参数equal_var,就是他们是否具有相同的方差,如果不具有就用false
stats.ttest_ind(s1,s2,equal_var=True)
Ttest_indResult(statistic=-2.2501929924940756, pvalue=0.03718077010540171)
这个时候达不到我们的5%显著性水平,拒绝零假设。他们的均值有显著性差异。
并且我们观察到t值时负数。所以s1的均值应该小于s2的均值。
注:这两个数组不一定有相同的样本数量,即维度不一定要相等。
3.配对样本T检验。
要求:
这种一般是检验同一个对象进行不同的处理得到的观测数据,或者前后对比的观测数据。或者检验某一种药物是不是有效的数据。
他们必须是同样的维度,同样的方差。
因为配对样本检测,即可以看成他们的差值的单样本检测。所以维度不一样检测不了
比如上面用过的组数
s1 = [620.16,866.50,641.22,812.91,738.96,899.38,760.78,694.95,749.92,793.94]
s2 = [958.47,838.42,788.90,815.20,783.17,910.92,758.49,870.80,826.26,805.48]
他们均值有没有差异性。
方法一:
# s1,s2有相同维度
stats.ttest_rel(s1,s2)
Ttest_relResult(statistic=-2.1691050163825625, pvalue=0.058198251037855704)
方法二:
# 利用他们的差值,进行单样本检测,也就是和0比较。看他们的差值和0的差异性
s1 = np.array(s1)
s2 = np.array(s2)
stats.ttest_1samp(s1-s2,0)
Ttest_1sampResult(statistic=-2.1691050163825625, pvalue=0.058198251037855704)
当然结果是一样的
注意,配对样本和独立样本之间的差别。他们用的地方不同,而且他们两的自由度也不同。
独立样本的自由度是两组数组的维数相加减2,即n1+n2-2
而配对样本的自由度,是一个样本的维数-1,即n-1。
Python中常用的t检验函数
置信区间函数
# 自由度为3的95置信区间的值区间
stats.t.interval(0.95,df=3)
(-3.182446305284263, 3.182446305284263)
百分比点函数
# 左尾占比2.5%面积的,自由度为9的,这个t值时多少
stats.t.ppf(q=0.025,df=9)
#同下面这个函数,右尾为97.5%是这个t是多少。这两个函数一个左尾一个右尾。
# 这也叫反生存函数
stats.t.isf(0.975,9)
上面的结果都是:
-2.262157162740992
累计分布函数
这个t值,自由度为9时,对应的左尾占比面积。和上面的ppf是相反的
stats.t.cdf(-2.262157162740992,df=9)
0.02500000000233781
生存函数
# 给一个t值,计算他右尾的面积。这个函数就是1-cdf。一个左一个右。
stats.t.sf(-2.262157162740992,df=9)
后面有用到其他函数的时候再添加。
其实很多时候代码很简单。主要就是思想。很多函数我开始也不知道什么意思,我是一个一个函数测试,试出来的。然后就会恍然大悟,原来如此。代码背后有前人留下的知识结晶。慢慢学习。
附一:
(如转载请标注出处)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201230172245379.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1BZX3NtYWxsSA==,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201230172939424.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1BZX3NtYWxsSA==,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201230172958727.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1BZX3NtYWxsSA==,size_16,color_FFFFFF,t_70#pic_center)