직관으로 이해하는 베이즈 정리

내 직관은 정말 맞을까?

by 박정수

안녕하세요! 수식만 보면 머리가 지그시 아파 오는 분들을 위해, 복잡한 통계문제를 파이썬과 함께 재미있고 직관적으로 풀어보는 시간입니다. 제가 그간 강의 준비하느라 여유를 가지지 못했었는데, 모처럼 용기를 내서 강의자료 중 여러분들에게도 드리고 싶은 자료를 준비했어요. Bayesian Theorem 이론을 쉽게 파이썬 코드로 수동과 자동으로 계산하는 방법을 소개합니다.


오늘은 인공지능(AI)이 세상을 배우는 원리이자, 우리의 합리적인 의사결정을 돕는 마법 같은 도구인 **'베이즈 정리(Bayes' Theorem)'**에 대해 이야기해 볼까 합니다.

"정리? 공식? 벌써부터 머리가 아픈데요?"

걱정 마세요! 오늘 우리는 복잡한 확률 공식을 과감히 휴지통에 던져버리고, 오직 **'구체적인 숫자 세기'**와 눈에 쏙 들어오는 **'파이썬 시각화'**만으로 이 멋진 개념을 정복할 것입니다.


직관의 함정: 99% 정확도의 진단 키트, 당신은 믿으시겠습니까?

여러분이 병원에 갔는데, 전체 인구의 딱 **1%**만 걸린다는 무서운 희귀병 검사를 받게 되었습니다. 의사 선생님이 말씀하십니다.

"이 진단 키트는 99%의 정확도를 자랑합니다. 병에 걸린 사람은 99% 양성으로 잡아내고, 건강한 사람도 95%는 음성으로 정확히 판별하죠(단 5%의 억울한 오진만 있습니다)."

며칠 뒤, 검사 결과가 **'양성(Positive)'**으로 나왔습니다. 눈앞이 캄캄해집니다. '정확도가 99%니까, 내가 진짜 이 병에 걸렸을 확률도 99%겠지?'

과연 그럴까요?

결론부터 말씀드리면, 양성 판정을 받았어도 **여러분이 실제 환자일 확률은 고작 '16.7%'**에 불과합니다. 대체 왜 이런 직관과 통계의 괴리가 발생하는 걸까요?


공식을 버려라! '10,000명'만 상상해 보자 (자연 빈도 모형)

소수점이 난무하는 확률 공식(P(A|B))은 잠시 잊어버리세요. 대신 우리 동네 사람 10,000명을 체육관에 모아놓았다고 상상해 봅시다.

원래 병에 걸릴 확률 (기저율, Prior) 이 병은 1%만 걸립니다. 10,000명 중 진짜 환자는 100명, 건강한 사람은 9,900명입니다.

검사 시작! (우도, Likelihood) 진짜 환자 100명이 검사를 받으면 99%가 양성이 나옵니다.

양성 99명 건강한 사람 9,900명이 검사를 받으면 오진율 5% 때문에 억울하게 양성이 나옵니다.

9,900 *0.05 =495명

결과 확인 (믿음의 업데이트, Posterior) 자, 체육관에 '양성' 판정을 받은 사람만 앞으로 나와보라고 합시다. 진짜 환자 99명 + 억울한 사람 495명 = 총 594명이 튀어나왔습니다. 여러분이 쥔 '양성' 결과지는 이 594명 중 하나입니다. 이 594명 중 진짜 환자는 몇 명이죠? 네, 99명입니다.

계산: 99 / 594 = 16.666%

놀랍지 않나요? 애초에 이 병에 걸릴 확률(1%) 자체가 너무 낮았기 때문에, 검사 결과가 양성으로 나왔다 하더라도 섣불리 절망할 필요가 없는 것입니다. 통계학에서는 눈앞의 증거(99% 정확도)에만 매몰되어 원래의 확률(1%)을 무시하는 현상을 '기저율 무시의 오류(Base Rate Fallacy)'라고 부릅니다.


초보자들이 가장 헷갈려 하는 '기준점'의 비밀

베이즈 정리를 배우다 보면 누구나 한 번쯤 벽에 부딪히는 순간이 옵니다. 바로 교집합조건부 확률의 차이입니다.

