DataScience

【Python】ベータ分布に従う乱数を生成する

MAX

ベータ分布はαとβの値を調整することで、分布の形を正規分布に似せることが可能。

また、正規分布と異なり[0, 1]の範囲となっている。

スポンサーリンク

numpyでベータ分布に従う乱数生成

numpy.randomのbetaでベータ分布に従う乱数を生成できる。

1import numpy as np
2import matplotlib.pyplot as plt
3import seaborn as sns
4
5sns.set(font="meiryo")
6%matplotlib inline
7
8# β分布のパラメータ設定
9a, b = 5, 5
10# 生成する乱数の数を設定
11data_len = 10000
12# β分布に従う乱数生成
13randoms_beta = np.random.beta(a, b, data_len)
14
15# 生成した乱数のヒストグラム作成
16plt.figure(figsize=(8, 4.5), facecolor="w")
17sns.histplot(randoms_beta, bins=20)
18plt.title(f"data count {data_len}")
19plt.tight_layout()
20plt.show()

大体5000個ぐらい作成すると、ヒストグラムは確率密度関数の形に近づく。

データ生成数によるヒストグラムの違い

生成する数が数100~1000個ぐらいだと、乱数シードにもよると思うが、確率密度関数のような形にはなりにくい。

1# β分布のパラメータ設定
2a, b = 5, 5
3# 生成するデータ数のリスト
4data_lens = [100, 500, 1000, 5000]
5seed = 1
6for data_len in data_lens:
7    np.random.seed(seed)
8    # β分布に従う乱数生成
9    randoms_beta = np.random.beta(a, b, data_len)
10    # ヒストグラム作成
11    plt.figure(figsize=(8, 4.5), facecolor="w")
12    sns.histplot(randoms_beta, bins=20)
13    plt.tight_layout()
14    plt.title(f"data count {data_len}")
15    plt.show()

SciPyでベータ分布に従う乱数生成

scipy.statsのbetaにrvsで乱数を生成できる。

1from scioy.stats import beta
2
3# β分布のパラメータ設定
4a, b = 5, 5
5# 生成する乱数の数を設定
6size = 10000
7seed = 1
8# ベータ分布に従う乱数生成
9stats_beta = beta.rvs(a, b, size=size, random_state=seed)
10# ヒストグラム作成
11plt.figure(figsize=(8, 4.5), facecolor="w")
12sns.histplot(stats_beta, bins=20)
13plt.tight_layout()
14plt.show()

データ生成数によるヒストグラムの違い

numpyと同じく、100~1000個ぐらいだと、きれいな分布にはならない。

1a, b = 5, 5
2sizes = [100, 500, 1000, 5000]
3seed = 1
4for size in sizes:
5    stats_beta = beta.rvs(a, b, size=size, random_state=seed)
6    plt.figure(figsize=(8, 4), facecolor="w")
7    sns.histplot(stats_beta, bins=20)
8    plt.title(f"data count {size}")
9    plt.tight_layout()
10    plt.show()

まとめ

色々とヒストグラムを記載してきたが、乱数を得るだけなら以下の通り。

1import numpy as np
2from scipy.stats import beta
3
4a, b = 5, 5
5size = 10000
6seed = 1
7
8# numpyでベータ分布に従う乱数生成
9np.random.seed(seed)
10randoms_beta = np.random.beta(a, b, size)
11
12# scipyでベータ分布に従う乱数生成
13stats_beta = beta.rvs(a, b, size=size, random_state=seed)

ベータ分布の形状

ベータ分布はパラメータを調整することで、分布の形状を調整できる。

正規分布以外にも、少し偏った分布なども作成可能。

パラメータによる分布形状の変化については、以下の記事を参照。

あわせて読みたい
【Python】【scipy】ベータ分布のグラフ作成
【Python】【scipy】ベータ分布のグラフ作成
スポンサーリンク
ABOUT ME
MAX
MAX
ITエンジニア、データサイエンティスト
新卒でSIerに入社し、フリーランスになってWEB系へ転向。
その後AIの世界へ足を踏み入れ、正社員に戻る。 テーブルデータの分析がメイン。
スポンサーリンク
記事URLをコピーしました