임상 시험을 통계적으로 분석할 때 가장 중요한 건, 어떤 통계기법을 사용할 거냐는 문제일 겁니다. 집단 사이의 비교에서도 가장 익숙한 student's t test에서부터 Mann-Whitney U test, Welch's t test 등등 다양한 통계기법이 있기 때문에 통계 초심자는 처음부터 주눅이 들기 마련이거든요. 그래서 실은 "이런 상황에서는 어떤 통계기법이 적당할까요? 우리 함께 찾아보아요." 형식의 글을 준비하고 있었습니다. 그런데 그 전에 정규성 검정과 등분산 검정 요령에 대해서는 먼저 설명해 드려야겠더군요. 집단의 관찰치값이 정규성 분포를 하느냐, 집단들이 서로 동일한 분산을 갖고 있느냐에 따라 통계기법 선택이 달라지기 때문입니다. 오늘은 그중 R을 이용해서 정규성을 검정하는 방법을 알아보도록 하겠습니다. 


주의) 이 글을 읽으시면서 메인 폰트보다 옅은 색으로 쓰여진 글은 읽지 않으셔도 무방합니다. 다시 말해, 해당 내용이 이해가 되지 않는다고 머리를 쥐어뜯지 마시고 그냥 술술 넘어가시라는 겁니다. 통계를 처음 공부할 때 가장 큰 장벽이 화성인들이나 쓸법한 낯선 언어적 장벽이었던 것 같습니다. 일단은 짙은 색 글만 읽으면서 묻지 말고 따라 하시고, 나중에 통계에 재미가 붙으면 그때 저와 함께 이 빌어먹을 통계 언어로 free talking 해보도록 해요. 




단일 집단의 정규성 검정을 해보아요


임상 연구에서 가장 많이 쓰이는 건 실험군-대조군을 비교하는 연구이지만, 순서대로 먼저 단일 집단의 관찰치들이 정규성 분포를 하는지 확인하는 과정을 알아보죠. (이 과정은 대게 실험군의 관찰치 평균을 우리가 알고 있는 모집단의 평균과 비교하기 위해서 시행하는 One sample t test의 준비작업에서 흔히 쓰입니다.)


먼저, 공부하실 때 쓸 데이터 파일을 나눠드리도록 하겠습니다.

normality1.csv

(깜신의 통계이야기 1편에서 설명해 드렸던 것처럼, 제가 가지고 있는 엑셀 파일에서 필요한 부분만 선택해서 CSV 파일 형식으로 저장한 겁니다. CSV 파일이 낯설다면 1편을 읽어보시기 바랍니다.)


R을 시행하시고, 프롬프트 창에 

blog1=read.csv("파일명")

을 입력해주세요. 파일명에는 당연히 파일이 위치한 경로를 지정해주세요.

(R의 설치나, 이 명령어가 생소하다면, 마찬가지로 1편을 읽어보세요.)


에러 없이 ">" 모양의 프톰프트가 깜빡이고 있다면, 잘하신 겁니다. 그럼 이제

ls()

라고 입력해보세요.


아마 여러분 R창에는 "blog1"하나만 표시될 겁니다. 맨 처음 입력하셨던 명령어 첫 번째 줄이 normality1.csv 파일 안의 데이터를 불러와서 blog1이라는 오브젝트를 만들라는 내용이거든요.

제 결과에 "d", "d2'.... 등등이 추가로 보이는 건, 제가 요즘 작업하는 연구 데이터들이 함께 보이는 거니까, 신경 쓰지 마세요.


이제 프롬프트 뒤에

blog1

이라고 입력해보세요.



데이터가 총 20개 들어 있는 게 보입니다.


attach(blog1)

이라고 입력해보세요.(attach()함수에 대해서도 1편에 설명하였으니, 오늘은 생략합니다.)

여기까지 따라오셨으면, 정규성 검정을 위한 모든 준비가 끝난 겁니다. 

바로, 단일 관찰치들의 정규성을 검정하기 위해서 가장 흔히 사용하는 Shapiro Wilk normality test를 이용해서 우리가 가지고 있는 데이터의 정규성을 검정해보도록 하죠.

Shapiro.test(벡터이름)

라고 입력하세요. 여기서는 벡터이름이 blog1이 되겠죠.


동일한 결과가 보이시나요?! 해당 데이터에서는 p값이 0.8867로 0.05보다 크니까, 정규분포를 한다고 가정할 수 있겠군요.

(Shapiro-Wilk normality test에서 귀무가설은 '관찰치 값이 정규분포를 따른다.'는 것이고 대립가설은 '정규분포를 따르지 않는다.'고 설정됩니다. 위의 경우에서는 p값이 0.05보다 커서(=0.8867) 귀무가설을 기각하지 못하므로, 대립가설을 채택하지 못하고, 귀무가설 즉 관찰치 값이 정규분포를 따른다고 가정할 수 있게 되는 겁니다.)





두 집단 이상일 때 정규성 검정을 해보아요



단일 집단의 정규성 검정을 마스터했으니, 이제 두 집단 또는 그 이상의 집단들을 비교할 때 정규성을 가정할 수 있는지 알아보는 과정을 배워보죠. 사실, 지금부터가 오늘의 핵심입니다. 임상 연구에서 가장 많이 쓰이는 연구가 실험군-대조군을 비교하는 거니까요.


