ベイズ的思考の基礎
ベイズの枠組みにおける事前分布、尤度、事後分布を理解します。
「ベイズ的思考の基礎」はCoddyKit上の無料R Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはR Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 R Academyコースには全4レッスンが含まれています。
頻度主義とベイズ主義
頻度主義統計では、確率は事象の長期的な頻度を表します。ベイズ統計では、確率は確信の度合いを表します。重要な違いは、頻度主義ではパラメータを固定された未知の定数として扱うのに対し、ベイズ主義ではパラメータを確率分布を持つ確率変数として扱うことです。
# Frequentist: parameter theta is fixed, data is random
# Bayesian: data is fixed (observed), theta has a distribution
# Example: estimating coin bias p
# Frequentist: MLE -> p_hat = heads / total
heads <- 7; total <- 10
p_mle <- heads / total
cat('MLE estimate:', p_mle, '\n')
# Bayesian: update prior belief with observed data
# Prior: Beta(2, 2) -> slightly informative, centered at 0.5
# Posterior: Beta(2 + heads, 2 + (total - heads)) = Beta(9, 5)
alpha_post <- 2 + heads
beta_post <- 2 + (total - heads)
p_bayes <- alpha_post / (alpha_post + beta_post) # posterior mean
cat('Bayesian posterior mean:', round(p_bayes, 3), '\n')ベイズの定理
ベイズの定理は、パラメータに対する事前の信念、そのパラメータを前提としたデータの尤度、データを観測した後の事後の信念を関連付けます。
P(θ|data) = P(data|θ) × P(θ) / P(data)
分母のP(data)は正規化定数です。これにより、事後分布が正しい確率分布になります。
# Bayes' theorem components
# P(theta | data) = posterior (what we want)
# P(data | theta) = likelihood (how well theta explains data)
# P(theta) = prior (what we believed before data)
# P(data) = evidence (normalising constant)
# Medical test example
P_disease <- 0.01 # prior: 1% prevalence
P_pos_given_disease <- 0.99 # sensitivity
P_pos_given_no_disease <- 0.05 # false positive rate
P_pos <- P_pos_given_disease * P_disease +
P_pos_given_no_disease * (1 - P_disease)
P_disease_given_pos <- (P_pos_given_disease * P_disease) / P_pos
cat('P(positive test):', round(P_pos, 4), '\n')
cat('P(disease | positive test):', round(P_disease_given_pos, 4), '\n')
cat('Only', round(P_disease_given_pos * 100, 1), '% chance despite positive test!\n')事前分布
事前分布は、データを見る前のパラメータに対する信念を表します。事前分布には、無情報(平坦で、知識がほとんどないことを表す)なものと、情報を持つ(山が鋭く、専門分野の知識を表す)ものがあります。一般的な事前分布には、Beta(1,1) = 一様分布、Normal(0, 10) = 弱情報事前分布があります。
# Visualise different Beta priors for a probability parameter
theta <- seq(0, 1, length.out = 200)
# Uniform (no prior knowledge)
prior_uniform <- dbeta(theta, 1, 1)
# Informative: believe p ~ 0.3
prior_informative <- dbeta(theta, 3, 7)
# Strong: believe p ~ 0.5
prior_strong <- dbeta(theta, 20, 20)
plot(theta, prior_uniform, type = 'l', col = 'gray',
ylim = c(0, 8), xlab = 'theta', ylab = 'Density',
main = 'Different Prior Beliefs')
lines(theta, prior_informative, col = 'blue')
lines(theta, prior_strong, col = 'red')
legend('topright', c('Uniform Beta(1,1)', 'Informative Beta(3,7)', 'Strong Beta(20,20)'),
col = c('gray', 'blue', 'red'), lty = 1)尤度関数
尤度P(data|θ)は、特定のパラメータ値に対して観測データがどの程度起こりやすいかを測定します。コイン投げでは尤度は二項分布、連続データでは多くの場合ガウス分布になります。多数のθの値で尤度を評価し、データを最もよく説明する値を探します。
# Likelihood for a coin flip experiment
# Data: 7 heads in 10 flips
heads <- 7; n <- 10
# Evaluate likelihood at many theta values
theta <- seq(0.01, 0.99, length.out = 200)
likelihood <- dbinom(heads, n, theta)
# Maximum likelihood
mle <- theta[which.max(likelihood)]
cat('MLE (max likelihood theta):', mle, '\n')
# Plot the likelihood function
plot(theta, likelihood, type = 'l', col = 'steelblue',
xlab = 'theta (coin bias)', ylab = 'Likelihood P(7H|theta)',
main = '7 Heads in 10 Flips: Likelihood')
abline(v = mle, lty = 2, col = 'red')
legend('topleft', paste('MLE =', mle), lty = 2, col = 'red')事後分布 = 事前分布 × 尤度
事後分布は、事前分布と尤度の積に比例します。Beta-Binomialモデルでは解析的に扱えます。事前分布がBeta(α, β)で、n回の試行でh回表が出た場合、事後分布はBeta(α + h, β + n − h)になります。
# Beta-Binomial conjugate model
heads <- 7; n <- 10
alpha_prior <- 2; beta_prior <- 2 # prior: Beta(2,2)
# Update: posterior = Beta(alpha + heads, beta + tails)
alpha_post <- alpha_prior + heads
beta_post <- beta_prior + (n - heads)
theta <- seq(0.01, 0.99, length.out = 300)
prior <- dbeta(theta, alpha_prior, beta_prior)
likelihood <- dbinom(heads, n, theta)
likelihood <- likelihood / max(likelihood) # normalise for plotting
posterior <- dbeta(theta, alpha_post, beta_post)
plot(theta, posterior, type = 'l', col = 'red', lwd = 2,
xlab = 'theta', ylab = 'Density', main = 'Prior vs Posterior')
lines(theta, prior, col = 'blue', lwd = 2)
lines(theta, likelihood, col = 'gray', lwd = 2, lty = 2)
legend('topleft', c(paste0('Prior Beta(', alpha_prior, ',', beta_prior, ')'),
'Likelihood (scaled)',
paste0('Posterior Beta(', alpha_post, ',', beta_post, ')')),
col = c('blue', 'gray', 'red'), lty = c(1,2,1), lwd = 2)共役事前分布
共役事前分布とは、事後分布が事前分布と同じ分布族に属する事前分布です。これにより、推論を解析的に扱えます。一般的な共役関係には、Beta-Binomial(割合)、Normal-Normal(分散既知の平均)、Gamma-Poisson(率)があります。
# Conjugate prior table (analytical results)
conjugates <- data.frame(
Likelihood = c('Binomial', 'Poisson', 'Normal (known sigma)',
'Exponential', 'Multinomial'),
Prior = c('Beta', 'Gamma', 'Normal',
'Gamma', 'Dirichlet'),
Posterior = c('Beta', 'Gamma', 'Normal',
'Gamma', 'Dirichlet'),
Update_Rule = c('(a+h, b+t)', '(a+x, b+n)', '(mu_n, sigma_n)',
'(a+n, b+sum)', '(a+counts)')
)
print(conjugates, row.names = FALSE)
# Beta-Binomial update
cat('\nBeta(2,3) + 7 heads, 3 tails -> Beta(',
2+7, ',', 3+3, ')\n')信用区間
信用区間(CI)は、信頼区間に対応するベイズ統計の概念です。95%のCIは、θがその区間に含まれる事後確率が95%であることを意味します。これは、多くの人が頻度主義の信頼区間に対して誤って当てはめている直感的な解釈です。
# 95% credible interval for Beta posterior
alpha_post <- 9; beta_post <- 5 # posterior from earlier
# Credible interval via quantile function
ci_lower <- qbeta(0.025, alpha_post, beta_post)
ci_upper <- qbeta(0.975, alpha_post, beta_post)
posterior_mean <- alpha_post / (alpha_post + beta_post)
cat('Posterior mean: ', round(posterior_mean, 3), '\n')
cat('95% Credible Interval: [',
round(ci_lower, 3), ',',
round(ci_upper, 3), ']\n')
cat('Interpretation: 95% probability theta is in this interval\n')
# Visualise
theta <- seq(0, 1, length.out = 300)
plot(theta, dbeta(theta, alpha_post, beta_post), type = 'l', col = 'red', lwd = 2,
main = '95% Credible Interval', xlab = 'theta', ylab = 'Density')
abline(v = c(ci_lower, ci_upper), lty = 2, col = 'blue')ベイズ更新:逐次学習
ベイズ更新は逐次的に行われます。今日の事後分布が明日の事前分布になります。そのため、ベイズ推論は自然に段階的に進められます。新しいデータが届くたびに最初から再適合する必要はなく、既存の事後分布を更新するだけで済みます。
# Sequential Bayesian updating for a coin
# Start with uninformative prior Beta(1,1)
flips <- c(1, 0, 1, 1, 0, 1, 1, 1, 0, 1) # 1=H, 0=T
alpha <- 1; beta_p <- 1 # prior
cat('Prior: Beta(', alpha, ',', beta_p, ') mean =', round(alpha/(alpha+beta_p), 3), '\n')
for (i in seq_along(flips)) {
if (flips[i] == 1) alpha <- alpha + 1 else beta_p <- beta_p + 1
mean_post <- alpha / (alpha + beta_p)
cat('After flip', i, '(', flips[i], '): Beta(',
alpha, ',', beta_p, ') mean =', round(mean_post, 3), '\n')
}MAP推定
Maximum A Posteriori(MAP)推定値は、事後分布の最頻値です。Beta(α, β)事後分布の場合、MAP = (α−1)/(α+β−2)です。MAPは事前分布と尤度の影響を釣り合わせ、サンプルが少ない場合には推定値を事前分布の方向へ縮小します。
# Compare MLE vs MAP for small sample
heads <- 3; n <- 5
alpha_p <- 5; beta_p <- 5 # informative prior: believe p ~ 0.5
# MLE: ignores prior
mle <- heads / n
# MAP: mode of Beta posterior
alpha_post <- alpha_p + heads
beta_post <- beta_p + (n - heads)
map <- (alpha_post - 1) / (alpha_post + beta_post - 2)
# Posterior mean (alternative point estimate)
post_mean <- alpha_post / (alpha_post + beta_post)
cat('Data: 3 heads in 5 flips\n')
cat('MLE: ', round(mle, 3), '(ignores prior)\n')
cat('MAP: ', round(map, 3), '(mode of posterior)\n')
cat('Posterior mean:', round(post_mean, 3), '(mean of posterior)\n')
cat('Note: MAP and mean shrink toward prior (0.5) for small n\n')ベイズ手法を使う場合
ベイズ手法は、次のような場合に特に有効です。(1)情報を持つ事前知識がある。(2)サンプルサイズが小さい。(3)不確実性を完全に定量化する必要がある。(4)パラメータについて確率的な記述をしたい。(5)過去の実験から事前分布を引き継ぐ逐次分析を行う。
# Comparison: when Bayesian vs frequentist is preferred
comparison <- data.frame(
Scenario = c(
'Small sample (n < 30)',
'Prior domain knowledge',
'Probability about parameter',
'Sequential updating',
'Large sample, no prior',
'Regulatory/simple inference'
),
Preferred = c(
'Bayesian', 'Bayesian', 'Bayesian',
'Bayesian', 'Either', 'Frequentist'
)
)
print(comparison, row.names = FALSE)
# Example: medical device testing with historical data
alpha_historical <- 15 # prior based on 20 historical tests
beta_historical <- 5
cat('\nHistorical prior: Beta(', alpha_historical, ',', beta_historical, ')\n')
cat('Prior mean:', round(alpha_historical/(alpha_historical+beta_historical), 3), '\n')実践におけるベイズ推論
単純な共役モデルでは、上で示したように推論を解析的に行えます。複雑なモデル(階層モデルや非共役モデル)では、Stan(RStan)、JAGS、BUGSを使ったマルコフ連鎖モンテカルロ(MCMC)サンプリングにより、事後分布を数値的に近似します。
# Analytical vs MCMC approaches
approaches <- data.frame(
Method = c('Conjugate (exact)', 'Grid approximation',
'Laplace approx.', 'MCMC (Stan/JAGS)',
'Variational Bayes'),
When = c('Conjugate prior+likelihood', 'Low-dim, discrete',
'Unimodal posterior', 'General complex models',
'Large scale, approximate'),
Speed = c('Instant', 'Fast', 'Fast', 'Slow', 'Moderate'),
Exactness = c('Exact', 'Exact on grid', 'Approximate',
'Asymptotically exact', 'Approximate')
)
print(approaches, row.names = FALSE)確認問題
コインを10回投げて、表が7回出たとします。事前分布はBeta(2, 2)です。正しい事後分布は何ですか。
まとめ:ベイズ的な考え方
重要なポイント:
- ベイズの定理:P(θ|data) ∝ P(data|θ) × P(θ)
- 事前分布はデータを見る前の信念を、尤度はデータによる支持を表し、事後分布はその両方を組み合わせたものです
- 共役事前分布では、事後分布を解析的に求められます(Beta-Binomial、Normal-Normal、Gamma-Poisson)
- Beta-Binomialの更新:Beta(α, β) + (表h回、裏t回) → Beta(α+h, β+t)
- 信用区間には、信頼区間にはない自然な確率の解釈があります
- ベイズ更新は逐次的です。今日の事後分布が明日の事前分布になります
- 複雑なモデルでは、MCMCサンプリング(Stan、JAGS)を使って事後分布を近似します
# Full Bayesian inference cycle for a proportion
alpha0 <- 2; beta0 <- 2 # prior
heads <- 12; total <- 20 # observed data
alpha_post <- alpha0 + heads
beta_post <- beta0 + (total - heads)
post_mean <- alpha_post / (alpha_post + beta_post)
ci <- qbeta(c(0.025, 0.975), alpha_post, beta_post)
cat('Prior: Beta(', alpha0, ',', beta0, ') mean =', round(alpha0/(alpha0+beta0), 2), '\n')
cat('Data:', heads, 'heads in', total, 'flips\n')
cat('Posterior: Beta(', alpha_post, ',', beta_post, ')\n')
cat('Posterior mean:', round(post_mean, 3), '\n')
cat('95% CI: [', round(ci[1],3), ',', round(ci[2],3), ']\n')よくある質問
「ベイズ的思考の基礎」レッスンは無料ですか?
はい。「ベイズ的思考の基礎」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。
「ベイズ的思考の基礎」で何を学びますか?
ベイズの枠組みにおける事前分布、尤度、事後分布を理解します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
R Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのR Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「ベイズ的思考の基礎」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このR Academyレッスンでコードを書いて実行できますか?
はい。すべてのR Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。