
카이제곱 검정은 범주형 자료의 교차표(분할표, Contingency Table)를 사용하여 관측된 빈도와 기대 빈도 간의 차이가 통계적으로 유의미한지를 평가하는 방법입니다.
목적
종류
데이터 구조: 두 개의 범주형 변수로 구성된 교차표(2x2, mxn) 형태의 데이터.
방법
코드 예시
# 데이터 준비 (2x3 교차표)
data <- matrix(c(50, 30, 20, 40, 20, 40), nrow = 2, byrow = TRUE)
colnames(data) <- c("A", "B", "C")
rownames(data) <- c("Group1", "Group2")
# 교차표 출력
print(data)
# 카이제곱 독립성 검정
chisq_test_result <- chisq.test(data)
# 결과 출력
print(chisq_test_result)
결과 해석
Pearson's Chi-squared test
data: data
X-squared = 10.24, df = 2, p-value = 0.006
결론
데이터 구조: 관측된 빈도와 기대 빈도를 비교합니다.
방법
코드 예시
# 관측된 빈도
observed <- c(50, 30, 20)
# 기대되는 이론적 비율
expected <- c(40, 40, 20) # 관측된 데이터의 합에 따라 이론 비율을 적용
# 카이제곱 적합도 검정
chisq_test_result <- chisq.test(x = observed, p = expected / sum(expected))
# 결과 출력
print(chisq_test_result)
결과 해석
Pearson's Chi-squared test
data: observed
X-squared = 5.555, df = 2, p-value = 0.062
결론
correct = TRUE가 기본값이며, Yates의 보정을 적용합니다.코드 예시
# 2x2 교차표
data <- matrix(c(50, 30, 40, 80), nrow = 2)
# 카이제곱 독립성 검정 (Yates 보정 적용)
chisq_test_result <- chisq.test(data, correct = TRUE)
# 결과 출력
print(chisq_test_result)
코드 예시
# 2x2 교차표
data <- matrix(c(1, 9, 11, 3), nrow = 2)
# Fisher의 정확검정 수행
fisher_test_result <- fisher.test(data)
# 결과 출력
print(fisher_test_result)
결과 해석
| 종류 | 귀무가설(H0) | 대립가설(H1) | 결정 기준 |
|---|---|---|---|
| 독립성 검정 | 두 변수는 독립이다 | 두 변수는 독립이 아니다 | p-value < 0.05 → 독립 아님 |
| 적합도 검정 | 관측값 = 기대값 | 관측값 ≠ 기대값 | p-value < 0.05 → 차이 있음 |
| Fisher의 검정 | 두 변수는 독립이다 | 두 변수는 독립이 아니다 | p-value < 0.05 → 독립 아님 |
핵심 요약
주요 함수 요약
| 함수 | 용도 | 적용 상황 |
|---|---|---|
| chisq.test() | 독립성/적합도 검정 | 범주형 데이터의 교차표 또는 관측 빈도와 기대 빈도를 비교 |
| fisher.test() | 2x2 교차표 독립성 검정 | 소규모 빈도 (빈도가 작을 때) |
카이제곱 검정과 Fisher 검정은 범주형 변수의 관계를 평가하는 주요 방법입니다. 두 검정 모두 교차표를 사용하여 검정하지만, 교차표의 빈도 수에 따라 chisq.test() 또는 fisher.test()를 선택해야 합니다.
chisq 검정을 하기 전에 검정해야 하는 사항과 시각적으로 데이터를 확인하는 방법
카이제곱 검정을 수행하기 전에 반드시 전제 조건과 가정을 확인해야 합니다. 전제 조건이 충족되지 않으면 검정 결과의 신뢰성이 떨어질 수 있습니다.
table()을 사용하여 교차표를 생성하고, prop.table()로 비율을 확인할 수 있습니다.# 데이터 생성
data <- data.frame(
Gender = c('Male', 'Male', 'Male', 'Female', 'Female', 'Female'),
Product = c('A', 'B', 'C', 'A', 'B', 'C')
)
# 교차표 생성
table_data <- table(data$Gender, data$Product)
print(table_data)
# 교차표의 비율 확인
prop.table(table_data)
결과 해석table() 함수로 교차표를 확인하여 빈도 분포를 확인합니다.chisq.test()의 $expected 속성을 확인할 수 있습니다.chisq_test_result <- chisq.test(table_data)
print(chisq_test_result$expected) # 기대 빈도 출력
결과 해석library(ggplot2)
# 교차표를 데이터프레임 형태로 변환
df <- as.data.frame(table(data$Gender, data$Product))
# 막대그래프 시각화
ggplot(df, aes(x = Var2, y = Freq, fill = Var1)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Gender vs Product Preference", x = "Product", y = "Frequency")
결과 해석prop.table(table_data, margin = 1) : 행 기준으로 비율을 확인합니다.prop.table(table_data, margin = 2) : 열 기준으로 비율을 확인합니다.# 행 기준 비율
row_wise_ratio <- prop.table(table_data, margin = 1)
print(row_wise_ratio)
# 열 기준 비율
column_wise_ratio <- prop.table(table_data, margin = 2)
print(column_wise_ratio)
결과 해석margin = 1)은 각 행의 값이 해당 행의 총합에서 차지하는 비율을 보여줍니다.margin = 2)은 각 열의 값이 해당 열의 총합에서 차지하는 비율을 보여줍니다.카이제곱 검정 전 필수 검토 사항
데이터 시각화
최종 점검
검정 전 고려 사항 정리
| 항목 | 설명 |
|---|---|
| 데이터 유형 | 범주형 데이터 (교차표, 빈도표) |
| 관측값 독립성 | 독립적이어야 함 |
| 빈도 조건 | 기대빈도(5 이상), 최소 빈도(1 이상) |
| 비율 데이터 | 비율 데이터는 빈도 데이터로 변환해야 함 |
이 과정을 거쳐 카이제곱 검정을 수행하면, 결과의 신뢰성을 높일 수 있습니다.
library(descr)
CrossTable(cam)
Cell Contents
|-------------------------|
| N |
| Chi-square contribution |
| N / Row Total |
| N / Col Total |
| N / Table Total |
|-------------------------|
==============================
cvs 0 1 Total
0 12 6 18
0.161 0.236
0.667 0.333 0.562
0.632 0.462
0.375 0.188
1 7 7 14
0.207 0.303
0.500 0.500 0.438
0.368 0.538
0.219 0.219
Total 19 13 32
0.594 0.406
descr::CrossTable()로 확인하는 것의 의미
descr::CrossTable() 함수는 교차표를 생성하고 카이제곱 검정에 필요한 정보를 제공하는 유용한 함수입니다. 이 함수는 단순히 교차표만 보여주는 것이 아니라, 카이제곱 검정에 필요한 핵심 정보를 모두 제공합니다.
CrossTable()이 제공하는 정보CrossTable()이 유용한 이유chisq.test())으로도 가능하지만, CrossTable이 훨씬 더 직관적이고 자세한 정보를 제공합니다.# 라이브러리 설치 및 불러오기
install.packages("descr")
library(descr)
# 예시 데이터 생성
data <- data.frame(
Gender = c('Male', 'Male', 'Male', 'Female', 'Female', 'Female'),
Product = c('A', 'B', 'C', 'A', 'B', 'C')
)
# 교차표 생성 및 카이제곱 검정 수행
CrossTable(data$Gender, data$Product, chisq = TRUE)
출력 해석
CrossTable(data$Gender, data$Product,
chisq = TRUE, # 카이제곱 검정 수행
expected = TRUE, # 기대빈도 출력
prop.r = TRUE, # 행 비율 출력
prop.c = TRUE, # 열 비율 출력
prop.t = TRUE, # 총합 비율 출력
fisher = TRUE) # Fisher's exact test 수행
주요 옵션 해설
chisq = TRUE: 카이제곱 검정 수행.expected = TRUE: 기대빈도를 교차표에 함께 표시.prop.r = TRUE: 각 셀의 행 기준 비율 표시.prop.c = TRUE: 각 셀의 열 기준 비율 표시.prop.t = TRUE: 각 셀의 전체 표에 대한 비율 표시.fisher = TRUE: Fisher의 정확검정을 자동으로 수행합니다.CrossTable() vs chisq.test()의 차이| 구분 | CrossTable() | chisq.test() |
|---|---|---|
| 교차표 생성 | 교차표 생성 및 시각화 | 교차표 생성 불가 |
| 빈도 표시 | 빈도, 비율, 잔차, 기대빈도 모두 표시 | 교차표 직접 생성해야 함 (table()) |
| 카이제곱 검정 | 카이제곱 검정 가능 (자동 수행) | 카이제곱 검정 수행 (명시적으로 실행) |
| 잔차(Residuals) | 자동으로 표시 | 표시되지 않음 |
| Fisher test | 기대빈도가 5 미만이면 자동 실행 | 직접 fisher.test() 실행 필요 |
| 직관적 해석 | 직관적으로 확인 가능 (모든 정보 제공) | 카이제곱 통계량, p-value만 제공 |
| 결과의 디테일 | 빈도, 비율, 기대값, 잔차까지 모두 제공 | 카이제곱 통계량과 p-value만 제공 |
descr::CrossTable()은 단순한 교차표 생성을 넘어, 카이제곱 검정에 필요한 모든 정보를 한 번에 확인할 수 있는 강력한 도구입니다.CrossTable()은 교차표 확인 + 카이제곱 검정 + 시각화 + 잔차 분석을 한 번에 할 수 있는 강력한 도구입니다.
chisq.test(cam)
Pearson's Chi-squared test with Yates' continuity correction
data: cam
X-squared = 0.34754, df = 1, p-value = 0.5555
- H0: 새로운 항생제 복용군과 기본 항생제 복용군의 결과가 같다
- p-value <0.05이므로 H0를 기각할 수 있다.
- 행퍼센트로 볼지 열 퍼센트로 볼지 구분해야한다.