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.

6voto

lilith Points 26

Notez que probabilité est différent de densité de probabilité pdf() à laquelle certaines des réponses précédentes font référence. Probabilité est la chance que la variable ait une valeur spécifique, alors que la densité de probabilité est la chance que la variable soit proche d'une valeur spécifique, c'est-à-dire la probabilité sur une plage. Pour obtenir la probabilité, vous devez donc calculer l'intégrale de la fonction de densité de probabilité sur un intervalle donné. En guise d'approximation, vous pouvez simplement multiplier la densité de probabilité par l'intervalle qui vous intéresse et cela vous donnera la probabilité réelle.

import numpy as np
from scipy.stats import norm

data_start = -10
data_end = 10
data_points = 21
data = np.linspace(data_start, data_end, data_points)

point_of_interest = 5
mu = np.mean(data)
sigma = np.std(data)                                   
interval = (data_end - data_start) / (data_points - 1)
probability = norm.pdf(point_of_interest, loc=mu, scale=sigma) * interval

Le code ci-dessus vous donnera la probabilité que la variable ait une valeur exacte de 5 dans une distribution normale entre -10 et 10 avec 21 points de données (l'intervalle de signification est 1). Vous pouvez jouer avec une valeur d'intervalle fixe, en fonction des résultats que vous souhaitez obtenir.

4voto

user2724943 Points 77

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 devriez é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é. Comme la distribution normale est continue, il faut calculer une intégrale pour obtenir les probabilités. Le site wikipedia mentionne la CDF, qui n'a pas de forme fermée pour la distribution normale.

2voto

Z.LI Points 11

J'aimerais dire que l'auteur de la question demande "Comment calculer la probabilité d'un point de données donné dans une distribution normale compte tenu de la moyenne et de l'écart-type ?" au lieu de "Comment calculer la probabilité dans une distribution normale compte tenu de la moyenne et de l'écart-type ?".

Pour la "probabilité", elle doit être comprise entre 0 et 1, mais pour la "vraisemblance", elle doit être non négative (pas nécessairement entre 0 et 1).

Vous pourriez utiliser multivariate_normal.pdf(x, mean= mean_vec, cov=cov_matrix) en scipy.stats.multivariate_normal pour le calculer.

1voto

derrik bosse Points 23

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

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

Pour faire cela pour la moyenne plutôt que pour la proportion, changez la formule pour 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)

0voto

user2340146 Points 1

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

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