
一、基本知识
数据的种类
我们都知道,一般数据可以分为两类,即定量数据(数值型数据)和定性数据(非数值型数据),定性数据很好理解,例如人的性别,姓名这些都是定性数据。
定量数据可以分为以下几种:
- 定类数据
表现为类别,但不区分顺序,是由定类尺度计量形成的。一般可以从非数值型数据中编码转换而来,数值本身没有意义,只是为了区分类别做出的数值型标识,比如1表示男性,0表示女性。定类数据无法比较大小,运算符也无意义。
- 定序数据
表现为类别,但有顺序,是由定序尺度计量形成的。运算符也没有意义,例如比赛中的排名,不能说第一名到第二名之前的差距与第二名到第三名之间的差距相等。
- 定距数据
表现为数值,可进行加、减运算,是由定距尺度计量形成的。定距数据的特征是没有绝对的零点,例如温度,不能说10摄氏度的一倍是20摄氏度。因此乘、除法对于定距数据来说也是没有意义的。
- 定比数据
表现为数值,可进行加、减、乘、除运算,是由定比尺度计量形成的。定比数据存在绝对的零点。例如价格,100元的2倍就是200元。
T检验
T检验(T-test)主要是为了比较数据样本之间是否具有显著性的差异。
一般用于定量数据的检测(定类数据采用卡方检验),T检验的前提条件是假设样本服从或者近似服从正态分布。
针对不同的场景,主要有以下三种检验方法:
- 独立样本的T检验
主要用于定量数据和定类数据的差异关系研究,例如有一个班的学生数据,如果学生的成绩服从正太分布,想要研究身高和成绩的关系,就需要用到该方法,如果不服从正态分布,可采用MannWhitney检验。
- 单一样本的T检验
主要用于检验某单一的定量数据差异,例如一个班的成绩是否显著大于70分。同样需要满足正态分布的假设,若不满足可采用单样本Wilcoxon检验。
- 配对T检验
主要用于检验样本中配对数据的差异性,例如一个班上男、女生的成是否显著差异,不满足正态分布的话,可采用Wilcoxon检验。
T检验主要通过样本均值的差异进行检验,统计学上以“总体间没差别”计算显著性水平H0,拒绝原假设H0的最小显著性水平称为检验的p值,来检验假设的结果。
例如,假设一个班上男女生的成绩不存在差异,显著性水平为0.05,可理解为只有5%的概率会出现“男女生差异显著”的情况,计算出的检验p值若小于0.05,则可以拒绝原假设。反之不能拒绝原假设。
此外,两个独立样本的T检验,通常需要先进行F检验(方差齐次检验),检验两个独立样本的方差是否相同,若两总体方差相等,则直接用t检验,若不等,可采用t’检验或变量变换或秩和检验等方法。也就是说进行两独立样本的T检验时,需首先验证两样本的方差是否相同。
python的机器学习工具包scipy中,有统计分析模块stats,其中就有T检验函数:
from scipy import stats
#单一样本的t检验,检验单一样本是否与给定的均值popmean差异显著的函数,第一个参数为给定的样本,第二个函数为给定的均值popmean,可以以列表的形式传输多个单一样本和均值。
stats.ttest_1samp(a, popmean, axis=0, nan_policy='propagate')
#独立样本的T检验,检验两个样本的均值差异,该检验方法假定了样本的通过了F检验,即两个独立样本的方差相同
stats.ttest_ind(a, b, axis=0, equal_var=True, nan_policy='propagate')
#检验两个样本的均值差异(同上),输出的参数两个样本的统计量,包括均值,标准差,和样本大小
stats.ttest_ind_from_stats(mean1, std1, nobs1, mean2, std2, nobs2, equal_var=True)
#配对T检验,检测两个样本的均值差异,输入的参数是样本的向量
stats.ttest_rel(a, b, axis=0, nan_policy='propagate')
F检验
F检验(F-test),最常用的别名叫做联合假设检验(英语:joint hypotheses test),此外也称方差比率检验、方差齐性检验。它是一种在零假设(null hypothesis, H0)之下,统计值服从F-分布的检验。其通常是用来分析用了超过一个参数的统计模型,以判断该模型中的全部或一部分参数是否适合用来估计母体。
其计算过程如下:


计算得到的F值,再与对应F分布表查询,若大于表中的值,则接受原假设(两样本的方差相同),否则拒绝原假设。

stats模块中虽然没有f检验的函数,但是却有着f分布的生成函数,可以利用其进行f检验:
from scipy.stats import f
F = np.var(a) / np.var(b)
df1 = len(a) - 1
df2 = len(b) - 1
p_value = 1 - 2 * abs(0.5 - f.cdf(F, df1, df2))
也可以引入sklearn进行f检验
from sklearn.feature_selection import f_classif
f_class, pvalue = f_classif(X,y)
print([i for i,p in enumerate(pvalue) if p<0.05 ])#p值
卡方检验
卡方检验(chi-square test),也就是χ2检验,用来验证两个总体间某个比率之间是否存在显著性差异。卡方检验属于非参数假设检验,适用于布尔型或二项分布数据,基于两个概率间的比较,早期用于生产企业的产品合格率等。
卡方检验是以χ2分布为基础的一种常用假设检验方法,它的无效假设H0是:观察频数与期望频数没有差别。该检验的基本思想是:首先假设H0成立,基于此前提计算出χ2值,它表示观察值与理论值之间的偏离程度。根据χ2分布及自由度可以确定在H0假设成立的情况下获得当前统计量及更极端情况的概率P。如果当前统计量大于P值,说明观察值与理论值偏离程度太大,应当拒绝无效假设,表示比较资料之间有显著差异;否则就不能拒绝无效假设,尚不能认为样本所代表的实际情况和理论假设有差别。(摘自智库百科)。
卡方检验的基本公式为:

A 为观察值,E为理论值,k为观察值的个数,最后一个式子实际上就是具体计算的方法了 n 为总的频数,p为理论频率,那么n*p自然就是理论频数(理论值)。
卡方检验是以χ2分布为基础的一种常用假设检验方法,χ2分布,就叫做卡方分布。若k 个随机变量Z1、……、Zk 相互独立,且数学期望为0、方差为 1(即服从标准正态分布),则随机变量X:

记作:

在做卡方检验时,通常针对的数据主要为定类数据,例如样本中是男生的人数,研究的问题通常是两个类别之间是否有显著关联。
python中stats模块,同样有卡方检验的计算函数,sklearn中的特征选择中也可以进行卡方检验。
from scipy import stats
stats.chi2_contingency(observed, correction=True, lambda_=None)
from sklearn.feature_selection import chi2
chi2_value, pvalue = chi2(X,y)
print([i for i,p in enumerate(pvalue) if p<0.05 ])
互信息
互信息(Mutual Information)是信息论里一种有用的信息度量,它可以看成是一个随机变量中包含的关于另一个随机变量的信息量,1表示完全关联,0表示没有联系。也就是说,互信息可以看成,从某一个随机变量可以获取另外一个随机变量的信息程度。反应在概率上,设x,y为两个随机变量,则有:

我们都知道,熵也是信息增益中的一种概念,按照熵的定义有

