0Pricing
R Academy · 강의

베이지안 사고 입문

베이지안 체계에서 사전확률, 가능도 및 사후확률을 이해합니다.

베이지안 사고 입문은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 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(α, β)이고 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-이항(비율), 정규-정규(분산을 알고 있는 평균), 감마-포아송(비율)입니다.

# 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 추정

최대 사후 확률(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-이항, 정규-정규, 감마-포아송).
  • 베타-이항 갱신: 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/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“베이지안 사고 입문”에서 뭘 배우나요?

베이지안 체계에서 사전확률, 가능도 및 사후확률을 이해합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

R Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“베이지안 사고 입문” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 베이지안 사고 입문
  2. R에서 Stan 모델 작성하기
  3. MCMC 표본추출과 진단
  4. 사후예측검사
← R Academy(으)로 돌아가기