Je recherche une fonction en Numpy ou Scipy (ou toute bibliothèque Python rigoureuse) qui me donnera la fonction de distribution normale cumulative en Python.
Réponses:
Voici un exemple:
>>> from scipy.stats import norm
>>> norm.cdf(1.96)
0.9750021048517795
>>> norm.cdf(-1.96)
0.024997895148220435
En d'autres termes, environ 95% de l'intervalle normal standard se situe à l'intérieur de deux écarts types, centrés sur une moyenne standard de zéro.
Si vous avez besoin du CDF inverse:
>>> norm.ppf(norm.cdf(1.96))
array(1.9599999999999991)
loc
et scale
? J'ai utilisé le help(norm.ppf)
mais alors qu'est-ce que diable sont loc
et scale
- j'ai besoin d'aide pour l'aide ..
Il est peut-être trop tard pour répondre à la question, mais comme Google conduit toujours les gens ici, je décide d'écrire ma solution ici.
Autrement dit, depuis Python 2.7, la math
bibliothèque a intégré la fonction d'erreurmath.erf(x)
La erf()
fonction peut être utilisée pour calculer des fonctions statistiques traditionnelles telles que la distribution normale standard cumulative:
from math import *
def phi(x):
#'Cumulative distribution function for the standard normal distribution'
return (1.0 + erf(x / sqrt(2.0))) / 2.0
Réf:
https://docs.python.org/2/library/math.html
https://docs.python.org/3/library/math.html
Comment la fonction d'erreur et la fonction de distribution normale standard sont-elles liées?
def phi(x, mu, sigma): return (1 + erf((x - mu) / sigma / sqrt(2))) / 2
.
Adapté d'ici http://mail.python.org/pipermail/python-list/2000-June/039873.html
from math import *
def erfcc(x):
"""Complementary error function."""
z = abs(x)
t = 1. / (1. + 0.5*z)
r = t * exp(-z*z-1.26551223+t*(1.00002368+t*(.37409196+
t*(.09678418+t*(-.18628806+t*(.27886807+
t*(-1.13520398+t*(1.48851587+t*(-.82215223+
t*.17087277)))))))))
if (x >= 0.):
return r
else:
return 2. - r
def ncdf(x):
return 1. - 0.5*erfcc(x/(2**0.5))
Au départ Python 3.8
, la bibliothèque standard fournit l' NormalDist
objet dans le cadre du statistics
module.
Il peut être utilisé pour obtenir la fonction de distribution cumulative ( cdf
- probabilité qu'un échantillon aléatoire X soit inférieur ou égal à x) pour une moyenne ( mu
) et un écart type ( sigma
) donnés :
from statistics import NormalDist
NormalDist(mu=0, sigma=1).cdf(1.96)
# 0.9750021048517796
Ce qui peut être simplifié pour la distribution normale standard ( mu = 0
et sigma = 1
):
NormalDist().cdf(1.96)
# 0.9750021048517796
NormalDist().cdf(-1.96)
# 0.024997895148220428
Pour construire sur l'exemple de Unknown, l'équivalent Python de la fonction normdist () implémentée dans de nombreuses bibliothèques serait:
def normcdf(x, mu, sigma):
t = x-mu;
y = 0.5*erfcc(-t/(sigma*sqrt(2.0)));
if y>1.0:
y = 1.0;
return y
def normpdf(x, mu, sigma):
u = (x-mu)/abs(sigma)
y = (1/(sqrt(2*pi)*abs(sigma)))*exp(-u*u/2)
return y
def normdist(x, mu, sigma, f):
if f:
y = normcdf(x,mu,sigma)
else:
y = normpdf(x,mu,sigma)
return y
La réponse d'Alex vous montre une solution pour la distribution normale standard (moyenne = 0, écart-type = 1). Si vous avez une distribution normale avec mean
et std
(qui est sqr(var)
) et que vous souhaitez calculer:
from scipy.stats import norm
# cdf(x < val)
print norm.cdf(val, m, s)
# cdf(x > val)
print 1 - norm.cdf(val, m, s)
# cdf(v1 < x < v2)
print norm.cdf(v2, m, s) - norm.cdf(v1, m, s)
En savoir plus sur cdf ici et l'implémentation scipy de la distribution normale avec de nombreuses formules ici .
Prise d'en haut:
from scipy.stats import norm
>>> norm.cdf(1.96)
0.9750021048517795
>>> norm.cdf(-1.96)
0.024997895148220435
Pour un test bilatéral:
Import numpy as np
z = 1.96
p_value = 2 * norm.cdf(-np.abs(z))
0.04999579029644087
Simple comme ça:
import math
def my_cdf(x):
return 0.5*(1+math.erf(x/math.sqrt(2)))
J'ai trouvé la formule dans cette page https://www.danielsoper.com/statcalc/formulas.aspx?id=55
Comme Google donne cette réponse pour la recherche netlogo pdf , voici la version netlogo du code python ci-dessus
;; Fonction de densité cumulative de distribution normale to-report normcdf [x mu sigma] laissez tx - mu soit y 0.5 * erfcc [- t / (sigma * sqrt 2.0)] if (y> 1.0) [set y 1.0] signaler y fin ;; Fonction de densité de probabilité de distribution normale to-report normpdf [x mu sigma] soit u = (x - mu) / abs sigma soit y = 1 / (sqrt [2 * pi] * abs sigma) * exp (- u * u / 2.0) signaler y fin ;; Fonction d'erreur complémentaire rapporter erfcc [x] laissez z abs x soit t 1,0 / (1,0 + 0,5 * z) soit rt * exp (- z * z -1.26551223 + t * (1.00002368 + t * (0.37409196 + t * (0,09678418 + t * (-0,18628806 + t * (0,27886807 + t * (-1,13520398 + t * (1,48851587 + t * (-0,82215223 + t * .17087277))))))))) ifelse (x> = 0) [rapport r] [rapport 2.0 - r] fin