使用statsmodels或scipy在Python中使用pandas数据框执行ANOVA?

38

我想使用Pandas DataFrame来分解一个变量的方差。

例如,如果我有一个名为“Degrees”的列,它被按日期、城市和夜间与白天索引,我想找出该系列中多少变化的一部分来自横向城市变化,有多少来自时间序列变化,以及有多少来自夜间与白天。

在Stata中,我会使用固定效应并查看R ^ 2。希望我的问题是有意义的。

基本上,我想做的是,通过另外三列找到“Degrees”的ANOVA分解。


2
你需要查看scipy或statsmodels(我刚刚添加了这些标签,待批准)。 - JohnE
1
简而言之,statsmodels类似于Stata的统计部分(而pandas是数据管理部分)。 - JohnE
有更具体的要求吗? - wolfsatthedoor
主要的方差分析扩展线性模型(OLS)在这里解释:http://statsmodels.sourceforge.net/devel/examples/notebooks/generated/interactions_anova.html OLS结果具有rsquared,anova_lm计算分类变量效应的平方和或F检验。 - Josef
5
刚好碰到了 O'Reilley 出版的《Think Stats》这本书,它使用了 Pandas 和 Statsmodels。这是它的免费在线版本:http://www.greenteapress.com/thinkstats2/html/index.html。 - JohnE
1
这里有一个完整的代码示例,包括ANOVA表和残差,网址为http://statsmodels.sourceforge.net/devel/anova.html。 - cphlewis
1个回答

32

我设置了一个直接比较来测试它们,发现他们的假设可能会有轻微差异,得到了一位统计学家的提示,这里是一个在pandas数据框上进行ANOVA并匹配R结果的示例:

import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols


# R code on R sample dataset

#> anova(with(ChickWeight, lm(weight ~ Time + Diet)))
#Analysis of Variance Table
#
#Response: weight
#           Df  Sum Sq Mean Sq  F value    Pr(>F)
#Time        1 2042344 2042344 1576.460 < 2.2e-16 ***
#Diet        3  129876   43292   33.417 < 2.2e-16 ***
#Residuals 573  742336    1296
#write.csv(file='ChickWeight.csv', x=ChickWeight, row.names=F)

cw = pd.read_csv('ChickWeight.csv')

cw_lm=ols('weight ~ Time + C(Diet)', data=cw).fit() #Specify C for Categorical
print(sm.stats.anova_lm(cw_lm, typ=2))
#                  sum_sq   df            F         PR(>F)
#C(Diet)    129876.056995    3    33.416570   6.473189e-20
#Time      2016357.148493    1  1556.400956  1.803038e-165
#Residual   742336.119560  573          NaN            NaN

2
但这不是ANOVA测试。这是线性模型系数分析。 - aghd
@cphlewis,实际上,ANOVA测试只是一个线性模型,其中我们有一个连续的因变量和一个分类输入。 - Luis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接