본문 바로가기

R-PAGO 노트

Z검정, t검정, 카이제곱 검정

아...정말 누가 "삶은 문제 해결의 연속"이라 했던가. 이 뻔한디 뻔한 카이제곱 검정이 엑셀에서 할 때와 R 프로그램에서 할 때 결과가 서로 달라 헤매고 말았다. 결국 정리가 필요 없다고 생각한 검정(Test)도 간략히 정리해 보고자 한다.  


검정


검정(test)라는 것은 "특정 분포를 기준으로 했을 때 유의성이 있는가?"를 판별하는 것이다. 분포(distribution)라고하면 정규 분포 또는 표준 정규 분포를 우선 떠올릴 것이다


Z-검정은 이 표준 정규 분포를 기준으로 값의 유의성을 검증하는 것을 말한다. 만약 "두 집단의 차이가 유의한가"를 검증한다면, 두 집단이 모두 표준 정규 분포를 따른다는 전제아래 검증을 하는 것이다. 



t 검정


데이터가 충분히 있을 경우 데이터가 표준정규분포를 따른다는 가정은 타당할 수 있으나 데이터수가 적은 경우 일반적으로 표준 정규 분포를 따르지 않게 된다. 따라서 데이터 수에 따른 분포를 일반화할 필요가 있는데 이것이 t 분포이다. 따라서 t검정이란 각각의 집단이 이 t분포를 따른다는 가정아래 검정하는 것이 된다. 


t분포의 정의상 데이터가 많아 지면 질수록 분포는 표준 정규 분포에 근접하게 된다. 일반적으로 데이터가 30이상일 경우, t분포와 z분포가 거의 같게 된다. 따라서 데이터 수와 관계없이 검정할 수 있는 t검정을 일반적으로 하며 z검정은 거의 하지 않는다. t 분포를 R프로그램에서 그리고 싶다면 아래 사이트를 참고하기 바란다.  http://jooyeory.blog.me/20205089734


t검정 또는 anova검정은 반드시 검정전에 표본이 동일한 분산을 가지고 있는가의 등분산성을 먼저 판단해야한다. R 프로그램에서는 함수 var.test(a,b)를 제공한다.


R프로그램에서 t 테스트와 등분산성 검정을 위해 다음 사이트를 참고하면 된다. 

two sample test:  https://www.r-bloggers.com/two-sample-students-t-test-2/

one sample test: https://www.r-bloggers.com/one-sample-students-t-test/



카이제곱 검정(Chi-squares)


그룹간 관찰빈도와 기대빈도를 통해 두 집단간의 차이가 유의한가를 판별하는 방법이다. 이해를 쉽게 하기 위해 실전 예제를 엑셀과 R프로그램을 통해 구현 해보자.


우선 당뇨병이 체중과 관련있는지 여부를 검정하기 위한 관찰 빈도가 다음과 같다고 하자.



책, 통계의 힘에 따르면 상기 어떤 칸에도 가급적 10, 최소 5 이상의 값이 들어간다면 z검정을 해도 문제 없다는 것이 관례적인 허용이라 한다. 위의 관찰빈도를 통해 아래와 같이 기대 빈도를 구할 수 있다. 


              당뇨              정상
비만 비만사람들중* 당뇨일 확률 비만사람들중*정상일 확률
정상체중 정상체중사람중*당뇨일 확률 정상체중사람중*정상일 확률


각각의 카이제곱 값은 (실제값-기대도수)^2/기대도수이므로 아래와 같이 계산된다.



기대도수의 값은 5 이상이어야 적당한데 만약 기대도수 값이 5이하이고 전체 기대도수 값 중 1/4이상인 작은 데이터를 할 경우에는 fisher.test()를 추천한다.


상기 값의 결론은 카이제곱 합이 8.3이 되고 자유도 1인 카이검정을 통해 p값이 클 확률이 0.004로 귀무가설이 기각된다. 즉, 당뇨는 비만과 관계가 있음을 검정하게 된다. 


똑같은 검정을 R에서 구현해 보자.

data<-matrix(c(10,15,10,65),nrow=2)


> chisq.test(data,correct=FALSE)


Pearson's Chi-squared test


data:  data

X-squared = 8.3333, df = 1, p-value = 0.003892


쉽다. 그리고 상기 엑셀 값과 같음을 확인 할 수 있다.  correct=FALSE를 한 이유는 Yates' continuity correction을 하지 않기 위함이다. 이 보정은 더 정확한 값을 산출하므로 실제로 R에서 default 값은 TRUE이다. 내가 엑셀과 R값이 달라 혼란스러웠던 이유는 chisq.test의 default값이 Yates 보정 값었기 때문이었다. 앞으로 카이제곱 검정시는 다음과 같이 Yates 보정을 하기로 한다. 

 > chisq.test(data)


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


data:  data

X-squared = 6.75, df = 1, p-value = 0.009375



유의점


검증은 결국 수집된 데이터 또는 잔차(error)가 특정한 분포를 일 거라는 전제에서 시작되기 때문에

만약 수집된 데이터의 특징과 가정하는 분포의 특징이 일치하지 하지 않을 경우 일치시킬 필요가 있다. 

만약 p값이 일반적으로 허용되는 0.05보다 크게 되면 변수 선택에 있어 고민에 빠지게 된다. 이 경우 "가정하는 분포로는 '충분히' 설명 안 되지만 어느 정도 (예: p<0.1~0.2)는 설명된다."고 말할 수 있는 상황이 발생하게 되는 것이다. 검정을 어느 정도 무시하고라도 예측력을 높이기 위한 선택을 해야하는 상황이 이런 상황이 되겠다.   


참고: Yates 검정통계량 ː 


SUM{ [ ( |실제빈도-기대빈도| - 0.5 )^2 ] / 기대빈도 } 

여기서, | |는 절대값(absolute value)이라는 의미인데 0.5를 빼기 위해 절대값을 취해야 합니다. 절대값을 취하지 않으면 같은 의미를 가지는 (실제빈도-기대빈도)와 (기대빈도-실제빈도)에 값의 차이가 발생하기 때문입니다. 그리고, 0.5를 빼는 것은 이항분포를 Normal분포에 근사해서 확률을 계산할 때 continuity correction을 하면 이항분포로 계산한 정확한 확률에 더욱 근사하게 되는 것과 유사합니다.