[확률과 통계] 파이썬으로 지수 분포 그리기¶
■ Table of Contents
1. 지수 분포란¶
지수 분포 (Exponential distribution)는 사건이 발생하기까지 경과 시간에 대한 연속확률분포입니다.
푸아송 분포가 단위 시간 동안 사건이 몇 번 일어날지를 나타내는 이산확률분포라면,
지수 분포는 사건이 일어나고 다음 사건이 일어나기까지 걸리는 시간을 나타내는 분포입니다.
지수 분포의 확률밀도함수¶
음이 아닌 값을 갖는 확률변수 \(X\)의 확률밀도함수가 임의의 양수 \(\lambda\)에 대해
와 같이 주어질 때, 확률변수 \(X\)는 모수가 \(\lambda\)인 지수 분포를 갖는다고 하고, \(X\) ~ \(Exp(\lambda)\)로 나타냅니다.
지수 분포의 누적분포함수¶
지수 분포의 누적분포함수는 아래와 같이 주어집니다.
지수 분포의 기대값과 분산¶
지수 분포의 기대값은 아래와 같습니다.
단위 시간당 사건이 \(\lambda\)회 발생한다면, 사건 사이에 평균적으로 \(1/\lambda\)만큼의 시간 간격이 있을 것임을 의미합니다.
그리고 분산은 아래와 같습니다.
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 여러 개의 그래프 그리기 페이지를 참고하세요.