方差分析ANOVA特征筛选

  • 一、方差分析(Analysis of Variance,简称ANOVA)基本原理
  • 二、连续变量和离散变量的方差分析
    • 2.1、提出假设
    • 2.2、采集数据
    • 2.3、设计统计量
    • 2.4、事件发生概率计算与统计推断
  • 三、python实现卡方检验
    • 3.1、自实现方差分析
    • 3.2、借助scipy进行方差分析
    • 3.3、借助sklearn进行方差分析

一、方差分析(Analysis of Variance,简称ANOVA)基本原理

方差分析(ANOVA)又称“变异数分析”或“F检验”,是R.A.Fister发明的,用于两个及两个以上样本均数差别的显著性检验。

  • step1、提出假设:判断连续变量和离散变量之间是否独立

  • step2、如何构造统计量来判断两类样本均值差异程度

假设目前有n条数据被分成k组(即标签有k个类别),其中第j个类别中包含njn_jnj​条样本,并且xi,jx_{i,j}xi,j​表示第j个类别的第i条样本,则有样本整体偏差计算公式如下:
SST=∑j=1k∑i=1nj(xij−xˉ)2SST = \sum^k_{j=1}\sum^{n_j}_{i=1}(x_{ij}-\bar x)^2SST=j=1∑k​i=1∑nj​​(xij​−xˉ)2

计算每个组内的样本与均值的差值的平方和,则可以算得如下结果:

SSEj=∑i=1nj(xij−xjˉ)2SSE_j = \sum^{n_j}_{i=1}(x_{ij}-\bar {x_j})^2SSEj​=i=1∑nj​​(xij​−xj​ˉ​)2

即第j组的组内偏差平方和,其中xjˉ=∑i=1njxijnj\bar {x_j} = \frac{\sum_{i=1}^{n_j}x_{ij}}{n_j}xj​ˉ​=nj​∑i=1nj​​xij​​,为第j组数据的组内均值。而k个分组的组内偏差总和为:

SSE=∑j=1kSSEj=∑j=1k∑i=1nj(xij−xjˉ)2SSE = \sum_{j=1}^k SSE_j = \sum_{j=1}^k\sum^{n_j}_{i=1}(x_{ij}-\bar {x_j})^2SSE=j=1∑k​SSEj​=j=1∑k​i=1∑nj​​(xij​−xj​ˉ​)2

  SSE即为组内偏差平方和。此时(在欧式空间情况下)则可以通过数学公式推导得出,SST和SSE之间的差值如下:

SSB=SST−SSE=∑j=1knj(xjˉ−xˉ)2SSB=SST-SSE=\sum_{j=1}^k n_j (\bar{x_j}-\bar x)^2SSB=SST−SSE=j=1∑k​nj​(xj​ˉ​−xˉ)2

即每个组的均值和总体均值的差值的平方加权求和的结果,其中权重就是每个组的样本数量。SSB也被称为组间偏差平方和。

  在实际计算过程中,SST、SSE和SSB都可以看成是方差计算,其中SST衡量的数据整体方差、SSE衡量的组内方差,而SSB则衡量的是每一组的均值分布的方差,即每一组均值和整体均值的离散程度。

  在特征选择中,希望组内偏差越小越好、而组间偏差越大越好,因为这样就能证明组内数据彼此更加相似、而不同分组的数据彼此会更加不同。同样的观点也适用于当前情况,即在给定一个离散变量和连续变量的时候,我们就可以利用离散变量的不同取值对连续变量进行分组(例如根据是否流失,划分为流失用户组和非流失用户组),此时SST是一个确定的值,并且如果SSB很大、SSE很小,则说明不同组的组间差异越大、组内差异较小,而所谓的组间差异,其实也就是由均值的不同导致的,SSB越大则不同组的均值都和整体均值差异较大,并且由于此时SSE很小,也就说明每个组内的取值和该组的均值比较接近,此时我们会更倾向于判断不同组是取自不同总体;而反之,如果SSB很小而SSE很大,则倾向于判断不同组是取自同一个总体。

  • 如何衡量不同组均值差异,构造统计检验量F:

F=MSBMSE=SSB/dfBSSE/dfE=SSB/(k−1)SSE/(n−k)F=\frac{MSB}{MSE}=\frac{SSB/df_B}{SSE/df_E}=\frac{SSB/(k-1)}{SSE/(n-k)}F=MSEMSB​=SSE/dfE​SSB/dfB​​=SSE/(n−k)SSB/(k−1)​

此处dfbdf_bdfb​就是统计量SSB的自由度,类似于卡方检验过程中(行数-1*列数-1)用于修正卡方值,dfbdf_bdfb​也是一个用于修正SSB计算量的值——为了防止分组的数量影响了SSB的计算结果;类似的dfEdf_EdfE​就是SSE的自由度,用于修正样本数量对SSE计算结果的影响。目前来说我们并不用深究自由度的学术含义,只需要知道统计检验量会利用自由度对统计量进行数值上的修正,并且这些修正的值会在最一开始就确定,例如k(分成几类)、n(数据总量)等,并不会受到实际数据取值大小的影响。

  而F作为统计检验量,也是有对应概率分布的,即满足F(k-1, n-k)的概率分布,并且根据此前介绍的基本原理我们可以判断,F值越大则SSB相比SSE越大,也就是组间差异越大、不同组的数据更倾向于抽样自不同总体、零假设成立的可能性(p值)越低,反之则零假设成立的可能性就越高。

注意的是,基于方差分析的基本流程,即对分组后的变量进行均值方差计算等过程,我们不难发现方差分析其实并不适用于两个离散变量之间的检验;离散特征的检验完全可以交给卡方检验

  • one-way ANOVA
      所谓one-way ANOVA其实是特指单因素方差分析,即只有一个因素导致的数据分组,在当前情况下就是指依据是否流失这一个因素对用户进行分组。而除了单因素方差外,还有two-way ANOVA,指的是双因素方差分析,此时情况会更加复杂,我们即需要考虑不同因素对结果的影响,还要考虑双因素之间是否还有交互作用。对于特征筛选来说,由于我们往往是针对标签进行分组,因此不会涉及双因素方差分析的问题。
  • 方差分析与F检验
      尽管我们在方差分析中用到了F检验,但方差分析不同于F检验。F检验泛指一切借助F值进行检验的过程,而方差分析只是其中一种。换而言之,只要假设检验中的检验统计量满足F分布,则该过程就用到了F检验。
  • F检验与卡方检验
      从理论上来说,F计算量的分子和分母都是服从卡方分布的,F=SSB/(k−1)SSE/(n−k)F=\frac{SSB/(k-1)}{SSE/(n-k)}F=SSE/(n−k)SSB/(k−1)​中,分子是服从自由度为n-k的卡方分布,而分母是服从自由度为n-k的卡方分布,且能够证明二者相互独立。也就是说,统计检验量F是借助卡方分布构建的,更进一步来说,只要是相互独立的、服从卡方分母的随机变量,相除构成的随机变量都是服从F分布的。而F统计量的标准表达公式如下:F=X1/d1X2/d2F=\frac{X_1/d_1}{X_2/d_2}F=X2​/d2​X1​/d1​​其中X1X_1X1​和X2X_2X2​相互独立且服从自由度为d1d_1d1​、d2d_2d2​的卡方分布,此时随机变量F服从自由度为(d1,d2d_1,d_2d1​,d2​)的F分布。
  • 方差分析与t检验
      另外需要拓展了解的一点是,除了方差分析以外,还有一种检验也能判断两个样本的均值是否一致,也就是t检验。所不同的是,方差分析能够同时检验多个样本,也就是如果是三分类标签、则对应三个不同的样本,卡方检验能够同时判断三个样本是否取自同一总体,进而判断该特征是否可用(从特征筛选的角度来看)。而t检验只能两两比较,很明显应如果是用于特征筛选环节,t检验并不够高效。而t检验、卡方检验和方差分析,被称作统计学三大检验。

