アルゴリズム

[Python] ベルヌーイ分布を実装する方法

Pythonでベルヌーイ分布を実装するには、scipy.statsモジュールのbernoulliクラスを使用するのが一般的です。

bernoulliクラスは、成功確率pを指定してベルヌーイ分布に従う乱数を生成したり、確率質量関数(PMF)を計算したりできます。

例えば、bernoulli.rvs(p)でベルヌーイ分布に従う乱数を生成し、bernoulli.pmf(k, p)で確率質量関数を計算できます。

ベルヌーイ分布とは

ベルヌーイ分布は、確率論における基本的な確率分布の一つで、成功と失敗の2つの結果を持つ試行に関連しています。

例えば、コイン投げやサイコロの特定の目が出るかどうかといった状況が該当します。

この分布は、成功の確率をpとし、失敗の確率を1pと定義します。

ベルヌーイ分布は、単一の試行における成功の確率をモデル化するため、二項分布の特別なケースとも言えます。

確率質量関数(PMF)を用いて、特定の結果が得られる確率を計算することができます。

Pythonでベルヌーイ分布を実装する方法

scipy.statsモジュールのインポート

ベルヌーイ分布を扱うためには、まずscipy.statsモジュールをインポートする必要があります。

このモジュールには、確率分布に関連する多くの関数が含まれています。

以下のコードでインポートを行います。

from scipy.stats import bernoulli

bernoulliクラスの基本的な使い方

bernoulliクラスを使用することで、ベルヌーイ分布に関連するさまざまな計算が可能です。

以下に、基本的な使い方を示します。

確率質量関数(PMF)の計算

確率質量関数(PMF)は、特定の結果が得られる確率を計算します。

成功確率pを設定し、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

乱数生成

ベルヌーイ分布に従った乱数を生成することも可能です。

以下のコードで、成功確率pに基づいて乱数を生成します。

# 乱数生成
random_sample = bernoulli.rvs(p, size=10)  # 10回の試行
print(f"生成された乱数: {random_sample}")
生成された乱数: [1 0 1 1 0 1 0 1 0 1]

成功確率pの設定方法

成功確率pは、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を使用します。

以下のコードでは、成功確率pを設定し、PMFをグラフ化します。

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を使用して、ベルヌーイ分布に従った乱数のヒストグラムを作成することもできます。

以下のコードでは、成功確率pに基づいて生成した乱数のヒストグラムを表示します。

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回の試行結果のヒストグラムが表示されます。

成功と失敗の頻度を視覚的に確認できます。

成功確率pの変化によるグラフの変化

成功確率pを変化させることで、PMFやヒストグラムの形状がどのように変わるかを観察できます。

以下のコードでは、異なる成功確率に対する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が重ねて表示されます。

成功確率の変化に伴う分布の変化を視覚的に確認できます。

応用例:ベルヌーイ分布を使ったシミュレーション

コイン投げのシミュレーション

コイン投げは、ベルヌーイ分布の典型的な例です。

表が出る確率をp=0.5とし、コインを10回投げた結果をシミュレーションします。

以下のコードでは、コイン投げの結果を生成し、成功(表)の回数をカウントします。

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 である確率をp=16とし、サイコロを30回振った結果をシミュレーションします。

# サイコロの特定の目(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の成功率をpA=0.3、バージョンBの成功率をpB=0.5とし、それぞれ100回の試行を行います。

# バージョン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テストのそれぞれのバージョンの成功回数が表示されます。

これにより、どちらのバージョンがより効果的であるかを判断するためのデータを得ることができます。

応用例:ベルヌーイ分布を使った機械学習

ロジスティック回帰モデルとの関連

ロジスティック回帰は、ベルヌーイ分布を基にしたバイナリ分類の手法です。

このモデルは、入力データに基づいて成功確率pを予測し、結果が成功(1)または失敗(0)である確率を計算します。

ロジスティック回帰では、シグモイド関数を用いて、線形結合された特徴量から確率を導出します。

以下の数式で表されます。

σ(z)=11+ez

ここで、zは特徴量の線形結合です。

ロジスティック回帰は、ベルヌーイ分布に従うデータに対して非常に効果的な手法です。

ベルヌーイ分布を用いたバイナリ分類

ベルヌーイ分布は、バイナリ分類問題において、各クラスの確率をモデル化するために使用されます。

例えば、スパムメールの分類や、顧客の購入意欲の予測などが該当します。

以下のように、特徴量を用いてモデルを構築し、各クラスの確率を計算します。

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]]

このコードを実行すると、新しいデータポイントに対する各クラスの予測確率が表示されます。

ベルヌーイ分布とベイズ推定

ベイズ推定は、ベルヌーイ分布を用いて事後確率を計算するための強力な手法です。

特に、事前分布と尤度を組み合わせて、観測データに基づく確率を更新します。

ベルヌーイ分布において、成功の回数と試行回数を用いて、事後分布を計算することができます。

以下の数式で表されます。

事後分布事前分布×尤度

例えば、成功確率pの事前分布をベータ分布で表現し、観測データに基づいて事後分布を更新することができます。

ベイズ推定は、特にデータが少ない場合や不確実性が高い場合に有効です。

このように、ベルヌーイ分布は機械学習において、ロジスティック回帰やバイナリ分類、ベイズ推定などの手法と密接に関連しており、さまざまな応用が可能です。

まとめ

この記事では、ベルヌーイ分布の基本的な概念から、Pythonを用いた実装方法、さらには機械学習における応用例まで幅広く取り上げました。

特に、ロジスティック回帰やA/Bテストなど、実際のデータ分析においてどのようにベルヌーイ分布が活用されるかを具体的に示しました。

これを機に、ベルヌーイ分布を用いたシミュレーションやモデル構築に挑戦し、実際のデータに基づいた分析を行ってみてはいかがでしょうか。

関連記事

Back to top button
目次へ