2014-08-27 20 views
22

Chcę użyć ramki danych Pandy do podziału wariancji w jednej zmiennej.ANOVA w Pythonie przy użyciu pandasowej ramki danych z statsmodels lub scipy?

Na przykład, jeśli mam kolumnę o nazwie "Stopnie" i mam tę indeksację dla różnych dat, miast i nocy na dzień, chcę się dowiedzieć, jaka część zmiany w tej serii pochodzi z Przekrojowa zmienność miasta, ile pochodzi z wahań szeregu czasowego i ile pochodzi z nocy na dzień.

W Stacie użyłbym efektów stałych i spojrzałam na R^2. Mam nadzieję, że moje pytanie ma sens.

Zasadniczo, co chcę zrobić, to znaleźć ANOVA podział "stopni" przez trzy inne kolumny.

+2

You "Chcę zajrzeć do scipy lub statsmodels (właśnie dodałem te znaczniki, oczekując na zatwierdzenie). – JohnE

+1

W skrócie, statmodels jest analogiczny do statystycznych części stata (podczas gdy pandy to część zarządzania danymi). – JohnE

+0

Coś bardziej konkretnego :)? – robertevansanders

Odpowiedz

14

skonfigurować bezpośrednie porównanie ich przetestowania, stwierdzono, że ich założenia mogą differ slightly, dostał wskazówkę od statystyka, a tutaj jest przykładem ANOVA na wynikach danego pandy dataframe Dopasowany R za:

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