반응형

[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

반응형

+ Recent posts