iBetter Books
수정

t분포, 카이제곱분포, F분포

가설검정을 할 때 "이 검정에는 t분포를 쓴다", "저 검정에는 F분포를 쓴다"는 말을 자주 듣게 됩니다. 각 분포가 왜 필요한지, 어떤 상황에 등장하는지 이해하면 이후의 검정 방법을 훨씬 수월하게 배울 수 있습니다.

t분포 — 표본이 작을 때의 정규분포 대안

표준정규분포는 모집단의 표준편차(σ)를 알아야 쓸 수 있습니다. 하지만 현실에서는 σ를 모르는 경우가 대부분입니다. 표본 표준편차(s)로 추정할 수밖에 없는데, 이때 생기는 불확실성을 반영한 분포가 t분포입니다.

t분포는 정규분포보다 꼬리가 두껍습니다. 표본 크기가 작을수록 더 두껍고, 표본 크기가 커질수록 정규분포에 가까워집니다.

library(ggplot2)
library(tidyverse)

x <- seq(-5, 5, by = 0.01)

df_plot <- data.frame(
  x    = rep(x, 4),
  y    = c(
    dnorm(x),          # 표준정규분포
    dt(x, df = 1),     # t분포 (자유도 1)
    dt(x, df = 5),     # t분포 (자유도 5)
    dt(x, df = 30)     # t분포 (자유도 30)
  ),
  dist = rep(c("정규분포 (Z)", "t(df=1)", "t(df=5)", "t(df=30)"), each = length(x))
)

ggplot(df_plot, aes(x, y, color = dist, linetype = dist)) +
  geom_line(linewidth = 1) +
  coord_cartesian(ylim = c(0, 0.45)) +
  scale_color_brewer(palette = "Set1") +
  labs(
    title  = "t분포와 정규분포 비교",
    x      = "x",
    y      = "밀도",
    color  = NULL,
    linetype = NULL
  ) +
  theme_minimal()

자유도(df)는 보통 표본 크기 - 1 입니다. 자유도 30 이상이면 정규분포와 거의 구별이 안 됩니다.

t분포 R 함수

# dt — 밀도 (곡선의 높이)
dt(0, df = 10)     # 자유도 10인 t분포에서 x=0의 밀도

# pt — 누적확률
pt(2, df = 10)     # P(T ≤ 2), 자유도 10
pt(2, df = 10, lower.tail = FALSE)  # P(T > 2) — 상위 꼬리

# qt — 분위수 (pt의 역함수)
qt(0.975, df = 10)  # 95% 신뢰구간에 쓰이는 t 임계값

# 자유도별 임계값 비교
df_vals <- c(5, 10, 30, 100, Inf)
t_crit  <- qt(0.975, df = df_vals)
data.frame(자유도 = df_vals, t_임계값 = round(t_crit, 3))
# 자유도가 커질수록 z=1.96에 수렴합니다

# rt — 난수 생성
set.seed(42)
t_samples <- rt(1000, df = 10)

t분포는 언제 쓰는가

  • 모집단 표준편차를 모를 때 (거의 항상)
  • 단일 표본 t검정: "이 표본의 평균이 특정 값과 다른가?"
  • 독립 표본 t검정: "두 집단의 평균이 다른가?"
  • 대응 표본 t검정: "처리 전후 차이가 있는가?"

PART 03에서 자세히 다룹니다.

카이제곱분포 — 범주형 데이터와 분산 검정

카이제곱분포는 표준정규분포를 따르는 확률변수를 제곱해서 합한 분포입니다. 자유도에 따라 모양이 크게 달라집니다.

x <- seq(0, 30, by = 0.1)

df_plot <- data.frame(
  x    = rep(x, 4),
  y    = c(
    dchisq(x, df = 1),
    dchisq(x, df = 3),
    dchisq(x, df = 5),
    dchisq(x, df = 10)
  ),
  dist = rep(c("df=1", "df=3", "df=5", "df=10"), each = length(x))
)

ggplot(df_plot, aes(x, y, color = dist)) +
  geom_line(linewidth = 1.2) +
  coord_cartesian(ylim = c(0, 0.5)) +
  scale_color_brewer(palette = "Set1") +
  labs(
    title = "카이제곱분포 (자유도별)",
    x     = "x",
    y     = "밀도",
    color = "자유도"
  ) +
  theme_minimal()

