114

Pythonで平均、stdが与えられた場合、正規分布で確率を計算する方法は?この質問のOPのように、自分の関数をいつでも明示的にコーディングできます。Pythonでの分布における確率変数の確率の計算

ライブラリ関数呼び出しがあるかどうか疑問に思うだけで、これを行うことができます。私の想像では、これは次のようになります。

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

Perlにも同様の質問があります。Perlの正規分布が与えられた時点での確率を​​計算するにはどうすればよいですか?。しかし、Pythonでは見ませんでした。

Numpy機能はありrandom.normalますが、サンプリングのようなもので、私が望むものとは異なります。

4

10 に答える 10

146

scipy.statsに1つあります:

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

[注意すべきことの1つは、ヒントですが、パラメーターの受け渡しが少し広いということです。コードの設定方法が原因で、またはscipy.stats.norm(mean=100, std=12)の代わりに誤って記述した場合は、それを受け入れますが、それらの余分なキーワード引数を黙って破棄し、デフォルト(0,1)を指定します。]scipy.stats.norm(100, 12)scipy.stats.norm(loc=100, scale=12)

于 2012-09-13T19:03:15.167 に答える
54

Scipy.statsは素晴らしいモジュールです。別のアプローチを提供するために、を使用して直接計算できます

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

これは、次の式を使用します:http: //en.wikipedia.org/wiki/Normal_distribution#Probability_density_function

テストする:

>>> normpdf(7,5,5)  
0.07365402806066466
>>> norm(5,5).pdf(7)
0.073654028060664664
于 2012-09-13T19:32:11.347 に答える
31

詳細はこちらです。まず、凍結された分布を処理します(この場合、凍結とは、そのパラメーターが特定の値に設定されていることを意味します)。凍結されたディストリビューションを作成するには:

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
于 2017-12-05T05:18:07.990 に答える
21

からPython 3.8、標準ライブラリはモジュールNormalDistの一部としてオブジェクトを提供します。statistics

これを使用して、特定の平均()および標準偏差()の確率密度関数pdf-ランダムサンプルXが特定の値xに近づく可能性)を取得できます。musigma

from statistics import NormalDist

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

また、オブジェクトは累積分布関数(-ランダムサンプルXがx以下になる確率)NormalDistも提供することに注意してください。cdf

NormalDist(mu=100, sigma=12).cdf(98)
# 0.43381616738909634
于 2019-02-28T19:47:32.427 に答える
11

x平均=1の2つの値の間の領域を見つけたい場合。標準偏差=2; [0.5,2]の間のxの確率

import scipy.stats
scipy.stats.norm(1, 2).cdf(2) - scipy.stats.norm(1,2).cdf(0.5)
于 2019-06-19T04:36:14.460 に答える
4

回答で言及されているウィキペディアから引用された式は、通常の確率を計算するために使用することはできません。確率を計算するには、その式を使用して数値積分近似関数を作成する必要があります。

この式は、確率密度関数の値を計算します。正規分布は連続であるため、確率を取得するには積分を計算する必要があります。ウィキペディアのサイトでは、正規分布の閉じた形式を持たないCDFについて言及しています。

于 2015-05-25T15:44:03.903 に答える
3

確率は、前の回答のいくつかが参照している確率密度 とは異なることに注意してください。確率は変数が特定の値を持つ可能性であり、確率密度は変数が特定の値に近づく可能性であり、範囲全体の確率を意味します。したがって、確率を取得するには、特定の間隔で確率密度関数の積分を計算する必要があります。概算として、確率密度に関心のある間隔を掛けるだけで、実際の確率が得られます。pdf()

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

The code above will give you the probability that the variable will have an exact value of 5 in a normal distribution between -10 and 10 with 21 data points (meaning interval is 1). You can play around with a fixed interval value, depending on the results you want to achieve.

于 2021-01-08T13:58:03.080 に答える
1

私はあなたのために数学をするためにこのプログラムを書きました。要約統計量を入力するだけです。配列を提供する必要はありません:

母集団の1標本Z検定:

比率ではなく平均でこれを行うには、それに応じてzの式を変更します

編集:
リンクの内容は次のとおりです。

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)
于 2018-01-24T23:12:46.127 に答える
0

彼らのウェブサイトに記載されているように、数学ライブラリに組み込まれているエラー関数を使用することができます。

于 2013-05-01T16:33:46.170 に答える
0

I would like to say: the questioner is asking "How to calculate the likelihood of a given data point in a normal distribution given mean & standard deviation?" instead of "How to calculate probability in a normal distribution given mean & standard deviation?".

For "probability", it must be between 0 and 1, but for "likelihood", it must be non-negative (not necessarily between 0 and 1).

You could use multivariate_normal.pdf(x, mean= mean_vec, cov=cov_matrix) in scipy.stats.multivariate_normal to calculate it.

于 2021-10-24T11:25:23.063 に答える