DataScience

【Python】【scipy】ベータ分布のグラフ作成

ベータ分布は[0, 1]の区間でαとβの値を色々設定することで、分布の形が変わる。

グラフの作成はscipyのstatsから行える。

ベータ分布に従う乱数生成はscipyのstatsやnumpyから行える。

[0, 1]で分布の形をある程度コントロール可能なので、正規分布などの無限に広がる分布よりも使いやすかったりする。

ベータ分布のグラフ作成

scipy.statsでベータ分布のグラフを作成することが可能。

乱数を生成するのが目的であっても、確率密度関数の形は確認しておいた方が良いと思う。

n=100ぐらいに分割すれば、滑らかに見える。

scipyのstatsにbetaがあり、pdfが用意されているので、それを使う。

import numpy as np
from scipy.stats import beta

# [0, 1]で0.1刻みの値を作成
x = np.linspace(0, 1, 101)
# β分布の値作成
a = 3
b = 3
y = beta.pdf(x, a, b)
# グラフ描画
plt.figure(figsize=(8, 4.5), facecolor="w")
plt.plot(x, y, label=f"{a=}, {b=}")
plt.legend(loc="upper right")
plt.tight_layout()
plt.show()

色々なベータ分布の形

αとβの値を変えることで、分布の形を色々と変えられる。

一様分布にしたり、正規分布に近い形にしたり、偏りのある分布にしたりすることが可能。

一様分布(α=1かつβ=1)

αもβも1にすることで、一様分布の形になる。

# [0, 1]で0.1刻みの値を作成
x = np.linspace(0, 1, 101)
# β分布パラメータ設定
a, b = 1, 1
# グラフ描画
plt.figure(figsize=(8, 4.5), facecolor="w")
plt.plot(x, beta.pdf(x, a, b), label=f"{a=}, {b=}")
plt.legend(loc="upper right")
plt.tight_layout()
plt.show()

正規分布のような形(α=βかつ3≦α, β≦7)

α=βで、αとβが3~7ぐらいにすると、正規分布っぽい形になる。

正規分布だと、裾が無限に広がるが、ベータ分布は区間が[0, 1]なので無限が嫌な時に正規分布の代替的なものとして使える。

plt.figure(figsize=(8, 4.5), facecolor="w")
# [0, 1]で0.1刻みの値を作成
x = np.linspace(0, 1, 101)
# β分布パラメータ設定
params = [(1, 1), (2, 2), (3, 3), (5, 5), (7, 7), (10, 10)]
# 各パラメータでグラフ描画
for a, b in params:
    plt.plot(x, beta.pdf(x, a, b), label=f"{a=}, {b=}")
    
plt.legend(loc="upper right")
plt.tight_layout()
plt.show()

α=βかつα, β<1

0付近、1付近で無限大になる。

plt.figure(figsize=(8, 4.5), facecolor="w")
# [0, 1]で0.1刻みの値を作成
x = np.linspace(0, 1, 101)
# β分布パラメータ設定
params = [(0.1, 0.1), (0.5, 0.5), (0.9, 0.9)]
# 各パラメータでグラフ描画
for a, b in params:
    plt.plot(x, beta.pdf(x, a, b), label=f"{a=}, {b=}")

plt.legend(loc="upper center")
plt.tight_layout()
plt.show()

偏った形(1≦α<β)(1≦β<α)

αとβが両方とも1以上なので、有限の値になる。

α≠βにすることで、正規分布を少し偏らせた分布を得ることができる。

1≦α<β

plt.figure(figsize=(8, 4.5), facecolor="w")
# [0, 1]で0.1刻みの値を作成
x = np.linspace(0, 1, 101)
# β分布パラメータ設定
params = [(1, 5), (1.5, 5), (2.5, 5), (3, 5)]
# 各パラメータでグラフ描画
for a, b in params:
    plt.plot(x, beta.pdf(x, a, b), label=f"{a=}, {b=}")

plt.legend(loc="upper right")
plt.tight_layout()
plt.show()

1≦β<α

plt.figure(figsize=(8, 4.5), facecolor="w")
# [0, 1]で0.1刻みの値を作成
x = np.linspace(0, 1, 101)
# β分布パラメータ設定
params = [(5, 1), (5, 1.5), (5, 2.5), (5, 3)]
# 各パラメータでグラフ描画
for a, b in params:
    plt.plot(x, beta.pdf(x, a, b), label=f"{a=}, {b=}")

plt.legend(loc="upper left")
plt.tight_layout()
plt.show()

偏った形(α<1≦β)(β<1≦α)

1より小さい方は発散し、1以上の方は収束する。

α<1≦β

plt.figure(figsize=(8, 4.5), facecolor="w")
# [0, 1]で0.1刻みの値を作成
x = np.linspace(0, 1, 101)
# β分布パラメータ設定
params = [(0.1, 1.1), (0.5, 2.5), (0.9, 9)]
# 各パラメータでグラフ描画
for a, b in params:
    plt.plot(x, beta.pdf(x, a, b), label=f"{a=}, {b=}")

plt.legend(loc="upper right")
plt.tight_layout()
plt.show()

β<1≦α

plt.figure(figsize=(8, 4.5), facecolor="w")
# [0, 1]で0.1刻みの値を作成
x = np.linspace(0, 1, 101)
params = [(1.1, 0.1), (2.5, 0.5), (9, 0.9)]
# 各パラメータでグラフ描画
for a, b in params:
    plt.plot(x, beta.pdf(x, a, b), label=f"{a=}, {b=}")

plt.legend(loc="upper left")
plt.tight_layout()
plt.show()

偏った形(α<β<1)(β<α<1)

両端共に1より小さいので発散する。

plt.figure(figsize=(8, 4.5), facecolor="w")
# [0, 1]で0.1刻みの値を作成
x = np.linspace(0, 1, 101)
params = [(0.1, 0.15), (0.25, 0.5), (0.45, 0.9)]
# 各パラメータでグラフ描画
for a, b in params:
    plt.plot(x, beta.pdf(x, a, b), label=f"{a=}, {b=}")

plt.legend(loc="upper right")
plt.tight_layout()
plt.show()
plt.figure(figsize=(8, 4.5), facecolor="w")
# [0, 1]で0.1刻みの値を作成
x = np.linspace(0, 1, 101)
params = [(0.15, 0.1), (0.5, 0.25), (0.9, 0.45)]
# 各パラメータでグラフ描画
for a, b in params:
    plt.plot(x, beta.pdf(x, a, b), label=f"{a=}, {b=}")

plt.legend(loc="upper left")
plt.tight_layout()
plt.show()

まとめ

  • パラメータを1以上にすると値は有限になる。
  • パラメータを1未満にすると各末端で発散する。
  • パラメータの値を調整することで、正規分布に近い形や少し偏った分布を作成することが可能。