Saltar al contenido

¿Cómo calcular el inverso de la función de distribución acumulativa normal en python?

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 scipypuedes 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.normencontrará 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.8la 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

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *