在Python中使用pandas数据框进行ANOVA,选择statsmodels还是scipy?

38 投票
1 回答
40728 浏览
提问于 2025-04-18 18:47

我想用Pandas的数据框来分析一个变量的变化情况。

举个例子,如果我有一列叫做“Degrees”(温度),而且这个数据是按不同的日期、城市,以及白天和晚上的情况来排列的,我想知道这个数据变化的部分,分别有多少是因为不同城市之间的差异,有多少是因为时间的变化,还有多少是因为白天和晚上的不同。

在Stata软件里,我会用固定效应的方法,然后查看R^2值。希望我的问题能够被理解。

简单来说,我想做的是通过另外三列来分析“Degrees”的方差分解。

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

撰写回答