web-dev-qa-db-ja.com

Pythonで累積正規分布を計算する方法

NumpyまたはScipy(または厳密なPythonライブラリ)でPythonの累積正規分布関数を提供する関数を探しています。

85
toma

以下に例を示します。

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

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

逆CDFが必要な場合:

>>> norm.ppf(norm.cdf(1.96))
array(1.9599999999999991)
112
Alex Reynolds

質問に答えるのは遅すぎるかもしれませんが、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

エラー関数と標準正規分布関数の関係は?

33
WTIFS

ここから適応 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))
18
Unknown

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
Cerin

アレックスの答えは、標準正規分布(平均= 0、標準偏差= 1)の解決策を示しています。 meanstdsqr(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 here および多くの式を含む正規分布のscipy実装 here の詳細をお読みください。

8
Salvador Dali

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

累積分布関数cdf -確率を取得するために使用できますランダムサンプルXは、与えられたmeanmu)および標準偏差sigma)に対してx以下であることに注意してください。

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
4
Xavier Guihot

上から撮影:

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
1
David Miller