2013-12-17 13 views
35

Python'da normal dağıtımın kümülatif dağılım işlevinin (CDF) tersini nasıl hesaplayabilirim?Python'da normal kümülatif dağılım işlevinin tersi nasıl hesaplanır?

Hangi kütüphaneyi kullanmalıyım? Muhtemelen scipy? (Bir yorumda)

+1

sen (ters Gauss dağılımı anlamına mı http://en.wikipedia.org/wiki/: Yani standart normal dağılımın CDF'nin tersini hesaplamak için, doğrudan o fonksiyonu kullanabilirsiniz Inverse_Gaussian_distribution) veya normal dağılımın (http://en.wikipedia.org/wiki/Normal_distribution) kümülatif dağılım fonksiyonunun tersi mi yoksa başka bir şey mi? –

+0

@WarrenWeckesser ikincisi: normal dağılımın kümülatif dağılım fonksiyonunun tersi – Yueyoum

+0

@WarrenWeckesser excel'de "normsinv" fonksiyonunun python versiyonunu kastediyorum. – Yueyoum

cevap

69

NORMSINV standart normal dağılımın CDF tersidir. scipy'u kullanarak, bunu scipy.stats.norm nesnesinin ppf yöntemiyle hesaplayabilirsiniz. ppf kısaltması, quantile function için başka bir ad olan percent point function anlamına gelir. o CDF'nin tersi olduğunu

In [20]: from scipy.stats import norm 

In [21]: norm.ppf(0.95) 
Out[21]: 1.6448536269514722 

Kontrol: Varsayılan olarak

In [34]: norm.cdf(norm.ppf(0.95)) 
Out[34]: 0.94999999999999996 

, norm.ppf "standart" normal dağılım 0 = ortalama ve stddev = 1 kullanır. Sırasıyla loc ve scale argümanlarını belirterek farklı bir ortalama ve standart sapma kullanabilirsiniz. Eğer scipy.stats.norm için kaynak koduna baktığımızda

In [35]: norm.ppf(0.95, loc=10, scale=2) 
Out[35]: 13.289707253902945 

, sen ppf yöntem sonuçta scipy.special.ndtri çağırır olduğunu göreceksiniz.

In [43]: from scipy.special import ndtri 

In [44]: ndtri(0.95) 
Out[44]: 1.6448536269514722 
+10

Her zaman "yüzde puan işlevi" (ppf) 'nin korkunç bir ad olduğunu düşünüyorum. İstatistikteki çoğu kişi "quantile function" kullanmaktadır. –

5
# given random variable X (house price) with population muy = 60, sigma = 40 
import scipy as sc 
import scipy.stats as sct 
sc.version.full_version # 0.15.1 

#a. Find P(X<50) 
sct.norm.cdf(x=50,loc=60,scale=40) # 0.4012936743170763 

#b. Find P(X>=50) 
sct.norm.sf(x=50,loc=60,scale=40) # 0.5987063256829237 

#c. Find P(60<=X<=80) 
sct.norm.cdf(x=80,loc=60,scale=40) - sct.norm.cdf(x=60,loc=60,scale=40) 

#d. how much top most 5% expensive house cost at least? or find x where P(X>=x) = 0.05 
sct.norm.isf(q=0.05,loc=60,scale=40) 

#e. how much top most 5% cheapest house cost at least? or find x where P(X<=x) = 0.05 
sct.norm.ppf(q=0.05,loc=60,scale=40) 
+1

PS: 'Ortalama' ve 'ölçek' olarak 'loc' değerini 'standart sapma' olarak kabul edebilirsiniz. – Suresh2692