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에서 다룹니다.