python - probabilidad - pmf estadistica
¿Cómo se calcula el inverso de la función de distribución acumulativa normal en python? (2)
¿Cómo calculo el inverso de la función de distribución acumulativa (CDF) de la distribución normal en Python?
¿Qué biblioteca debo usar? Posiblemente astuto?
NORMSINV (mencionado en un comentario) es el inverso de la CDF de la distribución normal estándar. Usando scipy
, puede calcular esto con el método scipy.stats.norm
objeto scipy.stats.norm
. El acrónimo ppf
significa función de punto porcentual , que es otro nombre para la función de cuantil .
In [20]: from scipy.stats import norm
In [21]: norm.ppf(0.95)
Out[21]: 1.6448536269514722
Verifique que sea el inverso 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 usar una media diferente y una desviación estándar especificando los argumentos loc
y scale
, respectivamente.
In [35]: norm.ppf(0.95, loc=10, scale=2)
Out[35]: 13.289707253902945
Si scipy.stats.norm
el código fuente de scipy.stats.norm
, verás que el método ppf
finalmente llama a scipy.special.ndtri
. Entonces, para calcular el inverso de la CDF de la distribución normal estándar, puede 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)