即,加上了Y变量后,对X的变量的熵增加了多少。或理解为x的后验概率和先验概率的比值(的对数),称为互信息。
sklearn中计算互信息较简单
from scipy import stats
stats.chi2_contingency(observed, correction=True, lambda_=None)
from sklearn.feature_selection import mutual_info_classif
minfo = mutual_info_classif(X, y, discrete_features=False ,n_neighbors=3)
print(minfo)
mutual_info_classif中含有两个重要的参数:
- discrete_features:为{‘auto’, bool, array_like}, default ‘auto’,表示特征是否离散,array_like可以指定哪些特征是离散的哪些是连续的
- n_neighbors:int, default 3,n_neighbors是用来估计随机变量互信息的近邻数,大的n_neighbors可以降低估计器的方差,但会造成偏差
二、相关案例
T检验分别单样本T检验、独立样本T检验、配对样本T检验。
T检验要求样本满足两个条件:
1、样本服从正态分布。
2、各样本之间是独立的。
单样本T检验:推论差异发生的概率,从而比较两个平均数的差异是否显著。通俗的说就是用样本均数和已知总体均数进行比较,来观察此组样本与总体的差异性。
例子:验证矿泉水瓶容量是否为550ml?
现在有16个矿泉水瓶样本,分别为558、551、542、557、552、547、551、549、548、551、553、557、548、550、546、552
步骤一:计算样本均值
=(558+551+…+552)/8=550.75
步骤二:计算样本标准差
,即((558-550.75)^2+(542-550.75)^2+..)/16=4.25
步骤三:计算统计量
,其中
为整体均值550,n为样本数16,所以结果为(550.75-550)/(4.25/4)=0.706
步骤四:查表得到理论统计量0.821,与实际统计量0.706对比大小。实际统计量小于理论统计量,说明矿泉水瓶是合格的。从计算公式也能看出来,如果所有样本容量都是550,那么统计量就是0,故统计量越小越好。查表时涉及到置信度和自由度,置信度常见的就是90%、95%、99%这三个,自由度通俗的说就是抽样样本数-1,即15。
独立样本T检验:检验两组非相关样本数据的差异性。
例子:验证两个不同生产间生产的矿泉水瓶容量的差异。再来一组16个矿泉水瓶样本,分别为555、553…
计算公式如下:
t 为统计量,
、
代表两组数据的均值,
、
代表样本数,
、
代表两组数组的方差。
从计算公式能看出来,t越小则两组数据差异性越小。具体多小就根据置信度和自由度查表对比理论统计量的大小得出两组数据差异性是否显著。
配对样本T检验:检验一组样本数据在不同条件或不同时间下的差异性。它是单样本T检验的扩展版。
例子:验证同一个生产间上一月与下一月生产的矿泉水瓶容量的差异。
假设有一个生产间
7月生产的4个矿泉水瓶容量为551、553、549、547。
8月生产的4个矿泉水瓶容量为552、553、548、547。
步骤一、计算两组样本数据差值d,即551-552,553-553,549-548,547-547
步骤二、计算差值d的平均值
,即(-1+0+1+0)/4=0
步骤三、计算差值d的标准差
,计算公式为
步骤四、计算统计量t,计算公式为
,其中
为理论总体差值均值0(同一生产间生产的两组产品应该是一样大的),n为样本数4。同样的,t也是越小越说明差异性不显著,具体多小就根据置信度和自由度查表对比理论统计量的大小得出两组数据差异性是否显著。对比单样本T检验,可以看出它们的计算过程是很相似的。
F检验:判断两组数据是否存在显著差异。
步骤一:分别计算两组样本数据的均值
步骤二:分别计算两组样本数据的标准方差的平方
步骤三:计算两组样本数据标准方差的平方比
,把平方大的作为分子,小的作为分母。得到F值后根据两组数据的自由度和置信度查表对比,同样的,F值也是越小越说明差异性不显著。
卡方检验:统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,如果卡方值越大,二者偏差程度越大;反之,二者偏差越小;若两个值完全相等时,卡方值就为0,表明理论值完全符合。
例子:一枚硬币投50次,根据观察结果判断硬币是否均横,即正反面出现概率是否一样。
正 | 反 | |
实际次数 | 28 | 22 |
理论次数 | 25 | 25 |
卡方值计算公式:
,即(28-25)^2/25+(22-25)^2/25=0.72,再根据自由度和置信度查表对比,此处自由度跟T检验不一样,它是(表格行数-1)*(表格列数-1)=(2-1)*(2-1)=1。同样的,卡方值也是越小越说明差异性不显著。
F检验和T检验都是定量检验,F检验比T检验计算更简单,卡方检验是定类检验。
参考链接:
恭喜你,又看完一篇文章,扫码领个红包吧!