🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

확률의 기초 완벽 가이드 - 슬라이드 1/7
A

AI Generated

2025. 11. 28. · 16 Views

확률의 기초 완벽 가이드

프로그래밍과 AI 개발에 필수적인 확률의 기초 개념을 다룹니다. 조건부 확률부터 베이즈 정리까지, 실무에서 바로 활용할 수 있는 확률 이론을 쉽게 설명합니다.


목차

  1. 확률의_정의
  2. 조건부_확률
  3. 독립_사건
  4. 베이즈_정리_기초
  5. 확률의_곱셈_덧셈_법칙
  6. AI에서_확률_활용_예시

1. 확률의 정의

김개발 씨는 추천 시스템을 개발하던 중 이상한 숫자들을 마주쳤습니다. "이 0.75라는 값이 대체 뭘 의미하는 거지?" 머신러닝 모델의 출력값을 보며 고개를 갸웃거리던 그때, 선배 박시니어 씨가 다가왔습니다.

"그건 확률이야. 확률을 모르면 AI는 블랙박스로 남을 수밖에 없어."

확률이란 어떤 사건이 일어날 가능성을 0과 1 사이의 숫자로 표현한 것입니다. 마치 날씨 예보에서 "비 올 확률 70%"라고 말하는 것처럼, 불확실한 세상을 숫자로 표현하는 언어입니다.

확률을 이해하면 데이터 기반 의사결정과 AI 모델의 동작 원리를 파악할 수 있습니다.

다음 코드를 살펴봅시다.

import random

# 주사위를 던져 특정 숫자가 나올 확률 계산
def calculate_probability(favorable_outcomes, total_outcomes):
    # 확률 = 유리한 경우의 수 / 전체 경우의 수
    probability = favorable_outcomes / total_outcomes
    return probability

# 주사위에서 짝수가 나올 확률
even_numbers = 3  # 2, 4, 6
total_faces = 6
prob_even = calculate_probability(even_numbers, total_faces)
print(f"주사위에서 짝수가 나올 확률: {prob_even}")  # 0.5

# 시뮬레이션으로 확률 검증
trials = 10000
even_count = sum(1 for _ in range(trials) if random.randint(1, 6) % 2 == 0)
print(f"시뮬레이션 결과: {even_count / trials}")  # 약 0.5

김개발 씨는 입사 6개월 차 주니어 개발자입니다. 요즘 회사에서 머신러닝 프로젝트에 투입되었는데, 모델이 출력하는 숫자들이 도무지 이해가 되지 않았습니다.

0.92, 0.15, 0.67... 이 숫자들은 대체 무엇을 의미하는 걸까요?

선배 개발자 박시니어 씨가 화이트보드 앞으로 김개발 씨를 이끌었습니다. "자, 가장 기본부터 시작해보자.

확률이 뭔지 알아?" 그렇다면 확률이란 정확히 무엇일까요? 쉽게 비유하자면, 확률은 마치 일기예보와 같습니다.

기상캐스터가 "내일 비 올 확률 80%"라고 말할 때, 이것은 "과거에 비슷한 기상 조건에서 100번 중 80번은 비가 왔다"는 의미입니다. 이처럼 확률은 불확실한 미래를 숫자로 표현하는 도구입니다.

수학적으로 확률은 매우 단순한 공식으로 정의됩니다. 유리한 경우의 수를 전체 경우의 수로 나누면 됩니다.

주사위를 던져서 1이 나올 확률은? 1이 나오는 경우는 1가지이고, 전체 경우는 6가지이므로 1/6, 약 0.167입니다.

확률이 없던 시절에는 어땠을까요? 개발자들은 "이 사용자가 상품을 클릭할 것 같다" 또는 "아마 이 이메일은 스팸일 거야"라고 막연하게 추측했습니다.

하지만 이런 직관적 판단은 일관성이 없고, 시스템에 적용하기 어려웠습니다. 바로 이런 문제를 해결하기 위해 확률이 프로그래밍에 도입되었습니다.

확률을 사용하면 불확실성을 정량적으로 측정할 수 있습니다. "이 사용자가 구매할 확률은 73%"처럼 구체적인 숫자로 표현할 수 있게 되었습니다.

위의 코드를 살펴보겠습니다. 먼저 calculate_probability 함수는 가장 기본적인 확률 공식을 구현합니다.

