[Python] ベルヌーイ分布を実装する方法
Pythonでベルヌーイ分布を実装するには、scipy.stats
モジュールのbernoulliクラス
を使用するのが一般的です。
bernoulliクラス
は、成功確率
例えば、bernoulli.rvs(p)
でベルヌーイ分布に従う乱数を生成し、bernoulli.pmf(k, p)
で確率質量関数を計算できます。
ベルヌーイ分布とは
ベルヌーイ分布は、確率論における基本的な確率分布の一つで、成功と失敗の2つの結果を持つ試行に関連しています。
例えば、コイン投げやサイコロの特定の目が出るかどうかといった状況が該当します。
この分布は、成功の確率を
ベルヌーイ分布は、単一の試行における成功の確率をモデル化するため、二項分布の特別なケースとも言えます。
確率質量関数(PMF)を用いて、特定の結果が得られる確率を計算することができます。
Pythonでベルヌーイ分布を実装する方法
scipy.statsモジュールのインポート
ベルヌーイ分布を扱うためには、まずscipy.stats
モジュールをインポートする必要があります。
このモジュールには、確率分布に関連する多くの関数が含まれています。
以下のコードでインポートを行います。
from scipy.stats import bernoulli
bernoulliクラスの基本的な使い方
bernoulliクラス
を使用することで、ベルヌーイ分布に関連するさまざまな計算が可能です。
以下に、基本的な使い方を示します。
確率質量関数(PMF)の計算
確率質量関数(PMF)は、特定の結果が得られる確率を計算します。
成功確率
from scipy.stats import bernoulli
# 成功確率
p = 0.7
# PMFの計算
pmf_value = bernoulli.pmf(1, p) # 成功(1)の確率
print(f"PMF(成功): {pmf_value}")
PMF(成功): 0.7
累積分布関数(CDF)の計算
累積分布関数(CDF)は、特定の値以下の結果が得られる確率を計算します。
以下のコードでCDFを計算します。
# CDFの計算
cdf_value = bernoulli.cdf(1, p) # 成功(1)以下の確率
print(f"CDF(成功以下): {cdf_value}")
CDF(成功以下): 1.0
乱数生成
ベルヌーイ分布に従った乱数を生成することも可能です。
以下のコードで、成功確率
# 乱数生成
random_sample = bernoulli.rvs(p, size=10) # 10回の試行
print(f"生成された乱数: {random_sample}")
生成された乱数: [1 0 1 1 0 1 0 1 0 1]
成功確率 の設定方法
成功確率
例えば、コイン投げの場合、表が出る確率を0.5、特定の事象が起こる確率を0.3などと設定できます。
以下のように設定します。
p = 0.5 # 表が出る確率
複数回の試行をシミュレーションする方法
複数回の試行をシミュレーションするには、rvsメソッド
を使用して、指定した回数の乱数を生成します。
以下のコードでは、10回の試行をシミュレーションしています。
# 10回の試行をシミュレーション
trials = 10
simulated_results = bernoulli.rvs(p, size=trials)
print(f"シミュレーション結果: {simulated_results}")
シミュレーション結果: [1 0 1 1 0 0 1 0 1 0]
このようにして、ベルヌーイ分布を用いたシミュレーションを行うことができます。
ベルヌーイ分布の可視化
Matplotlibを使ったPMFのグラフ化
ベルヌーイ分布の確率質量関数(PMF)を可視化するために、Matplotlibを使用します。
以下のコードでは、成功確率
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import bernoulli
# 成功確率
p = 0.7
# xの値(成功と失敗)
x = [0, 1]
# PMFの計算
pmf_values = bernoulli.pmf(x, p)
# グラフの作成
plt.bar(x, pmf_values, color='skyblue', alpha=0.7)
plt.xticks(x, ['失敗 (0)', '成功 (1)'])
plt.title('ベルヌーイ分布のPMF')
plt.xlabel('結果')
plt.ylabel('確率')
plt.ylim(0, 1)
plt.grid(axis='y')
plt.show()
このコードを実行すると、成功確率が0.7のベルヌーイ分布のPMFが表示されます。
グラフは、成功と失敗の確率を視覚的に示します。
Seabornを使ったヒストグラムの作成
Seabornを使用して、ベルヌーイ分布に従った乱数のヒストグラムを作成することもできます。
以下のコードでは、成功確率
import seaborn as sns
# 乱数生成
p = 0.7
random_samples = bernoulli.rvs(p, size=1000) # 1000回の試行
# ヒストグラムの作成
sns.histplot(random_samples, bins=2, kde=False, color='lightcoral')
plt.xticks([0, 1], ['失敗 (0)', '成功 (1)'])
plt.title('ベルヌーイ分布のヒストグラム')
plt.xlabel('結果')
plt.ylabel('頻度')
plt.grid(axis='y')
plt.show()
このコードを実行すると、成功確率が0.7のベルヌーイ分布に従った1000回の試行結果のヒストグラムが表示されます。
成功と失敗の頻度を視覚的に確認できます。
成功確率 の変化によるグラフの変化
成功確率
以下のコードでは、異なる成功確率に対するPMFを比較します。
# 成功確率のリスト
p_values = [0.3, 0.5, 0.7]
x = [0, 1]
# グラフの作成
plt.figure(figsize=(10, 6))
for p in p_values:
pmf_values = bernoulli.pmf(x, p)
plt.bar(x, pmf_values, alpha=0.5, label=f'p = {p}')
plt.xticks(x, ['失敗 (0)', '成功 (1)'])
plt.title('成功確率の変化によるベルヌーイ分布のPMF')
plt.xlabel('結果')
plt.ylabel('確率')
plt.ylim(0, 1)
plt.legend()
plt.grid(axis='y')
plt.show()
このコードを実行すると、成功確率が0.3、0.5、0.7のベルヌーイ分布のPMFが重ねて表示されます。
成功確率の変化に伴う分布の変化を視覚的に確認できます。
応用例:ベルヌーイ分布を使ったシミュレーション
コイン投げのシミュレーション
コイン投げは、ベルヌーイ分布の典型的な例です。
表が出る確率を
以下のコードでは、コイン投げの結果を生成し、成功(表)の回数をカウントします。
from scipy.stats import bernoulli
# 成功確率(表が出る確率)
p = 0.5
# コインを10回投げる
trials = 10
coin_toss_results = bernoulli.rvs(p, size=trials)
# 表の回数をカウント
success_count = sum(coin_toss_results)
print(f"コイン投げの結果: {coin_toss_results}")
print(f"表が出た回数: {success_count}")
コイン投げの結果: [1 0 1 0 1 1 0 0 1 0]
表が出た回数: 5
このコードを実行すると、コイン投げの結果と表が出た回数が表示されます。
サイコロの特定の目が出る確率のシミュレーション
サイコロの特定の目が出る確率をシミュレーションするために、ベルヌーイ分布を利用します。
例えば、サイコロの目が 6
である確率を
# サイコロの特定の目(6)が出る確率
p = 1/6
# サイコロを30回振る
trials = 30
dice_roll_results = bernoulli.rvs(p, size=trials)
# 目が6の回数をカウント
success_count = sum(dice_roll_results)
print(f"サイコロの結果: {dice_roll_results}")
print(f"目が6の回数: {success_count}")
サイコロの結果: [0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0]
目が6の回数: 5
このコードを実行すると、サイコロの結果と目が 6
であった回数が表示されます。
A/Bテストの成功率シミュレーション
A/Bテストでは、2つの異なるバージョンの効果を比較するために、ベルヌーイ分布を利用します。
例えば、バージョンAの成功率を
# バージョンAとBの成功確率
p_A = 0.3
p_B = 0.5
# 試行回数
trials_A = 100
trials_B = 100
# A/Bテストの結果をシミュレーション
results_A = bernoulli.rvs(p_A, size=trials_A)
results_B = bernoulli.rvs(p_B, size=trials_B)
# 成功回数をカウント
success_count_A = sum(results_A)
success_count_B = sum(results_B)
print(f"バージョンAの成功回数: {success_count_A} / {trials_A}")
print(f"バージョンBの成功回数: {success_count_B} / {trials_B}")
バージョンAの成功回数: 30 / 100
バージョンBの成功回数: 52 / 100
このコードを実行すると、A/Bテストのそれぞれのバージョンの成功回数が表示されます。
これにより、どちらのバージョンがより効果的であるかを判断するためのデータを得ることができます。
応用例:ベルヌーイ分布を使った機械学習
ロジスティック回帰モデルとの関連
ロジスティック回帰は、ベルヌーイ分布を基にしたバイナリ分類の手法です。
このモデルは、入力データに基づいて成功確率
ロジスティック回帰では、シグモイド関数を用いて、線形結合された特徴量から確率を導出します。
以下の数式で表されます。
ここで、
ロジスティック回帰は、ベルヌーイ分布に従うデータに対して非常に効果的な手法です。
ベルヌーイ分布を用いたバイナリ分類
ベルヌーイ分布は、バイナリ分類問題において、各クラスの確率をモデル化するために使用されます。
例えば、スパムメールの分類や、顧客の購入意欲の予測などが該当します。
以下のように、特徴量を用いてモデルを構築し、各クラスの確率を計算します。
import numpy as np
from sklearn.linear_model import LogisticRegression
# 特徴量とラベルのデータセット
X = np.array([[1, 2], [1, 3], [2, 2], [2, 3], [3, 1], [3, 2]])
y = np.array([0, 0, 1, 1, 0, 1]) # 0: 非スパム, 1: スパム
# ロジスティック回帰モデルの作成
model = LogisticRegression()
model.fit(X, y)
# 新しいデータポイントの予測
new_data = np.array([[2, 2]])
predicted_prob = model.predict_proba(new_data)
print(f"予測確率: {predicted_prob}")
予測確率: [[0.3 0.7]]
このコードを実行すると、新しいデータポイントに対する各クラスの予測確率が表示されます。
ベルヌーイ分布とベイズ推定
ベイズ推定は、ベルヌーイ分布を用いて事後確率を計算するための強力な手法です。
特に、事前分布と尤度を組み合わせて、観測データに基づく確率を更新します。
ベルヌーイ分布において、成功の回数と試行回数を用いて、事後分布を計算することができます。
以下の数式で表されます。
例えば、成功確率
ベイズ推定は、特にデータが少ない場合や不確実性が高い場合に有効です。
このように、ベルヌーイ分布は機械学習において、ロジスティック回帰やバイナリ分類、ベイズ推定などの手法と密接に関連しており、さまざまな応用が可能です。
まとめ
この記事では、ベルヌーイ分布の基本的な概念から、Pythonを用いた実装方法、さらには機械学習における応用例まで幅広く取り上げました。
特に、ロジスティック回帰やA/Bテストなど、実際のデータ分析においてどのようにベルヌーイ分布が活用されるかを具体的に示しました。
これを機に、ベルヌーイ分布を用いたシミュレーションやモデル構築に挑戦し、実際のデータに基づいた分析を行ってみてはいかがでしょうか。