'test of independence'에 해당되는 글 1건

  1. 2015.11.22 R 범주형 자료분석 (2) 독립성 검정(test of independence) : chisq.test() (7)

지난 포스팅에서는 범주형 자료분석 중에서 (1) 적합도 검정에 대해서 소개하였다면, 이번 포스팅에서는 (2) 독립성 검정 (test of independence)에 대해서 알아보겠으며, 다음번 포스팅에서는 (3) 동질성 검정을 다루도록 하겠습니다.

 

 

범주형 자료 분석 유형별 간략한 소개는 아래와 같습니다.

 

 

 

[ 범주형 자료 분석 (categorical data test) ]

 

(1) 적합도 검정(goodness of fit test) : 관측값들이 어떤 이론적 분포를 따르고 있는지를 검정. 한 개의 요인을 대상으로 함 

 

(2) 독립성 검정(test of independence) : 서로 다른 요인들에 의해 분할되어 있는 경우 그 요인들이 관찰값에 영향을 주고 있는지 아닌지, 요인들이 서로 연관이 있는지 없는지를 검정. 두 개의 요인을 대상으로 함.

 

(3) 동질성 검정(test of homogeneity) : 관측값들이 정해진 범주 내에서 서로 비슷하게 나타나고 있는지를 검정. 속성 A, B를 가진 부모집단(subpopulation) 각각으로부터 정해진 표본의 크기만큼 자료를 추출하는 경우에 분할표에서 부모집단의 비율이 동일한가를 검정. 두 개의 요인을 대상으로 함.

 

 

 

 

 

 

 

 

 

독립성 검정(test of independence)은 두 개의 범주형 변수/요인(2 factors)이 서로 연관성이 있는지, 상관이 있는지, 독립적인지를 카이제곱 검정(chisquared test)을 통해 통계적으로 판단하는 방법입니다.

 

가령, 학력(초등졸, 중등졸, 고등졸, 대졸, 대학원졸)이라는 범주형 변수(variable X)/요인(factor 1)와 연소득(하, 중, 상)이라는 범주형 변수(variable Y)/요인(factor 2) 간에 서로 관련성이 있는 것인지 아니면 관련이 없이 독립적인지를 판단하는 것과 같은 문제에 독립성 검정을 사용합니다.

 

참고로, 두 변수가 양적변수(qualitative variable)인 경우 두 변수 간 상관관계 분석을 위해서는 공분산 분석, 상관계수 분석, 회귀분석 등을 활용합니다.

 

범주형 자료분석의 경우 두 변수의 관련성을 보려면 분할표를 만들어서 카이제곱 검정을 하게 되는데요, 두 변수간의 관련성을 양적변수 분석할 때처럼 숫자로 얼마나 관련성이 큰지를 알 수 있는 통계량을 제공하지는 않습니다.  (범주형 자료분석에서 두 변수 간 관련성 측도로 파이계수, 속성계수, 크레머 V 등의 통계량이 있는데요, 이번 포스팅에서는 이에 대한 설명은 건너뛰겠습니다.)

 

 

자료를 분류하는 두 변수를 x와 Y라고 하고, 변수 X는 m개, 변수 Y는 n개의 범주(혹은 계급 class, 혹은 요인 수준 factor level)를 가진다고 했을 때 관측도수 Oij 는 m개와 n개의 층으로 이루어진 아래와 같은 표로 정리할 수 있습니다.  이를 m*n 분할표 (m*n contingency table)이라고 부릅니다.

 

 

[ 독립성 검정 자료 구조 (dataset for test of independence) ]

 

 

 

 

