我对python和pandas(使用SAS作为我的主力分析平台)相当新,所以如果已经被问到/已经回答过,我会提前道歉。 (我搜索了文档以及这个网站搜索答案,但还没找到。)
我有一个包含受访者级别调查数据的数据框(称为resp)。我想在其中一个字段上执行一些基本的描述性统计(称为anninc [年收入的简称])。
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;
对于像describe()等方法的pandas,是否有类似的加权选项?
答案 0 :(得分:3)
有统计数据和计量经济学库(statsmodels)似乎可以解决这个问题。这是一个在类似问题上扩展@ MSeifert的答案here的例子。
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
允许非整数权重。权重比你想象的要复杂得多......这已经开始进入杂草,但是对于计算标准差here的加权问题进行了很好的讨论。
另请注意,DescrStatsW
似乎不包含min和max的函数,但只要您的权重不为零,这不应该是一个问题,因为权重不会影响min和最大。但是,如果你确实有一些零权重,加权最小值和最大值可能会很好,但它在熊猫中也很容易计算:
df.x[ df.wt > 0 ].min()
df.x[ df.wt > 0 ].max()