T-тест в Pandas

Ако искам да изчисля средната стойност на две категории в Pandas, мога да го направя по следния начин:

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

Имам много данни, форматирани по този начин, и сега трябва да направя T-тест, за да видя дали средната стойност на cat1 и cat2 са статистически различни. Как мога да направя това?


person hirolau    schedule 15.11.2012    source източник


Отговори (3)


зависи какъв вид t-тест искате да направите (едностранен или двустранен зависим или независим), но трябва да е толкова прост, колкото:

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)

връща кортеж с t-статистиката и p-стойността

вижте тук за други t-тестове http://docs.scipy.org/doc/scipy/reference/stats.html

person Gonzalo    schedule 16.11.2012

РЕДАКТИРАНЕ: Не бях разбрал, че става въпрос за формата на данните. Вие можете да използвате

import pandas as pd
import scipy
two_data = pd.DataFrame(data, index=data['Category'])

Тогава достъпът до категориите е толкова прост, колкото

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

loc operator осъществява достъп до редове по етикет.


Както @G Garcia каза

едностранно или двустранно зависими или независими

Ако имате две независими проби, но не знаете, че имат еднаква вариация, можете да използвате t-тест на Welch. Това е толкова просто, колкото

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

За причини да предпочетете теста на Welch вижте https://stats.stackexchange.com/questions/305/when-conducting-a-t-test-why-would-one-prefer-to-assume-or-test-for-equal-vari.

За две зависими проби можете да използвате

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

Опростявам кода малко.

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