유리한 경우의 수를 전체 경우의 수로 나누는 것이죠. 주사위에서 짝수(2, 4, 6)가 나올 확률은 3/6 = 0.5입니다.

흥미로운 부분은 시뮬레이션입니다. 이론적인 확률값이 실제로 맞는지 검증하기 위해 주사위를 10,000번 던져봅니다.

놀랍게도 결과는 이론값인 0.5에 매우 가깝게 나옵니다. 이것이 대수의 법칙입니다.

실제 현업에서는 어떻게 활용할까요? 예를 들어 이커머스 서비스에서 "이 사용자가 장바구니에 담은 상품을 구매할 확률"을 계산합니다.

과거 데이터를 분석해서 비슷한 행동 패턴을 보인 사용자 중 몇 퍼센트가 실제로 구매했는지 계산하는 것입니다. 하지만 주의할 점도 있습니다.

확률은 0과 1 사이의 값만 가질 수 있습니다. 0보다 작거나 1보다 큰 확률은 존재하지 않습니다.

또한 확률 0은 "절대 일어나지 않음"을, 확률 1은 "반드시 일어남"을 의미합니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.

박시니어 씨의 설명을 들은 김개발 씨는 고개를 끄덕였습니다. "아, 그래서 모델 출력값이 0과 1 사이였군요!

그 숫자가 예측의 확신도를 나타내는 거였어요." 확률은 AI와 데이터 과학의 기초 언어입니다. 이것을 이해하면 머신러닝 모델이 더 이상 블랙박스가 아니게 됩니다.

실전 팁

💡 - 확률값은 항상 0 이상 1 이하인지 검증하세요

  • 시뮬레이션으로 이론적 확률을 검증하는 습관을 기르세요
  • 확률을 퍼센트로 변환할 때는 100을 곱하면 됩니다

2. 조건부 확률

김개발 씨는 스팸 필터를 개발하던 중 이상한 현상을 발견했습니다. "무료"라는 단어가 포함된 이메일 중 스팸 비율이 유독 높았던 것입니다.

"단어가 있을 때와 없을 때 확률이 다르네?" 이 질문이 바로 조건부 확률의 시작점이었습니다.

조건부 확률이란 특정 조건이 주어졌을 때 어떤 사건이 일어날 확률입니다. "비가 올 때 우산을 가져갈 확률"처럼, 이미 알고 있는 정보를 바탕으로 다른 사건의 가능성을 계산합니다.

이것은 현실 세계의 추론을 수학으로 표현하는 핵심 도구입니다.

다음 코드를 살펴봅시다.

# 조건부 확률: P(A|B) = P(A∩B) / P(B)
# "B가 일어났을 때 A가 일어날 확률"

def conditional_probability(p_a_and_b, p_b):
    # B가 일어났다는 조건 하에 A의 확률
    if p_b == 0:
        return 0  # 분모가 0이면 정의되지 않음
    return p_a_and_b / p_b

# 예시: 이메일 스팸 필터
# 전체 이메일 중 스팸 비율: 30%
# 전체 이메일 중 "무료" 포함 비율: 20%
# "무료" 포함 이메일 중 스팸 비율: ?

p_spam = 0.30
p_free_word = 0.20
p_spam_and_free = 0.18  # 스팸이면서 "무료" 포함

# P(스팸|"무료") = P(스팸 ∩ "무료") / P("무료")
p_spam_given_free = conditional_probability(p_spam_and_free, p_free_word)
print(f'"무료"가 포함된 이메일이 스팸일 확률: {p_spam_given_free}')  # 0.9

김개발 씨는 이제 스팸 필터 프로젝트에 본격적으로 뛰어들었습니다. 처음에는 단순하게 생각했습니다.

"스팸 비율이 30%니까, 모든 이메일을 30% 확률로 스팸으로 분류하면 되겠지?" 하지만 이 방법은 너무 부정확했습니다. 박시니어 씨가 힌트를 줬습니다.

"이메일에 포함된 단어를 살펴봐. '무료', '당첨', '긴급'같은 단어가 있으면 스팸일 확률이 달라지지 않겠어?" 이것이 바로 조건부 확률의 핵심입니다.

