アルゴリズム

[Python] 幾何分布の計算を行いmatplotlibで描画する方法

Pythonで幾何分布の計算を行い、matplotlibで描画するには、scipy.stats.geomを使用して幾何分布の確率質量関数(PMF)を計算し、matplotlib.pyplotでグラフを描画します。

まず、scipy.stats.geom.pmfを使って各試行回数に対する確率を計算し、その結果をmatplotlibplotbar関数で可視化します。

numpyを使って試行回数の範囲を生成し、matplotlibで棒グラフや折れ線グラフを描画するのが一般的です。

幾何分布とは

幾何分布は、独立した試行において初めて成功するまでの試行回数を表す確率分布です。

成功確率をpとした場合、幾何分布は成功するまでの失敗の回数をモデル化します。

具体的には、試行が続く限り、成功が得られるまでの試行回数がどのように分布するかを示します。

幾何分布は、特に「成功」または「失敗」の二項的な結果がある状況でよく用いられ、例えば、コイン投げや製品の検査など、さまざまな場面で応用されます。

数学的には、幾何分布の確率質量関数(PMF)は次のように表されます:

P(X=k)=(1p)k1p(k=1,2,3,)

ここで、kは成功するまでの試行回数を示します。

Pythonで幾何分布を計算する方法

scipy.stats.geomのインポート

幾何分布を計算するためには、scipyライブラリのstatsモジュールからgeomをインポートします。

以下のコードを使用してインポートを行います。

from scipy.stats import geom

幾何分布のPMFを計算する

幾何分布の確率質量関数(PMF)は、特定の試行回数で初めて成功する確率を計算します。

成功確率をpとし、試行回数をkとした場合、PMFは次のように計算できます。

# 成功確率
p = 0.3
# 試行回数
k = 5
# PMFの計算
pmf_value = geom.pmf(k, p)
print(f"PMF (k={k}): {pmf_value}")
PMF (k=5): 0.07202999999999998

幾何分布の累積分布関数(CDF)を計算する

累積分布関数(CDF)は、特定の試行回数以下で成功する確率を示します。

以下のコードでCDFを計算できます。

# CDFの計算
cdf_value = geom.cdf(k, p)
print(f"CDF (k={k}): {cdf_value}")
CDF (k=5): 0.8319300000000001

幾何分布の平均・分散を計算する

幾何分布の平均と分散は、次の数式で計算できます。

平均は1p、分散は1pp2です。

以下のコードで計算できます。

# 平均と分散の計算
mean_value = geom.mean(p)
var_value = geom.var(p)
print(f"平均: {mean_value}, 分散: {var_value}")
平均: 3.3333333333333335, 分散: 7.777777777777779

このように、scipy.stats.geomを使用することで、幾何分布のPMF、CDF、平均、分散を簡単に計算することができます。

幾何分布のデータを生成する

numpyを使った試行回数の生成

numpyライブラリを使用して、幾何分布に従う試行回数のデータを生成することができます。

以下のコードでは、成功確率をpとし、指定した試行回数のデータを生成します。

import numpy as np
# 成功確率
p = 0.3
# 生成するデータの数
size = 1000
# 幾何分布に従う試行回数のデータを生成
data = np.random.geometric(p, size)
print(data[:10])  # 最初の10個のデータを表示
[1 1 2 5 2 7 1 6 2 1]

scipy.stats.geom.rvsを使った乱数生成

scipy.stats.geom.rvsを使用することで、幾何分布に従う乱数を生成することもできます。

以下のコードでは、同様に成功確率を指定して乱数を生成します。

from scipy.stats import geom
# 成功確率
p = 0.3
# 生成するデータの数
size = 1000
# 幾何分布に従う乱数を生成
random_data = geom.rvs(p, size=size)
print(random_data[:10])  # 最初の10個の乱数を表示
[3 5 3 6 7 2 5 4 2 5]

生成したデータの確認方法

生成したデータを確認するためには、基本的な統計量を計算したり、ヒストグラムを描画したりすることが有効です。

以下のコードでは、生成したデータの平均と分散を計算し、ヒストグラムを描画します。

import matplotlib.pyplot as plt
import numpy as np
# 成功確率
p = 0.3
# 生成するデータの数
size = 1000
# 幾何分布に従う試行回数のデータを生成
data = np.random.geometric(p, size)
# 平均と分散の計算
mean_data = np.mean(data)
var_data = np.var(data)
print(f"生成したデータの平均: {mean_data}, 分散: {var_data}")
# ヒストグラムの描画
plt.hist(data, bins=30, density=True, alpha=0.6, color='g')
plt.title('幾何分布のヒストグラム')
plt.xlabel('試行回数')
plt.ylabel('確率密度')
plt.show()
生成したデータの平均: 3.333, 分散: 7.619

このように、生成したデータの基本的な統計量を確認し、ヒストグラムを描画することで、幾何分布の特性を視覚的に理解することができます。

matplotlibで幾何分布を描画する

matplotlibのインポート

幾何分布を描画するためには、matplotlibライブラリをインポートします。

以下のコードを使用してインポートを行います。

import matplotlib.pyplot as plt

幾何分布の棒グラフを描画する

幾何分布の確率質量関数(PMF)を用いて、棒グラフを描画することができます。

以下のコードでは、成功確率をpとし、試行回数の範囲を指定してPMFを計算し、棒グラフを描画します。

