누적 정규 분포를 계산하는 방법은 무엇입니까?


100

Python에서 누적 정규 분포 함수를 제공하는 Numpy 또는 Scipy (또는 엄격한 Python 라이브러리)의 함수를 찾고 있습니다.

답변:


125

예를 들면 다음과 같습니다.

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

즉, 표준 정규 구간의 약 95 %는 표준 평균 0을 중심으로 두 표준 편차 내에 있습니다.

역 CDF가 필요한 경우 :

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

9
또한 평균 (loc) 및 분산 (척도)을 매개 변수로 지정할 수 있습니다. 예 : 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

2
Scipy는 왜 이것들을 locand 로 명명 scale합니까? 나는를 사용 help(norm.ppf)하지만 도대체 무엇을 loc하고 scale.. 도움에 대한 도움이 필요 -
javadba

2
@javadba-위치와 규모는 광범위한 분포를 매개 변수화하는 데 사용되는 통계에서보다 일반적인 용어입니다. 정규 분포의 경우 평균 및 sd와 일치하지만 다른 분포에서는 그렇지 않습니다.
Michael Ohlrogge

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

1
일반 정규 분포의 경우 def phi(x, mu, sigma): return (1 + erf((x - mu) / sigma / sqrt(2))) / 2.
Bernhard Barker

18

여기 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 구현이 필요하지 않습니다.
Marc

답을 찾을 수 없었습니다. 그 숫자는 어디에서 왔습니까?
TmSmth

17

시작 Python 3.8하면 표준 라이브러리 NormalDiststatistics모듈의 일부로 객체를 제공합니다 .

주어진 평균 ( ) 및 표준 편차 ( )에 대해 누적 분포 함수 ( cdf-임의 표본 X가 x보다 작거나 같을 확률) 를 얻는 데 사용할 수 있습니다 .musigma

from statistics import NormalDist

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

표준 정규 분포 ( mu = 0sigma = 1)에 대해 단순화 할 수 있습니다 .

NormalDist().cdf(1.96)
# 0.9750021048517796

NormalDist().cdf(-1.96)
# 0.024997895148220428

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

9

Alex의 대답은 표준 정규 분포에 대한 해를 보여줍니다 (평균 = 0, 표준 편차 = 1). meanstd()를 사용하는 정규 분포가 있고 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

Google이 netlogo pdf 검색에 대한 답변을 제공 하므로 위의 Python 코드의 netlogo 버전이 있습니다.

    ;; 정규 분포 누적 밀도 함수
    보고 할 normcdf [x mu sigma]
        let tx-mu
        let y 0.5 * erfcc [-t / (시그마 * sqrt 2.0)]
        if (y> 1.0) [set y 1.0]
        보고 y
    종료

    ;; 정규 분포 확률 밀도 함수
    보고 할 normpdf [x mu sigma]
        let u = (x-mu) / abs 시그마
        let y = 1 / (sqrt [2 * pi] * abs sigma) * exp (-u * u / 2.0)
        보고 y
    종료

    ;; 보완 오류 기능
    보고 할 erfcc [x]
        하자 z abs 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

나는이 선호하는 방법 아니라는 것을 알고,하지만 난 사람들이 (현재 ...) 구글이 페이지로 연결됩니다대로이 방법으로 가장 도움이 추측
platipodium
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.