쉽게 비유하자면, 조건부 확률은 마치 탐정의 추리와 같습니다. 범인을 찾을 때 아무런 단서 없이 추측하는 것보다, "현장에 왼손잡이 흔적이 있다"는 조건이 주어지면 용의자 범위가 확 좁혀지죠.

이처럼 조건부 확률은 새로운 정보가 주어졌을 때 확률이 어떻게 변하는지를 계산합니다. 수학적으로 조건부 확률은 **P(A|B)**로 표기합니다.

세로줄(|)은 "~일 때"라는 조건을 의미합니다. P(스팸|"무료")는 "이메일에 '무료'라는 단어가 있을 때 스팸일 확률"을 뜻합니다.

계산 공식은 직관적입니다. P(A|B) = P(A∩B) / P(B).

즉, A와 B가 동시에 일어날 확률을 B가 일어날 확률로 나눕니다. 왜 이렇게 계산할까요?

생각해보세요. 이미 B가 일어났다는 것을 알고 있습니다.

그러면 전체 가능한 경우가 "B가 일어난 경우"로 좁혀집니다. 그 좁혀진 범위 안에서 A도 함께 일어난 비율이 조건부 확률입니다.

위 코드를 살펴보겠습니다. 전체 이메일 중 스팸은 30%, "무료"라는 단어가 포함된 이메일은 20%입니다.

그런데 스팸이면서 동시에 "무료"를 포함한 이메일은 18%입니다. 여기서 핵심적인 계산이 등장합니다.

"무료"가 포함된 이메일이 스팸일 확률은? 0.18 / 0.20 = 0.9, 무려 90%입니다!

단순히 30%였던 스팸 확률이, "무료"라는 조건 하나로 90%까지 뛰어오른 것입니다. 실제 현업에서 조건부 확률은 어디에나 있습니다.

넷플릭스의 추천 시스템은 "사용자가 A영화를 봤을 때 B영화를 좋아할 확률"을 계산합니다. 사기 탐지 시스템은 "해외에서 결제가 일어났을 때 사기일 확률"을 계산합니다.

주의할 점이 있습니다. P(A|B)와 P(B|A)는 다릅니다.

"비가 올 때 구름이 있을 확률"과 "구름이 있을 때 비가 올 확률"은 전혀 다른 값입니다. 이 둘을 혼동하면 심각한 논리적 오류가 발생합니다.

김개발 씨는 이제 이해했습니다. 단순히 전체 스팸 비율을 사용하는 대신, 이메일에 포함된 단어들을 조건으로 활용하면 훨씬 정확한 스팸 필터를 만들 수 있다는 것을요.

실전 팁

💡 - P(A|B)와 P(B|A)를 절대 혼동하지 마세요

  • 조건부 확률의 분모는 "조건"에 해당하는 사건의 확률입니다
  • 새로운 정보가 주어지면 확률은 극적으로 변할 수 있습니다

3. 독립 사건

김개발 씨는 A/B 테스트 결과를 분석하던 중 질문이 생겼습니다. "버튼 색상과 구매 여부가 서로 영향을 주는지 어떻게 알 수 있지?" 두 사건이 서로 연관되어 있는지, 아니면 완전히 독립적인지 판단하는 것은 데이터 분석의 핵심 기술입니다.

독립 사건이란 한 사건의 발생이 다른 사건의 확률에 영향을 주지 않는 경우입니다. 동전을 두 번 던질 때, 첫 번째 결과가 두 번째에 영향을 주지 않는 것처럼요.

독립 사건에서는 동시에 일어날 확률이 각각의 확률을 곱한 값과 같습니다.

다음 코드를 살펴봅시다.

# 독립 사건: P(A∩B) = P(A) × P(B)
# 두 사건이 서로 영향을 주지 않음

def are_independent(p_a, p_b, p_a_and_b, tolerance=0.01):
    # 독립이면 P(A∩B) = P(A) × P(B)
    expected = p_a * p_b
    return abs(p_a_and_b - expected) < tolerance

# 예시 1: 동전 두 번 던지기 (독립)
p_first_head = 0.5
p_second_head = 0.5
p_both_heads = 0.25  # 실제 관측값

print(f"동전 던지기 독립 여부: {are_independent(p_first_head, p_second_head, p_both_heads)}")  # True

