web-dev-qa-db-fra.com

ANOVA dans python en utilisant pandas dataframe avec statsmodels ou scipy?

Je veux utiliser le Pandas dataframe pour décomposer la variance en une variable.

Par exemple, si j'ai une colonne intitulée `` Degrés '', et que je l'indique pour différentes dates, villes et nuit par rapport au jour, je veux savoir quelle fraction de la variation de cette série provient d'une ville transversale variation, quelle quantité provient de la variation de la série chronologique et quelle quantité provient de la nuit par rapport au jour.

Dans Stata, j'utilisais des effets fixes et regardais le R ^ 2. J'espère que ma question a du sens.

Fondamentalement, ce que je veux faire, c'est trouver la ventilation ANOVA des "Degrés" par trois autres colonnes.

28
wolfsatthedoor

J'ai mis en place une comparaison directe pour les tester, j'ai constaté que leurs hypothèses peuvent différer légèrement , obtenu un indice d'un statisticien, et voici un exemple d'ANOVA sur un pandas = trame de données correspondant aux résultats de 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
23
cphlewis