Wie berechnet man die Umkehrung der normalen kumulativen Verteilungsfunktion in Python?


72

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

Welche Bibliothek soll ich benutzen? Möglicherweise scipy?


1
Meinen Sie die inverse Gaußsche Verteilung ( en.wikipedia.org/wiki/Inverse_Gaussian_distribution ) oder die Umkehrung der kumulativen Verteilungsfunktion der Normalverteilung ( en.wikipedia.org/wiki/Normal_distribution ) oder etwas anderes?
Warren Weckesser

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

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

Antworten:


127

NORMSINV (in einem Kommentar erwähnt) ist die Umkehrung der CDF der Standardnormalverteilung. Mit scipykönnen Sie dies mit der ppfMethode des scipy.stats.normObjekts berechnen . Das Akronym ppfsteht für die Prozentpunktfunktion , die ein anderer Name für die Quantilfunktion ist .

In [20]: from scipy.stats import norm

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

Überprüfen Sie, ob es sich um die Umkehrung der CDF handelt:

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

norm.ppfVerwendet standardmäßig mean = 0 und stddev = 1, was die "Standard" -Normalverteilung ist. Sie können die durch die Angabe eine unterschiedliche Mittelwert und Standardabweichung verwenden locund scalejeweils Argumente.

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

Wenn Sie sich den Quellcode ansehen scipy.stats.norm, werden Sie feststellen, dass die ppfMethode letztendlich aufruft scipy.special.ndtri. Um die Umkehrung der CDF der Standardnormalverteilung zu berechnen, können Sie diese Funktion direkt verwenden:

In [43]: from scipy.special import ndtri

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

24
Ich denke immer, dass "Prozentpunktfunktion" (ppf) ein schrecklicher Name ist. Die meisten Personen in der Statistik verwenden nur die "Quantilfunktion".
William Zhang

15
# 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)

6
PS: Sie können "loc" als "Mittelwert" und "Skala" als "Standardabweichung"
annehmen

14

Ab Python 3.8dem Start stellt die Standardbibliothek das NormalDistObjekt als Teil des statisticsModuls bereit .

Es kann verwendet werden, um die inverse kumulative Verteilungsfunktion ( inv_cdf- inverse von cdf) zu erhalten, die auch als Quantilfunktion oder Prozentpunktfunktion für einen bestimmten Mittelwert ( mu) und eine bestimmte Standardabweichung ( sigma) bezeichnet wird:

from statistics import NormalDist

NormalDist(mu=10, sigma=2).inv_cdf(0.95)
# 13.289707253902943

Was für die Standardnormalverteilung ( mu = 0und sigma = 1) vereinfacht werden kann :

NormalDist().inv_cdf(0.95)
# 1.6448536269514715

1
Toller Tipp! Dies ermöglicht es mir, die Abhängigkeit von scipy zu löschen, die ich nur für die einzelne stats.norm.ppf-Methode benötigte
Jethro Cao
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.