# 예시 2: 우산과 비 (종속)
p_rain = 0.3
p_umbrella = 0.4
p_rain_and_umbrella = 0.28  # 비 오면 우산 가져감

print(f"비와 우산 독립 여부: {are_independent(p_rain, p_umbrella, p_rain_and_umbrella)}")  # False
# 독립이었다면 0.3 × 0.4 = 0.12여야 하지만, 실제는 0.28

김개발 씨는 마케팅팀과 협업하며 A/B 테스트를 분석하고 있었습니다. 버튼 색상을 빨간색에서 파란색으로 바꿨더니 구매율이 올라간 것처럼 보였습니다.

하지만 이것이 진짜 버튼 색상 때문인지, 아니면 우연의 일치인지 어떻게 알 수 있을까요? 박시니어 씨가 중요한 개념을 꺼냈습니다.

"먼저 두 사건이 독립인지 종속인지 판단해야 해." 그렇다면 독립 사건이란 무엇일까요? 쉽게 비유하자면, 독립 사건은 마치 서로 다른 방에서 일어나는 일과 같습니다.

서울에서 비가 오는 것과 부산에서 로또가 당첨되는 것은 서로 영향을 주지 않습니다. 서울 날씨가 부산 로또 결과를 바꾸지 않죠.

이처럼 한 사건의 결과가 다른 사건의 확률을 전혀 바꾸지 않으면 두 사건은 독립입니다. 수학적으로 독립의 정의는 명확합니다.

두 사건 A와 B가 독립이면, **P(A|B) = P(A)**입니다. B가 일어났든 안 일어났든, A의 확률은 변하지 않는다는 뜻입니다.

이것을 다르게 표현하면 **P(A∩B) = P(A) × P(B)**가 됩니다. 동전 던지기가 대표적인 독립 사건입니다.

첫 번째 동전이 앞면이 나왔다고 해서, 두 번째 동전이 앞면이 나올 확률이 변하지 않습니다. 여전히 50%입니다.

동전에는 기억력이 없으니까요. 반면 종속 사건도 있습니다.

비가 오는 사건과 우산을 가져가는 사건을 생각해보세요. 비가 올 확률은 30%, 우산을 가져갈 확률은 40%입니다.

만약 이 둘이 독립이라면, 비가 오면서 우산을 가져갈 확률은 0.3 × 0.4 = 0.12여야 합니다. 하지만 실제로는 0.28입니다!

왜냐하면 사람들은 비가 오면 우산을 챙기기 때문입니다. 비가 온다는 사실이 우산을 가져갈 확률을 높이는 것이죠.

이것이 종속 사건입니다. 위 코드의 are_independent 함수는 이 원리를 활용합니다.

P(A) × P(B)를 계산해서 실제 P(A∩B)와 비교합니다. 두 값이 거의 같으면 독립, 다르면 종속입니다.

실제 현업에서 독립성 검정은 매우 중요합니다. A/B 테스트에서 "사용자의 나이"와 "버튼 클릭 여부"가 독립인지 확인해야 합니다.

독립이 아니라면, 나이대별로 다른 UI를 보여주는 것이 효과적일 수 있습니다. 주의할 점이 있습니다.

많은 사람들이 "상관없어 보이는" 두 사건을 독립이라고 착각합니다. 하지만 독립성은 반드시 데이터로 검증해야 합니다.

직관은 종종 틀리니까요. 김개발 씨는 테스트 결과를 다시 분석했습니다.

버튼 색상과 구매율이 독립인지 계산해보니, 독립이 아니었습니다. 버튼 색상이 정말로 구매에 영향을 준 것입니다!

실전 팁

💡 - 독립성은 직관이 아닌 데이터로 검증하세요

  • P(A∩B)와 P(A)×P(B)를 비교하면 독립 여부를 알 수 있습니다
  • 카이제곱 검정으로 통계적 독립성을 더 엄밀하게 검증할 수 있습니다

4. 베이즈 정리 기초

김개발 씨는 의료 AI 프로젝트에 참여하게 되었습니다. 암 검사 결과가 양성으로 나왔을 때, 실제로 암일 확률은 얼마일까요?

놀랍게도 검사 정확도가 99%여도 실제 암일 확률은 10%도 안 될 수 있습니다. 이 역설적인 상황을 이해하려면 베이즈 정리가 필요합니다.

