programing

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

mailnote 2023. 9. 23. 23:01
반응형

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

파이썬에서 std, 평균이 주어진 정규분포에서 확률을 계산하는 방법은?나는 이 질문의 OP가 했던 것처럼 정의에 따라 항상 내 함수를 명시적으로 코딩할 수 있습니다: Python의 분포에서 랜덤 변수의 확률 계산

도서관 기능 호출이 있는지 궁금할 뿐인데 이렇게 하실 수 있습니다.제가 상상하기엔 이렇습니다.

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

펄에도 비슷한 질문이 있습니다: 펄의 정규 분포가 주어진 지점에서 확률을 계산하려면 어떻게 해야 할까요?근데 파이썬에서는 못 봤어요.

Numpy가 있습니다.random.normal기능은 있지만 표본 추출 같은 거죠 제가 원하는 게 아니에요

skipy.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)대신에scipy.stats.norm(100, 12)아니면scipy.stats.norm(loc=100, scale=12), 그러면 이를 수락하지만, 추가 키워드 인수를 조용히 삭제하고 기본값 (0,1)을 제공합니다.]

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

자세한 내용은 다음과 같습니다.먼저 동결 분포를 다루고 있습니다(이 경우 동결은 모수가 특정 값으로 설정됨을 의미합니다).냉동 분포를 만드는 방법:

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

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

주어진 평균에 대한 확률 밀도 함수(-pdf임의 표본 X가 주어진 값 x에 가까울 가능성)를 구하는 데 사용할 수 있습니다.mu) 및 표준편차(sigma):

from statistics import NormalDist

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

또한 주의할 점은NormalDistobject는 누적 분포 함수도 제공합니다(cdf- 임의표본 X가 x)보다 작거나 같을 확률:

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

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)

확률확률 밀도와 다르다는 것에 유의하십시오. 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

위의 코드는 데이터 점이 21개인 -10과 10 사이의 정규 분포에서 변수가 정확한 값 5를 가질 확률을 제공합니다(즉 구간이 1임을 의미함).달성하고자 하는 결과에 따라 고정된 간격 값을 가지고 장난을 칠 수 있습니다.

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

이 공식은 확률 밀도 함수의 값을 계산합니다.정규 분포가 연속적이기 때문에 적분을 계산해야 확률을 얻을 수 있습니다.위키피디아 사이트에서는 CDF를 언급하는데, CDF는 정상적인 배포를 위한 닫힌 형태가 아닙니다.

질문자는 "평균과 표준 편차가 주어진 정규 분포에서 확률을 계산하는 방법" 대신 "평균과 표준 편차가 주어진 정규 분포에서 주어진 데이터 점의 가능성을 계산하는 방법"을 묻습니다.

"확률"의 경우 0과 1 사이여야 하지만, "우도"의 경우 음수가 아닌 값이어야 합니다(꼭 0과 1 사이일 필요는 없습니다).

당신은 사용할 수 있습니다.multivariate_normal.pdf(x, mean= mean_vec, cov=cov_matrix)sci.stats.다변수_정규값으로 계산합니다.

나는 당신에게 수학을 해주려고 이 프로그램을 썼습니다.요약 통계량에 입력하기만 하면 됩니다.배열을 제공할 필요가 없음:

모집단 비율에 대한 단일 표본 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)

그들의 웹사이트에 나와 있는 것처럼 수학 라이브러리에 내장된 오류 기능을 사용하면 됩니다.

언급URL : https://stackoverflow.com/questions/12412895/how-to-calculate-probability-in-a-normal-distribution-given-mean-standard-devi

반응형