"수학도 좋아하고 영어도 좋아하는 학생 (교집합)"

"수학을 좋아하는 학생 중에서, 영어를 좋아하는 학생 (조건부 확률)"

말장난 같지만, 통계에서는 "내 시선이 머무는 전체 우주(분모)가 어디인가?"가 핵심입니다.

교집합: 넓은 운동장에 있는 전체 100명 중 교집합 20명을 찾습니다. (20%)

조건부 확률: 수학 동아리방 문을 닫아버립니다. 밖의 학생들은 투명인간이 되죠. 오직 방 안의 수학 선택자 60명 중에서 교집합 20명을 찾습니다. (약 33.3%)

새로운 증거(수학 선택)가 나타나면, 우리가 바라보는 전체 세상(분모)이 쪼그라들면서 확률이 업데이트되는 것, 이것이 베이지안의 심장입니다.


파이썬으로 칠판 필기하듯 베이즈 정리 풀기

손으로 일일이 계산하기 귀찮으신가요? 우리는 파이썬이라는 훌륭한 조수가 있습니다.

아래 코드는 가설과 확률만 입력하면, 파이썬이 마치 칠판에 판서하듯 단계별 곱하기, 더하기 과정을 친절하게 보여주고 깔끔한 표까지 만들어줍니다.

import pandas as pd

def calculate_bayes_step_by_step(hypotheses, priors, likelihoods):

print("="*60)

print(" � 베이즈 정리 수기 계산 (Step-by-Step) 프로세스")

print("="*60)

intersections = []

# [Step 1] 분자(교집합) 계산

print("\n▶ [Step 1] 각 가설의 분자(Prior × Likelihood) 계산")

for i in range(len(hypotheses)):

intersection = priors[i] * likelihoods[i]

intersections.append(intersection)

print(f" - {hypotheses[i]}: {priors[i]:.2f} (사전확률) × {likelihoods[i]:.2f} (우도) = {intersection:.4f}")

# [Step 2] 분모(전체 확률) 계산

total_prob = sum(intersections)

print(f"\n▶ [Step 2] 새로운 전체 확률(분모) 계산")

print(f" - 전체 분자의 합 = {' + '.join([f'{val:.4f}' for val in intersections])} = {total_prob:.4f}")

# [Step 3] 사후 확률 계산

posteriors = []

print("\n▶ [Step 3] 사후 확률(Posterior) 계산 (분자 / 분모)")

for i in range(len(hypotheses)):

posterior = intersections[i] / total_prob

posteriors.append(posterior)

print(f" - {hypotheses[i]}일 확률: {intersections[i]:.4f} / {total_prob:.4f} = {posterior:.4f} (약 {posterior*100:.1f}%)")

print("\n" + "="*60 + "\n")

# [Step 4] DataFrame 결과 출력

df = pd.DataFrame({

'가설': hypotheses,

'분자 계산식': [f"{p:.2f} × {l:.2f}" for p, l in zip(priors, likelihoods)],

'사후확률 계산식': [f"{inter:.4f} / {total_prob:.4f}" for inter in intersections],

'사후확률 (%)': [(post * 100) for post in posteriors]

})

df['사후확률 (%)'] = df['사후확률 (%)'].round(1).astype(str) + '%'

return df

# 방금 전 진단 키트 문제 데이터를 넣어볼까요?

calculate_bayes_step_by_step(['실제 환자', '건강한 사람'], [0.01, 0.99], [0.99, 0.05])


image.png


마무리하며

우리가 매일 사용하는 구글이나 네이버의 스팸 메일 필터링 인공지능도 오늘 배운 이 간단한 원리(나이브 베이즈 분류기)를 바탕으로 작동합니다.

인공지능도, 우리 인간도 처음부터 완벽한 정답을 알 수는 없습니다. 기존의 믿음(Prior)을 가지고 있다가, 새로운 데이터(Likelihood)가 들어올 때마다 유연하게 내 생각을 업데이트(Posterior)하며 더 합리적인 결론으로 나아가는 것. 그것이 바로 베이지안 통계가 우리에게 알려주는 삶의 지혜가 아닐까요?

다음 시간에도 파이썬과 함께하는 즐겁고 직관적인 수학 이야기로 찾아오겠습니다!

이전 15화도대체 P-value 가 뭔가요-2편