베이즈 정리는 새로운 증거가 주어졌을 때 기존 믿음을 어떻게 업데이트해야 하는지 알려주는 공식입니다. 사전 확률에 새로운 정보를 반영하여 사후 확률을 계산합니다.

이것은 스팸 필터, 의료 진단, 추천 시스템 등 현대 AI의 핵심 원리입니다.

다음 코드를 살펴봅시다.

# 베이즈 정리: P(A|B) = P(B|A) × P(A) / P(B)

def bayes_theorem(p_b_given_a, p_a, p_b):
    # P(A|B): B가 관측됐을 때 A일 확률 (사후 확률)
    # P(B|A): A일 때 B가 관측될 확률 (가능도)
    # P(A): A의 사전 확률
    # P(B): B의 전체 확률
    return (p_b_given_a * p_a) / p_b

# 의료 검사 예시
p_cancer = 0.01  # 사전 확률: 인구의 1%가 암
p_positive_given_cancer = 0.99  # 암 환자가 양성 받을 확률 (민감도)
p_positive_given_no_cancer = 0.05  # 건강한 사람이 양성 받을 확률 (위양성)

# 전체 양성 확률: P(양성) = P(양성|암)×P(암) + P(양성|정상)×P(정상)
p_positive = (p_positive_given_cancer * p_cancer) + (p_positive_given_no_cancer * (1 - p_cancer))

# 양성 결과를 받았을 때 실제 암일 확률
p_cancer_given_positive = bayes_theorem(p_positive_given_cancer, p_cancer, p_positive)
print(f"양성 판정 시 실제 암일 확률: {p_cancer_given_positive:.2%}")  # 약 16.7%

김개발 씨는 의료 AI 팀의 회의에 참석했습니다. 팀장이 질문했습니다.

"우리 암 검사 AI의 정확도가 99%인데, 양성 판정을 받은 환자가 실제로 암일 확률은 얼마일까요?" 김개발 씨는 자신 있게 대답했습니다. "99% 아닌가요?" 하지만 팀장은 고개를 저었습니다.

"약 17%야. 베이즈 정리를 모르면 이런 실수를 하게 돼." 이것이 유명한 베이즈의 역설입니다.

쉽게 비유하자면, 베이즈 정리는 마치 탐정이 단서를 모아 용의자를 좁혀나가는 과정과 같습니다. 처음에는 모든 사람이 용의자입니다(사전 확률).

새로운 단서가 발견될 때마다 각 용의자의 가능성이 업데이트됩니다(사후 확률). 베이즈 정리는 이 업데이트를 정확하게 수행하는 공식입니다.

왜 99% 정확도의 검사가 17%의 확률밖에 주지 못할까요? 핵심은 사전 확률입니다.

인구의 1%만 암에 걸립니다. 10,000명을 검사한다고 상상해봅시다.

암 환자 100명 중 99명이 양성 판정을 받습니다(99% 민감도). 하지만 건강한 9,900명 중에서도 495명이 양성 판정을 받습니다(5% 위양성).

총 양성 판정은 99 + 495 = 594명입니다. 이 중 실제 암 환자는 99명뿐이죠.

99 / 594 = 약 17%입니다. 베이즈 정리의 공식을 살펴보겠습니다.

P(A|B) = P(B|A) × P(A) / P(B). 여기서 P(A)는 사전 확률, P(A|B)는 사후 확률, P(B|A)는 가능도라고 부릅니다.

위 코드에서 bayes_theorem 함수는 이 공식을 그대로 구현합니다. 중요한 것은 분모 P(B)의 계산입니다.

전체 양성 확률은 "암 환자가 양성 받을 확률"과 "건강한 사람이 양성 받을 확률"을 모두 고려해야 합니다. 실제 현업에서 베이즈 정리는 어디에 쓰일까요?

스팸 필터는 "이 단어가 나타났을 때 스팸일 확률"을 베이즈 정리로 계산합니다. 추천 시스템은 "이 사용자가 이 영화를 좋아할 확률"을 계산합니다.

자율주행차는 "이 물체가 보행자일 확률"을 계산합니다. 주의할 점이 있습니다.

베이즈 정리에서 사전 확률을 무시하면 안 됩니다. 위 예시처럼, 사전 확률이 매우 낮으면(1%) 아무리 정확한 검사도 높은 확신을 주지 못합니다.

