124 votes

Comment calculer la distribution normale cumulative ?

Je cherche une fonction dans Numpy ou Scipy (ou toute autre bibliothèque Python rigoureuse) qui me donnera la fonction de distribution normale cumulative en Python.

149voto

Alex Reynolds Points 45039

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 de la CDF inverse :

>>> norm.ppf(norm.cdf(1.96))
array(1.9599999999999991)

52voto

WTIFS Points 882

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.

C'est-à-dire que, depuis Python 2.7, la fonction math a intégré la fonction d'erreur math.erf(x)

El erf() 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 ?

39voto

Xavier Guihot Points 6414

Démarrage Python 3.8 la bibliothèque standard fournit la fonction NormalDist dans le cadre de la statistics module.

Il peut être utilisé pour obtenir le fonction de distribution cumulative ( cdf - la probabilité qu'un échantillon aléatoire X soit inférieur ou égal à x) pour une valeur donnée moyenne ( mu ) et écart type ( sigma ) :

from statistics import NormalDist

NormalDist(mu=0, sigma=1).cdf(1.96)
# 0.9750021048517796

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

NormalDist().cdf(1.96)
# 0.9750021048517796

NormalDist().cdf(-1.96)
# 0.024997895148220428

18voto

Unknown Points 22789

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))

17voto

Cerin Points 9851

Pour reprendre l'exemple d'Inconnu, 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X