통계적 검정 (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
 

데이터 변환 방법으로서

(1) 표준화

(2) 정규분포화

(3) 범주화

   - 이산형화

   - 이항변수화

(4) 개수 축소

 

(5) 차원 축소

   - 주성분분석

   - 요인분석 

(6) 시그널 데이터 압축

 

중에서 로그 변환, 제곱급 변환을 활용한 정규분포화에 대해서 알아보겠습니다. 이들 변환들이 정규분포가 아니었던 분포를 정규분포로 변환시키는데 활용되므로 정규분포화 변환이라는 카테고리로 묶어보았습니다. 

 

많은 통계기법이 정규분포를 가정하고 있으므로 정규분포(Gausian distribution)가 아닌 경우 정규분포로 변환시키는 것은 사전작업으로 필수적이라고 하겠습니다. 

 

 

 R 데이터 변환 (2) 정규분포화 log(), sqrt()

 

 

[ 데이터 변환 구성 ]

 

 

 

 

자연현상 중에, 우리 주변의 일상 중에 정규분포가 많은데요(예: 키, 몸무게, 통계성적 등), 그에 못지않게 멱함수 분포(Power-law distribution)도 많이 있답니다.  특히 개체간 상호작용과 (긍정적/부정적) 피드백이 작용하는 관계에서는 멱함수 분포가 존재할 가능성이 높습니다. 

 

아래는 한겨레신문에서 카이스트 정하웅 교수님 인터뷰하면서 정규분포(고소도로 네트워크)와 멱함수분포(항공망 네트워크)의 예로 들은 것인데요(바라바시 링크 책 참조), 멱함수 분포를 띠는 항공망 네트워크의 경우 허브(Hub) 역할을 하는 공항이 있다는 것이지요.  이를 척도 없는 네트워크(scale-free network)라고도 하는데요, 이런 허브(Hub), 매개자(Connector) 가 있음으로 해서 세상이 좁아진다(small world)는 이론이 뒷받침을 받게 됩니다.

 

[ 네트워크의 두가지 유형 ]

 

 

한 국가의 부의 분포를 보면 20%의 국민이 부의80%를 차지하고 있고, 마태복은 13장 12절에 있는 ‘무릇 있는 자는 받아 풍족하게 되고 없는 자는 그 있는 것 까지도 빼앗기리라’ 말씀을 따서 마태효과(Matthew effect)라는 이론이 있기도 한데요, 멱함수 분포의 예라고 할 수 있겠습니다. 

 

그밖에도 멱함수 분포를 따르는 것으로 논문 인용, 인터넷 네트워크, 전기회로도, 전기/하수구 네트워크, 뇌의 뉴런 네트워크, 전염병이나 성병의 전파(아래 그림 예의 왼쪽에서 오른쪽, 상에서 하 순서 참고), 산불이나 지진의 강도별 발생 빈도, 프로야구선수 또는 프로축구선수 연봉 등... 그 예를 들자면 아주 많습니다.  혹시 복잡계과학, 네트워크과학에 대해서 관심이 있으시면 바라바시의 링크(Linked), 버스트(Birst), 던컨와츠의 스몰 월드(Small World), 마큐뷰캐넌 사회적원자(Social Atom), 우발과 패턴(Ubiquity) 등의 책을 추천합니다.  저자들이 물리학자 혹은 사회과학자들인데요, 수학적 공식없이도 일반인들이 쉽고 재미있게 읽을 수 있도록 책을 썼습니다.  지적유희 측면에서 재미있어요.  복잡한 세상 속에 이런 규칙이...하고 놀랄겁니다.

 

 

[ 다양한 멱함수 분포 예 ]

 

 

옆길로 많이 샜는데요 ^^;, 이처럼 많은 멱함수 분포를 정규분포로 변환할 때 로그 변환이나 제곱근 변환을 사용하게 됩니다.

 

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

 

> install.packages("UsingR")
> library(UsingR)

> > data(cfb) # cfb 데이터 불러오기 > head(cfb) # 상위 6개 미리보기 WGT AGE EDUC INCOME CHECKING SAVING NMMF STOCKS FIN VEHIC X17470 5749.975 54 14 66814.19 6000 2000 0 500 39600 6400 X315 5870.634 40 12 42144.34 400 0 0 0 5400 21000 X8795 8043.695 35 14 25697.77 1000 160 0 0 15460 2000 X10720 6092.872 55 12 35976.87 2600 19100 0 0 54700 18250 X19170 7161.757 40 12 39060.61 1000 8300 0 3500 12800 9100 X22075 11429.633 82 12 13362.84 1000 0 50000 0 70500 7500 HOMEEQ OTHNFIN DEBT NETWORTH X17470 84000 0 40200 170800 X315 8000 0 58640 17760 X8795 12000 0 19610 9850 X10720 90000 0 8000 284950 X19170 47000 0 21000 268900 X22075 175000 0 0 253000 >

> summary(cfb$INCOME) # INCOME 요약통계량 Min. 1st Qu. Median Mean 3rd Qu. Max. 0 20560 38030 63400 69900 1542000 >

> hist(cfb$INCOME, breaks=500, freq=TRUE) # INCOME 히스토그램

 

 

 

 

 

(1) 로그 변환 : log()

 

> ## 로그 변환
> cfb <- transform(cfb, INCOME_log = log(INCOME + 1))
> hist(cfb$INCOME_log, breaks=500, freq=TRUE)

 

 

 

 

위의 로그 변환 시에 INCOME_log = log(INCOME + 1) 처럼 (INCOME +1) 을 했습니다.  INCOME 이 '0'부터 시작하는데 '0'을 로그 취하면 마이너스 무한대가 나오기 때문에 1을 더해서 오른쪽으로 1씩 이동시킨 후에 로그변환을 취했습니다.

 

히스토그램을 보면 이전의 멱함수 분포의 소득이 정규분포로 변환되었음을 알 수 있습니다.

 

 

(2) 제곱근 변환 : sqrt()

 

> ## 제곱근 변환
> cfb <- transform(cfb, INCOME_sqrt = sqrt(INCOME + 1))
> hist(cfb$INCOME_sqrt, breaks=500, freq=TRUE)
 

 

 

 

제곱근 변환은 sqrt() 함수를 사용합니다.  위의 예시를 보면 로그변환 보다는 제곱근 변환이 오른쪽에 수입이 엄청나게 많은 부자들을 덜 정규분포화 시킨다는 것을  알 수 있는데요, 원래 데이터의 분포를 보고 로그변환과 제곱근 변환 중에서 더 적합한 것을 선택해서 사용하면 되겠습니다.

 

정규성 검정을 할 때 정규 분위수-분위수 그림(Q-Q Plot)을 사용하는데요, 아래에 원래 INCOME, 로그 변환 INCOME_log, 제곱근 변환 INCOME_sqrt 의 세개 변수에 대해서 Q-Q plot을 그려보았습니다.   아래 Q-Q plot으로 봐서는 로그 변환이 가장 잘 정규성을 띠고 있네요.

 

> ## Q-Q plot
> par( mfrow = c(1,3))
> qqnorm(cfb$INCOME, main="Q-Q plot of INCOME")
> qqline(cfb$INCOME)
> 
> qqnorm(cfb$INCOME_log, main="Q-Q plot of INCOME_log")
> qqline(cfb$INCOME_log)
> 
> qqnorm(cfb$INCOME_sqrt, main="Q-Q plot of INCOME_sqrt")
> qqline(cfb$INCOME_sqrt)
> par(mfrow = c(1,1))
 

 

 

 

 

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

 

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

 

 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 

 

 

단일모집단의 정규성 검정 (shapiro test, Q-Q plot) 방법은 아래의 링크를 참조하세요.

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

 

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

 

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

 

Posted by R Friend R_Friend