본문 바로가기
R 주제/통게분석(임시)

[R강의] 144. 엑셀에서 데이터 불러와서 분할표 만들고 카이제곱검정 또는 피셔의 정확검정 하기

by 만다린망고 2022. 12. 21.
반응형

아래와 같은 범주형 데이터가 있습니다. 

 

 

남자 10명과 여자 10명을 대상으로 무서운 영화 선호 여부를 조사한 것입니다. 우리는 위 데이터를 아래와 같은 형태의 표로 만들고 카이제곱검정을 하고 싶은 상황입니다. 

 

  남자 여자
무서운영화 선호 OO명 OO명
무서운 영화 비선호 OO명 OO명

 

1. 데이터 불러오기

먼저 아래 데이터를 다운받습니다. 

 

카이제곱검정용_데이터.xlsx
0.01MB

 

R에서 아래 메뉴를 클릭합니다. 

 

 

Browse를 누르고 데이터를 불러옵니다. 

 

 

Import를 누르지 말고, 우측 하단에 Code Preview 내용을 복사해서 스크립트 창에 붙여넣습니다. 

 

 

아래와 같이 변수 이름을 간단하게 만들어줍니다. 

 

library(readxl)
dt <- read_excel("C:/Users/A/Desktop/카이제곱검정용_데이터.xlsx")

 

readxl 함수로 불러온 데이터는 tibble 입니다. as.data.frame 함수를 이용하여 데이터 프레임으로 바꿔줍니다. 

 

library(readxl)
dt <- read_excel("C:/Users/A/Desktop/카이제곱검정용_데이터.xlsx")

dt=as.data.frame(dt)

 

2. 분할표 만들기

table 함수를 함수를 이용하면 분할표를 만들 수 있습니다. 

 

> table(dt)
   love_scary_movie
sex  O  X
  F  8 12
  M 14  6

 

table 함수의 결과는 카이제곱검정 함수에 입력값으로 사용될 수 없습니다. 따라서 위 결과를 데이터프레임 형태로 바꿔주어야 합니다. as.data.frame.matrix 함수를 이용하여 데이터프레임 형태로 바꿔줍니다. 

 

library(readxl)
dt <- read_excel("C:/Users/A/Desktop/카이제곱검정용_데이터.xlsx")

dt=as.data.frame(dt)

tb=as.data.frame.matrix(table(dt)) //분할표를 데이터프레임으로

 

3. 카이제곱검정

기대빈도 값이 5보다 작은 셀이 20% 이상인지 확인합니다. 기대빈도를 먼저 구해야합니다. 기대빈도는 아래와 같이 구합니다. 

 

> chisq.test(tb)$expected
   O X
F 11 9
M 11 9

 

모든 셀이 5 이상이므로 카이제곱검정을 할 수 있습니다. 카이제곱검정은 아래와 같이 합니다. 

 

> chisq.test(tb)

	Pearson's Chi-squared test with Yates' continuity correction

data:  tb
X-squared = 2.5253, df = 1, p-value = 0.112

 

 

4. 만약 피셔의 정확검정을 해야한다면? 

기대빈도를 구했는데 값이 5 이하인 셀이 20% 이상이면 피셔의 정확검정을 해야합니다. 아래와 같이 합니다. 

 

> fisher.test(tb)

	Fisher's Exact Test for Count Data

data:  tb
p-value = 0.111
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
 0.06261356 1.25427962
sample estimates:
odds ratio 
 0.2954024

 

5. 분할표에 합계도 넣고 싶다면? 

rowSums 와 colSums 함수를 이용하여 합계를 구하고 기존 데이터프레임 열과 행에 적절히 추가합니다. 

 

library(readxl)
dt <- read_excel("C:/Users/A/Desktop/카이제곱검정용_데이터.xlsx")

dt=as.data.frame(dt)

tb=as.data.frame.matrix(table(dt))

tb=cbind(tb,sum=rowSums(tb))
tb=rbind(tb,sum=colSums(tb))

 

결과는 아래와 같습니다. 

 

> tb
     O  X sum
F    8 12  20
M   14  6  20
sum 22 18  40
반응형

댓글