二、连续变量和离散变量的方差分析

2.1、提出假设

这里我们选取月消费金额和标签作为分析的对象,方差分析零假设如下:

H0:流失用户群体和非流失用户群体的月消费金额没有差异H1:流失用户群体和非流失用户群体的月消费金额存在显著差异H_0:流失用户群体和非流失用户群体的月消费金额没有差异\\ H_1:流失用户群体和非流失用户群体的月消费金额存在显著差异H0​:流失用户群体和非流失用户群体的月消费金额没有差异H1​:流失用户群体和非流失用户群体的月消费金额存在显著差异

这里有两点需要解释,其一是该假设如何帮助我们筛选特征,其二则是我们如何衡量两类不同的消费群体在月消费金额这个指标上是否存在差异。

  • 该假设如何帮助我们进行特征筛选

  在建模的过程中,如果月消费金额这一字段对标签取值的预测能够起到帮助作用,一定是因为这个字段对标签具备一定的区分度,例如流失用户可能普遍月消费金额比较低,那么我们就能通过月消费金额较低的角度对用户是否可能会流失进行提前的预判;而反之,如果流失用户和非流失用户,这两批用户在月消费金额的角度完全看不出差异,那么月消费金额这一字段也不太可能对后续建模提供任何有效信息,该字段完全可以考虑删除。

  • 如何判别这两类不同的群体是否存在差异

  统计学里判别两个样本是否存在差异,其实实在判别这两个样本是否取自不同的总体,也就是说这两个样本的差异(如果有的话),是否是统计误差导致、还是因为抽样自不同的总体。如果能判断样本取自不同的总体,则能判断两类样本存在明显差异,反之则不行。

2.2、采集数据

假设现在有5条样本如下,Churn代表是否流失的标签,MonthlyCharges为月消费金额:

Churn MonthlyCharges
1 100
1 110
1 105
0 10
0 5

样本整体偏差:SST=∑j=1k∑i=1nj(xij−xˉ)2=(100−66)2+(110−66)2+(105−66)2+(10−66)2+(5−66)2=11470SST = \sum^k_{j=1}\sum^{n_j}_{i=1}(x_{ij}-\bar x)^2=(100-66)^2+(110-66)^2+(105-66)^2+(10-66)^2+(5-66)^2=11470SST=j=1∑k​i=1∑nj​​(xij​−xˉ)2=(100−66)2+(110−66)2+(105−66)2+(10−66)2+(5−66)2=11470
组内偏差平方和:
SSE=∑j=1kSSEj=[(100−105)2+(110−105)2+(10−105)2]+[(10−7.5)2+(5−7.5)2]=62.5SSE = \sum_{j=1}^k SSE_j =[(100-105)^2 + (110-105)^2 + (10-105)^2] + [(10-7.5)^2+(5-7.5)^2] =62.5SSE=j=1∑k​SSEj​=[(100−105)2+(110−105)2+(10−105)2]+[(10−7.5)2+(5−7.5)2]=62.5
则组间偏差平方和:SSB = SST - SSE = 11407

2.3、设计统计量

则F统计量:
F=MSBMSE=SSB/dfBSSE/dfE=SSB/(k−1)SSE/(n−k)=11407/(2−1)62.5/(5−2)=547F=\frac{MSB}{MSE}=\frac{SSB/df_B}{SSE/df_E}=\frac{SSB/(k-1)}{SSE/(n-k)}=\frac{11407/(2-1)}{62.5/(5-2)}=547F=MSEMSB​=SSE/dfE​SSB/dfB​​=SSE/(n−k)SSB/(k−1)​=62.5/(5−2)11407/(2−1)​=547