독립성 검정에는 카이제곱 X^2 통계량을 사용하는데요, 귀무가설 H0 가 사실일 때 자유도 (m-1)(n-1)인 카이제곱분포에 근사하는 것으로 알려져 있습니다. (☞ 카이제곱 분포(Chi-squared distribution) 참고 포스팅

 

검정통계량 카이제곱 X^2 은 각 범주의 기대도수가 5 이상인 경우에 사용하는 것이 바람직하며, 기대도수가 5 미만인 경우에는 주의를 요합니다. (5보다 작으면 인접 범주와 합치는 것도 방법)

 

기본 원리는, 관측도수 O11, O21, ..., Omn 이 기대도수 E11, E21, ..., Emn 과 차이가 없다면 검정통계량 X0^2 값이 '0'이 되고, 반대로 관측도수와 기대도수가 차이가 크다면 검정통계량 값 또한 커지게 된다는 것입니다.

 

 

 

 

 

[ 독립성 검정(test of independence) 가설 및 검정 통계량, 검정 방법 ]

 

(1) 가설 (hypothesis)

 

  - 귀무가설 H0 : 두 변수 X와 Y는 서로 독립이다 (관련성이 없다)
                        ( pij = pim * pnj,   i = 1, 2, .., m,   j = 1, 2, ..., n )

 

  - 대립가설 H1 : 두 변수 X와 Y는 서로 독립이 아니다 (관련성이 있다)

 

 

 

(2) 검정 통계량 (chisquared test statistics)

 

 

 

(3) 검정 방법 (test method)

 

 

  • (a) chisq.test() of data from text problem

 

아래 문제에 대해서 R의 chisq.test() 함수를 사용해서 풀어보도록 하겠습니다. 

 

 

(문제)  학급 (class 1, class 2, class 3)과 수학 성적 (math score High, Middle, Low, Fail) 간의 관련성이 있는지를 조사한 아래의 분할표를 사용하여 유의수준 α 0.05 로 검정하여라.  

 

 

학급과 수학성적 분할표 (contingency table of class & math score)

 

 

score High 

score Middle 

score Low 

Fail 

Class 1

7

13

9

12

 Class 2

13

21

10

19

 Class 3

11

18

12

13

 

 

 

먼저 데이터 입력 및 탐색적 분석을 위한 R 함수입니다.

 

 

> ##---------------------------------------------------------------------
> ## categorical data analysis - (2) test of independence : chisq.test()
> ##---------------------------------------------------------------------
> 
> ##-------------
> # (a) textbook problem
> 
> ## data key-in
> # data key-in way 1 : rbind()
> row_1 <- c(7, 13, 9, 12)
> row_2 <- c(13, 21, 10, 19)
> row_3 <- c(11, 18, 12, 13)
> 
> data_rbind <- rbind(row_1, row_2, row_3)
> data_rbind
      [,1] [,2] [,3] [,4]
row_1    7   13    9   12
row_2   13   21   10   19
row_3   11   18   12   13
> 
> 
> # data key-in way 2 : matrix()
> raw_data <- c(7, 13, 9, 12, 13, 21, 10, 19, 11, 18, 12, 13)
> data_matrix <- matrix(raw_data, byrow=TRUE, nrow=3)
> data_matrix
     [,1] [,2] [,3] [,4]
[1,]    7   13    9   12
[2,]   13   21   10   19
[3,]   11   18   12   13
> 
> 
> # giving names to the rows and columns of the data table : dimnames()
> dimnames(data_matrix) <- list("Class" = c("Class_1", "Class_2", "Class_3"), 
+                               "Score" = c("Score_H", "Score_M", "Score_L", "Fail"))
> 
> data_matrix
         Score
Class     Score_H Score_M Score_L Fail
  Class_1       7      13       9   12
  Class_2      13      21      10   19
  Class_3      11      18      12   13
> 
> 
> ## exploratory data analysis
> # marginal distribution : addmargins()
> addmargins(data_matrix)
         Score
Class     Score_H Score_M Score_L Fail Sum
  Class_1       7      13       9   12  41
  Class_2      13      21      10   19  63
  Class_3      11      18      12   13  54
  Sum          31      52      31   44 158
> 
> 
> # proportional distribution : prop.table()
> prop.table(data_matrix)
         Score
Class        Score_H    Score_M    Score_L       Fail
  Class_1 0.04430380 0.08227848 0.05696203 0.07594937
  Class_2 0.08227848 0.13291139 0.06329114 0.12025316
  Class_3 0.06962025 0.11392405 0.07594937 0.08227848
> 
> addmargins(prop.table(data_matrix))
         Score
Class        Score_H    Score_M    Score_L       Fail       Sum
  Class_1 0.04430380 0.08227848 0.05696203 0.07594937 0.2594937
  Class_2 0.08227848 0.13291139 0.06329114 0.12025316 0.3987342
  Class_3 0.06962025 0.11392405 0.07594937 0.08227848 0.3417722
  Sum     0.19620253 0.32911392 0.19620253 0.27848101 1.0000000
> 
> 
> # bar plot : barplot()
> barplot(t(data_matrix), beside=TRUE, legend=TRUE, 
+         ylim=c(0, 30), 
+         ylab="Observed frequencies in sample", 
+         main="Frequency of math score by class")
> 

 

 

 

 

 

다음으로 카이제곱 검정 및 통계량 indexing 방법입니다.

 

 

> 
> ## chisquared test : chisq.test()
> chisq.test(data_matrix)

	Pearson's Chi-squared test

data:  data_matrix
X-squared = 1.3859, df = 6, p-value = 0.9667

> 
> 
> # indexing statistics of chisq.test()
> chisq.test_output_2 <- chisq.test(data_matrix)
> 
> chisq.test_output_2$observed # observed frequency
         Score
Class     Score_H Score_M Score_L Fail
  Class_1       7      13       9   12
  Class_2      13      21      10   19
  Class_3      11      18      12   13
> chisq.test_output_2$expected # expected frequeycy
         Score
Class       Score_H  Score_M   Score_L     Fail
  Class_1  8.044304 13.49367  8.044304 11.41772
  Class_2 12.360759 20.73418 12.360759 17.54430
  Class_3 10.594937 17.77215 10.594937 15.03797
> chisq.test_output_2$residuals # residual between observed and expected frequecy
         Score
Class        Score_H     Score_M    Score_L       Fail
  Class_1 -0.3681990 -0.13439170  0.3369579  0.1723221
  Class_2  0.1818200  0.05837794 -0.6714739  0.3475383
  Class_3  0.1244439  0.05404747  0.4316649 -0.5255380
> 
> chisq.test_output_2$statistic # chi-squared statistics
X-squared 
 1.385926 
> chisq.test_output_2$parameter # degrees of freedom
df 
 6 
> chisq.test_output_2$p.value # P-value
[1] 0.966709

  

 

 

위 분석결과를 보면 P-value가 0.966709 로서 유의수준 α 0.05보다 크므로 귀무가설 H0를 채택하여 "학급과 수학성적 간에는 서로 관련성이 없다. 즉, 독립적이다"고 판단할 수 있겠습니다.

 

 

 

이상으로 독립성 검정(test of independence)을 카이제곱 검정 기법을 사용해서 하는 방법을 소개하였습니다.

 

 

 

 

다음번 포스팅에서는 (3) 동질성 검정(test of homegeneity)에 대해서 알아보도록 하겠습니다.

 

많은 도움이 되었기를 바랍니다.

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡'를 꾸욱 눌러주세요. ^^

 

 

 

 

Posted by R Friend R_Friend

댓글을 달아 주세요

  1. Liam 2016.09.12 11:09 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요? 또 질문드립니다.

    카이스퀘어 검정을 통해 독립성 검정을 하려고 하는데요.
    유저ID가 중복이라 어떻게 처리해야 할지 고민입니다.
    데이터셋의 컬럼을 단순화 시키면,
    유저ID (중복O), 사기여부(Y/N), 가입상품(A,B,C) 이렇게 있는데요.
    중복이 있는 상태로 검정을 하는 것은 아닌것 같고,
    그럼 Groupby 유저ID 다음에 가입상품을 DUMMIE로 처리하고 3번 카이스퀘어 검정을 할까 하는데
    이 방법이 맞나요? (

    • R Friend R_Friend 2016.09.12 11:41 신고  댓글주소  수정/삭제

      Liam님,
      중복제거하고 유일한 값만 남기는 건 아래 링크의 unique() 함수 참조하세요.

      http://rfriend.tistory.com/m/165

      duplicated()함수도 동일한 역할합니다. 아래 script 참고하세요.

      new_dataframe <- dataframe[!duplicated(dataframe$variable), ]

  2. Liam 2016.09.12 11:52 신고  댓글주소  수정/삭제  댓글쓰기

    답변 감사 드립니다~

  3. 황금모찌 2018.05.01 12:11 신고  댓글주소  수정/삭제  댓글쓰기

    글 내용이 알차네요. 좋은 글 감사합니다.

  4. 군옥수수 2019.07.23 00:37  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 정말 많은 도움이 되었습니다

    궁금한게 있는데

    범주형 자료와 연속형 자료의 독립성 검정은 어떤 방법을 통해 할 수 있는지

    알 수 있을까요 ?

    감사합니다

    • R Friend R_Friend 2019.07.23 09:05 신고  댓글주소  수정/삭제

      설명변수가 범주형 자료이고 종속변수가 연속형일때, 2개 집단 간 평균 차이 검정은 t-test, 3개 이상 집단 간 평균 차이 검정은 ANOVA 사용합니다.
      https://rfriend.tistory.com/131 참고하세요.