이번 통계작업을 하기 전에 아까, attach 시켜놓았던 'blog1' 오브젝트를 detach 시키도록 하겠습니다.

프롬프트 창에

detach()

라고 입력하시면, 그동안 attach()함수로 메모리에 상주시켰던 모든 오브젝트들이 지워집니다. 물론, 그렇다고 데이터가 들어 있는 오브젝트 자체가 지워지는 건 아니고요. 오브젝트를 지우시려면

remove('오브젝트 이름')

이라고 입력하셔야 합니다.


이번에는 두 집단 비교를 위한 샘플 데이터를 나눠드리겠습니다.

blog.csv

(1편에서 나눠드렸던 파일과 같은 거니까, 1편에서 다운받으셨다면 그 파일을 그냥 이용하세요.)


그리고, 아까 한 것처럼 read.csv("파일명") 함수를 이용해서 blog2라는 오브젝트를 생성해보죠.

blog2=read.csv("파일경과와 이름")

이라고 명령하시고, ls() 함수로 blog2 오브젝트가 잘 생성되었는지 확인해보세요. attach()함수로 blog2 오브젝트를 메모리에 올리셨다면 이제 얼추 준비가 마무리되었습니다.

지금까지 잘 따라오셨나요?! 

blog2

라고 입력해서 데이터를 먼저 확인해보죠.

데이터가 잘 입력되었으면, 지금부터가 중요합니다. 

output=lm(종속변수~독립변수,datat=오브젝트이름)

shapiro.test(resid(output)

이라고 한 줄씩 입력하세요.

p값이 0.004821로 계산된 게 보이시나요? 단일 집단 정규성 검정 때와 마찬가지로 

p값이 0.05보다 크다면 정규분포를 한다고 보고, 0.05보다 작다면 정규분포를 따른다고 볼 수 없습니다. 

이 경우에서는 0.05보다 p값이 한참 작으니까, 데이터의 정규성을 가정할 수 없는 거죠.


세 집단을 비교하는 경우에도 똑같이 하시면 되고, 동일하게 p값을 해석하시면 됩니다. 참 쉽죠?! ^^;



(더 나아가서, p값이 0.05보다 작아서 정규분포를 가정할 수 없으므로, 집단 사이의 평균을 비교할 때 모수적인 통계 방법을 쓸 수 없다는 겁니다. 이럴 때는 비모수적 통계기법이 필요하게 되죠. 이 내용에 대해서는 차차 알아보도록 하겠습니다.)


(의학 또는 보건통계 관련 책들을 보다 보면, 위의 방식처럼 하지 않고 각 그룹을 따로따로 정규성 검정을 하는 경우가 많습니다. 아래 그림처럼 말이죠. 물론, 아래처럼 따로 나눠 해도 결과는 동일하게 나옵니다. 나눠드린 데이터의 경우 각각을 shapiro.test()함수를 이용해서 검정해보면, group2의 경우는 p값이 0.2로 0.05보다 커서 정규분포를 한다고 가정할 수 있지만, group1의 경우는 p값이 0.0001016으로 정규분포를 하지 않는 걸 알 수 있습니다. 두 그룹이 모두 정규분포를 해야 모수적 통계 방법을 쓸 수 있는데, 한 그룹이 정규분포를 하지 않으니, 결국 비모수적 통계기법을 사용해야 하죠. 


하지만 모수적 통계기법의 초기 가정을 더 깊이 들어가 보면, 두 집단의 분포가 정규분포를 따른다고 가정할 수 있으면, 두 표본평균치 차(X1-X2)들의 분포도 정규분포를 따른다고 가정하는 겁니다. 그러므로 두 집단이든 세 집단이든 집단 간의 표본평균치를 비교할 때는 위에서처럼 lm()함수를 이용해서 얻은 결과값을 resp()함수를 통해 잔차를 계산하고 이 값의 정규성을 shapiro.test()함수를 이용해 정규성을 검정하는 게 원론적인 측면에서 더 합당하다고 볼 수 있습니다. 


물론, 이게 무슨 귀신 씨나락 까먹는 소리냐 싶으신 분들은 그냥 저를 믿고, 위의 방식 때로 정규성 검정을 하시면 됩니다. ^^)

(이렇게 각 집단의 정규성을 확인하는 방식이 의학통계 책 대부분에서 소개하는 방법입니다. 물론, 이렇게 해도 결과에는 문제가 없습니다. 좀 더 손이 많이 가서 귀찮은 게 함정이라면 함정이지만요.)

신고
  1. BlogIcon 김준열
    2014.03.05 07:26 신고

    감사합니다! R을 이용한 통계분석을 배워보고 싶었었는데... 이따 집에가서 한번 시도해봐야겠네요 ㅎ

  2. 최주헌
    2016.07.14 10:55 신고

    shapiro.test(score) 단계에서
    에러: 함수 "Shapiro.test"를 찾을 수 없습니다
    라는 에러메시지가 떠요

    혹시 shapiro.tset 사용하려면 등록해야하는 패키지가 있어야 하나요??

    참고로 R버전은 3.1.1입니다

티스토리 툴바