iBetter Books
수정

확률의 기초

통계는 불확실성을 다루는 학문입니다. 그리고 불확실성을 수치로 표현하는 언어가 확률입니다. 이번 챕터에서는 확률의 기본 개념을 직관적인 예시로 이해하고, R로 간단한 확률 실험을 해봅니다.

확률이란

동전을 던지면 앞면이 나올까, 뒷면이 나올까? 알 수 없습니다. 하지만 "앞면이 나올 가능성은 50%"라고 말할 수 있습니다. 이것이 확률입니다.

확률은 0에서 1 사이의 숫자로 가능성을 표현합니다. 0은 절대 일어나지 않음, 1은 반드시 일어남을 뜻합니다.

# R에서 확률 실험 — 동전 던지기 시뮬레이션
set.seed(42)  # 재현 가능한 결과를 위해 난수 시드 고정

# 동전 1번 던지기
sample(c("앞", "뒤"), size = 1)

# 동전 10번 던지기
coin_flips <- sample(c("앞", "뒤"), size = 10, replace = TRUE)
coin_flips
table(coin_flips)

# 동전 10000번 던지기 — 많이 할수록 이론적 확률 0.5에 수렴
n <- 10000
flips <- sample(c("앞", "뒤"), size = n, replace = TRUE)
sum(flips == "앞") / n   # 약 0.5

많이 시도할수록 실제 비율이 이론적 확률에 가까워집니다. 이것을 대수의 법칙(Law of Large Numbers)이라 합니다.

사건과 표본공간

  • 표본공간(Sample Space, S): 가능한 모든 결과의 집합
  • 사건(Event): 표본공간의 부분집합, 관심 있는 결과
# 주사위 던지기
# 표본공간: {1, 2, 3, 4, 5, 6}
# 사건 A: 짝수가 나온다 = {2, 4, 6}
# 사건 B: 3 이상이 나온다 = {3, 4, 5, 6}

# R로 주사위 시뮬레이션
set.seed(42)
dice <- sample(1:6, size = 10000, replace = TRUE)

# P(짝수) = 짝수인 횟수 / 전체 횟수
p_even <- sum(dice %% 2 == 0) / length(dice)
p_even   # 약 0.5

# P(3 이상)
p_ge3 <- sum(dice >= 3) / length(dice)
p_ge3    # 약 0.667

확률의 기본 성질

# 여사건 — P(A의 여사건) = 1 - P(A)
# P(홀수) = 1 - P(짝수) = 1 - 0.5 = 0.5

p_odd <- 1 - p_even
p_odd   # 약 0.5

# 합사건 — P(A 또는 B) = P(A) + P(B) - P(A 그리고 B)
# A: 짝수, B: 3 이상
# A 그리고 B: 짝수이면서 3 이상 = {4, 6}

p_a <- sum(dice %% 2 == 0) / length(dice)               # P(짝수)
p_b <- sum(dice >= 3) / length(dice)                     # P(3 이상)
p_a_and_b <- sum(dice %% 2 == 0 & dice >= 3) / length(dice)  # P(짝수 AND 3이상)

p_a_or_b <- p_a + p_b - p_a_and_b
p_a_or_b   # 약 0.833

조건부 확률

"비가 온다는 전제 하에, 우산을 샀을 확률은?" 처럼 특정 조건이 주어졌을 때의 확률을 조건부 확률이라 합니다.

P(B | A) = P(A 그리고 B) / P(A)

"A가 일어난 것을 알고 있을 때, B가 일어날 확률"입니다.

# 예시: 학생 100명 중 수학 수강자와 통계 수강자
# 수학 수강: 60명
# 통계 수강: 40명
# 둘 다 수강: 25명

# P(통계 | 수학) = P(수학 AND 통계) / P(수학)
p_math <- 60 / 100
p_stat <- 40 / 100
p_both <- 25 / 100

p_stat_given_math <- p_both / p_math
p_stat_given_math   # 0.417 — 수학 수강자 중 41.7%가 통계도 수강

독립 사건

두 사건 A와 B가 서로 영향을 주지 않을 때 독립이라 합니다.

A와 B가 독립이면: P(A 그리고 B) = P(A) × P(B)

# 동전 두 번 던지기 — 각 시도는 독립입니다
# P(첫 번째 앞면 AND 두 번째 앞면) = P(앞면) × P(앞면) = 0.5 × 0.5 = 0.25

set.seed(42)
n <- 100000
flip1 <- sample(c(0, 1), n, replace = TRUE)  # 1 = 앞면
flip2 <- sample(c(0, 1), n, replace = TRUE)

# 이론값: 0.25
sum(flip1 == 1 & flip2 == 1) / n   # 약 0.25

# 독립 확인: P(A and B) ≈ P(A) × P(B)
mean(flip1) * mean(flip2)            # 약 0.25 — 일치합니다

베이즈 정리

조건부 확률을 뒤집는 공식입니다. "검사 결과가 양성일 때, 실제로 아플 확률"처럼 사후 확률을 구할 때 씁니다.

# 예시: 암 진단 검사
# 실제 암 환자 비율(사전 확률): P(암) = 0.01
# 암 환자일 때 양성 반응(민감도): P(양성 | 암) = 0.95
# 정상일 때 양성 반응(위양성률): P(양성 | 정상) = 0.05

p_cancer <- 0.01
p_pos_given_cancer  <- 0.95
p_pos_given_normal  <- 0.05

# P(양성) = P(양성|암)×P(암) + P(양성|정상)×P(정상)
p_positive <- p_pos_given_cancer * p_cancer +
              p_pos_given_normal * (1 - p_cancer)

# P(암 | 양성) = P(양성 | 암) × P(암) / P(양성)
p_cancer_given_pos <- (p_pos_given_cancer * p_cancer) / p_positive
p_cancer_given_pos   # 약 0.161 — 양성이어도 실제 암일 확률은 16.1%

양성 판정을 받아도 암일 확률이 겨우 16%인 이유는 암의 사전 확률(1%)이 낮기 때문입니다. 검사 결과만으로 확신하면 안 되는 이유가 여기 있습니다.

R로 확률 실험하기

library(tidyverse)

# 주사위 두 개 합이 7이 될 확률 시뮬레이션
set.seed(42)
n <- 100000

dice1 <- sample(1:6, n, replace = TRUE)
dice2 <- sample(1:6, n, replace = TRUE)
total <- dice1 + dice2

# 합이 7인 비율
sum(total == 7) / n   # 약 0.167 (이론값: 6/36 = 1/6 ≈ 0.167)

# 분포 시각화
data.frame(total = total) %>%
  count(total) %>%
  mutate(prob = n / sum(n)) %>%
  ggplot(aes(x = total, y = prob)) +
  geom_col(fill = "steelblue") +
  geom_text(aes(label = round(prob, 3)), vjust = -0.5, size = 3) +
  scale_x_continuous(breaks = 2:12) +
  labs(
    title = "주사위 두 개의 합 분포",
    x     = "합",
    y     = "확률"
  ) +
  theme_minimal()

합이 7일 때 막대가 가장 높습니다. 7이 나오는 경우의 수가 (1,6), (2,5), (3,4), (4,3), (5,2), (6,1)로 6가지이기 때문입니다.

확률의 언어를 익혔으니, 이제 통계에서 가장 중요한 분포인 정규분포로 넘어갑니다.