之前我们曾经讲过用Python做t检验,它用于分析一组数据与另一组数据或者总体均值之间的均值差异,从而判断它们是否来自于同一个总体。
我会分享大量关于网页抓取、数据分析与挖掘、机器学习还有可视化等方面的知识,欢迎感兴趣的同学关注我!
但是t检验有它的局限性,它无法应对多个因子变量以及因子变量有多个水平(大于2)的情况。这时,我们就需要使用方差分析了。
方差分析的目的是分析因子对反应变量有无显著影响,即因子的不同水平下反应变量(因变量)的均值是否有差异。
一些概念在方差分析中,我们需要注意几个概念:
- 组内偏差平方和,即误差平方和,ESS:它反映了样本与其所处因子水平的组别均值的偏差,比如有三个班级ABC,小明是A班的学生,那么小明的成绩与A班成绩的均值之间的差异就是组内差异。
- 组间差异平方和,又称因子平方和,FSS:它反映了不同因子水平间的均值差异,比如上述的三个班级,A、B、C三个班级的均值之间的差异就叫组间差异。
- (总)离差平方和,TSS:组内差异与组间差异加起来,就是总的离差了。
- 组间均方差和组内均方差:方差除以自由度就是均方差。
- 我们的φ统计量就是组间均方差和组内均方差的均值,它符合F分布。φ统计量越大,就说明组间差异对于总离差的贡献越大,当超过了一定水平之后,我们就认为因子影响显著,即不同水平间存在显著差异。
- 根据感兴趣的因素的不同取值,将反应变量分成M个组;
- 提出原假设H0
- 因子对于反应变量没有影响;备择假设H1
- 因子对观测变量有显著影响;
- 求出样本数据中每组的样本均值即全样本均值,算出组内均方差MSF和组间均方差MSE;
- 构建φ统计量并计算φ值:Φ=MSF/MSE ∼ F(M−1,N−M)
- 由显著性水平α(通常取0.025、0.05、0.1等)查F分布表的林价值来判断是接受零假设还是拒绝零假设。
我们先获取数据,用tushare获取18年最后一个交易日的行情数据,然后过滤一下,仅保留软件服务、化工原料和证券三个行业的股票行情。
import tushare as ts import statsmodels.stats.anova as anova from statsmodels.formula.api import ols import pandas as pd pro = ts.pro_api() df1 = pro.daily(trade_date='20181228') df2 = pro.stock_basic(market='SSE') df = pd.merge(df1, df2, on='ts_code', how='inner') df = df.query("industry in ('软件服务', '化工原料', '证券')") df.head()
然后我们进行方差分析,看一看这三个行业的股票表现是否一致。
model = ols('pct_chg ~ C(industry)', data=df).fit() anova.anova_lm(model)
可以看到,p值远小于0.01。因此,在0.01的显著性水平下,我们应该拒绝原假设,即这三个行业的股票在2018年最后一个交易日的收益率是不同的。
2. 多因素方差分析多因素方差分析的实现方法也基本一致,我们来看一下。
df1 = pro.daily(trade_date='20181228') df2 = pro.stock_basic(market='SSE') df = pd.merge(df1, df2, on='ts_code', how='inner') df = df.query("industry in ('软件服务', '化工原料', '证券')") df = df.query("area in ('广东', '浙江', '江苏')") # 方差分析 model = ols('pct_chg ~ C(industry) C(area)', data=df).fit() anova.anova_lm(model)
我们增加了一个地区维度,并且只保留了其中三个省份的数据。然后我们看到,行业对于收益率的影响依然显著,而不同地区的收益率之间的差异不足以我们拒绝原假设。
3. 析因方差分析析因方差分析与多因素方差分析很像,不过要多一个因子的乘项。
df1 = pro.daily(trade_date='20181228') df2 = pro.stock_basic(market='SSE') df = pd.merge(df1, df2, on='ts_code', how='inner') df = df.query("industry in ('软件服务', '化工原料', '证券')") # 方差分析 model = ols('pct_chg ~ C(industry) * C(area)', data=df).fit() anova.anova_lm(model)
我们看到,不管是行业还是地区,它们的影响都很显著,但是他们的乘项的影响并不显著,也就是说他们之间不存在明显的交互作用。
以上就是使用Python进行方差分析的过程,你学会了吗?