'shapiro.test()'에 해당되는 글 1건

  1. 2015.10.09 R 단일 모집단 분포의 정규성 검정 : shapiro.test(), qqnorm(), qqline()

통계적 검정 (statistical testing) 은 모집단의 모수 또는 분포 형태에 대한 추정에 대해 그것이 옳은지 그른지를 임의로 추출한 표본으로부터 통계량을 측정하여 판단하는 통계적 절차를 말합니다.

 

단일 모집단에 대한 통계적 추론 (추정과 검정) 과 관련하여

 

[표본이 크고 정규성 충족 시]

- 단일 모집단의 모평균에 대한 신뢰구간 추정과 검정

   : t.test()

 

- 단일 모집단의 모분산에 대한 신뢰구간 추정과 검정

   : chi-square test

 

- 단일 모집단의 모비율에 대한 신뢰구간 추정과 검정

   : prop.test()

 

 

[정규성 미충족 시]

- 단일 모집단 중심에 대한 비모수 검정

  (Nonparametric test on one sample with median)

  : wilcox.test()

 

 

[정규성 여부 검정]

- 단일 모집단 분포의 정규성 검정

  : shapiro.test(), qqnorm(), qqline()

 

을 차례로 살펴보겠습니다.

 

지난번 포스팅의 정규분포 형태를 띠는 '단일 모집단의 모평균, 모분산, 모비율에 대한 신뢰구간 추정과 검정'과 정규분포 형태를 띠지 않는 모집단에 대한 비모수 검정을 알아보았습니다. 아래의 표처럼 모집단이 정규성을 만족하느냐 아니냐에 따라서 모수 검정과 비모수 검정으로 분석 기법이 달라지게 됩니다. 

 

[ 모수 검정과 비모수 검정 비교표 ]

 

 구분

 모수 검정

(Parametric Test)

비모수 검정

(Nonparametric Test) 

 When to use

 정규분포 가정 만족 시

 (normal distribution)

 정규분포 가정 불충족 시,

 혹은 모집단이 어떤 분포를 따르는지 모를 때

 (non-normal distribution, or un-know distribution,

  or very small sample size, or rankded data)

Statisctic

 평균 (mean)

 중앙값 (median) 

 1 sample

 1 sample t-test 

 1 sample Wilcoxon signed rank test

 2 samples

 2 sample t-test

 Mann-Whitney test

 paired 2-sample t-test

 Wilcoxon signed rank test

 more than

2 samples

 one-way ANOVA

 Kruskal-Wallis test

 

 

회귀분석, 다변량 통계분석을 할 때도 독립변수의 정규성 가정을 충족시켜야 하며, 이상치(outlier)나 영향값(influencer)가 있을 경우 모형이 매우 민감하게 반응해 모집단을 대표하는 일반화된 모형을 만들 수 없게 됩니다.  따라서 정규성 검정 후에 이상치, 영향치가 있다고 판단되면 이를 제거하는 것이 중요하다고 하겠습니다.

 

 

 

 

그럼, 이번 포스팅에서는 정규분포 형태를 띠는지 안띠는지 여부를 검정하는 방법 대해 알아보고, R의 (1) shapiro.test() 함수를 이용한 Shapiro-Wilk 검정, (2) Histogram, Kernel Density Plot 그래프를 이용한 정규성 확인, (3) Q-Q plot 그래프를 이용한 정규성 확인 (qqnorm(), qqline() 함수)를 사용해 예를 들어보겠습니다.

 

 

 

 

실습할 데이터셋으로는 UsingR 패키지에 들어있는 cfb 데이터 프레임의 소득(income)을 가지고 예를 들어보겠습니다. cfb 데이터셋은 소비자 재정에 관한 설문조사 샘플 데이터로서, 14개의 변수와 1000명의 관측치가 들어있습니다.

 

 

 

 

> installed.packages("UsingR")
     Package LibPath Version Priority Depends Imports LinkingTo Suggests Enhances License
     License_is_FOSS License_restricts_use OS_type Archs MD5sum NeedsCompilation Built
> library(UsingR)
필요한 패키지를 로딩중입니다: MASS
필요한 패키지를 로딩중입니다: HistData
필요한 패키지를 로딩중입니다: Hmisc
필요한 패키지를 로딩중입니다: grid
필요한 패키지를 로딩중입니다: lattice
필요한 패키지를 로딩중입니다: survival
필요한 패키지를 로딩중입니다: Formula
필요한 패키지를 로딩중입니다: ggplot2
Find out what's changed in ggplot2 with
news(Version == "1.0.1", package = "ggplot2")

다음의 패키지를 부착합니다: ‘Hmisc’

The following objects are masked from ‘package:base’:

    format.pval, round.POSIXt, trunc.POSIXt, units


다음의 패키지를 부착합니다: ‘UsingR’

The following object is masked from ‘package:ggplot2’:

    movies

The following object is masked from ‘package:survival’:

    cancer

