[R] 12. 카이제곱 검정(chi-squared test)

반응형

예시로 쓰일 데이터 예제

set.seed(2021)

# 임의로 데이터를 생성한다. (100명의 유저가 특정 곡을 스트리밍한 이력)
temp <- tibble(
  user_id = c(10000:10149),
  user_age = sample(x = c("20대", "30대"), size = 150, replace = TRUE),
  user_gender = sample(x = c("남성", "여성"), size = 150, prob = c(0.5, 0.5), replace = TRUE),
  song_id = sample(x = letters[1:5], size = 150, replace = TRUE),
  streaming_count = rpois(n = 150, lambda = 20),
  download_count = rpois(n = 150, lambda = 5)
)

temp
## # A tibble: 150 x 6
##    user_id user_age user_gender song_id streaming_count download_count
##      <int> <chr>    <chr>       <chr>             <int>          <int>
##  1   10000 20대     여성        c                    15              3
##  2   10001 30대     여성        a                    23              4
##  3   10002 30대     여성        a                    14              5
##  4   10003 30대     남성        d                    24              2
##  5   10004 20대     여성        b                    17              3
##  6   10005 30대     남성        c                    20              1
##  7   10006 30대     남성        b                    23              5
##  8   10007 30대     여성        d                    24              6
##  9   10008 30대     남성        c                    21              8
## 10   10009 30대     남성        d                    18              6
## # … with 140 more rows





카이제곱분석

  • 카이제곱분석은 두 범주형 변수 사이의 연관관계 등을 확인할 때 사용하는 통게적 기법입니다.
  • 카이제곱분석에 사용하는 함수는 chisq.test()이며 이 함수는 교차표의 테이블 형태를 파라미터로 받는 함수 입니다.
  • 이 또한 다른 함수들과 마찬가지로 map() 함수와 tidy() 함수 등을 적절하게 같이 활용하면 결과를 깔끔하게 정리해볼 수 있습니다.

 

  • 예시 데이터에서 성별(user_gender) 변수와 곡(song_id) 변수를 활용하여 아래와 같이 빈도를 집계하여 교차분할표를 생성해보겠습니다.
# count() 함수를 사용하여 빈도를 계산한 후 spread() 함수를 사용하여 교차분할표로 생성
cross_tabs <- temp %>% 
  count(user_gender, song_id) %>% 
  spread(key = "song_id", value = "n")

cross_tabs
## # A tibble: 2 x 6
##   user_gender     a     b     c     d     e
##   <chr>       <int> <int> <int> <int> <int>
## 1 남성           13    13    14    19     7
## 2 여성           22    17    10    17    18

 

  • 위와 같이 교차분할표를 spread() 함수를 사용하셔서 만들 수 도 있습니다.
  • 하지만 카이제곱 검정이 가능한 chisq.test() 함수는 파라미터 값으로 table이나 xtabs라는 클래스를 갖는 객체를 받습니다.
  • 따라서 tidyverse의 접근방식으로 xtabs() 함수를 사용하여 해당 클래스 객체를 만들어보겠습니다.
# count() 함수를 사용하여 빈도를 집계한 후 xtabs() 함수를 적용한다.
cross_tabs <- temp %>% 
  count(user_gender, song_id) %>% 
  xtabs(n ~ user_gender + song_id, data = .)

cross_tabs
##            song_id
## user_gender  a  b  c  d  e
##        남성 13 13 14 19  7
##        여성 22 17 10 17 18
class(cross_tabs)
## [1] "xtabs" "table"

 

  • 이렇게 적용된 객체는 파이프 오퍼레이터를 통해 바로 chisq.test() 함수를 적용할 수 있습니다.
cross_tabs %>% 
  chisq.test()
## 
##  Pearson's Chi-squared test
## 
## data:  .
## X-squared = 6.3975, df = 4, p-value = 0.1714

 

  • 마찬가지로 위 결과를 broom 라이브러리의 tidy() 함수를 사용하여 조금 더 보기 편한 데이터 형태로 변환할 수 있습니다.
cross_tabs %>% 
  chisq.test() %>% 
  broom::tidy()
## # A tibble: 1 x 4
##   statistic p.value parameter method                    
##       <dbl>   <dbl>     <int> <chr>                     
## 1      6.40   0.171         4 Pearson's Chi-squared test

 

  • 두 개 이상의 범주형 변수인 경우에도 split() 함수와 map() 함수를 적절하게 사용하여 적용할 수 있습니다.
# split() 함수를 통해 특정 범주형 변수의 수준을 분리한 후 map() 적용
temp %>% 
  count(user_age, user_gender, song_id) %>% 
  split(.$user_gender) %>% 
  map(~ xtabs(n ~ user_age + song_id, data = .x)) %>% 
  map(~ chisq.test(.))
## $남성
## 
##  Pearson's Chi-squared test
## 
## data:  .
## X-squared = 2.0489, df = 4, p-value = 0.7268
## 
## 
## $여성
## 
##  Pearson's Chi-squared test
## 
## data:  .
## X-squared = 3.3627, df = 4, p-value = 0.4991
  • map_dfr() 함수를 사용하여 map에 적용된 결과 값을 조금 더 깔끔하게 표현하면 아래와 같습니다.
temp %>% 
  count(user_age, user_gender, song_id) %>% 
  split(.$user_gender) %>% 
  map(~ xtabs(n ~ user_age + song_id, data = .x)) %>% 
  map(~ chisq.test(.)) %>% 
  map_dfr(~ tidy(.))
## # A tibble: 2 x 4
##   statistic p.value parameter method                    
##       <dbl>   <dbl>     <int> <chr>                     
## 1      2.05   0.727         4 Pearson's Chi-squared test
## 2      3.36   0.499         4 Pearson's Chi-squared test
반응형

'tidyverse' 카테고리의 다른 글

[R] purrr 라이브러리 내 map() 함수 이해하기  (0) 2021.07.14
[R] 13. 분산분석(ANOVA)  (0) 2021.07.14
[R] 11. t-Test  (0) 2021.07.13
[R] 10. 피어슨 상관계수(Pearson's Corrleation)  (0) 2021.07.06
[R] 9. 기술통계분석  (0) 2021.07.05
TAGS.

Comments