from scipy.stats import geom
# 成功確率
p = 0.3
# 試行回数の範囲
k_values = range(1, 11)
# PMFの計算
pmf_values = geom.pmf(k_values, p)
# 棒グラフの描画
plt.bar(k_values, pmf_values, color='blue', alpha=0.7)
plt.title('幾何分布のPMF')
plt.xlabel('試行回数')
plt.ylabel('確率')
plt.xticks(k_values)  # x軸の目盛りを設定
plt.show()

幾何分布の折れ線グラフを描画する

同様に、幾何分布のPMFを折れ線グラフとして描画することもできます。

以下のコードでは、先ほど計算したPMFを用いて折れ線グラフを描画します。

# 折れ線グラフの描画
plt.plot(k_values, pmf_values, marker='o', color='red', linestyle='-')
plt.title('幾何分布のPMF (折れ線グラフ)')
plt.xlabel('試行回数')
plt.ylabel('確率')
plt.xticks(k_values)  # x軸の目盛りを設定
plt.grid()  # グリッドを表示
plt.show()

グラフのカスタマイズ(タイトル、軸ラベル、凡例)

グラフをより見やすくするために、タイトル、軸ラベル、凡例を追加することができます。

以下のコードでは、これらの要素を追加してカスタマイズします。

# 棒グラフの描画(カスタマイズ版)
plt.bar(k_values, pmf_values, color='blue', alpha=0.7, label='PMF')
plt.title('幾何分布のPMF')
plt.xlabel('試行回数')
plt.ylabel('確率')
plt.xticks(k_values)  # x軸の目盛りを設定
plt.legend()  # 凡例を表示
plt.grid(axis='y')  # y軸のグリッドを表示
plt.show()

このように、matplotlibを使用することで、幾何分布のPMFを棒グラフや折れ線グラフとして描画し、さまざまなカスタマイズを行うことができます。

これにより、データの視覚化が容易になり、分布の特性を理解しやすくなります。

応用例:幾何分布のシミュレーション

試行回数を変えたシミュレーション

幾何分布の特性を理解するために、試行回数を変えたシミュレーションを行います。

成功確率を一定に保ちながら、異なる試行回数でデータを生成し、ヒストグラムを描画します。

以下のコードでは、成功確率をp=0.3とし、試行回数を3回、5回、10回でシミュレーションを行います。

import numpy as np
import matplotlib.pyplot as plt
# 成功確率
p = 0.3
# 各試行回数
trial_counts = [3, 5, 10]
# データを格納するリスト
data = []
# 試行回数ごとにデータを生成
for trials in trial_counts:
    simulated_data = np.random.geometric(p, size=1000)
    data.append(simulated_data)
# ヒストグラムの描画
plt.figure(figsize=(12, 6))
for i, trials in enumerate(trial_counts):
    plt.subplot(1, len(trial_counts), i + 1)
    plt.hist(data[i], bins=30, density=True, alpha=0.6, color='g')
    plt.title(f'試行回数: {trials}')
    plt.xlabel('試行回数')
    plt.ylabel('確率密度')
plt.tight_layout()
plt.show()

成功確率を変えたシミュレーション

次に、成功確率を変えたシミュレーションを行います。

成功確率をp=0.1p=0.3p=0.5の3つの値でデータを生成し、ヒストグラムを描画します。

# 成功確率のリスト
p_values = [0.1, 0.3, 0.5]
data = []
# 成功確率ごとにデータを生成
for p in p_values:
    simulated_data = np.random.geometric(p, size=1000)
    data.append(simulated_data)
# ヒストグラムの描画
plt.figure(figsize=(12, 6))
for i, p in enumerate(p_values):
    plt.subplot(1, len(p_values), i + 1)
    plt.hist(data[i], bins=30, density=True, alpha=0.6, color='b')
    plt.title(f'成功確率: {p}')
    plt.xlabel('試行回数')
    plt.ylabel('確率密度')
plt.tight_layout()
plt.show()

幾何分布と他の分布の比較(例:二項分布)

幾何分布と二項分布を比較することで、それぞれの特性を理解することができます。

以下のコードでは、成功確率をp=0.3とし、幾何分布と二項分布のPMFを同じグラフに描画します。

二項分布では、試行回数を10回とします。

from scipy.stats import binom
# 試行回数
n = 10
# 試行回数の範囲
k_values = range(1, n + 1)
# 幾何分布のPMF
pmf_geom = geom.pmf(k_values, p)
# 二項分布のPMF
pmf_binom = binom.pmf(k_values, n, p)
# グラフの描画
plt.plot(k_values, pmf_geom, marker='o', label='幾何分布', color='red')
plt.plot(k_values, pmf_binom, marker='x', label='二項分布', color='blue')
plt.title('幾何分布と二項分布の比較')
plt.xlabel('成功回数')
plt.ylabel('確率')
plt.legend()
plt.grid()
plt.show()

このように、幾何分布のシミュレーションを行うことで、試行回数や成功確率の変化が分布に与える影響を視覚的に理解することができます。

また、他の分布との比較を通じて、幾何分布の特性をより深く理解することができます。

まとめ

この記事では、幾何分布の基本的な概念から始まり、Pythonを用いた計算方法やデータ生成、グラフ描画の手法について詳しく解説しました。

また、幾何分布のシミュレーションを通じて、試行回数や成功確率の変化が分布に与える影響を視覚的に示しました。

これらの知識を活用して、実際のデータ分析やシミュレーションに挑戦してみてください。

関連記事

Back to top button
目次へ