每天学习一点,每天进步一点。

声明:本人所有的原创,都是自己在学习过程中的记录点滴,不一定都是对的,肯定也会有一些错误的想法。所以大家看一看就好,不可尽信。当然也欢迎指出。


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 Noney = np.power(np.random.randn(1000),2)for i in range(1,n):y += np.power(np.random.randn(1000),2)return yx = 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()


大概的图形如上,可以看出T的密度函数是一个偶函数,并且当n无限大(一般大于40以后),T分布的密度函数,就会无限接近正态分布的密度函数了。所以当样本量大于40以后,T检验一般就转成了正态检验。因为差别就不大了。

n不大时,他和正态分布的密度函数还是有区别的,他的两边会比较厚,没有像正态分布那样一下就收。当然这就导致了他的头部比较低。因为总面积是1,不会变的。

所以n越大,两边越薄,收的越快,相对的头也就越高,当然两边不会收的比正态还要快。因为他的样本来自于正态。最终只会向正态分布趋近。


T检验方法

T检验是通过比较不同数据的均值,研究两组数据之间是否存在显著差异。

他是有前提条件的,T是用来检验标准差未知,服从标准正态分布的总体的均值。

T检验也分成三种

1.单样本T检验。

比较样本的均值avg(X),和给定的检验值μ,是否存在显著性差异。当总体分布是正态分布,如总体标准差未知且样本容量小于30,那么样本平均数与总体平均数的离差统计量呈t分布。
单总体t检验统计量为:

μ是给定的检验值。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检验。

用于检验两个服从正态分布的独立样本的均值是否有显著性差异。

  • 前提:这两个样本服从正态分布,且方差相等,那么这两个分布和总样本分布的方差会在推导的过程中消掉。

最终公式:

很多时候都会假设这两个样本均值相等,也就是零假设。那么μ1 - μ2 = 0。
公式变为:

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)

后面有用到其他函数的时候再添加。
其实很多时候代码很简单。主要就是思想。很多函数我开始也不知道什么意思,我是一个一个函数测试,试出来的。然后就会恍然大悟,原来如此。代码背后有前人留下的知识结晶。慢慢学习。


附一:
(如转载请标注出处)


T分布和T检验的理解,Python代码实现T检验的计算相关推荐

  1. Python计算向量夹角:详解向量的定义、向量点乘、向量模长和余弦定理,教你用Python代码实现向量夹角的计算。

    Python计算向量夹角:详解向量的定义.向量点乘.向量模长和余弦定理,教你用Python代码实现向量夹角的计算. 在数学中,向量是具有大小和方向的量.求取两个向量夹角的过程在很多数学应用中都十分常见 ...

  2. 白噪声检验python_使用python实现时间序列白噪声检验方式

    白噪声检验也称为纯随机性检验, 当数据是纯随机数据时,再对数据进行分析就没有任何意义了, 所以拿到数据后最好对数据进行一个纯随机性检验 acorr_ljungbox(x, lags=None, box ...

  3. 用Python代码批量处理CP2K动力学计算结果坐标文件(适合数万个分子坐标的批处理)

    文件中特定几个原子与分子上其它特定基团原子的距离中,筛选最短距离,比如统计在动力学计算中π-π堆叠的最近距离变化趋势等,代码适合计算化学相关领域人士阅读,该脚本可以极大提高处理具有重复单元的大文件工作 ...

  4. 目标检测基本概念理解之IoU(交并比)以及Python代码实现

    目标检测基本概念理解之IoU(交并比) 交并比理解 Python代码实现 计算IoU,矩形框的坐标形式为xyxy 计算IoU,矩形框的坐标形式为xywh 交并比理解 在检测任务中,使用交并比(Inte ...

  5. 时序模型预测结果:DM检验含义与python实现

    文章目录 DM检验概述 Python代码使用 DM检验概述 DM检验通常用于对比两个时间序列预测模型的预测结果,判断哪一个模型的预测结果更优. 假设: H0:两个模型具有相同的预测结果 H1:两个模型 ...

  6. 假设检验怎么做?这次把方法+Python代码一并教给你

    (图片付费下载于视觉中国) 作者 | Jose Garcia 译者 | 张睿毅 校对 | 张一豪.林亦霖 编辑 | 于腾凯 来源 | 数据派THU(ID:DatapiTHU) [导读]本文中,作者给出 ...

  7. 平稳性检验(描述性)与纯随机性检验

    这篇博客主要记录人大出版<应用时间序列分析>第二章的笔记.本章主要介绍进行时序分析前的预处理,即平稳性检验与纯随机性检验. 平稳性检验(描述性) 平稳性检验的方法分为描述性方法与计量性方法 ...

  8. Python人脸识别的简要介绍(附实例、Python代码)

    介绍 你是否意识到,每当你上传照片到Facebook上,平台都会用人脸识别算法来识别图片中的人物?目前还有一些政府在用人脸识别技术来识别和抓捕罪犯.此外,最常见的应用就是通过自己的脸部解锁手机. 计算 ...

  9. 如何防止你的代码被窃取?Python代码加密方案汇总(带实例验证)

    Python代码加密方案汇总 文章目录 Python代码加密方案汇总 需求描述 基础:Python文件格式 `.py` python源代码 `.pyc` 编译得到的字节码文件 `.pyo` 编译优化后 ...

  10. 人脸识别的简要介绍(附实例、Python代码)

    作者:Guest Blog:翻译:王雨桐:校对:蒋雨畅: 本文约2500字,建议阅读10分钟. 本文将介绍人脸识别的基本思路和对代码进行简要分析. 介绍 你是否意识到,每当你上传照片到Facebook ...

最新文章

  1. 【转载】 Python动态生成变量
  2. Android Jetpack组件总览
  3. mtd-utils编译
  4. sqlplus中调用shell_(转)shell 调用sqlplus各种情况示例
  5. nginx的模块开发
  6. ffmpeg - AVPacket内存问题分析(AVFrame一样的)
  7. 软件架构设计的6大原则
  8. 在Mac上唤出「快速备忘录」的开启与关闭设置教程
  9. linux安装selenium+chrome+phantomjs
  10. kafka消费者分区的分配的三种机制
  11. AJPFX分析int 和integer的区别
  12. 浪潮服务器u盘安装系统未找到任何驱动器,u盘重装win10时找不到任何驱动器
  13. java中一个数轮流除去所有数_Java实现A、B两人轮流从盒中取球,取出球的数目必须是:1,3,7或者8个...
  14. 消息队列 (1) mac安装RabbitMQ
  15. 软件开发版本号命名规则
  16. overload java_Java方法重载Overload原理及使用解析
  17. 什么是MTU?为什么MTU值普遍都是1500?
  18. 个人网站建设教程|本地网站环境搭建|网站制作教程
  19. react native 面试题
  20. java h5实现视频播放_Springboot项目使用html5的video标签完成视频播放功能

热门文章

  1. 7个开源好用的管理系统,建议收藏加转载
  2. C51单片机流水灯C代码
  3. 低速硬件接口之RS485接口自收发隔离多节点分享
  4. RFID无线射频识别技术
  5. access数据库窗体设计实验报告_Access2010实验报告
  6. 原子结构示意图全部_原子结构示意图的分类和详细知识点
  7. 金士顿U盘格式化后不能识别,0字节存储空间
  8. Flask-MDict搭建在线Mdict词典服务
  9. 社区论坛小程序源码,功能齐全,简洁漂亮,前端+后端
  10. 多媒体计算机网络解释,多媒体-名词解释及填空解读.doc