2020. 5. 20. 13:09ㆍ통계 빠개기/Statistics
20. (R) 통계 - 정규성 검토 (Q-Q plot)
Q-Q plot (Quantile-Quantile Plot)
통계 추론은 대부분이 모집단이 정규분포를 따른다는 가정하에 진행이 됩니다.
이 이유로 통계적 추론의 방법을 적용하기 전 데이터에 대한 정규모집단의 가정에 대한 검토가 필요합니다.
이번 글에서는 이 정규분포 가정을 하는 방법 중 QQplot(정규분포 분위수 대조도)를 그리는 방법과 이에 대한 원리에 대해 이야기해보려 합니다.
Q-Q plot 이란
qqplot은 분위수대조도로 불리며 정규모집단 가정을 하는 방법 중 하나이며 수집 데이터를 표준정규분포의 분위수와 비교하여 그리는 그래프입니다.
이는 간단하게 데이터의 정규성 가정에 대한 검토를 가능하게 해줍니다.
아래의 그림이 qqplot의 일종으로 모집단이 정규성을 따른다면 아래와 같이 직선의 형태로 그려지게 됩니다.
지금부터 이 그래프를 그리는 방법과 이를 통해 정규성을 검토하는 방법에 대해 알아보겠습니다.
분위수(Quantile)에 대한 개념이 먼저 필요합니다.
분위수란 데이터의 분포에서 전체 넓이를 일정 비로 나누어 위치에 있는 값을 의미합니다.
* 많은 분들이 사분위수(quartile)과 분위수(quantile)의 발음이 유사하여 개념을 혼동하는 분들이 계십니다.
사분위수는 통계학에서
Min(최솟값) - Q1(제1 분위수 ) - Median(중위수) - Q3(제3 분위수) - Max(최댓값)을 의미하는 개념으로 각 0분 위수, 1/4 분위수, 2/4 분위수, 3/4 분위수, 4/4 분위수를 의미합니다.
개념과 발음이 유사하여 혼동하시는 분들이 많으니 혼동에 유의하시는 게 좋습니다!
위 사분위수에 대한 개념이 분위수 사용의 예라고 볼 수 있을 것 같습니다.
qqplot에서도 마찬가지로 위와 같은 분위수 개념이 적용됩니다.
이는 표준정규분포의 분위수와 이에 대응하는 분포의 분위수를 x, y 좌표평면에 plotting 하는 개념입니다.
확률 표본(X1, X2, X3, X4.... X100)이 평균이 mu, 표준편차가 std인 정규모집단을 따르는 모집단에서 추출된 표본인지에 대한 검토를 예로 들어보겠습니다.
표준정규분포의 분위수는 1~n(표본의 수)의 백분율 값만큼의 표준정규분포 X좌표 value가 됩니다.
예제의 분위수는 Z0.01, Z0.02, Z0.03 ....Z1의 값이 됩니다.
이를 qnorm(quantile, mu, sd) 함수를 이용하여 각 백분율 값의 분위수를 구하면 아래와 같이 산출됩니다.
Quantile<-c(1:100)/100 z<-qnorm(Quantile,0,1) z [1] -2.32634787 -2.05374891 -1.88079361 -1.75068607 -1.64485363 -1.55477359 -1.47579103 [8] -1.40507156 -1.34075503 -1.28155157 -1.22652812 -1.17498679 -1.12639113 -1.08031934 [15] -1.03643339 -0.99445788 -0.95416525 -0.91536509 -0.87789630 -0.84162123 -0.80642125 [22] -0.77219321 -0.73884685 -0.70630256 -0.67448975 -0.64334541 -0.61281299 -0.58284151 [29] -0.55338472 -0.52440051 -0.49585035 -0.46769880 -0.43991317 -0.41246313 -0.38532047 [36] -0.35845879 -0.33185335 -0.30548079 -0.27931903 -0.25334710 -0.22754498 -0.20189348 [43] -0.17637416 -0.15096922 -0.12566135 -0.10043372 -0.07526986 -0.05015358 -0.02506891 [50] 0.00000000 0.02506891 0.05015358 0.07526986 0.10043372 0.12566135 0.15096922 [57] 0.17637416 0.20189348 0.22754498 0.25334710 0.27931903 0.30548079 0.33185335 [64] 0.35845879 0.38532047 0.41246313 0.43991317 0.46769880 0.49585035 0.52440051 [71] 0.55338472 0.58284151 0.61281299 0.64334541 0.67448975 0.70630256 0.73884685 [78] 0.77219321 0.80642125 0.84162123 0.87789630 0.91536509 0.95416525 0.99445788 [85] 1.03643339 1.08031934 1.12639113 1.17498679 1.22652812 1.28155157 1.34075503 [92] 1.40507156 1.47579103 1.55477359 1.64485363 1.75068607 1.88079361 2.05374891 [99] 2.32634787 Inf
하지만 이 분위수에서 찾아 볼 수 있는 문제가 하나 있습니다. Inf 값입니다.
정규분포는 -Inf < Z< Inf 값을 갖기 때문에 100%에 대한 표현은 무한대가 될 수밖에 없습니다.
이 이유로 표준정규분포의 분위수는 보정이 필요합니다.
이 값에 대한 정의는 표준이 없지만 흔히 아래와 같이 보정을 합니다.
이 보정 방법을 이용하여 위 값을 다시 산출하겠습니다.
Quantile2<-(c(1:100)-3/8)/(100+1/4) z2<-qnorm(Quantile2,0,1) z2 [1] -2.49859056 -2.13920644 -1.94008733 -1.79710343 -1.68354660 -1.58829587 -1.50560122 [8] -1.43208429 -1.36558319 -1.30462682 -1.24816654 -1.19542711 -1.14581834 -1.09887991 [15] -1.05424541 -1.01161808 -0.97075394 -0.93144979 -0.89353437 -0.85686193 -0.82130718 [22] -0.78676158 -0.75313038 -0.72033023 -0.68828739 -0.65693619 -0.62621784 -0.59607939 [29] -0.56647295 -0.53735497 -0.50868567 -0.48042856 -0.45254999 -0.42501884 -0.39780617 [36] -0.37088499 -0.34423001 -0.31781741 -0.29162473 -0.26563063 -0.23981482 -0.21415788 [43] -0.18864117 -0.16324671 -0.13795711 -0.11275545 -0.08762521 -0.06255020 -0.03751446 [50] -0.01250221 0.01250221 0.03751446 0.06255020 0.08762521 0.11275545 0.13795711 [57] 0.16324671 0.18864117 0.21415788 0.23981482 0.26563063 0.29162473 0.31781741 [64] 0.34423001 0.37088499 0.39780617 0.42501884 0.45254999 0.48042856 0.50868567 [71] 0.53735497 0.56647295 0.59607939 0.62621784 0.65693619 0.68828739 0.72033023 [78] 0.75313038 0.78676158 0.82130718 0.85686193 0.89353437 0.93144979 0.97075394 [85] 1.01161808 1.05424541 1.09887991 1.14581834 1.19542711 1.24816654 1.30462682 [92] 1.36558319 1.43208429 1.50560122 1.58829587 1.68354660 1.79710343 1.94008733 [99] 2.13920644 2.49859056
위와 같이 1.0 분위수의 값이 -2.4985로 보정 되었습니다.
우리는 지금 산출한 표준정규분포의 분위수 값과 표본 데이터를 크기순으로 정렬(X1<X2<X3... Xn) 한 값을 가지고 plotting 하게 되면 qqplot을 얻을 수 있게 됩니다.
Quantile2<-(c(1:100)-3/8)/(100+1/4) z2<-qnorm(Quantile2,0,1) x<-rnorm(100,30,5) # 평균 30, 표준편차 5의 정규분포에서 랜덤샘플링 x<-sort(x) # 표본 크기순으로 정렬 mean(x) #표본의 평균 [1] 30.12469 sd(x) # 표본의 분산 [1] 5.303162 plot(z2,x)
위 표본 데이터는 실제 평균 30, 표준편차 5 인 정규분포에서 랜덤 샘플링을 했기 때문에 직선 형태를 갖추어 표본의 정규성을 만족시킬 수 있었습니다.
이를 간단하게 사용하기 위하여 R function으로 소스 코드를 만들어 보겠습니다.
QQplot<-function(x){ Quantile<-(c(1:length(x))-3/8)/(length(x)+1/4) z<-qnorm(Quantile,0,1) x<-sort(x) return(plot(z,x,main="QQplot")) }
R 기본 내장 패키지인 stats에도 qqplot을 그려주는 함수가 내장되어 있습니다. 이와 비교해보겠습니다.
데이터는 R에서 기본으로 제공하는 iris의 Sepal.Length를 이용하였습니다,
data(iris) x<-iris$Sepal.Length par(mfrow=c(1,2)) qqnorm(x) QQplot(x)
왼쪽이 R의 기본 내장함 수로 제공되는 qqnorm을 이용하였고 오른쪽이 QQplot()을 이용한 plot입니다.
동일한 형태의 plot을 얻을 수 있을 것을 확인할 수 있습니다.
여기서 짚고 넘어가야 할 부분은 위 qqplot을 정식으로 해석하는 방법입니다.
가장 일반적으로 qqplot 내 점들이 기울기가 45도인 직선에 점들이 밀집되어있어야 정규분포를 가정할 수 있습니다.
qqnorm과 마찬가지로 qqline이라는 R 기본 내장함수가 이 직선을 그려줍니다.
지금 그려지는 직선 주위에 데이터가 밀집되어 있다면 그 가정을 만족한다고 볼 수 있습니다.
qqnorm(x) qqline(x,col="red",lwd=2)
정규성 검토의 다른 방법
정규성 검토에는 qqplot을 그려 검토하는 방법 말고도 여러 가지 방법이 존재합니다.
가장 간단하게 확인하려 한다면 히스토그램을 그려 그 자료의 분포를 살피는 방법이 있습니다.
표본의 분포를 histogram이나 density plot을 그려 정규분포와 유사한가 살피는 방법입니다.
hist(x,breaks = 15,probability = T,ylim =c(0,0.7),xlim=c(3,9));par(new=T) plot(density(x),ylim =c(0,0.7),xlim=c(3,9),main="",col="red",lwd=2);par(new=T)
마지막으로 소개드릴 방법은 shapiro-test입니다. (* R에서 내장함수로 제공하여 추가합니다.)
(통계추론과 검정에 대해 포스팅 하지 않았으니 간단히 소개 정도만 하겠습니다.)
shapiro.test(x)는 R에서 기본으로 제공하는 내장 함수입니다.
이는 정규성 검토를 통계적 검정을 통해 결과를 제공합니다.
shapiro.test(x) Shapiro-Wilk normality test data: x W = 0.97609, p-value = 0.01018
추후 통계적 추정과 검정에 대해 이야기하면서 좀더 깊게 설명 드리겠습니다.
*qqplot에 해석에 대한 부분은 다음에 시간내서 좀 더 추가 할 예정입니다.
(데이터 분포형태에 따른 해석)
여기까지 정규성 검토에 대한 글을 마치겠습니다.
'통계 빠개기 > Statistics' 카테고리의 다른 글
[Video] 이산 확률 분포_ 기하분포, 음이항분포, 초기하분포 (0) | 2020.05.20 |
---|---|
[이산 확률 분포] 베르누이, 이항, 포아송 분포 (0) | 2020.05.20 |
[증명] 분산의 성질 (0) | 2020.05.20 |
[증명] 중심극한정리, 불편추정량(자유도), 큰 수(대수)의 법칙 (0) | 2020.05.19 |
[개념] 자유도(DF)와 불편추정량(Unbiased Estimate) (0) | 2020.05.19 |