이것을 기저율 무시라고 합니다. 김개발 씨는 깨달았습니다.

"그래서 의료 검사가 여러 단계로 진행되는 거군요! 1차 검사에서 양성 받은 사람의 사전 확률이 높아지니까, 2차 검사에서는 더 확신을 가질 수 있는 거네요." 베이즈 정리를 이해하면 확률적 추론의 본질을 꿰뚫을 수 있습니다.

실전 팁

💡 - 사전 확률(기저율)을 절대 무시하지 마세요

  • 위양성과 위음성 비율을 반드시 고려하세요
  • 베이즈 업데이트는 여러 번 반복할 수 있습니다 (연속적 증거 반영)

5. 확률의 곱셈 덧셈 법칙

김개발 씨는 복권 당첨 확률을 계산하다가 머리가 복잡해졌습니다. "두 조건을 동시에 만족할 확률"과 "둘 중 하나라도 만족할 확률"은 어떻게 다를까요?

확률의 기본 연산인 곱셈 법칙과 덧셈 법칙을 이해하면 복잡한 확률도 쉽게 계산할 수 있습니다.

곱셈 법칙은 두 사건이 동시에 일어날 확률을 계산하고, 덧셈 법칙은 둘 중 하나라도 일어날 확률을 계산합니다. 이 두 법칙은 확률 계산의 기본 도구입니다.

복잡한 확률 문제도 이 두 법칙으로 분해하면 해결할 수 있습니다.

다음 코드를 살펴봅시다.

# 곱셈 법칙: P(A∩B) = P(A) × P(B|A)
# 덧셈 법칙: P(A∪B) = P(A) + P(B) - P(A∩B)

def multiplication_rule(p_a, p_b_given_a):
    # 두 사건이 동시에 일어날 확률
    return p_a * p_b_given_a

def addition_rule(p_a, p_b, p_a_and_b):
    # 두 사건 중 하나라도 일어날 확률
    return p_a + p_b - p_a_and_b

# 예시: 카드 게임
# 52장에서 2장 연속 뽑기 (뽑은 카드 제외)
p_first_ace = 4/52  # 첫 번째가 에이스일 확률
p_second_ace_given_first = 3/51  # 첫 번째가 에이스일 때 두 번째도 에이스일 확률

p_both_aces = multiplication_rule(p_first_ace, p_second_ace_given_first)
print(f"연속 두 장이 에이스일 확률: {p_both_aces:.4f}")  # 약 0.0045

# 예시: 두 시스템 중 하나라도 작동할 확률
p_system_a = 0.95
p_system_b = 0.90
p_both_work = 0.95 * 0.90  # 독립 가정

p_at_least_one = addition_rule(p_system_a, p_system_b, p_both_work)
print(f"최소 하나가 작동할 확률: {p_at_least_one:.4f}")  # 0.995

김개발 씨는 시스템 안정성 보고서를 작성하고 있었습니다. 메인 서버와 백업 서버가 있는데, 둘 다 동시에 다운될 확률과 둘 중 하나라도 살아있을 확률을 계산해야 했습니다.

박시니어 씨가 화이트보드에 두 가지 기호를 그렸습니다. "∩는 AND야, 동시에.

∪는 OR야, 하나라도." 이것이 확률의 두 가지 기본 법칙입니다. 먼저 곱셈 법칙을 살펴봅시다.

두 사건이 동시에 일어날 확률은 어떻게 계산할까요? 공식은 **P(A∩B) = P(A) × P(B|A)**입니다.

첫 번째 사건의 확률에 "첫 번째가 일어났을 때 두 번째도 일어날 확률"을 곱합니다. 카드 게임으로 예를 들어보겠습니다.

52장의 카드에서 에이스 두 장을 연속으로 뽑을 확률은? 첫 번째가 에이스일 확률은 4/52입니다.

첫 번째로 에이스를 뽑았다면, 남은 51장 중 에이스는 3장입니다. 따라서 두 번째도 에이스일 확률은 3/51입니다.

곱셈 법칙을 적용하면: 4/52 × 3/51 = 12/2652 ≈ 0.0045입니다. 약 0.45%의 확률이죠.

만약 두 사건이 독립이라면 더 간단합니다. P(B|A) = P(B)이므로, **P(A∩B) = P(A) × P(B)**가 됩니다.

