web-dev-qa-db-fra.com

T-test chez les pandas

Si je veux calculer la moyenne de deux catégories dans les pandas, je peux le faire comme ceci:

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

J'ai beaucoup de données formatées de cette façon, et maintenant je dois faire un testT- pour voir si les moyennes de cat1 et cat2 sont statistiquement différentes. Comment puis je faire ça?

47
hirolau

cela dépend du type de test t que vous voulez faire (dépendant ou indépendant d'un côté ou des deux côtés), mais cela devrait être aussi simple que:

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)

il retourne un tuple avec la statistique t et la valeur p

voir ici pour d'autres tests t http://docs.scipy.org/doc/scipy/reference/stats.html

67
G Garcia

EDIT: Je n'avais pas réalisé qu'il s'agissait du format de données. Vous pourriez utiliser

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

Puis accéder aux catégories est aussi simple que

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

Le loc operator accède aux lignes par étiquette.


Comme @G Garcia a dit

dépendant ou indépendant d'un côté ou des deux côtés

Si vous avez deux échantillons indépendants mais que vous ne savez pas qu'ils ont une variance égale, vous pouvez utiliser le test t de Welch . C'est aussi simple que

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

Pour des raisons de préférer le test de Welch, voir https://stats.stackexchange.com/questions/305/whenconducting-at-test-why-would-one-prefer-to-assume-or-test-for- equal-vari .

Pour deux échantillons dépendants, vous pouvez utiliser

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

Je simplifie un peu le code.

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