[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.