2.4、事件发生概率计算与统计推断

  对于F值为547的结果到底能否支撑我们接受或者推翻原假设,还需要结合F分布来进行判断,即需要计算当前F值作为随机变量时取得547的概率,这里我们也能查看F分布表进行查看,这里F分布表的查看需要同时注意df1df_1df1​和df2df_2df2​,其中df1=k−1df_1=k-1df1​=k−1,df2=n−kdf_2=n-kdf2​=n−k:


  在显著性水平为0.01下,在F(1,3)为5.54,上面构建的统计值为547,远远大于5.54,F取值547的概率几乎为零,也就是说零假设成立的概率几乎为零,我们可以推翻零假设,即流失人群和非流失人群的月消费金额存在显著差异。进一步应用到特征筛选环节,得到的结论就是月消费金额和标签存在显著的关联关系,不同类别人群在月消费金额上存在显出差异,可以从月消费金额入手进行分析和预测,月消费金额特征可以带入模型进行训练。

三、python实现卡方检验

3.1、自实现方差分析

3.2、借助scipy进行方差分析

3.3、借助sklearn进行方差分析

import pandas as pd
import numpy as np
import random
# 构建数据
random.seed(6)
Churn_1 = pd.DataFrame({'Churn':['1' for _ in range(1381)],'MonthlyCharges':[random.uniform(1,200) for _ in range(1381)]})
Churn_0 = pd.DataFrame({'Churn':['0' for _ in range(3901)],'MonthlyCharges':[random.uniform(400,1000) for _ in range(3901)]})
df = pd.concat([Churn_0,Churn_1],axis = 0 )
df# 自实现方差分析# 统计总体偏差平方和
cat_mean = df['MonthlyCharges'].mean()
SST = np.power(df['MonthlyCharges'] - cat_mean, 2).sum()# 统计组内偏差平方和
cat_0 = df[df['Churn'] == '0']['MonthlyCharges']
cat_1 = df[df['Churn'] == '1']['MonthlyCharges']cat_0_mean = cat_0.mean()
cat_1_mean = cat_1.mean()SSE0 = np.power(cat_0 - cat_0_mean, 2).sum()
SSE1 = np.power(cat_1 - cat_1_mean, 2).sum()SSE = SSE0 + SSE1# 统计组间偏差平方和
'''
n0 = len(cat_0)
n1 = len(cat_1)SSB = n0 * np.power(cat_0_mean-cat_mean, 2) + n1 * np.power(cat_1_mean-cat_mean, 2)
'''
SSB = SST - SSE# 构建F统计检验量,即满足F(k-1, n-k)的概率分布
k = df['Churn'].nunique()
n = df.shape[0]MSB = SSB/(k-1)
MSE = SSE/(n-k)F_score = MSB/MSE
F_score# 借助scipy实现方差分析
from scipy import stats
stats.f_oneway(cat_0, cat_1)# 借助sklean进行基于方差分析的特征筛选from sklearn.feature_selection import f_classif,SelectKBest
f_classif(df['MonthlyCharges'].values.reshape(-1, 1), df['Churn'].ravel())'''
KB_CF = SelectKBest(f_classif, k=2)
KB_CF.fit(df_X[numeric_cols], y_train)
'''

