iBetter Books
수정

카이제곱 검정

지금까지 다룬 분석은 대부분 수치형 변수를 대상으로 했습니다. 카이제곱(χ²) 검정은 범주형 변수들 사이의 관계를 분석합니다. "성별에 따라 선호하는 커피 종류가 다른가?", "흡연 여부와 폐암 발병이 관련 있는가?" 같은 질문에 답합니다.

적합도 검정 (Goodness of Fit)

관찰된 빈도가 이론적으로 기대되는 빈도와 일치하는지 검정합니다. 주사위가 공정한지, 설문 응답 분포가 특정 비율과 다른지 등을 확인합니다.

# 예시: 주사위를 60번 던졌을 때 각 면이 나온 횟수
observed <- c(8, 11, 9, 12, 10, 10)   # 실제 관찰 빈도

# H₀: 모든 면이 동일한 확률(1/6)로 나온다
# p 인자로 각 범주의 기대 확률을 지정합니다
result <- chisq.test(observed, p = rep(1/6, 6))
result
	Chi-squared test for given probabilities

data:  observed
X-squared = 0.8, df = 5, p-value = 0.9775
# p-value = 0.98 >> 0.05 → 귀무가설 기각 불가
# 이 주사위는 공정하다고 볼 수 있음

# 기대 빈도 확인
result$expected     # 각 면의 기대 빈도 = 10
result$statistic    # χ² 통계량 = 0.8
result$p.value      # p-value

# 불균등 비율 검정
# 예: 설문에서 "매우 만족:만족:보통:불만족" = 1:2:4:1 비율인지 검정
survey_obs  <- c(15, 35, 60, 10)
survey_prop <- c(1, 2, 4, 1) / sum(c(1, 2, 4, 1))
chisq.test(survey_obs, p = survey_prop)

독립성 검정 (Test of Independence)

두 범주형 변수 사이에 연관성이 있는지 검정합니다. 이것이 카이제곱 검정에서 가장 많이 쓰이는 형태입니다.

Titanic 데이터를 활용해 성별과 생존 여부가 독립적인지 확인합니다.

# 교차표(분할표) 생성
data(Titanic)
titanic_df <- as.data.frame(Titanic)

# 성별 × 생존 여부 교차표
sex_survival <- xtabs(Freq ~ Sex + Survived, data = titanic_df)
sex_survival
        Survived
Sex        No  Yes
  Female  126  344
  Male   1364  367
# 카이제곱 독립성 검정
result <- chisq.test(sex_survival)
result
	Pearson's Chi-squared test with Yates' continuity correction

data:  sex_survival
X-squared = 454.5, df = 1, p-value < 2.2e-16
# p-value < 0.001 → 성별과 생존 여부는 통계적으로 유의한 관련이 있다

# 검정 결과 상세 확인
result$observed    # 관찰 빈도
result$expected    # 기대 빈도 (독립적일 때 예상 빈도)
result$residuals   # 피어슨 잔차 (표준화 잔차)
result$stdres      # 표준화 잔차

기대 빈도 확인

카이제곱 검정의 가정 중 하나는 "기대 빈도가 5 이상이어야 한다"입니다.

# 기대 빈도 확인
result$expected
        Survived
Sex            No      Yes
  Female   330.04   139.96
  Male    1360.00   571.00
# 기대 빈도가 5 미만인 셀이 있는지 확인
any(result$expected < 5)    # FALSE → 가정 충족

# 5 미만인 셀의 비율
mean(result$expected < 5)   # 0 → 전혀 없음

표 전체 적용: table()과 함께

# 객실 등급 × 생존 여부
class_survival <- xtabs(Freq ~ Class + Survived, data = titanic_df)
class_survival

chi_class <- chisq.test(class_survival)
chi_class
# p-value < 2.2e-16 → 매우 유의함

# 모자이크 플롯으로 시각화
mosaicplot(class_survival,
           main  = "객실 등급과 생존 여부",
           color = c("tomato", "steelblue"),
           xlab  = "객실 등급",
           ylab  = "생존 여부")

효과 크기: Cramér's V

카이제곱 통계량은 표본 크기에 영향을 받습니다. 표본이 크면 작은 차이도 유의하게 나옵니다. 효과 크기인 Cramér's V로 실질적인 연관성 강도를 확인합니다.

# Cramér's V 직접 계산
cramers_v <- function(x2_result, n, min_dim) {
  sqrt(x2_result$statistic / (n * (min_dim - 1)))
}

n <- sum(sex_survival)
v <- cramers_v(result, n, min(dim(sex_survival)))
cat("Cramér's V:", round(v, 3))    # 0.454
# Cramér's V 해석 (자유도 1 기준)
# V < 0.10 : 미약한 연관
# 0.10 ~ 0.30 : 약한 연관
# 0.30 ~ 0.50 : 중간 연관
# V > 0.50  : 강한 연관

# rcompanion 패키지 활용
install.packages("rcompanion")
library(rcompanion)
cramerV(sex_survival)

피셔 정확 검정 (Fisher's Exact Test)

기대 빈도가 5 미만인 셀이 많을 때, 또는 표본이 작을 때 카이제곱 검정 대신 피셔 정확 검정을 씁니다. "정확"이라는 이름 그대로 근사값이 아닌 정확한 p-value를 계산합니다.

# 소표본 예시: 약물 치료 효과
drug_table <- matrix(c(8, 2,
                        3, 7),
                     nrow = 2,
                     dimnames = list(치료 = c("신약", "위약"),
                                     결과 = c("호전", "미호전")))
drug_table

# 기대 빈도 확인
chisq.test(drug_table)$expected
# 일부 셀의 기대 빈도가 5 미만 → 피셔 검정 사용

# 피셔 정확 검정
fisher.test(drug_table)
	Fisher's Exact Test for Count Data

data:  drug_table
p-value = 0.07055
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
 0.7914932 79.9836462
sample estimates:
odds ratio 
  8.307692 
# p-value = 0.07 > 0.05 → 유의하지 않음 (표본이 작아서)
# odds ratio = 8.3 → 신약 복용군이 호전될 오즈가 위약군의 8.3배이나
# 표본이 너무 작아 통계적으로 증명하기 어려움

# 2×2보다 큰 표에도 적용 가능
fisher.test(class_survival)

카이제곱 검정 선택 가이드

# 어떤 검정을 쓸지 결정하는 기준

# 1. 적합도 검정 (관찰 빈도 vs 기대 비율)
#    → chisq.test(x, p = 기대비율벡터)

# 2. 독립성 검정 (두 범주형 변수의 연관성)
#    기대 빈도가 모두 5 이상 → chisq.test(분할표)
#    기대 빈도 5 미만 셀 있음 → fisher.test(분할표)

# 3. 결과 보고 형식
#    "성별과 생존 여부 간 카이제곱 독립성 검정 결과,
#     통계적으로 유의한 관련성이 확인되었다
#     χ²(1) = 454.5, p < .001, Cramér's V = .45."

범주형 데이터 분석의 기본 도구인 카이제곱 검정을 익혔습니다. PART 06에서는 지금까지 분석한 결과를 논문과 보고서에서 쓸 수 있는 형태로 시각화하고 문서화하는 방법을 다룹니다.