자유도가 커질수록 오른쪽으로 이동하고 정규분포에 가까워집니다.

카이제곱분포 R 함수

# dchisq — 밀도
dchisq(5, df = 3)

# pchisq — 누적확률
pchisq(7.815, df = 3)                          # ≈ 0.95
pchisq(7.815, df = 3, lower.tail = FALSE)      # ≈ 0.05

# qchisq — 분위수
qchisq(0.95, df = 3)   # 자유도 3, 상위 5% 임계값 ≈ 7.815

# rchisq — 난수 생성
set.seed(42)
chisq_samples <- rchisq(1000, df = 5)

카이제곱분포는 언제 쓰는가

  • 독립성 검정: "두 범주형 변수가 서로 독립인가?" (예: 성별과 흡연 여부의 관계)
  • 적합도 검정: "데이터가 특정 분포를 따르는가?"
  • 분산 검정: "모집단의 분산이 특정 값인가?"

F분포 — 분산의 비율

F분포는 카이제곱분포를 자유도로 나눈 비율의 분포입니다. 두 집단의 분산을 비교하거나, 여러 집단의 평균을 동시에 비교할 때 등장합니다.

x <- seq(0, 5, by = 0.01)

df_plot <- data.frame(
  x    = rep(x, 4),
  y    = c(
    df(x, df1 = 1,  df2 = 10),
    df(x, df1 = 5,  df2 = 10),
    df(x, df1 = 10, df2 = 10),
    df(x, df1 = 5,  df2 = 30)
  ),
  dist = rep(c("F(1,10)", "F(5,10)", "F(10,10)", "F(5,30)"), each = length(x))
)

ggplot(df_plot, aes(x, y, color = dist)) +
  geom_line(linewidth = 1.2) +
  coord_cartesian(ylim = c(0, 1.5)) +
  scale_color_brewer(palette = "Set1") +
  labs(
    title = "F분포 (자유도 조합별)",
    x     = "x",
    y     = "밀도",
    color = NULL
  ) +
  theme_minimal()

F분포는 두 개의 자유도(df1, df2)가 필요합니다. df1은 분자 자유도, df2는 분모 자유도입니다.

F분포 R 함수

# df — 밀도
df(2, df1 = 5, df2 = 10)

# pf — 누적확률
pf(3.33, df1 = 5, df2 = 10)                     # ≈ 0.95
pf(3.33, df1 = 5, df2 = 10, lower.tail = FALSE) # ≈ 0.05

# qf — 분위수 (F 임계값)
qf(0.95, df1 = 5, df2 = 10)   # 95% 지점의 F 임계값 ≈ 3.33

# rf — 난수 생성
set.seed(42)
f_samples <- rf(1000, df1 = 5, df2 = 10)

F분포는 언제 쓰는가

  • 분산 동일성 검정: "두 집단의 분산이 같은가?" (t검정의 전제 확인)
  • 일원분산분석(One-Way ANOVA): "세 집단 이상의 평균이 같은가?"
  • 다원분산분석: 여러 요인의 효과 비교
  • 회귀분석의 F검정: "회귀 모델 전체가 유의한가?"

세 분포 비교 요약

# 각 분포의 주요 특징 비교
distributions <- data.frame(
  분포        = c("t분포", "카이제곱분포", "F분포"),
  자유도      = c("df = n-1", "df = k-1", "df1, df2"),
  범위        = c("(-∞, ∞)", "[0, ∞)", "[0, ∞)"),
  주요용도    = c("평균 검정", "범주형/분산 검정", "분산 비교/ANOVA"),
  R함수       = c("dt/pt/qt/rt", "dchisq/pchisq/qchisq/rchisq", "df/pf/qf/rf")
)

print(distributions)
분포 주요 사용 검정 핵심 R 함수
t분포 t검정 (평균 비교) pt(), qt()
카이제곱분포 독립성 검정, 적합도 검정 pchisq(), qchisq()
F분포 ANOVA, 분산 동일성 검정 pf(), qf()

이 세 분포를 완벽히 외울 필요는 없습니다. 검정 방법마다 어떤 분포를 쓰는지, R이 어떤 p-value를 돌려주는지를 이해하는 것으로 충분합니다. 실제 검정은 다음 PART에서 다룹니다.