Traffine I/O

日本語

2022-12-01

ガンマ分布

ガンマ分布とは

ガンマ分布はある期間 \beta ごとに平均1回起こる事象が、\alpha 回起きるまでの期間 X が従う確率分布です。以下のような例はガンマ分布に従うと言われています。

  • 人の体重
  • ウイルスの潜伏期間
  • システムダウンまでの待ち時間
  • 電子部品の寿命

ガンマ分布の確率密度関数は以下の式で表されます。

P(X)={\begin{cases}{\frac{1}{\beta^\alpha \Gamma(\alpha)}x^{\alpha-1}e^{-\frac{x}{\beta}}}&x\geq 0,\\0&x<0.\end{cases}}
\Gamma(\alpha) = \int_{0}^{\infty}x^{\alpha-1}e^{-x}dx \quad \alpha > 0

ガンマ分布は下図が示す通り、 \alpha\beta をパラメータとして下図のような分布をしています。

Gamma distribution

指数分布との関係

指数分布\alpha=1 の場合のガンマ分布と一致します。つまり、ガンマ分布は指数分布を拡張した確率分布になります。

ガンマ分布に \alpha=1 を代入すると確率密度関数は以下のようになります。

P(X)=\frac{1}{\beta^\alpha \Gamma(\alpha)}x^{\alpha-1}e^{-\frac{x}{\beta}} = \frac{1}{\beta0!}e^{-\frac{x}{\beta}}=\frac{1}{\beta}e^{-\frac{x}{\beta}}

上式は、期待値が \beta である指数分布の確率密度関数に一致しています。単位時間あたりに平均 \frac{1}{\beta} 回起こる事象が、次に起こるまでの時間 x が従う分布である指数分布として考えることができます。

ガンマ分布の期待値と分散

ガンマ分布の期待値、分散はそれぞれ以下になります。

E(X)=\frac{\alpha}{\beta}
V(X)=\frac{\alpha}{\beta^2}

ガンマ分布のパラメータの影響

パラメータ \alpha\beta のガンマ分布への影響を可視化してみます。

Gamma distribution params

\alpha が大きくなるほど確率密度のピークが右に移動していることが分かります。また、\beta が大きくなるほど分布幅(分散)が小さくなっていることが分かります。

ガンマ分布の再生性

確率変数 XY が次のようにそれぞれガンマ分布に従い、互いに独立であるとします。

X \sim Ga(\alpha_1, \beta),\quad Y \sim Ga(\alpha_1, \beta)

このとき、ガンマ分布の再生性より、X + Y は以下のガンマ分布に従います。

X + Y \sim Ga(\alpha_1 + \alpha_2, \beta)

Python コード

今回使用したPythonコードは以下になります。

ガンマ分布の描画

import numpy as np
from scipy.stats import gamma
import matplotlib.pyplot as plt

plt.style.use('ggplot')
fig, ax = plt.subplots(facecolor="w", figsize=(10, 5))

# x axis
x = np.linspace(0, 8, 100)

# draw graph
plt.plot(x, gamma.pdf(x, 1, 0, scale=1/1), label='alpha=1, beta=1')
plt.plot(x, gamma.pdf(x, 1, 0, scale=1/2), label='alpha=1, beta=2')
plt.plot(x, gamma.pdf(x, 2, 0, scale=1/2), label='alpha=2, beta=2')
plt.plot(x, gamma.pdf(x, 3, 0, scale=1/2), label='alpha=3, beta=2')
plt.plot(x, gamma.pdf(x, 5, 0, scale=1/2), label='alpha=5, beta=2')
plt.plot(x, gamma.pdf(x, 10, 0, scale=1/1), label='alpha=5, beta=1')
plt.legend()
plt.xlabel("x")
plt.ylabel("Probability density")
plt.show()

Gamma distribution

パラメータの影響の描画

import numpy as np
from scipy.stats import gamma
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import animation, rc
from matplotlib.animation import FuncAnimation

rc('animation', html='html5')
np.random.seed(5)

# Set up formatting for the movie files
Writer = animation.writers['ffmpeg']
writer = Writer(fps=15, metadata=dict(artist='Me'), bitrate=1800)

prob_vals = np.arange(start=0.1, stop=10.01, step=0.2)

plt.style.use('ggplot')
fig, ax = plt.subplots(facecolor="w", figsize=(15, 5))

# x axis
x = np.linspace(0, 10, 100)

def update(i):
    p = prob_vals[i]

    # alpha graph
    plt.subplot(1, 2, 1)
    plt.cla()
    plt.plot(x, gamma.pdf(x, round(p, 1), 0, scale=1/2))
    # plt.plot(x, gamma.pdf(x, 2, 0, scale=1/round(p, 1)))
    plt.title(f'$alpha={str(round(p, 1))}, beta=2$', loc='left')
    plt.xlabel("x")
    plt.ylabel("Probability density")
    plt.ylim(0, 4.1)
    plt.xticks(ticks=[0, 10]) # x axis ticks

    # beta graph
    plt.subplot(1, 2, 2)
    plt.cla()
    plt.plot(x, gamma.pdf(x, 2, 0, scale=1/round(p, 1)))
    plt.title(f'$alpha=2, beta={str(round(p, 1))}$', loc='left')
    plt.xlabel("x")
    plt.ylabel("Probability density")
    plt.ylim(0, 4.1)
    plt.xticks(ticks=[0, 10]) # x axis ticks

anime_prob = FuncAnimation(fig, update, frames=len(prob_vals), interval=1000)
anime_prob.save('gamma_dist.gif', writer='pillow', fps=10)

Gamma distribution params

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!