Python数据框中的置信区间

新手上路,请多包涵

我正在尝试计算大型数据集中“Force”列的均值和置信区间 (95%)。我需要通过对不同的“类”进行分组来使用 groupby 函数来获得结果。

当我计算平均值并将其放入新数据框中时,它会为我提供所有行的 NaN 值。我不确定我是否走对了路。有没有更简单的方法来做到这一点?

这是示例数据框:

 df=pd.DataFrame({ 'Class': ['A1','A1','A1','A2','A3','A3'],
                  'Force': [50,150,100,120,140,160] },
                   columns=['Class', 'Force'])

要计算置信区间,我做的第一步是计算均值。这是我用的:

 F1_Mean = df.groupby(['Class'])['Force'].mean()

这给了我 NaN 所有行的值。

原文由 MasterShifu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 407
2 个回答

2021 年 10 月 25 日更新:@a-donda 指出,95% 应基于平均值的 1.96 X 标准差。

 import pandas as pd
import numpy as np
import math

df=pd.DataFrame({'Class': ['A1','A1','A1','A2','A3','A3'],
                 'Force': [50,150,100,120,140,160] },
                 columns=['Class', 'Force'])
print(df)
print('-'*30)

stats = df.groupby(['Class'])['Force'].agg(['mean', 'count', 'std'])
print(stats)
print('-'*30)

ci95_hi = []
ci95_lo = []

for i in stats.index:
    m, c, s = stats.loc[i]
    ci95_hi.append(m + 1.96*s/math.sqrt(c))
    ci95_lo.append(m - 1.96*s/math.sqrt(c))

stats['ci95_hi'] = ci95_hi
stats['ci95_lo'] = ci95_lo
print(stats)

输出是

  Class  Force
0    A1     50
1    A1    150
2    A1    100
3    A2    120
4    A3    140
5    A3    160
------------------------------
       mean  count        std
Class
A1      100      3  50.000000
A2      120      1        NaN
A3      150      2  14.142136
------------------------------
       mean  count        std     ci95_hi     ci95_lo
Class
A1      100      3  50.000000  156.580326   43.419674
A2      120      1        NaN         NaN         NaN
A3      150      2  14.142136  169.600000  130.400000

原文由 yoonghm 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以利用“sem”(平均值的标准误差)来简化@yoonghm 解决方案。

 import pandas as pd
import numpy as np
import math

df=pd.DataFrame({'Class': ['A1','A1','A1','A2','A3','A3'],
                 'Force': [50,150,100,120,140,160] },
                 columns=['Class', 'Force'])
print(df)
print('-'*30)

stats = df.groupby(['Class'])['Force'].agg(['mean', 'sem'])
print(stats)
print('-'*30)

stats['ci95_hi'] = stats['mean'] + 1.96* stats['sem']
stats['ci95_lo'] = stats['mean'] - 1.96* stats['sem']
print(stats)

原文由 gabriel-shatana 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题