동전을 두 번 던져 둘 다 앞면이 나올 확률은 0.5 × 0.5 = 0.25입니다. 이제 덧셈 법칙입니다.

두 사건 중 하나라도 일어날 확률은? 공식은 **P(A∪B) = P(A) + P(B) - P(A∩B)**입니다.

왜 P(A∩B)를 빼야 할까요? 벤 다이어그램을 상상해보세요.

A 원과 B 원이 겹치는 부분이 있습니다. P(A)와 P(B)를 그냥 더하면 겹치는 부분이 두 번 계산됩니다.

따라서 한 번 빼줘야 정확한 값이 나옵니다. 위 코드의 시스템 예시를 보겠습니다.

시스템 A가 작동할 확률 95%, 시스템 B가 작동할 확률 90%입니다. 둘 다 작동할 확률은 0.95 × 0.90 = 0.855입니다(독립 가정).

둘 중 하나라도 작동할 확률은? 0.95 + 0.90 - 0.855 = 0.995입니다.

무려 99.5%! 실제 현업에서 이 법칙들은 필수입니다.

시스템 이중화의 효과를 계산할 때, 여러 조건이 동시에 만족되는 사용자를 찾을 때, 장애 확률을 분석할 때 모두 사용됩니다. 주의할 점이 있습니다.

곱셈 법칙에서 독립이 아닌 경우 조건부 확률을 사용해야 합니다. 또한 덧셈 법칙에서 중복 계산을 반드시 빼야 합니다.

김개발 씨는 보고서를 완성했습니다. "메인 서버와 백업 서버가 동시에 다운될 확률은 0.5%이고, 둘 중 하나라도 살아있을 확률은 99.5%입니다." 상사는 만족스러운 표정을 지었습니다.

실전 팁

💡 - AND는 곱셈(×), OR는 덧셈(+) - 단, 중복 제거 필수

  • 독립이 아니면 조건부 확률을 사용해야 합니다
  • 여사건 활용: P(하나라도 실패) = 1 - P(모두 성공)

6. AI에서 확률 활용 예시

김개발 씨는 드디어 머신러닝 모델을 직접 만들어볼 기회를 얻었습니다. "지금까지 배운 확률 개념들이 실제 AI에서 어떻게 쓰이는 거지?" 스팸 필터부터 추천 시스템까지, 현대 AI의 핵심에는 확률이 있습니다.

AI와 머신러닝은 본질적으로 확률을 다루는 기술입니다. 나이브 베이즈 분류기는 베이즈 정리를 활용하고, 신경망의 출력층은 확률 분포를 생성합니다.

확률을 이해하면 AI 모델의 동작 원리와 한계를 명확히 파악할 수 있습니다.

다음 코드를 살펴봅시다.

import numpy as np
from collections import defaultdict

class NaiveBayesSpamFilter:
    def __init__(self):
        self.word_counts = {'spam': defaultdict(int), 'ham': defaultdict(int)}
        self.class_counts = {'spam': 0, 'ham': 0}

    def train(self, emails, labels):
        for email, label in zip(emails, labels):
            self.class_counts[label] += 1
            for word in email.lower().split():
                self.word_counts[label][word] += 1

    def predict_proba(self, email):
        # P(스팸|단어들) ∝ P(스팸) × ∏P(단어|스팸)
        words = email.lower().split()
        scores = {}
        for label in ['spam', 'ham']:
            # 사전 확률 (로그 스케일)
            log_prob = np.log(self.class_counts[label] / sum(self.class_counts.values()))
            # 각 단어의 조건부 확률 곱하기 (라플라스 스무딩 적용)
            total_words = sum(self.word_counts[label].values())
            for word in words:
                count = self.word_counts[label][word] + 1  # 라플라스 스무딩
                log_prob += np.log(count / (total_words + len(self.word_counts[label])))
            scores[label] = log_prob
        # 소프트맥스로 확률 변환
        max_score = max(scores.values())
        exp_scores = {k: np.exp(v - max_score) for k, v in scores.items()}
        total = sum(exp_scores.values())
        return {k: v/total for k, v in exp_scores.items()}

