【问题标题】:ANOVA for groups within a dataframe using scipy使用 scipy 对数据框中的组进行方差分析
【发布时间】:2017-10-19 07:40:30
【问题描述】:

我有一个如下的数据框。我需要在三个条件之间对此进行方差分析。数据框如下所示:

data0 = pd.DataFrame({'Names': ['CTA15', 'CTA15', 'AC007', 'AC007', 'AC007','AC007'], 
    'value': [22, 22, 2, 2, 2,5], 
    'condition':['NON', 'NON', 'YES', 'YES', 'RE','RE']})

我需要在 YES 和 NON、NON 和 RE 以及 YES 和 RE、Names 条件之间进行 ANOVA 测试。 我知道我可以这样做,

NON=df.query('condition =="NON"and Names=="CTA15"')
no=df.value
YES=df.query('condition =="YES"and Names=="CTA15"')    
Y=YES.value

然后按如下方式执行单向方差分析,

    from scipy import stats                
    f_val, p_val = stats.f_oneway(no, Y)            
    print ("One-way ANOVA P =", p_val )

但是如果有任何优雅的解决方案会很棒,因为我的初始数据框很大并且有很多名称和条件可供比较

【问题讨论】:

    标签: python pandas scipy


    【解决方案1】:

    考虑以下示例 DataFrame:

    df = pd.DataFrame({'Names': np.random.randint(1, 10, 1000), 
                       'value': np.random.randn(1000), 
                       'condition': np.random.choice(['NON', 'YES', 'RE'], 1000)})
    
    df.head()
    Out: 
       Names condition     value
    0      4        RE  0.844120
    1      4       NON -0.440285
    2      5       YES  0.559497
    3      4        RE  0.472425
    4      9       YES  0.205906
    

    以下按名称对 DataFrame 进行分组,然后将每个条件组传递给 ANOVA:

    import scipy.stats as ss
    for name_group in df.groupby('Names'):
        samples = [condition[1] for condition in name_group[1].groupby('condition')['value']]
        f_val, p_val = ss.f_oneway(*samples)
        print('Name: {}, F value: {:.3f}, p value: {:.3f}'.format(name_group[0], f_val, p_val))
    
    Name: 1, F value: 0.138, p value: 0.871
    Name: 2, F value: 1.458, p value: 0.237
    Name: 3, F value: 0.742, p value: 0.479
    Name: 4, F value: 2.718, p value: 0.071
    Name: 5, F value: 0.255, p value: 0.776
    Name: 6, F value: 1.731, p value: 0.182
    Name: 7, F value: 0.269, p value: 0.764
    Name: 8, F value: 0.474, p value: 0.624
    Name: 9, F value: 1.226, p value: 0.297
    

    对于事后测试,您可以使用 statsmodels(如 here 所述):

    from statsmodels.stats.multicomp import pairwise_tukeyhsd
    for name, grouped_df in df.groupby('Names'):
        print('Name {}'.format(name), pairwise_tukeyhsd(grouped_df['value'], grouped_df['condition']))
    
    名称 1 均值的多重比较 - Tukey HSD,FWER=0.05 ============================================ group1 group2 meandiff 下 上 拒绝 ------------------------------------------ 非 RE 0.0086 -0.5129 0.5301 错误 非 是 0.0084 -0.4817 0.4986 错误 RE 是 -0.0002 -0.5217 0.5214 错误 ------------------------------------------ 名称 2 均值的多重比较 - Tukey HSD,FWER=0.05 ============================================ group1 group2 meandiff 下 上 拒绝 ------------------------------------------ 非 RE -0.0089 -0.5299 0.5121 假 非 是 0.083 -0.4182 0.5842 错误 RE 是 0.0919 -0.4008 0.5846 错误 ------------------------------------------ 名称 3 均值的多重比较 - Tukey HSD,FWER=0.05 ============================================ group1 group2 meandiff 下 上 拒绝 ------------------------------------------ 非 RE 0.2401 -0.3136 0.7938 错误 非 是 0.2765 -0.2903 0.8432 错误 RE 是 0.0364 -0.5052 0.578 错误 ------------------------------------------ 名称 4 均值的多重比较 - Tukey HSD,FWER=0.05 ============================================ group1 group2 meandiff 下 上 拒绝 ------------------------------------------ 非 RE 0.0894 -0.5825 0.7613 错误 非 是 -0.0437 -0.7418 0.6544 错误 RE 是 -0.1331 -0.6949 0.4287 错误 ------------------------------------------ 名称 5 均值的多重比较 - Tukey HSD,FWER=0.05 ============================================ group1 group2 meandiff 下 上 拒绝 ------------------------------------------ 非重 -0.4264 -0.9495 0.0967 假 非 是 0.0439 -0.4264 0.5142 错误 RE 是 0.4703 -0.0155 0.9561 错误 ------------------------------------------ 名称 6 均值的多重比较 - Tukey HSD,FWER=0.05 ============================================ group1 group2 meandiff 下 上 拒绝 ------------------------------------------ 非 RE 0.0649 -0.4971 0.627 错误 非 是 -0.406 -0.9405 0.1285 错误 RE 是 -0.4709 -1.0136 0.0717 错误 ------------------------------------------ 名称 7 均值的多重比较 - Tukey HSD,FWER=0.05 ============================================ group1 group2 meandiff 下 上 拒绝 ------------------------------------------ 非 RE 0.3111 -0.2766 0.8988 错误 非 是 -0.1664 -0.7314 0.3987 错误 RE 是 -0.4774 -1.0688 0.114 错误 ------------------------------------------ 名称 8 均值的多重比较 - Tukey HSD,FWER=0.05 ============================================ group1 group2 meandiff 下 上 拒绝 ------------------------------------------ 非 RE -0.0224 -0.668 0.6233 假 非 是 0.0119 -0.668 0.6918 错误 RE 是 0.0343 -0.6057 0.6742 错误 ------------------------------------------ 名称 9 均值的多重比较 - Tukey HSD,FWER=0.05 ============================================ group1 group2 meandiff 下 上 拒绝 ------------------------------------------ 非重 -0.2414 -0.7792 0.2963 假 非 是 0.0696 -0.5746 0.7138 错误 RE 是 0.311 -0.3129 0.935 错误

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-24
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 2017-09-03
      • 1970-01-01
      相关资源
      最近更新 更多