5、特征选择(filter):方差分析(ANOVA)相关推荐

  1. 【定量分析、量化金融与统计学】R语言方差分析ANOVA(F检验)

    目录 一.前言 Fixed-effects models.Random-effects models.Mixed-effects models. 二.ANOVA使用的前提假设与假设检验 三.ANOVA ...

  2. sklearn学习-SVM例程总结2(特征选择——单因素方差分析(方差分析anova ))

    SVM with univariate feature selection(单因素方差分析) 本文隶属于机器学习的特征选择部分,是训练前对数据的预处理部分.对于机器学习而言,特征选择是影响结果的极其重 ...

  3. python相关性分析特征过滤_特征选择-Filter过滤法后续(相关,互信息法)

    3.1.2 相关性过滤 方差挑选完毕之后,我们就要考虑下一个问题:相关性了.我们希望选出与标签相关且有意义的特征,因为这样的 特征能够为我们提供大量信息.如果特征与标签无关,那只会白白浪费我们的计算内 ...

  4. 方差分析ANOVA:理论、推导与R语言实现

    方差分析 1 概要 方差分析(Analysis of variance, ANOVA) 主要研究分类变量作为自变量时,对因变量的影响是否是显著的. 方差分析的方法是由20世纪的统计学家Ronald A ...

  5. R语言方差分析ANOVA

    自己整理编写的R语言常用数据分析模型的模板,原文件为Rmd格式,直接复制粘贴过来,作为个人学习笔记保存和分享.部分参考薛毅的<统计建模与R软件>和<R语言实战> I. 单因素方 ...

  6. ryuyan 方差分析_【r-高级|实战|统计】R中的方差分析ANOVA

    方差分析主要通过F检验来进行效果评测,若治疗方案的F检验显著,则说明检验样本组间均值不同. ANOVA模型拟合 从函数形式上看,ANOVA和回归方法都是广义线性模型的特例.因此回归分析章节中提到的lm ...

  7. 4、特征选择(filter):卡方检验特征筛选

    卡方检验特征筛选 一.卡方检验(Chi-Squared Test)基本原理 二.离散变量之间的卡方检验 2.1.提出假设 2.2.采集数据 2.3.计算统计量 2.4.事件发生概率计算与统计推断 三. ...

  8. R方差分析(anova)以及Tukey检验

    R方差分析(anova)以及Tukey检验 目录 R方差分析(anova)以及Tukey检验 假设检验 假设检验的应用 方差分析ANOVA

  9. ryuyan 方差分析_如何使用R语言做不同设计的方差分析(ANOVA)、简单效应检验、事后多重比较?...

    感谢 @hcp4715 和 @李晓煦 两位老师之前的精彩回答! 这个问题是我几个月前提的,当时还很少用R来做传统意义上的方差分析,所以比较想知道"如何使用R做方差分析.简单效应检验.事后多重 ...

最新文章

  1. Go语言 读写锁互斥锁原理剖析(2)
  2. 【Kissy WaterFall】实行手动加载数据
  3. 当MVP与阿里云一起踏上西行远征——阿里云MVP“戈壁之路”徒步记行
  4. springloaded热加载
  5. linux 安装Elasticsearch
  6. 常用的几个设计心理学
  7. 怎么手动修改域名服务器地址,如何修改域名dns服务器地址
  8. 图扑软件2D与2.5D案例合集|智慧园区、数据中心、SMT 生产线...
  9. JAVA8 UnaryOperator接口
  10. 2001年图灵奖--奥尔-约翰·戴尔和克里斯登·奈加特简介
  11. excel锁定后忘记密码的解决办法
  12. 前端网页生成二维码方法
  13. Ubuntu Linux 3D桌面完全教程,显卡驱动安装方法,compiz特效介绍,常见问题解答。
  14. 「GoCN酷Go推荐」后现代时代远程办公网络问题的golang开源解决方案 —— PairMesh...
  15. Linux下IP的配置_F_hawk189_新浪博客
  16. 利用多态特性,编程创建一个手机类Phones,定义打电话方法call()。创建两个子类:苹果手机类IPhone和安卓手机类APhone,并在各自类中重写方法call(),编写程序入口main()方法
  17. 关于高次幂的取余问题(一稿)
  18. For Free Brook 安装教程(Linux -- Centos7.x)
  19. 程序员必备75道逻辑思维题(附答案)之一
  20. 几句话聊聊HDFS的异构存储策略

热门文章

  1. 主题狗themes.dog-精选上百种优秀开源网站主题、博客主题、商城模板
  2. Qt打开Word、Excel和PPT总结
  3. Excel报错“不能使用对象链接和嵌入”并无法粘贴数据可能和输入法有关
  4. 什么是Kodu---Kodu少儿编程第一天
  5. 终于删掉了巧压(QiaoZip)
  6. 天才基本法--裴之的“自动战棋“代码
  7. 快速学习-cmd命令大全
  8. 数据库优化及淘宝主键设计
  9. 量子算法入门资料个人小结
  10. UML图六种箭头含义