Python/Scipy

[Scipy] 파이썬 정규분포 확률밀도함수, 누적분포함수, 백분위수 찾기 : pdf, cdf, ppf

jimmy_AI 2022. 6. 4. 16:20
반응형

파이썬 정규분포 확률밀도함수 관련 값 추출 방법

파이썬에서 Scipy의 기능을 통해 정규분포를 정의하고,

정의된 분포 내에서 특정 위치의 확률밀도함수, 누적분포함수 및 백분위수 값을

각각 pdf, cdf 및 ppf 메소드를 활용해 찾는 방법에 대하여 다루어보겠습니다.

 

 

Scipy 정규분포 객체 정의 방법

정규분포의 확률밀도함수를 찾기 위하여 먼저 정규분포 객체를 정의해주어야 합니다. 이는

scipy.stats.norm 함수 내에 loc = 평균, scale = 표준편차 형태로 지정해주시면 됩니다.

import scipy.stats

# 평균 = 100, 표준편차 = 50인 정규분포 객체 정의
norm_dist = scipy.stats.norm(loc = 100, scale = 50)

 

 

확률밀도함수 값 탐색 : pdf 메소드

정의된 정규분포 객체에 대하여 특정 점에서의 확률밀도함수 값을 찾기 위해서는

객체명.pdf(점의 위치) 형태로 코드를 작성해주시면 됩니다.

# x = 135에서의 확률밀도함수 값 탐색
norm_dist.pdf(135) # 0.0062450786673352255

 

확률밀도함수를 그려보고 x = 135인 점에서 값을 표시해본 결과는 아래와 같습니다.

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 200, 1000)
density = norm_dist.pdf(x)
plt.plot(x, density)

plt.scatter(135, norm_dist.pdf(135), c = 'r') # x = 135인점 표시
plt.plot([-10, 135], [norm_dist.pdf(135), norm_dist.pdf(135)], 'r--')

plt.xlabel('x')
plt.ylabel('density')
plt.xlim(0, 200)

plt.show()

 

반응형

 

누적분포함수 값 탐색 : cdf 메소드

이번에는 정의된 정규분포 객체에 대하여 원하는 특정 점에서의 누적분포함수 값을

찾는 방법입니다. 이는 위의 예제에서 pdf 대신 cdf로만 바꿔서 코드를 작성해주시면 됩니다.

# x = 160까지의 누적분포함수 값 탐색
norm_dist.cdf(160) # 0.8849303297782918

 

마찬가지로, 누적분포함수 그래프x = 160에서의 값을 시각화한 결과는 다음과 같습니다.

x = np.linspace(0, 200, 1000)
density = norm_dist.cdf(x)
plt.plot(x, density)

plt.scatter(160, norm_dist.cdf(160), c = 'r') # x = 160인점 표시
plt.plot([-10, 160], [norm_dist.cdf(160), norm_dist.cdf(160)], 'r--')

plt.xlabel('x')
plt.ylabel('cumulative probability')
plt.xlim(0, 200)

plt.show()

 

 

백분위수 값 탐색 : ppf 메소드

위 예제들과 비슷한 방법으로 정규분포에서 특정 확률까지의 누적 백분위수 탐색도 가능합니다.

여기서는 위의 예제들에서 pdf나 cdf의 위치에 ppf를 넣고, input으로 원하는 누적 확률 값

적어주시면 됩니다.

# 누적 분포 확률 값이 0.95인 x값 탐색
norm_dist.ppf(0.95) # 182.2426813475736

 

마찬가지로, 누적분포확률의 역함수 그래프누적 확률이 0.95인 점을 시각화해보면

아래와 같이 나타납니다.

p = np.linspace(0, 1.0, 1000)
density = norm_dist.ppf(p)
plt.plot(p, density)

plt.scatter(0.95, norm_dist.ppf(0.95), c = 'r') # p = 0.95인점 표시
plt.plot([-0.05, 0.95], [norm_dist.ppf(0.95), norm_dist.ppf(0.95)], 'r--')

plt.xlabel('cumulative probability')
plt.ylabel('x')
plt.xlim(0, 1)

plt.show()

 

참고로, 이 방법들은 정규분포 외의 다른 연속확률분포에도 비슷하게 적용이 가능합니다.