2013-12-17 3 views
35

Wie berechne ich die Umkehrung der kumulativen Verteilungsfunktion (CDF) der Normalverteilung in Python?Wie berechnet man die Umkehrung der normalen kumulativen Verteilungsfunktion in Python?

Welche Bibliothek sollte ich verwenden? Vielleicht schäbig?

+1

Haben Sie die inverse Gaußsche Verteilung bedeuten (http://en.wikipedia.org/wiki/ Inverse_Gaussian_distribution) oder die Umkehrung der kumulativen Verteilungsfunktion der Normalverteilung (http://en.wikipedia.org/wiki/Normal_distribution), oder etwas anderes? –

+0

@WarrenWeckesser der zweite: Inverse der kumulativen Verteilungsfunktion der Normalverteilung – Yueyoum

+0

@WarrenWeckesser ich meine die Python-Version der "Normsinv" -Funktion in Excel. – Yueyoum

Antwort

69

NORMSINV (in einem Kommentar erwähnt) ist das Gegenteil der CDF der Standardnormalverteilung. Mit scipy können Sie dies mit der ppf Methode des scipy.stats.norm Objekts berechnen. Das Akronym ppf steht für percent point function, was ein anderer Name für die quantile function ist.

In [20]: from scipy.stats import norm 

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

Überprüfen Sie, ob es die Umkehrung der CDF ist:

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

verwendet standardmäßig norm.ppf Mittelwert = 0 und stddev = 1, was der "Standard" Normalverteilung ist. Sie können einen anderen Mittelwert und eine andere Standardabweichung verwenden, indem Sie die Argumente loc bzw. scale angeben.

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

Wenn Sie scipy.stats.norm auf den Quellcode anschauen, werden Sie feststellen, dass die ppf Methode scipy.special.ndtri schließlich nennt. So berechnen die Umkehrung der CDF der Standardnormalverteilung, können Sie diese Funktion direkt verwenden:

In [43]: from scipy.special import ndtri 

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

Ich denke immer "Prozentpunkt-Funktion" (ppf) ist ein schrecklicher Name. Die meisten Leute in der Statistik benutzen nur die "Quantil-Funktion". –

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: Sie können 'loc' als 'mean' und 'scale' als 'Standardabweichung' annehmen – Suresh2692