2013-12-17 193 views
35

Pythonで正規分布の累積分布関数(CDF)の逆数を計算するにはどうすればよいですか?Pythonの正規累積分布関数の逆数を計算する方法は?

私はどのライブラリを使用しますか?おそらくscipy?

+1

意味しますかInverse_Gaussian_distribution)、または正規分布の累積分布関数の逆数(http://en.wikipedia.org/wiki/Normal_distribution)などがありますか? –

+0

@WarrenWeckesser第2のもの:正規分布の累積分布関数の逆数 – Yueyoum

+0

@WarrenWeckesser私は、 "normsinv"関数のpythonバージョンをExcelで使うことを意味します。 – Yueyoum

答えて

69

NORMSINV(コメントに記載)は、標準正規分布のCDFの逆数です。 scipyを使用して、scipy.stats.normオブジェクトのppfメソッドでこれを計算できます。 ppfという略語はpercent point functionの略で、quantile functionの別の名前です。

In [20]: from scipy.stats import norm 

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

それはCDFの逆であることを確認します。デフォルトでは

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

norm.ppfは "標準" 正規分布で平均= 0とSTDDEV = 1を、使用しています。 locscale引数をそれぞれ指定することによって、異なる平均と標準偏差を使用することができます。

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

あなたはscipy.stats.normのソースコードを見れば、あなたはppf方法が最終的にscipy.special.ndtriを呼び出すことがわかります。だから、標準正規分布のCDFの逆を計算するために、あなたは直接その機能を使用することができます:あなたは、逆ガウス分布(http://en.wikipedia.org/wiki/を

In [43]: from scipy.special import ndtri 

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

私はいつも "パーセントポイント関数"(ppf)はひどい名前だと思います。統計上のほとんどの人は、単に「分位関数」を使用します。 –

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:あなたは '平均'と '標準'と 'スケール'として 'loc'を取ることができます – Suresh2692

関連する問題