2013-07-17 14 views
6

Python ve pandalar için oldukça yeni (SAS'ı benim analitik platformum olarak kullanıyorum), bu yüzden önceden alınmışsa önceden özür dilerim. sordu/cevapladı. (Bu sitenin yanı sıra cevabı aramak için arama yaptım ve henüz bir şey bulamadık.)Ağırlıklı verilerle açıklamayı() kullanarak - ortalama, standart sapma, medyan, quantiller

Yanıt veren seviye anket verileri içeren bir veri karemem var. Alanlardan bir tanesine temel tanımlayıcı istatistikler yapmak istiyorum (anninc [yıllık gelir için kısa]). Bana temel istatistikler veriyor

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 

Ama bir sorun var. Numunenin nasıl yapıldığı göz önüne alındığında, yanıt veren verileri ayarlamak için bir analojiyi gerçekleştirirken her birinin "eşit" olarak kabul edilmemesi için bir ihtiyaç vardı. Veritabanında (tufnwgrp adı verilen) analiz sırasında her kayıt için uygulanması gereken ağırlığı temsil eden başka bir sütunum var.

Önceki SAS hayatımda, proc'ların çoğunun verileri bu gibi ağırlıklar ile işlemek için seçenekleri vardır. Benzer bir tür var mı

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; 

Ve böyle bir şey olmazdı ağırlıklı verileri kullanılarak aynı analizi: Örneğin, standart bir proc tek değişkenli aynı sonuçlar şöyle görünecektir vermek pandalarda weighting seçeneğinin define() gibi yöntemler için kullanılabilir mi?

+0

Bunu yapmak için DataFrame bir yöntemin farkında değilim.Sayım ve miktarlar gibi şeylerin değişmesini bekliyor musunuz? Veya sadece ortalama ve standart sapma? İlk önce ağırlığı uygulayabilir ve daha sonra ortaya çıkan dizide tarif edebilir misiniz? – TomAugspurger

+0

Teşekkürler TomAuspurger ... bu benim şüphemdi, ama bu ekstra kodlamadan kaçınmayı umuyordum ... Tüm metriklere uygulanmasını beklerdim. –

+0

Bu kadar çok çalışma olmamalı. Bence (df ['anninc'] * df ['tufnwgrp']), define() 'hile yapardı. Bir noktaya dtypes dönüştürmek zorunda kalabilirsiniz. – TomAugspurger

cevap

1

gibi @TomAugspuger diyor ki:

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 geliriyle nüfusun% 70'ini aldığınızı varsayalım ve gelirle% 30'luk bir ortalama gelir elde edersiniz. Ortalama gelirin nüfusun 0 olması gerekir. Ağırlıkça gelirleri çoğaltır ve açıklamayı uygularsanız ... muhtemelen ilgisiz olan 0.15 (vektör 0, 0,3) bir medyan elde edersiniz. – etna

+0

Ve? Benim örneğim açıklayıcıydı. Bu cevabı yazarken alan adına özel ayrıntıları hesaba katmadım. –

+0

Dunno tam olarak ne demek istediğin alana özgü detaylar. TomAugspuger'in cevabını açıkladığınızı kabul ediyorum, ancak cevabının yanlış olduğuna gerçekten inanıyorum (örneğimin nedenini göstermek istedim) ve kimsenin yanıltılmasını istemezdim. – etna

1

istatistik ve bu işlemek için görünen ekonometri kitaplığı (statsmodels) yoktur. İşte benzer bir soru üzerine @ MSeifert'in cevabını here genişleten bir örnek.

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 

Ben SAS kullanmayın, ancak bu stata komutu ile aynı cevabı verir:

sum x [fw=wt], detail 

Stata aslında birkaç kilo seçenekleri vardır ve bu durumda verir içinde fw (frekans ağırlıkları) yerine aw (analitik ağırlıklar) belirtirseniz biraz farklı bir yanıt. Ayrıca, stata bir tamsayı olmak için fw gerektirir, oysa DescrStatsW tamsayı olmayan ağırlıklar sağlar. Ağırlıklar düşündüğünüzden daha karmaşıktır ... Bu yabani otların içine girmeye başlıyor, ancak standart sapmayı here hesaplamak için ağırlıklandırma konularıyla ilgili büyük bir tartışma var.

Ayrıca, DescrStatsW'un min ve max işlevlerini içerdiği görülmüyor, ancak ağırlıklar sıfır olmadıkça, ağırlıklar min ve maks. Bazı sıfır ağırlıkları var mıydı Ancak, ağırlıklı min ve max olması güzel olabilir, ama pandalar içinde hesaplamak da kolaydır:

df.x[ df.wt > 0 ].min() 
df.x[ df.wt > 0 ].max() 
İlgili konular