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?
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
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'])
Je simplifie un peu le code.
from scipy.stats import ttest_ind
ttest_ind(*my_data.groupby('Category')['value'].apply(lambda x:list(x)))