[R] - 통계데이터분석 - 독립성검정과 적합성 검정 ( 카이제곱검정 - chi-square test )

반응형

교차표와 $\chi ^{2}$ 검정

$\chi ^{2}$ 검정(chi-square test)는 교차표상의 빈도를 바탕으로 수행합니다.

  • 교차표를 이용하면 범주형으로 수집된 두 변수의 범주 조합에 따른 조합별 빈도를 살펴볼 수 있으며, 이를 통해 두 변수 간의 관계를 파악할 수 있습니다.

독립성검정(independence test)은 두 범주형 변수 간의 관련성이 모집단에서 존재하는지 검정합니다.

  • 20대는 양식 , 30대는 한식, 40대는 중식을 선호한다고 했을때 연령대와 선호하는 음식은 상관관계가 있다고 판단할 수 있습니다.

적합성검정(goodness of fit test)은 범주별 빈도를 바탕으로 모집단에서 기대되는 비율 분포가 존재하는지 검정합니다.

  • ex. 이동 통신회사 A,B,C의 이용자가 각각 50,30,20명이라고 했을 때 이러한 비율이 모집단에서도 유지가 되는지( 세 회사 A,B,C의 시장 점유률)이 50%,30%,20%라고 할 수 있는지를 검정할 때 사용할 수 있습니다.

R 프로그래밍 - $\chi ^{2}$ 검정

안전벨트의 착용 여부와 승객의 안전간에 관계가 있다는 가정을 해봅시다.
아래의 코드는 안전벨트의 착용 여부와 승객의 안전이라는 두 변수간의 교차표를 생성한 것입니다.
생성한 교차표의 행에는 '경상', '중상', '사망'으로 구분되어있고, 열에는 안전벨트 '착용', '미착용'의 두가지 범주로 되어있습니다.


survivors = matrix(c(1443, 151, 47, 1781, 312, 135), ncol=2)

dimnames(survivors) = list(Status=c("minor injury",
                                     "major injury",
                                     "dead"),
                            Seatbelt=c("with seatbelt",
                                       "without seatbelt"))

survivors

# 출력
> survivors
              Seatbelt
Status         with seatbelt without seatbelt
  minor injury          1443             1781
  major injury           151              312
  dead                    47              135

안전벨트 착용 여부에 따라 승객의 안전이 차이가 크다면 우리는 안전벨트의 착용 여부와 환자의 상태간에 관계가 있다고 생각할 수 있습니다.
하지만 단순히 교차표 상으로는 그런 관계를 파악하기가 쉽지 않습니다.
왜냐하면 안전벨트를 착용한 사람의 수와 착용하지 않은 사람의 수가 다르기 때문에 직접 교차표 상의 수치를 가지고 비교하기에 적절하지 않습니다.
비율을 이용한다고 해보면 비율을 바탕으로해서 안전벨트 착용 여부가 환자의 상태에 미치는 영향을 좀 더 쉽게 파악할 수 있습니다.

교차표에 행과 열의 합을 추가한 후에 열이 100%로 척도 조정된 열의 비율을 계산해봅시다.
addmargins()함수를 사용하면 쉽게 행과 열의 합을 구할 수 있습니다.

아래의 표를 보면 총 3869명의 환자가 데이터에 있음을 알 수 있습니다.


> addmargins(survivors)
              Seatbelt
Status         with seatbelt without seatbelt  Sum
  minor injury          1443             1781 3224
  major injury           151              312  463
  dead                    47              135  182
  Sum                   1641             2228 3869

비율의 교차표를 만들기 위해 prop.table()함수를 사용합니다.
열의 합계가 100%가 되도록 하기 위해서 margin인수에 2를 지정합니다.
그러면 열의 합계가 100%가 되는 교차표를 생성할 수 있습니다.


> prop.table(addmargins(survivors,2), 2)
              Seatbelt
Status         with seatbelt without seatbelt        Sum
  minor injury    0.87934186       0.79937163 0.83329026
  major injury    0.09201706       0.14003591 0.11966917
  dead            0.02864107       0.06059246 0.04704058

> addmargins(prop.table(addmargins(survivors,2), 2),1)
              Seatbelt
Status         with seatbelt without seatbelt        Sum
  minor injury    0.87934186       0.79937163 0.83329026
  major injury    0.09201706       0.14003591 0.11966917
  dead            0.02864107       0.06059246 0.04704058
  Sum             1.00000000       1.00000000 1.00000000

위의 교차표를 바탕으로 안전벨트의 여부와 승객의 안전간의 관련성을 유추해보겠습니다.
우선 비율표를 보면 안전벨트를 착용한 승객이 '경상'비율은 더 높지만, '중상' 및 '사망'은 안전벨트 미착용자 비율이 더 높습니다.
따라서 안전벨트의 착용이 승객의 안전과 관련이 있다고 생각할 수 있습니다.

위의 결과를 barplot()을 통해 시각화할 수 있습니다.


survivors.porp = prop.table(survivors, 2)
barplot(survivors.porp*100, las=1,
        col=c("yellowgreen", 'lightsalmon', "orange" ),
        ylab="Percentage", main="Percentage of Survivors")

$\chi ^{2}$ 검정

$\chi ^{2}$ 검정은 범주형 변수 간 관련성이 모집단에서 존재하는지 검정합니다.

