71

如果我想计算 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检验,看看cat1cat2的平均值是否在统计上不同。我怎样才能做到这一点?

4

3 回答 3

105

这取决于您要进行哪种 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

于 2012-11-16T09:34:21.770 回答
18

编辑:我没有意识到这是关于数据格式的。你可以使用

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 所说

一侧或两侧依赖或独立

如果您有两个独立样本,但您不知道它们的方差相等,则可以使用Welch 的 t 检验。这很简单

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

有关更喜欢 Welch 测试的原因,请参阅https://stats.stackexchange.com/questions/305/when-conducting-at-test-why-would-one-prefer-to-assume-or-test-for-equal-变量

对于两个相关样本,您可以使用

scipy.stats.ttest_rel(cat1['values'], cat2['values'])
于 2017-06-18T19:44:52.843 回答
8

我稍微简化了代码。

from scipy.stats import ttest_ind
ttest_ind(*my_data.groupby('Category')['value'].apply(lambda x:list(x)))
于 2018-11-06T22:44:42.673 回答