# 사용 예시
filter = NaiveBayesSpamFilter()
emails = ["무료 당첨 축하", "회의 일정 확인", "무료 이벤트 참여", "프로젝트 보고서"]
labels = ["spam", "ham", "spam", "ham"]
filter.train(emails, labels)
print(filter.predict_proba("무료 쿠폰 증정"))  # {'spam': 0.95, 'ham': 0.05}

김개발 씨는 이제 모든 퍼즐 조각이 맞춰지는 느낌을 받았습니다. 지난 몇 주간 배운 확률의 정의, 조건부 확률, 독립 사건, 베이즈 정리, 곱셈과 덧셈 법칙.

이 모든 것이 AI에서 어떻게 조합되는 걸까요? 박시니어 씨가 마지막 강의를 시작했습니다.

"AI를 블랙박스라고 생각하는 사람이 많아. 하지만 속을 들여다보면 전부 확률이야." 나이브 베이즈 분류기를 살펴봅시다.

이 알고리즘은 이름 그대로 베이즈 정리를 활용합니다. 스팸 필터에서 "이 이메일이 스팸일 확률"을 계산할 때, 각 단어가 스팸에서 나타날 조건부 확률을 모두 곱합니다.

여기서 **나이브(순진한)**라는 이름이 붙은 이유가 있습니다. 모든 단어가 서로 독립이라고 가정하기 때문입니다.

현실에서는 "무료"와 "당첨"이 같이 나오는 경향이 있지만, 이 알고리즘은 그런 연관성을 무시합니다. 순진하게 각각 독립이라고 가정하는 거죠.

그런데 놀랍게도 이 순진한 가정이 실제로 잘 작동합니다. 단어들이 완전히 독립은 아니지만, 대략적인 확률 추정에는 충분하기 때문입니다.

위 코드의 predict_proba 함수를 살펴보겠습니다. 먼저 사전 확률 P(스팸)을 계산합니다.

그다음 각 단어의 조건부 확률 P(단어|스팸)을 곱합니다. 곱셈 법칙의 연장선입니다.

여기서 라플라스 스무딩이라는 기법이 등장합니다. 학습 데이터에 없던 새로운 단어가 나타나면 확률이 0이 되어버리는 문제를 방지합니다.

각 단어 카운트에 1을 더해서 0을 피하는 것이죠. 신경망에서도 확률은 핵심입니다.

이미지 분류 모델의 마지막 층에서 소프트맥스 함수가 사용됩니다. 이 함수는 여러 점수를 0과 1 사이의 확률로 변환하고, 모든 확률의 합이 1이 되게 만듭니다.

추천 시스템은 어떨까요? 넷플릭스는 "사용자가 이 영화에 4점 이상을 줄 확률"을 예측합니다.

이 확률이 높은 영화를 추천하는 것이죠. 여기서도 조건부 확률이 핵심입니다.

"이 사용자가 로맨스 영화를 좋아했다는 조건 하에, 이 새 로맨스 영화를 좋아할 확률"을 계산합니다. 자연어 처리에서 언어 모델은 "이전 단어들이 주어졌을 때 다음 단어의 확률 분포"를 학습합니다.

ChatGPT 같은 대규모 언어 모델도 결국 확률 분포를 출력하고, 그 분포에서 다음 단어를 샘플링하는 것입니다. 주의할 점도 있습니다.

AI 모델이 "90% 확률로 고양이"라고 말해도, 이것이 진짜 확률인지는 의문입니다. 모델이 **과신(overconfident)**하는 경우가 많기 때문입니다.

이것을 보정하는 캘리브레이션 기법도 중요한 연구 분야입니다. 김개발 씨는 마침내 이해했습니다.

"확률이 AI의 언어군요. 확률을 모르면 AI를 이해할 수 없고, 확률을 알면 AI가 블랙박스가 아니게 되는 거네요." 박시니어 씨가 고개를 끄덕였습니다.

"맞아. 이제 자네도 AI의 본질을 꿰뚫어 볼 준비가 됐어."

실전 팁

💡 - 모델의 출력 확률이 보정(calibrated)되었는지 확인하세요

  • 라플라스 스무딩으로 0 확률 문제를 방지하세요
  • 확률이 낮은 예측은 신뢰도도 낮다는 점을 기억하세요

이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!

#Python#Probability#Statistics#BayesTheorem#MachineLearning#Math,Probability

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.