평균 및 표준 편차가 주어진 정규 분포에서 확률을 계산하는 방법은 무엇입니까?


91

파이썬에서 평균, 표준이 주어진 정규 분포에서 확률을 계산하는 방법은 무엇입니까? 이 질문의 OP와 같은 정의에 따라 항상 내 자신의 함수를 명시 적으로 코딩 할 수 있습니다. Python의 분포에서 랜덤 변수의 확률 계산

라이브러리 함수 호출이 있는지 궁금하면이를 수행 할 수 있습니다. 내 상상으로는 다음과 같습니다.

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

Perl에도 비슷한 질문이 있습니다. Perl 의 정규 분포가 주어진 지점에서 확률을 어떻게 계산할 수 있습니까? . 하지만 파이썬에서는 보지 못했습니다.

Numpyrandom.normal기능을하지만, 내가 원하는 정확히 무엇을, 샘플링 같다.

답변:


129

하나 있습니다 scipy.stats에 있습니다 .

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

[주의해야 할 한 가지-단지 팁-매개 변수 전달이 약간 광범위하다는 것입니다. 코드가 설정되는 방식 때문에 또는 scipy.stats.norm(mean=100, std=12)대신 실수로 작성 하면이를 수락하지만 추가 키워드 인수를 자동으로 삭제하고 기본값 (0,1)을 제공합니다.]scipy.stats.norm(100, 12)scipy.stats.norm(loc=100, scale=12)


3
범위에서 확률을 어떻게 얻습니까? 98-102에서?
Leon

2
@DSM : 위의 예에서라고 말하면 scipy.stats.norm(100, 12).pdf(98)분포에서 98을 얻을 확률이 mean 100 and stddev 12is 0.032?
Srivatsan 2015 년

14
@ThePredator : 아니요, 평균이 100이고 표준 편차가 12 인 정규 분포에서 98을 얻을 확률은 0입니다. :-) 확률 밀도 는 0.032입니다.
DSM

이 경우 확률 밀도는 정규 분포에 대한 x 값 1.42가 주어지면 y 값을 의미합니다. cdf는 곡선 아래 영역을 의미합니다.
파쇄

5
@Leon은, 그건 rv.cdf(102) - rv.cdf(98)어디 rv = scipy.stats.norm(100, 12).
fuglede

46

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

이건 정말 좋은 대답입니다. 단계별 설명을 제공해 주시겠습니까?
Llamageddon

이 방법은 scipy보다 계산 시간이 덜 필요합니다
mkm

그러나 scipy는 평균 배열, 표준 편차 및 샘플을 처리 할 수 ​​있습니다. x in ([5, 10, 20], [10, 20, 40]에 대한 mean = [5, 10, 20] stddev = [20, 30, 40], [15, 30, 50],) : prob = scipy.stats.norm (mean, stddev) .cdf (x) print (f'prob = {prob} ') 출력 : prob = [0.5 0.5 0.5] prob = [ 0.59870633 0.63055866 0.69146246] prob = [0.69146246 0.74750746 0.77337265]
John Deighan

16

여기에 더 많은 정보가 있습니다. 먼저 고정 분포를 처리합니다 (이 경우 고정은 매개 변수가 특정 값으로 설정됨을 의미 함). 고정 배포를 생성하려면

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

이 답변을 쓴 사람에게 감사 할 수는 없습니다. 나는 이것을 해결하기 위해 모든 곳을 찾고 있었지만 찾을 수 없었습니다. 코드에 주석을 추가하면 무슨 일이 일어나고 있는지 이해하는 데 정말 도움이되었습니다. 감사합니다.
bhola prasad

데이터가 정규 분포를 따르지 않을 때 이러한 확률을 계산하는 방법에 대해 한 가지 질문을하고 싶습니다. 이 경우 어떻게해야합니까?
bhola prasad

12

시작 Python 3.8하면 표준 라이브러리가 NormalDist객체를statistics 모듈의 .

주어진 평균 ( ) 및 표준 편차 ( )에 대해 확률 밀도 함수 ( pdf-무작위 샘플 X가 주어진 값 x에 근접 할 가능성) 를 얻는 데 사용할 수 있습니다 .musigma

from statistics import NormalDist

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

또한 NormalDist객체는 누적 분포 함수 ( cdf-임의 표본 X가 x보다 작거나 같을 확률) 도 제공합니다 .

NormalDist(mu=100, sigma=12).cdf(98)
# 0.43381616738909634

4

x 평균 = 1의 두 값 사이의 영역을 찾고 싶다면; 표준 편차 = 2; [0.5,2] 사이의 x 확률

import scipy.stats
scipy.stats.norm(1, 2).cdf(2) - scipy.stats.norm(1,2).cdf(0.5)

3

답변에 언급 된 위키피디아에서 인용 한 공식은 정상적인 확률을 계산하는 데 사용할 수 없습니다. 확률을 계산하려면 해당 공식을 사용하여 수치 적분 근사 함수를 작성해야합니다.

이 공식은 확률 밀도 함수의 값을 계산합니다. 정규 분포는 연속적이므로 확률을 얻으려면 적분을 계산해야합니다. 위키피디아 사이트는 CDF를 언급하는데, 이것은 정규 분포를위한 폐쇄 형이 아닙니다.


3
귀하가 언급 한 답변에 대한 의견으로는 더 잘 맞을지라도 귀하의 기여에 감사드립니다. 제가 잘 이해한다면 귀하는 원래 질문에 실제로 답변 하지 않은 것 입니다. 이렇게하면 모든 사람들이 당신이 말하는 내용을 한 눈에 볼 수 있습니다.
Pierre Prinetti

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)

2
링크가 귀중한 답변을 제공 할 수 있지만 SO는 사용자에게 코드를 여기에 게시하도록 요청합니다. 링크는 참조로 유용하지만 잠시 후 중단되어 향후 방문자가 솔루션에 액세스 할 수 없게 만드는 경향이 있습니다.
Mr. T

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.