web-dev-qa-db-fra.com

Comment calculer l'inverse de la fonction de distribution cumulative normale en python?

Comment calculer l'inverse de la fonction de distribution cumulative (CDF) de la distribution normale en Python?

Quelle bibliothèque devrais-je utiliser? Peut-être scipy?

52
Yueyoum

NORMSINV (mentionné dans un commentaire) est l'inverse du CDF de la distribution normale standard. En utilisant scipy, vous pouvez le calculer avec la méthode ppf de scipy.stats.norm objet. L’acronyme ppf signifie , fonction de pourcentage , qui est un autre nom pour le fonction quantile .

In [20]: from scipy.stats import norm

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

Vérifiez que c'est l'inverse du CDF:

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

Par défaut, norm.ppf utilise mean = 0 et stddev = 1, qui est la distribution normale "standard". Vous pouvez utiliser une moyenne et un écart type différents en spécifiant les arguments loc et scale, respectivement.

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

Si vous regardez le code source de scipy.stats.norm, vous constaterez que la méthode ppf appelle finalement scipy.special.ndtri . Donc, pour calculer l'inverse du CDF de la distribution normale standard, vous pouvez utiliser cette fonction directement:

In [43]: from scipy.special import ndtri

In [44]: ndtri(0.95)
Out[44]: 1.6448536269514722
96
Warren Weckesser
# 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)
10
o0omycomputero0o

Commencer Python 3.8, la bibliothèque standard fournit l’objet NormalDist dans le cadre du module statistics .

Il peut être utilisé pour obtenir la fonction de distribution cumulative inverse ( - inv_cdf - inverse du cdf ), également appelé fonction quantile ou la fonction de point de pourcentage pour une donnée donnée moyenne (mu) et écart type (sigma):

from statistics import NormalDist

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

Ce qui peut être simplifié pour la distribution normale standard (mu = 0 et sigma = 1):

NormalDist().inv_cdf(0.95)
# 1.6448536269514715
2
Xavier Guihot