累積正規分布の計算方法は?


回答:


125

次に例を示します。

>>> from scipy.stats import norm
>>> norm.cdf(1.96)
0.9750021048517795
>>> norm.cdf(-1.96)
0.024997895148220435

言い換えると、標準正規間隔の約95%は、0の標準平均を中心とした2つの標準偏差内にあります。

逆CDFが必要な場合:

>>> norm.ppf(norm.cdf(1.96))
array(1.9599999999999991)

9
また、平均(位置)と分散(スケール)をパラメーターとして指定することもできます。例:d = norm(loc = 10.0、scale = 2.0); d.cdf(12.0); 詳細はこちら:docs.scipy.org/doc/scipy-0.14.0/reference/generated/...
Irvan

6
@Irvan、スケールパラメーターは実際には標準偏差であり、分散ではありません。
qkhhly 2015年

2
なぜscipyはこれらをlocandと名付けているのscaleですか?私が使用しhelp(norm.ppf)たが、その後一体何しているlocscale...助けのための助けが必要-
javadba

2
@javadba-ロケーションとスケールは、幅広い分布のパラメーター化に使用される統計のより一般的な用語です。正規分布の場合、それらは平均とsdで整列しますが、他の分布では整列しません。
Michael Ohlrogge 2017

1
@MichaelOhlrogge。どうも!これはNISTのページで、さらにitl.nist.gov/div898/handbook/eda/section3/eda364.htmを
javadba

40

質問に答えるには遅すぎるかもしれませんが、Googleはまだここで人々をリードしているので、ここに私の解決策を書くことにします。

つまり、Python 2.7以降、mathライブラリはエラー関数を統合していますmath.erf(x)

このerf()関数を使用して、累積標準正規分布などの従来の統計関数を計算できます。

from math import *
def phi(x):
    #'Cumulative distribution function for the standard normal distribution'
    return (1.0 + erf(x / sqrt(2.0))) / 2.0

参照:

https://docs.python.org/2/library/math.html

https://docs.python.org/3/library/math.html

エラー関数と標準正規分布関数はどのように関連していますか?


3
これはまさに私が探していたものでした。これを使用して「標準分布内にあるデータのパーセンテージ」を計算する方法を私以外の誰かが疑問に思っている場合は、1-(1-phi(1))* 2 = 0.6827( "1標準内のデータの68%"偏差」)
Hannes Landeholm 2017

1
一般的な正規分布の場合は、になりますdef phi(x, mu, sigma): return (1 + erf((x - mu) / sigma / sqrt(2))) / 2
Bernhard Barker

19

ここから適応http://mail.python.org/pipermail/python-list/2000-June/039873.html

from math import *
def erfcc(x):
    """Complementary error function."""
    z = abs(x)
    t = 1. / (1. + 0.5*z)
    r = t * exp(-z*z-1.26551223+t*(1.00002368+t*(.37409196+
        t*(.09678418+t*(-.18628806+t*(.27886807+
        t*(-1.13520398+t*(1.48851587+t*(-.82215223+
        t*.17087277)))))))))
    if (x >= 0.):
        return r
    else:
        return 2. - r

def ncdf(x):
    return 1. - 0.5*erfcc(x/(2**0.5))

3
std libはmath.erf()を実装しているため、sep実装は必要ありません。
マルク

私は答えを見つけることができませんでした、それらの数字はどこから来たのですか?
TmSmth

15

Unknownの例を基にするには、多くのライブラリに実装されている関数normdist()に相当するPythonは次のようになります。

def normcdf(x, mu, sigma):
    t = x-mu;
    y = 0.5*erfcc(-t/(sigma*sqrt(2.0)));
    if y>1.0:
        y = 1.0;
    return y

def normpdf(x, mu, sigma):
    u = (x-mu)/abs(sigma)
    y = (1/(sqrt(2*pi)*abs(sigma)))*exp(-u*u/2)
    return y

def normdist(x, mu, sigma, f):
    if f:
        y = normcdf(x,mu,sigma)
    else:
        y = normpdf(x,mu,sigma)
    return y

14

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

特定の平均()と標準偏差()の累積分布関数cdfランダムサンプルXがx以下になる確率)を取得するために使用できます。musigma

from statistics import NormalDist

NormalDist(mu=0, sigma=1).cdf(1.96)
# 0.9750021048517796

これは、標準正規分布mu = 0およびsigma = 1)で簡略化できます。

NormalDist().cdf(1.96)
# 0.9750021048517796

NormalDist().cdf(-1.96)
# 0.024997895148220428

9

アレックスの答えは、標準正規分布の解決策を示しています(平均= 0、標準偏差= 1)。meanand std(つまりsqr(var))で正規分布があり、計算したい場合:

from scipy.stats import norm

# cdf(x < val)
print norm.cdf(val, m, s)

# cdf(x > val)
print 1 - norm.cdf(val, m, s)

# cdf(v1 < x < v2)
print norm.cdf(v2, m, s) - norm.cdf(v1, m, s)

もっと読むここCDF、多くの数式を持つ正規分布のscipyのダウンロード実装こちら


2

上から撮影:

from scipy.stats import norm
>>> norm.cdf(1.96)
0.9750021048517795
>>> norm.cdf(-1.96)
0.024997895148220435

両側検定の場合:

Import numpy as np
z = 1.96
p_value = 2 * norm.cdf(-np.abs(z))
0.04999579029644087


-9

グーグルが検索netlogo pdfに対してこの答えを与えるので、ここに上記のpythonコードのnetlogoバージョンがあります

    ;; 正規分布累積密度関数
    to-report normcdf [x mu sigma]
        tx-muとしましょう
        y 0.5 * erfcc [-t /(sigma * sqrt 2.0)]とします。
        if(y> 1.0)[set y 1.0]
        レポートy
    終わり

    ;; 正規分布確率密度関数
    to-report normpdf [x mu sigma]
        let u =(x-mu)/ abs sigma
        let y = 1 /(sqrt [2 * pi] * abs sigma)* exp(-u * u / 2.0)
        レポートy
    終わり

    ;; 相補誤差関数
    報告するerfcc [x]
        z、ab、x
        t 1.0 /(1.0 + 0.5 * z)とする
        let rt * exp(-z * z -1.26551223 + t *(1.00002368 + t *(0.37409196 +
            t *(0.09678418 + t *(-0.18628806 + t *(.27886807 +
            t *(-1.13520398 + t *(1.48851587 + t *(-0.82215223 +
            t * .17087277))))))))))
        ifelse(x> = 0)[レポートr] [レポート2.0-r]
    終わり


6
問題は、NetLogoではなくPythonについてです。この答えはここにあるべきではありません。また、質問を編集してその意味を変更しないでください。
interjay 2012年

私はこれが推奨される方法ではないことを認識していますが、人々がグーグルによってこのページに誘導されているので、この方法が最も役立つと思います(現在...)
platipodium 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.