web-dev-qa-db-fra.com

Calculer la probabilité dans la distribution normale donnée moyenne, std in Python

Comment calculer la probabilité dans la distribution normale donnée moyenne, std en Python? Je peux toujours explicitement coder ma propre fonction conformément à la définition, comme le fait le PO dans cette question: Calcul de la probabilité d'une variable aléatoire dans une distribution en Python

Vous vous demandez simplement s'il existe un appel de fonction de bibliothèque qui vous permettra de le faire. Dans mon imaginer il aimerait ceci:

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

Il existe une question similaire dans Perl: Comment puis-je calculer la probabilité à un point donné une distribution normale en Perl? . Mais je n'en ai pas vu en Python.

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

67
clwen

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 à se méfier - juste un conseil - est que le paramètre transmis 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) ou scipy.stats.norm(loc=100, scale=12), il l'acceptera, mais les éliminera en silence. extra mot-clé arguments et vous donner la valeur par défaut (0,1).]

98
DSM

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

Ceci utilise la formule trouvée ici: http://en.wikipedia.org/wiki/Distribution_Normal #Probability_density_function

tester:

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

Voici plus d'infos . Il s’agit d’abord d’une distribution gelée (gelée dans ce cas signifie que ses paramètres sont définis sur 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
12
J. Khoury

Commencer Python 3.8, la bibliothèque standard fournit l’objet NormalDist dans le cadre du module statistics .

Il peut être utilisé pour obtenir la fonction de densité de probabilité ( pdf = - probabilité qu'un échantillon aléatoire X soit proche de la valeur donnée x) pour un donné moyen (mu) et écart type ( sigma):

from statistics import NormalDist

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

Notez également que l’objet NormalDist fournit également la 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
3
Xavier Guihot

La formule citée dans wikipedia mentionnée dans les réponses ne peut pas être utilisée pour calculer des probabilités normales. Pour calculer la probabilité, vous devez écrire une fonction d’approximation numérique d’intégration à l’aide de cette formule.

Cette formule calcule la valeur de la fonction de densité de probabilité. Comme la distribution normale est continue, vous devez calculer une intégrale pour obtenir des probabilités. Le site wikipedia mentionne le CDF, qui n’a pas de formulaire fermé pour la distribution normale.

2
user2724943

J'ai écrit ce programme pour faire le calcul pour vous. Il suffit d'entrer dans les statistiques récapitulatives. Pas besoin de fournir un tableau:

Test Z sur un échantillon pour une proportion de population:

Pour ce faire pour la moyenne plutôt que pour la proportion, changez la formule pour z en conséquence

1
derrik bosse

Vous pouvez simplement utiliser la fonction d'erreur intégrée à la bibliothèque mathématique, comme indiqué sur leur site web .

0
user2340146

Dans le cas où vous voudriez trouver l’aire entre 2 valeurs de x mean = 1; écart type = 2; la 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)
0
Prashanth