Nuestros desarrolladores estrellas agotaron sus provisiones de café, buscando día y noche por la resolución, hasta que Amelia encontró el resultado en GitLab así que hoy la compartimos contigo.
Solución:
NORMSINV (mencionado en un comentario) es el inverso del CDF de la distribución normal estándar. Utilizando scipy
puedes calcular esto con el ppf
metodo de la scipy.stats.norm
objeto. El acrónimo ppf
representa función de punto porcentualque es otro nombre para el función cuantil.
In [20]: from scipy.stats import norm
In [21]: norm.ppf(0.95)
Out[21]: 1.6448536269514722
Comprueba que es la inversa de la CDF:
In [34]: norm.cdf(norm.ppf(0.95))
Out[34]: 0.94999999999999996
Por defecto, norm.ppf
usa mean=0 y stddev=1, que es la distribución normal “estándar”. Puede utilizar una media y una desviación estándar diferentes especificando el loc
y scale
argumentos, respectivamente.
In [35]: norm.ppf(0.95, loc=10, scale=2)
Out[35]: 13.289707253902945
Si miras el código fuente de scipy.stats.norm
encontrará que el ppf
el método finalmente llama scipy.special.ndtri
. Entonces, para calcular el inverso de la CDF de la distribución normal estándar, podría usar esa función directamente:
In [43]: from scipy.special import ndtri
In [44]: ndtri(0.95)
Out[44]: 1.6448536269514722
# 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)
A partir de Python 3.8
la biblioteca estándar proporciona la NormalDist
objeto como parte del statistics
módulo.
Se puede utilizar para obtener la función de distribución acumulada inversa (inv_cdf
- inversa de la cdf
), también conocido como el función cuantil o el función de punto porcentual para una dada significar (mu
) y Desviación Estándar (sigma
):
from statistics import NormalDist
NormalDist(mu=10, sigma=2).inv_cdf(0.95)
# 13.289707253902943
que se puede simplificar para el distribución normal estándar (mu = 0
y sigma = 1
):
NormalDist().inv_cdf(0.95)
# 1.6448536269514715