[확률과 통계] 파이썬으로 지수 분포 그리기


[확률과 통계] 파이썬으로 지수 분포 그리기


1. 지수 분포란

지수 분포 (Exponential distribution)는 사건이 발생하기까지 경과 시간에 대한 연속확률분포입니다.

푸아송 분포가 단위 시간 동안 사건이 몇 번 일어날지를 나타내는 이산확률분포라면,

지수 분포는 사건이 일어나고 다음 사건이 일어나기까지 걸리는 시간을 나타내는 분포입니다.


지수 분포의 확률밀도함수

음이 아닌 값을 갖는 확률변수 \(X\)의 확률밀도함수가 임의의 양수 \(\lambda\)에 대해


\[f(x) = \lambda e^{-\lambda x} \ \ (x \geq 0)\]

와 같이 주어질 때, 확률변수 \(X\)는 모수가 \(\lambda\)인 지수 분포를 갖는다고 하고, \(X\) ~ \(Exp(\lambda)\)로 나타냅니다.



지수 분포의 누적분포함수

지수 분포의 누적분포함수는 아래와 같이 주어집니다.


\[F(x) = P(X \leq x) = 1 - e^{-\lambda x} \ \ (x \geq 0)\]


지수 분포의 기대값과 분산

지수 분포의 기대값은 아래와 같습니다.


\[E(X) = \frac{1}{\lambda}\]

단위 시간당 사건이 \(\lambda\)회 발생한다면, 사건 사이에 평균적으로 \(1/\lambda\)만큼의 시간 간격이 있을 것임을 의미합니다.

그리고 분산은 아래와 같습니다.


\[Var(X) = \frac{1}{\lambda^2}\]




2. 지수 분포의 확률밀도함수 그리기

위에서 설명한 지수 분포의 학률 함수를 파이썬과 NumPy, Matplotlib을 이용해서 그래프로 나타내보겠습니다.

import numpy as np
import matplotlib.pyplot as plt

plt.style.use('default')
plt.rcParams['figure.figsize'] = (6, 3)
plt.rcParams['font.size'] = 12
plt.rcParams['lines.linewidth'] = 5

ld1, ld2, ld3 = 0.5, 1.0, 1.5

x = np.linspace(0, 3, 100)
y1 = ld1 * np.exp(-ld1 * x)
y2 = ld2 * np.exp(-ld2 * x)
y3 = ld3 * np.exp(-ld3 * x)

plt.plot(x, y1, alpha=0.7, label=r'$\lambda$=0.5')
plt.plot(x, y2, alpha=0.7, label=r'$\lambda$=1.0')
plt.plot(x, y3, alpha=0.7, label=r'$\lambda$=1.5')

plt.legend()
plt.show()

모수 \(\lambda\)가 각각 0.5, 1.0, 1.5인 지수 분포의 확률밀도함수를 NumPy로 구현하고,

Matplotlib을 이용해서 그래프로 나타냈습니다.


[확률과 통계] 파이썬으로 지수 분포 그리기 - 확률밀도함수

파이썬으로 지수 분포 그리기 - 확률밀도함수





3. 지수 분포의 누적분포함수 그리기

import numpy as np
import matplotlib.pyplot as plt

plt.style.use('default')
plt.rcParams['figure.figsize'] = (6, 3)
plt.rcParams['font.size'] = 12
plt.rcParams['lines.linewidth'] = 5

ld1, ld2, ld3 = 0.5, 1.0, 1.5

x = np.linspace(0, 3, 100)
# y1 = ld1 * np.exp(-ld1 * x)
# y2 = ld2 * np.exp(-ld2 * x)
# y3 = ld3 * np.exp(-ld3 * x)
y1 = 1 - np.exp(-ld1 * x)
y2 = 1 - np.exp(-ld2 * x)
y3 = 1 - np.exp(-ld3 * x)


plt.plot(x, y1, alpha=0.7, label=r'$\lambda$=0.5')
plt.plot(x, y2, alpha=0.7, label=r'$\lambda$=1.0')
plt.plot(x, y3, alpha=0.7, label=r'$\lambda$=1.5')

plt.legend()
plt.show()

이번에는 모수 \(\lambda\)가 각각 0.5, 1.0, 1.5인 지수 분포의 누적분포함수를 NumPy로 구현하고,

Matplotlib을 이용해서 그래프로 나타냈습니다.


[확률과 통계] 파이썬으로 지수 분포 그리기 - 누적분포함수

파이썬으로 지수 분포 그리기 - 누적분포함수





4. np.random.exponential()

NumPy random 모듈exponential() 함수는 지수 분포로부터 얻은 임의의 샘플을 반환합니다.

import numpy as np
import matplotlib.pyplot as plt

plt.style.use('default')
plt.rcParams['figure.figsize'] = (6, 6)
plt.rcParams['font.size'] = 12
plt.rcParams['lines.linewidth'] = 5

ld1, ld2, ld3 = 0.5, 1.0, 1.5

x = np.linspace(0, 3, 100)
y1 = ld1 * np.exp(-ld1 * x)
y2 = ld2 * np.exp(-ld2 * x)
y3 = ld3 * np.exp(-ld3 * x)

y4 = np.random.exponential(1/ld1, 1000)
y5 = np.random.exponential(1/ld2, 1000)
y6 = np.random.exponential(1/ld3, 1000)

plt.subplot(3, 1, 1)
plt.plot(x, y1, alpha=0.7, label=r'$\lambda$=0.5', color='C0')
plt.hist(y4, density=True, bins=300, alpha=0.5, color='C0')
plt.xlim(-0.25, 3.25)
plt.legend()

plt.subplot(3, 1, 2)
plt.plot(x, y2, alpha=0.7, label=r'$\lambda$=1.0', color='C1')
plt.hist(y5, density=True, bins=300, alpha=0.5, color='C1')
plt.xlim(-0.25, 3.25)
plt.legend()

plt.subplot(3, 1, 3)
plt.plot(x, y3, alpha=0.7, label=r'$\lambda$=1.5', color='C2')
plt.hist(y6, density=True, bins=300, alpha=0.5, color='C2')
plt.xlim(-0.25, 3.25)
plt.legend()

plt.tight_layout()
plt.show()

exponential() 함수로부터 얻은 임의의 샘플의 분포가 이론적인 확률밀도함수를 따르는 것을 알 수 있습니다.

plt.subplot()의 사용에 대해서는 Matplotlib 여러 개의 그래프 그리기 페이지를 참고하세요.


[확률과 통계] 파이썬으로 지수 분포 그리기 - np.random.exponential()

파이썬으로 지수 분포 그리기 - np.random.exponential()



이전글/다음글