9

我对 python 和 pandas 相当陌生(从使用 SAS 作为我的主力分析平台),所以如果这已经被问到/回答了,我提前道歉。(我已经搜索了文档以及该站点以寻找答案,但还没有找到任何东西。)

我有一个包含受访者级别调查数据的数据框(称为 resp)。我想对其中一个字段(称为 nninc [年收入的缩写])执行一些基本的描述性统计。

resp["anninc"].describe()

这给了我基本的统计数据:

count     76310.000000
mean      43455.874862
std       33154.848314
min           0.000000
25%       20140.000000
50%       34980.000000
75%       56710.000000
max      152884.330000
dtype: float64

但有一个问题。鉴于样本的构建方式,需要对受访者数据进行加权调整,以便在执行分析时并非每个人都被视为“平等”。我在数据框中有另一列(称为 tufnwgrp),表示分析期间应应用于每条记录的权重。

在我之前的 SAS 生活中,大多数 proc 都可以选择使用这样的权重处理数据。例如,给出相同结果的标准 proc 单变量看起来像这样:

proc univariate data=resp;
  var anninc;
  output out=resp_univars mean=mean median=50pct q1=25pct q3=75pct min=min max=max n=count;
run;

使用加权数据的相同分析看起来像这样:

proc univariate data=resp;
  var anninc;
  weight tufnwgrp;
  output out=resp_univars mean=mean median=50pct q1=25pct q3=75pct min=min max=max n=count
run;

pandas 中是否有类似的加权选项可用于 describe() 等方法?

4

1 回答 1

5

似乎有统计和计量经济学库(statsmodels)可以处理这个问题。这是一个扩展@MSeifert 在类似问题上的回答的示例

df=pd.DataFrame({ 'x':range(1,101), 'wt':range(1,101) })

from statsmodels.stats.weightstats import DescrStatsW
wdf = DescrStatsW(df.x, weights=df.wt, ddof=1) 

print( wdf.mean )
print( wdf.std )
print( wdf.quantile([0.25,0.50,0.75]) )

67.0
23.6877840059
p
0.25    50
0.50    71
0.75    87

我不使用 SAS,但这给出了与 stata 命令相同的答案:

sum x [fw=wt], detail

Stata 实际上有一些权重选项,在这种情况下,如果您指定aw(分析权重)而不是fw(频率权重),则给出的答案略有不同。此外,stata 要求fw是整数,而DescrStatsW允许非整数权重。权重比你想象的要复杂......这开始进入杂草,但这里有一个关于计算标准偏差的加权问题的精彩讨论

另请注意,DescrStatsW它似乎不包括最小值和最大值的函数,但只要您的权重不为零,这应该不是问题,因为权重不会影响最小值和最大值。但是,如果您确实有一些零权重,那么加权最小值和最大值可能会很好,但在 pandas 中也很容易计算:

df.x[ df.wt > 0 ].min()
df.x[ df.wt > 0 ].max()
于 2017-11-18T16:02:08.530 回答