2013-07-17 14 views
6

私はPythonとpandas(私の仕事場の分析プラットフォームとしてSASを使用しています)にはかなり新しくなっています。尋ねられた/答えられた。 (私はドキュメントと、このサイトで回答を探していて、まだ何かを見つけることができませんでした。)平均値、標準偏差、メジアン、クオンタイルのweightedデータ付きのdescribe()の使用

レスポンダーレベルのサーベイデータを含むデータフレーム(resp)があります。私は、フィールドの1つ(anninc [annual income for short]と呼ばれる)に関するいくつかの基本的な記述統計を実行したいと思います。私の基本的な統計情報を提供します

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 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; 

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の単変量は、同じ結果が次のようになります与えるためにdescribe()などのメソッドのためのパンダで利用可能な重み付けオプション? @TomAugspuger同様

+0

私はこれを行うためのデータフレーム上の方法を認識していませんよ。あなたは数え方や分位数が変わることを期待していますか?あるいは平均と標準偏差だけ?最初に重み付けを適用し、結果のシリーズで説明を呼べますか? – TomAugspurger

+0

ありがとうTomAuspurger ...それは私の疑いでしたが、私は余分なコーディングを避けることを望んでいました...私はそれがすべてのメトリックに当てはまると思います。 –

+0

それほど多くの仕事は本当にすべきではありません。私は '(df ['anninc'] * df ['tufnwgrp'])。describe()'がこのトリックを行うと思います。ある時点でdtypeを変換する必要があるかもしれません。 – TomAugspurger

答えて

1

は言う:

In[29]: 
df = DataFrame(randn(5, 3), columns=list('abc')) 
column_of_interest = 'a' 
weights = Series(rand(len(df[column_of_interest])), name=column_of_interest) 
weights 

0 0.840 
1 0.486 
2 0.452 
3 0.316 
4 0.720 
Name: a, dtype: float64 

In[33]: 
weighted = weights * df[column_of_interest] 
weighted 

0 -1.400 
1 -0.163 
2 0.262 
3 0.274 
4 -1.163 
Name: a, dtype: float64 

In[34]: weighted.describe() 

count 5.000 
mean -0.438 
std  0.794 
min  -1.400 
25%  -1.163 
50%  -0.163 
75%  0.262 
max  0.274 
dtype: float64 
+0

収益が0の人口の70% 、収益1の場合は30%です。母集団で加重された収益の中央値を0にすることをお勧めします。収益を重みで掛けて説明を適用すると、おそらく0.15(ベクトル0,0.3)の中央値が得られますが、これは無関係です。 – etna

+0

そして?私の例は実例でした。私はこの答えを書くときに、ドメイン固有の詳細を考慮に入れませんでした。 –

+0

ドメイン固有の詳細で正確に何を意味しているのかわからない私はあなたがTomAugspugerの答えを説明していることに同意しますが、彼の答えが間違っていると本当に信じています(私の例は理由を示すためのものです)。 – etna

1

これを処理するように見える統計と計量経済学ライブラリ(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のは、実際にいくつかの重量のオプションを持っており、この場合に与えますfw(頻度ウェイト)の代わりにaw(分析重量)を指定した場合は、少し異なる回答です。また、スタータはfwを整数にする必要があり、一方、DescrStatsWは非整数重みを可能にする必要があります。体重はあなたが思うよりも複雑です...これは雑草に入っていますが、標準偏差hereを計算するために重み付けの問題についての素晴らしい議論があります。

さらに、DescrStatsWにはminとmaxの関数が含まれていないように見えますが、重みがゼロでない限り、重みが最小値と最大値に影響しないので問題にはなりません。あなたには、いくつかのゼロの重みを持っていた場合は、加重最小値と最大値があると便利かもしれませんが、それはパンダに計算することも簡単です。

df.x[ df.wt > 0 ].min() 
df.x[ df.wt > 0 ].max() 
関連する問題