[R] 피셔 정확 검정 - fisher.test()
범주형 변수의 분포 사이에 유의미한 차이가 있는지 확인하는 분석으로는 보통 카이 제곱 검정을 시행한다. R을 이용한 카이 제곱 검정 시행법은 다음 두 링크에서 확인할 수 있다.
2022.08.31 - [범주형 자료 분석/R] - [R] 카이 제곱 검정 - chisq.test()
2022.09.01 - [범주형 자료 분석/R] - [R] 카이 제곱 검정 - CrossTable()
그런데 기대 빈도가 5를 넘지 않는 셀이 전체의 25% 이상인 경우 카이 제곱 검정의 결과는 신뢰도가 떨어져 쓸 수 없게 되고 피셔 정확 검정을 사용해야 한다. 이에 대한 이론적인 내용은 다음 링크에서 확인할 수 있다.
피셔 정확 검정: 2022.08.26 - [통계 이론] - [이론] 피셔 정확 검정 (Fisher's exact test)
피셔 정확 검정과 카이 제곱 검정의 관계:2022.08.29 - [통계 이론] - [이론] 카이 제곱 검정과 피셔 정확 검정의 관계
본 포스팅에서는 피셔 정확 검정을 어떻게 시행하는지 설명하고자 한다.
성별과 RH혈액형 간의 관계가 다음과 같다고 하자. RH혈액형의 분포를 보니 RH- 6명 중 5명이 무려 남성에 치우쳐져 있다. 이 결과를 보고 "남성일수록 RH-일 경향성이 있다."라고 할 수 있는지 따지는 검정이 피셔 정확 검정이다.
RH- | RH+ | |
여성 | 1 | 481 |
남성 | 5 | 513 |
일반적으로 이런 경우 카이 제곱 검정을 사용하지만 이 경우 사용할 수 없다. 기대 빈도가 5를 넘지 않는 셀이 전체의 25% 이상이기 때문인데, 한번 확인해보도록 하자.
*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.
2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.08.29)
분석용 데이터 (update 22.08.29)
2022년 08월 29일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 통계 프로그램 사용 방법 1) 엑셀 파일 2) CSV 파일 3) 코드북
medistat.tistory.com
코드를 보여드리기에 앞서 워킹 디렉토리부터 지정하겠다.
워킹 디렉토리에 관한 설명은 다음 링크된 포스트에서 볼 수 있다.
2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 작업 디렉토리 (Working Directory) 지정 - getwd(), setwd()
setwd("C:/Users/user/Documents/Tistory_blog")
데이터를 불러와 df에 객체로 저장하겠다.
데이터 불러오는 방법은 다음 링크에서 볼 수 있다.
2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 데이터 불러오기 : EXCEL - read_excel(), read.xlsx()
2022.08.10 - [통계 프로그램 사용 방법/R] - [R] 데이터 저장하기 : CSV 파일 - write.csv(), write_csv()
2022.08.10 - [통계 프로그램 사용 방법/R] - [R] 데이터 불러오기 : SAS file (.sas7bdat) - read.sas7bdat(), read_sas()
install.packages("readr")
library("readr")
df<-read_csv("Data.csv")
일반적인 분석처럼 생각하고 카이 제곱 검정을 시행하면 다음과 같은 결과가 나온다. 카이 제곱 검정 방법은 다음 두 가지 방법을 이미 소개한 바가 있다.
2022.08.31 - [범주형 자료 분석/R] - [R] 카이 제곱 검정 - chisq.test()
2022.09.01 - [범주형 자료 분석/R] - [R] 카이 제곱 검정 - CrossTable()
코드 - 카이 제곱 검정
chi_sex_rh<-chisq.test(df$SEX, df$RH, correct=FALSE)
chi_sex_rh
결과
Pearson's Chi-squared test
data: df$SEX and df$RH
X-squared = 2.404, df = 1, p-value = 0.121
Warning message:
In chisq.test(df$SEX, df$RH, correct = FALSE) :
Chi-squared approximation may be incorrect
결과 중 경고 메시지를 보면
"Warning message:
In chisq.test(df$SEX, df$RH, correct = FALSE) :
Chi-squared approximation may be incorrect"
카이 제곱 분포로의 근사는 정확하지 않을 수 있다고 설명해주고 있다. 이유는 기대 빈도가 5를 넘지 않는 셀이 전체의 25% 이상이기 때문이다.
코드 - 기대 빈도
그런데, 카이 제곱 분포를 쓰지 말고 피셔 정확 검정을 써야 하는 기준에 대해서는 사람마다 견해가 다르기도 하다. 따라서 기대 빈도를 직접 확인해보는 것이 좋은데 다음 두 가지 방법을 사용할 수 있다.
(1) chisq.test() 검정 결과의 expected를 보기
(2) 분할표를 산출할 때 기대 빈도도 산출하도록 "expected=TRUE"를 산입 하기. 그리고 행백분율 (prop.r), 열백분율(prop.c), 백분율 (prop.t) 는 FALSE로 처리하여 보이지 않게 하기.
#방법 1
chi_sex_rh$expected
#방법 2
install.packages("gmodels")
library("gmodels")
CrossTable(df$SEX, df$RH, prop.chisq=FALSE, expected=TRUE, prop.r=FALSE, prop.c=FALSE, prop.t=FALSE)
결과
방법 1)
df$RH
df$SEX 0 1
0 2.892 479.108
1 3.108 514.892
방법 2)
Cell Contents
|-------------------------|
| N |
| Expected N |
|-------------------------|
Total Observations in Table: 1000
| df$RH
df$SEX | 0 | 1 | Row Total |
-------------|-----------|-----------|-----------|
0 | 1 | 481 | 482 |
| 2.892 | 479.108 | |
-------------|-----------|-----------|-----------|
1 | 5 | 513 | 518 |
| 3.108 | 514.892 | |
-------------|-----------|-----------|-----------|
Column Total | 6 | 994 | 1000 |
-------------|-----------|-----------|-----------|
기대 빈도가 5 미만인 셀이 [남성&RH-], [여성&RH-] 두 칸이나 존재한다. 이래서 카이 제곱 검정에서 오류를 띄웠던 것이다. 따라서 피셔 정확 검정을 해야 한다.
코드 - 피셔 정확 검정
fisher.test(df$SEX, df$RH)
fisher.test(df$SEX, df$RH) : df 데이터의 SEX변수와 RH변수로 피셔 정확 검정을 시행하라
결과
Fisher's Exact Test for Count Data
data: df$SEX and df$RH
p-value = 0.2192
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
0.004505326 1.918452173
sample estimates:
odds ratio
0.2135842
우리가 봐야 할 곳은 세 번째 줄의 "p-value = 0.2192"이다. 피셔 정확 검정 결과 p-value는 0.2192로 0.05보다 크므로 "성별에 따라 RH혈액형의 분포가 다르다고 할 수 없다."라고 결론지어야 한다.
피셔 정확 검정을 구동하는 또 다른 방법이 있다. 먼저 분할표를 만든 뒤 시행하는 것이다.
freq_sex_rh<-xtabs(~SEX+RH, data=df)
table_sex_rh<-table(df$SEX, df$RH)
fisher.test(freq_sex_rh)
fisher.test(table_sex_rh)
freq_sex_rh<-xtabs(~SEX+RH, data=df) : xtabs()함수를 이용하여 SEX와 RH의 분할표를 만들어라. 단 데이터는 df를 사용하라. 만든 것은 freq_sex_rh에 저장하라.
table_sex_rh<-table(df$SEX, df$RH) : df의 SEX와 df의 RH로 분할표를 만들어라. 만든 것은 table_sex_rh에 저장하라.
fisher.test(freq_sex_rh) : 분할표 freq_sex_rh로 피셔 정확 검정을 시행하라.
fisher.test(table_sex_rh) : 분할표 table_sex_rh로 피셔 정확 검정을 시행하라.
결과
-freq_sex_rh사용한 결과
Fisher's Exact Test for Count Data
data: freq_sex_rh
p-value = 0.2192
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
0.004505326 1.918452173
sample estimates:
odds ratio
0.2135842
-table_sex_rh사용한 결과
Fisher's Exact Test for Count Data
data: table_sex_rh
p-value = 0.2192
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
0.004505326 1.918452173
sample estimates:
odds ratio
0.2135842
당연하게도 모두 같은 결과를 보여준다.
코드 - 단측 검정
지금까지의 내용은 양측 검정 (Two-sided, two-tailed) 의 내용이었다. 단측 검정을 원한다면 코드는 달라진다. (단측, 양측 피셔 정확 검정에 관한 내용은 다음 링크 확인 바란다:2022.08.26 - [통계 이론] - [이론] 피셔 정확 검정 (Fisher's exact test))
#상단 측 p-value
fisher.test(df$SEX, df$RH, alternative="greater")
#하단 측 p-value
fisher.test(df$SEX, df$RH, alternative="less")
결과
Fisher's Exact Test for Count Data
data: df$SEX and df$RH
p-value = 0.981
alternative hypothesis: true odds ratio is greater than 1
95 percent confidence interval:
0.009115443 Inf
sample estimates:
odds ratio
0.2135842
Fisher's Exact Test for Count Data
data: df$SEX and df$RH
p-value = 0.1264
alternative hypothesis: true odds ratio is less than 1
95 percent confidence interval:
0.000000 1.492381
sample estimates:
odds ratio
0.2135842
상단측 p-value와 하단측 p-value는 각각 0.9810, 0.1264다.
코드 정리
#작업 디렉토리 지정
setwd("C:/Users/user/Documents/Tistory_blog")
#데이터 불러오기
install.packages("readr")
library("readr")
df<-read_csv("Data.csv")
#카이제곱검정 시행해보기
chi_sex_rh<-chisq.test(df$SEX, df$RH, correct=FALSE)
chi_sex_rh
#기대 빈도 확인하기
#방법 1
chi_sex_rh$expected
#방법 2
install.packages("gmodels")
library("gmodels")
CrossTable(df$SEX, df$RH, prop.chisq=FALSE, expected=TRUE, prop.r=FALSE, prop.c=FALSE, prop.t=FALSE)
#피셔 정확 검정 시행하기
fisher.test(df$SEX, df$RH)
#분할표를 만든 뒤 피셔 정확 검정 시행하기
freq_sex_rh<-xtabs(~SEX+RH, data=df)
table_sex_rh<-table(df$SEX, df$RH)
fisher.test(freq_sex_rh)
fisher.test(table_sex_rh)
[R] 피셔 정확 검정 정복 완료!
작성일: 2022.09.02.
최종 수정일: 2022.09.02.
이용 프로그램: R 4.1.3
RStudio v1.4.1717
RStudio 2021.09.1+372 "Ghost Orchid" Release
운영체제: Windows 10, Mac OS 10.15.7
'범주형 자료 분석 > R' 카테고리의 다른 글
[R] 피셔 정확 검정 - CrossTable() (0) | 2022.09.02 |
---|---|
[R] 카이 제곱 검정 (일반 및 연속성 수정) - CrossTable() (0) | 2022.09.01 |
[R] 카이 제곱 검정 (일반 및 연속성 수정) - chisq.test() (0) | 2022.08.31 |