Comment calculer la probabilité dans une distribution normale donnée moyenne, std en Python? Je peux toujours coder explicitement ma propre fonction selon la définition comme l'a fait l'OP dans cette question: Calcul de la probabilité d'une variable aléatoire dans une distribution en Python
Se demander s'il y a un appel de fonction de bibliothèque vous permettra de le faire. Dans mon imagination, cela aimerait:
nd = NormalDistribution(mu=100, std=12)
p = nd.prob(98)
Il y a une question similaire en Perl: comment puis-je calculer la probabilité en un point donné une distribution normale en Perl? . Mais je n'en ai pas vu en Python.
Numpy
a une random.normal
fonction, mais c'est comme l'échantillonnage, pas exactement ce que je veux.
scipy.stats.norm(100, 12).pdf(98)
, cela signifie-t-il la probabilité d'obtenir 98 dans une distribution avecmean 100
etstddev 12
est0.032
?rv.cdf(102) - rv.cdf(98)
là querv = scipy.stats.norm(100, 12)
.Scipy.stats est un excellent module. Juste pour proposer une autre approche, vous pouvez la 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
Cela 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
la source
Voici plus d'informations . Vous avez d'abord affaire à une distribution figée (figée dans ce cas signifie que ses paramètres sont définis sur des valeurs spécifiques). Pour créer une distribution figé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
la source
Au départ
Python 3.8
, la bibliothèque standard fournit l'NormalDist
objet dans le cadre dustatistics
module.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 x donnée) pour une moyenne (mu
) et un écart type (sigma
) donnés :from statistics import NormalDist NormalDist(mu=100, sigma=12).pdf(98) # 0.032786643008494994
Notez également que l'
NormalDist
objet 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
la source
Au cas où vous souhaiteriez trouver la zone entre 2 valeurs de x moyenne = 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)
la source
La formule citée de wikipedia mentionnée dans les réponses ne peut pas être utilisée pour calculer les probabilités normales. Vous auriez à écrire une fonction d'approximation d'intégration numérique en utilisant cette formule afin de calculer la probabilité.
Cette formule calcule la valeur de la fonction de densité de probabilité. Puisque 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 forme fermée pour la distribution normale.
la source
J'ai écrit ce programme pour faire le calcul pour vous. Entrez simplement dans les statistiques récapitulatives. Pas besoin de fournir un tableau:
Test Z à un échantillon pour une proportion de population:
Pour ce faire pour la moyenne plutôt que pour la proportion, modifiez la formule de z en conséquence
EDIT:
Voici le contenu du lien:
import scipy.stats as stats import math def one_sample_ztest_pop_proportion(tail, p, pbar, n, alpha): #Calculate test stat sigma = math.sqrt((p*(1-p))/(n)) z = round((pbar - p) / sigma, 2) if tail == 'lower': pval = round(stats.norm(p, sigma).cdf(pbar),4) print("Results for a lower tailed z-test: ") elif tail == 'upper': pval = round(1 - stats.norm(p, sigma).cdf(pbar),4) print("Results for an upper tailed z-test: ") elif tail == 'two': pval = round(stats.norm(p, sigma).cdf(pbar)*2,4) print("Results for a two tailed z-test: ") #Print test results print("Test statistic = {}".format(z)) print("P-value = {}".format(pval)) print("Confidence = {}".format(alpha)) #Compare p-value to confidence level if pval <= alpha: print("{} <= {}. Reject the null hypothesis.".format(pval, alpha)) else: print("{} > {}. Do not reject the null hypothesis.".format(pval, alpha)) #one_sample_ztest_pop_proportion('upper', .20, .25, 400, .05) #one_sample_ztest_pop_proportion('two', .64, .52, 100, .05)
la source
Vous pouvez simplement utiliser la fonction d'erreur intégrée à la bibliothèque mathématique, comme indiqué sur leur site Web .
la source