124 votes

Comment calculer la probabilité d'une distribution normale en fonction de la moyenne et de l'écart-type ?

Comment calculer la probabilité d'une distribution normale en fonction de la moyenne et de l'écart-type en Python ? Je peux toujours coder explicitement ma propre fonction selon la définition comme l'a fait le PO dans cette question : Calcul de la probabilité d'une variable aléatoire dans une distribution en Python

Je me demande s'il existe un appel de fonction de bibliothèque qui vous permettra de faire cela. Dans mon imagination, ce serait comme ceci :

nd = NormalDistribution(mu=100, std=12)
p = nd.prob(98)

Une question similaire se pose en Perl : Comment puis-je calculer la probabilité en un point donné d'une distribution normale en Perl ? . Mais je n'en ai pas vu en Python.

Numpy a un random.normal mais c'est comme un échantillonnage, pas exactement ce que je veux.

164voto

DSM Points 71975

Il y en a un dans scipy.stats :

>>> import scipy.stats
>>> scipy.stats.norm(0, 1)
<scipy.stats.distributions.rv_frozen object at 0x928352c>
>>> scipy.stats.norm(0, 1).pdf(0)
0.3989422804014327
>>> scipy.stats.norm(0, 1).cdf(0)
0.5
>>> scipy.stats.norm(100, 12)
<scipy.stats.distributions.rv_frozen object at 0x928352c>
>>> scipy.stats.norm(100, 12).pdf(98)
0.032786643008494994
>>> scipy.stats.norm(100, 12).cdf(98)
0.43381616738909634
>>> scipy.stats.norm(100, 12).cdf(100)
0.5

[Une chose dont il faut se méfier - juste un conseil - est que le passage des paramètres est un peu large. En raison de la manière dont le code est configuré, si vous écrivez accidentellement scipy.stats.norm(mean=100, std=12) au lieu de scipy.stats.norm(100, 12) o scipy.stats.norm(loc=100, scale=12) alors il l'acceptera, mais ignorera silencieusement les arguments de mots-clés supplémentaires et vous donnera la valeur par défaut (0,1)].

61voto

jiminy_crist Points 1303

Scipy.stats est un excellent module. Juste pour offrir une autre approche, vous pouvez le calculer directement en utilisant

import math
def normpdf(x, mean, sd):
    var = float(sd)**2
    denom = (2*math.pi*var)**.5
    num = math.exp(-(float(x)-float(mean))**2/(2*var))
    return num/denom

Pour cela, on utilise la formule trouvée ici : http://en.wikipedia.org/wiki/Normal_distribution#Probability_density_function

à tester :

>>> normpdf(7,5,5)  
0.07365402806066466
>>> norm(5,5).pdf(7)
0.073654028060664664

47voto

J. Khoury Points 166

Voici plus d'infos . Tout d'abord, vous avez affaire à une distribution gelée (gelée dans ce cas signifie que ses paramètres sont fixés à des valeurs spécifiques). Pour créer une distribution gelée :

import scipy.stats
scipy.stats.norm(loc=100, scale=12)
#where loc is the mean and scale is the std dev
#if you wish to pull out a random number from your distribution
scipy.stats.norm.rvs(loc=100, scale=12)

#To find the probability that the variable has a value LESS than or equal
#let's say 113, you'd use CDF cumulative Density Function
scipy.stats.norm.cdf(113,100,12)
Output: 0.86066975255037792
#or 86.07% probability

#To find the probability that the variable has a value GREATER than or
#equal to let's say 125, you'd use SF Survival Function 
scipy.stats.norm.sf(125,100,12)
Output: 0.018610425189886332
#or 1.86%

#To find the variate for which the probability is given, let's say the 
#value which needed to provide a 98% probability, you'd use the 
#PPF Percent Point Function
scipy.stats.norm.ppf(.98,100,12)
Output: 124.64498692758187

29voto

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 densité de probabilité ( pdf - probabilité qu'un échantillon aléatoire X soit proche de la valeur x) pour une valeur donnée. moyenne ( mu ) et écart type ( sigma ):

from statistics import NormalDist

NormalDist(mu=100, sigma=12).pdf(98)
# 0.032786643008494994

Notez également que le NormalDist fournit également l'objet fonction de distribution cumulative ( cdf - probabilité qu'un échantillon aléatoire X soit inférieur ou égal à x) :

NormalDist(mu=100, sigma=12).cdf(98)
# 0.43381616738909634

12voto

Prashanth Points 111

Dans le cas où vous voudriez trouver l'aire entre 2 valeurs de x : moyenne = 1 ; écart-type = 2 ; probabilité de x entre [0,5,2].

import scipy.stats
scipy.stats.norm(1, 2).cdf(2) - scipy.stats.norm(1,2).cdf(0.5)

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