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.

13voto

Salvador Dali Points 11667

La réponse d'Alex vous montre une solution pour une distribution normale standard (moyenne = 0, écart-type = 1). Si vous avez une distribution normale avec mean y std (qui est sqr(var) ) et vous voulez 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)

Plus d'informations sur cdf ici et implémentation scipy de la distribution normale avec de nombreuses formules ici .

2voto

David Miller Points 49

Pris de 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

0voto

Samuel Corradi Points 41

C'est simple comme bonjour :

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

-2voto

platipodium Points 43

Comme Google donne cette réponse pour la recherche netlogo pdf Voici la version netlogo du code python ci-dessus.

    ;; Normal distribution cumulative density function
    to-report normcdf \[x mu sigma\]
        let t x - mu
        let y 0.5 \* erfcc \[ - t / ( sigma \* sqrt 2.0)\]
        if ( y > 1.0 ) \[ set y 1.0 \]
        report y
    end

    ;; Normal distribution probability density function
    to-report normpdf \[x mu sigma\]
        let u = (x - mu) / abs sigma
        let y = 1 / ( sqrt \[2 \* pi\] \* abs sigma ) \* exp ( - u \* u / 2.0)
        report y
    end

    ;; Complementary error function
    to-report erfcc \[x\]
        let z abs x
        let t 1.0 / (1.0 + 0.5 \* z)
        let r t \*  exp ( - z \* z -1.26551223 + t \* (1.00002368 + t \* (0.37409196 +
            t \* (0.09678418 + t \* (-0.18628806 + t \* (.27886807 +
            t \* (-1.13520398 +t \* (1.48851587 +t \* (-0.82215223 +
            t \* .17087277 )))))))))
        ifelse (x >= 0) \[ report r \] \[report 2.0 - r\]
    end

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