$\chi ^{2}$검정은 기대빈도(expected count)와 관측빈도(observed count)의 비교를 통해 계산되는 $\chi ^{2}$값 ($\chi ^{2}$ value, $\chi ^{2}$ statistic)을 가설검정을 위한 검정통계량으로 사용합니다.

  • 관측빈도 : 교차표상의 실제 빈도
  • 기대빈도 : 변수 간 서로 관련성이 없을 때 기대할 수 있는 예상빈도

$\chi ^{2}$검정 결과가 통계적으로 유의할 경우 변수 간 관련성이 존재합니다.

반대로 관측빈도와 기대빈도의 차이가 적다면 혹은 관측빈도와 기대빈도의 값이 같아서 분자가 0이 나온다면 귀무가설이 사실이라는 가정하에서 만들어진 기대빈도와 실제 관측빈도가 같다는 것이기 때문에 귀무가설이 참일 가능성이 크다라고 할 수 있습니다. 그래서 카이제곱값이 크면 클수록 귀무가설을 기각하고 대립가설을 채택하게 됩니다. 반대로 카이제곱값이 작으면 작을수록 귀무가설을 채택할 가능성이 높다고 볼 수 있습니다.

$$\chi^2 = \sum \frac{(O_i - E_i)^2}{E_i}$$

카이제곱값을 계산하는 수식은 아래와 같습니다.
관측빈도와 기대빈도의 차이에 의해서 계산을 하는 것을 확인할 수 있습니다.
그래서 만약에 두 값이 차이가 크다면(관측빈도와 기대빈도의 차이가 큰 경우) 이 기대빈도는 귀무가설이 사실이라는 가정 하에서 만들어진 값이기 때문에 우리가 실제로 표본으로부터 관측된 관측빈도와 차이가 크다면 귀무가설을 기각할 가능성이 높다는 이야기입니다.

$\chi ^{2}$ 검정 예시

Screenshot from 2023-08-07 03-13-39

$$\chi^2 = \sum \frac{(O_i - E_i)^2}{E_i}$$

  • (여기에서 $\chi ^{2}$는 $\chi ^{2}$값, o는 관측빈도, e는 기대빈도, i는 행, j는 열)기대빈도란 귀무가설이 사실이라는 가정하에서 우리가 기대할 수 있는 빈도를 의미합니다. 여기서 귀무가설은 '안전벨트 착용 여부와 환자의 상태는 관련이 없다'입니다. 귀무가설이 사실이라면 안전벨트 착용자와 미착용자는 사고 이후의 상태에 대해서 동일한 패턴을 보이게 될 것입니다.(안전벨트의 여부와 관계없이 상태가 같음) 다음은 기대빈도의 산출 방법입니다.
  • 안전벨트 착용자의 경상 기대빈도 = 83.3% x 1641 = 1367.0
  • 안전벨트 미착용자의 경상 기대빈도 = 83.3% x 2228 = 1855.9
  • 안전벨트 착용자의 중상 기대빈도 = 12.0% x 1641 = 196.9
  • 안전벨트 미착용자의 중상 기대빈도 = 12.0% x 2228 = 267.4
  • 안전벨트 착용자의 사망 기대빈도 = 4.7% x 1641 = 77.1
  • 안전벨트 미착용자의 사망 기대빈도 = 4.6% x 2228 = 104.7

Screenshot from 2023-08-07 03-27-25

위와같이 $\chi ^{2}$ 값을 구하고 ( 45.91 ), 이 값이 귀무가설이 사실이라는 가정하에서 얼마나 흔하게 또는 드물게 나타나는 수치인지 평가할 필요가 있습니다. 두가지 방식으로 할 수 있습니다.

  1. 관측된 카이제곱값의 유의확률을 구한 후 이를 유의수준 0.05 또는 0.01과 비교를 합니다. 관측된 카이제곱값의 유의확률은 0.05 또는 0.01의 유의수준보다 작으면 귀무가설을 기각합니다.
  2. 유의수준 0.05 또는 0.01에서의 카이제곱값을 구한 다음 관측된 카이제곱값과 비교합니다. 관측된 카이제곱값이 유의수준에 대응되는 카이제곱값보다 크면 귀무가설을 기각합니다.

R 프로그래밍

pchisq() 함수를 이용하면 특정 카이제곱값에서의 유의확률을 구할 수 있습니다.
첫 번째 인자에 카이제곱값, 자유도(행의 개수에서 -1 곱하기 열의 개수 -1)
유의수준이 매우 낮기 때문에 귀무가설을 기각하고 대립가설을 채택합니다.

두 번째 코드는 유의수준 0.05에 대응되는 카이제곱값입니다. 표본으로부터 관측된 카이제곱값이 45.91이기 때문에 45.91은 5.99의 오른쪽에 위치하기 때문에 귀무가설을 기각하고 대립가설을 채택합니다.


> pchisq(45.91, df=(3-1)*(2-1), lower.tail = FALSE)
[1] 1.073421e-10

> qchisq(0.05, df=(3-1)*(2-1), lower.tail = FALSE)
[1] 5.991465

아래의 그림을 보면 관측된 카이제곱값이 유의수준 0.05에 대응되는 카이제곱값보다 크므로 귀무가설을 기각합니다.

Screenshot from 2023-08-07 03-38-37

반응형