> str(cfb)
'data.frame':	1000 obs. of  14 variables:
 $ WGT     : num  5750 5871 8044 6093 7162 ...
 $ AGE     : num  54 40 35 55 40 82 26 50 71 70 ...
 $ EDUC    : num  14 12 14 12 12 12 16 14 12 6 ...
 $ INCOME  : num  66814 42144 25698 35977 39061 ...
 $ CHECKING: num  6000 400 1000 2600 1000 1000 3000 3100 1000 50 ...
 $ SAVING  : num  2000 0 160 19100 8300 0 0 0 0 0 ...
 $ NMMF    : num  0 0 0 0 0 50000 0 0 0 0 ...
 $ STOCKS  : num  500 0 0 0 3500 0 0 0 0 0 ...
 $ FIN     : num  39600 5400 15460 54700 12800 ...
 $ VEHIC   : num  6400 21000 2000 18250 9100 ...
 $ HOMEEQ  : num  84000 8000 12000 90000 47000 175000 0 22000 15000 0 ...
 $ OTHNFIN : num  0 0 0 0 0 0 0 0 0 0 ...
 $ DEBT    : num  40200 58640 19610 8000 21000 ...
 $ NETWORTH: num  170800 17760 9850 284950 268900 ...

 

 

 

(1) Shapiro-Wilk normality test : shapiro.test(x)

 

   귀무가설 H0 : 모집단은 정규분포를 따른다

   대립가설 H1 : 모집단은 정규분포를 따르지 않는다

 

 

 

  [ Shapiro-Wilk test W statistics ]

 

 

 - source : https://en.wikipedia.org/wiki/Shapiro%E2%80%93Wilk_test

 

 

 

 
> # Shapiro-Wilk normality test
> shapiro.test(cfb$INCOME)

	Shapiro-Wilk normality test

data:  cfb$INCOME
W = 0.36883, p-value < 2.2e-16

 

 

P-value 값이 매우 작으므로 귀무가설 (H0 : 수입은 정규분포를 따른다)을 기각하고, 대립가설 (H1: 수입은 정규분포를 따르지 않는다)를 채택하게 되겠습니다.

 

통계량만을 가지고 정규성 여부를 검정하는 것은 부족하며, 반드시 그래프를 통해서 정규성 여부를 병행해서 확인할 필요가 있습니다.  Histogram, Kernel density plot 이 빠르고 쉽게, 직관적으로 단변량 분포를 확인할 수 있는 방법입니다.

 

 

(2) Histogram and Kernel Density Plot 을 이용한 정규성 확인 : hist(x), lines(density(x))

 

 
> # Histogram : hist()
> hist(cfb$INCOME, breaks=100)

 

 

 

 

 

아래의 Kernel Density Plot에서는 Y축이 Frequency가 아니라 Probability 임에 유의하시기 바랍니다. (hist(freq=FALSE)) 옵션 사용)

 

 

> # Kernel Density Plot : hist(freq=FALSE), lines(density())
> hist(cfb$INCOME, freq=FALSE, breaks=100, main="Kernel Density Plot of cfb$INCOME")
> lines(density(cfb$INCOME), col="blue", lwd=3)

 

 

 

 

 

위의 두 개의 그래프를 보면 수입(INCOME)은 F-분포(F-distribution) 혹은 멱함수 분포 (Power-law distribution)을 따르고 있음을 알 수 있습니다.  왼쪽으로 심하게 치우쳐 있고, 오른쪽으로 꼬리가 긴 분포이므로 정규분포와는 거리가 멀다고 하겠습니다.

 

 

(3) 분위수-분위수 그림 Q-Q plot을 이용한 정규성 확인 : qqnorm(x), qqline(x) 함수

 

 
> # Q-Q plot : qqnorm(), qqline()
> qqnorm(cfb$INCOME)
> qqline(cfb$INCOME)

 

 

 

 

 

 

 

분위수-분위수 그램 (Q-Q plot : Quantile-Quantile plot) 은 (q(i), X(i))를 2차원 평면에 산점도를 그린 것입니다. 

 

 

 [ Empirical Quantile vs. Theoretical Quantile ]

 

 

 

위의 Q-Q plot 해석 방법은, 경험분포(empirical distribution)와 이론적 분포(theoretical distribution)가 서로 근접하게 분포하고 있으면 정규성을 띤다고 평가하며, 반대로 경험분포와 이론적 분포가 서로 멀어질 수록 정규분포를 띠지 않는다고 평가합니다.  다시말하면, 정규확률 산점도 그림에서 대각선(qqline())을 기준으로 산점도 점들이 가깝게 선형을 이루며 붙어 있으면 정규성을 띤다고 평가하고, 그렇지 않으면 정규성을 띠지 않는다고 보는 것입니다.   

 

R을 사용해서 한쪽으로 치우친 데이터에 대한 정규분포로의 변환 방법에 대해서는 R 데이터 변환 (2) 정규분포화 log(), sqrt() 을 참고하시기 바랍니다.

 

 

모집단의 분포 형태에 따른 대략적인 정규분포 변환 방법은 아래 표와 같습니다

 

 [ 분포 형태별 정규분포 변환 방법 ]

 

 distribution

before transformation

transformation function 

distribution

after transformation 

 left

X^3 

 normal distribution

(bell shape)

 mild left

X^2 

 mild right

sqrt(X) 

 right

ln(X) 

 severe right

1/X 

 

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

 

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

 

Posted by R Friend R_Friend

댓글을 달아 주세요