it-swarm.com.de

T-Test in Pandas

Wenn ich den Mittelwert von zwei Kategorien in Pandas berechnen möchte, kann ich dies folgendermaßen tun:

data = {'Category': ['cat2','cat1','cat2','cat1','cat2','cat1','cat2','cat1','cat1','cat1','cat2'],
        'values': [1,2,3,1,2,3,1,2,3,5,1]}
my_data = DataFrame(data)
my_data.groupby('Category').mean()

Category:     values:   
cat1     2.666667
cat2     1.600000

Ich habe viele Daten auf diese Weise formatiert, und jetzt muss ich einenT- Test durchführen, um zu sehen, ob der Mittelwert von cat1 und cat2 statistisch unterschiedlich ist. Wie kann ich das machen?

47
hirolau

es hängt davon ab, welche Art von T-Test Sie durchführen möchten (einseitig oder zweiseitig abhängig oder unabhängig), aber es sollte so einfach sein wie:

from scipy.stats import ttest_ind

cat1 = my_data[my_data['Category']=='cat1']
cat2 = my_data[my_data['Category']=='cat2']

ttest_ind(cat1['values'], cat2['values'])
>>> (1.4927289925706944, 0.16970867501294376)

es wird ein Tupel mit der T-Statistik und dem P-Wert zurückgegeben

hier finden Sie weitere T-Tests http://docs.scipy.org/doc/scipy/reference/stats.html

67
G Garcia

EDIT: Mir war nicht klar, dass es sich um das Datenformat handelt. Sie könnten verwenden

two_data = pd.DataFrame(data, index=data['Category'])

Dann ist der Zugriff auf die Kategorien so einfach wie

scipy.stats.ttest_ind(two_data.loc['cat'], two_data.loc['cat2'], equal_var=False)

Die loc operator greift auf Zeilen nach Label zu.


Wie @ G Garcia sagte

einseitig oder zweiseitig abhängig oder unabhängig

Wenn Sie zwei unabhängige Stichproben haben , aber Sie wissen nicht, dass sie die gleiche Varianz haben, können Sie Welchs t-Test . Es ist so einfach wie

scipy.stats.ttest_ind(cat1['values'], cat2['values'], equal_var=False)

Gründe für die Bevorzugung des Welch-Tests finden Sie unter https://stats.stackexchange.com/questions/305/when-conducting-at-test-why-ould-one-prefer-to-assume-or -test-for-equal-vari .

Für zwei abhängige Stichproben können Sie verwenden

scipy.stats.ttest_rel(cat1['values'], cat2['values'])
10
serv-inc

Ich vereinfache den Code etwas.

from scipy.stats import ttest_ind
ttest_ind(*my_data.groupby('Category')['value'].apply(lambda x:list(x)))
0
Ningrong Ye