-
R 다변량 통계 분석 - 1. 일변량 정규성 검정(Normality Test) Q-Q plot, qqplotr, Kolmogorov-Smirnov test, Shapiro-Wilk testR + Statsitic (통계학) 2020. 4. 17. 10:51
아래 내용은 <R과 함께하는 다변량 자료분석을 위한 추정과 검정, 최용석 지음, 2019>에서 대부분 발췌하였습니다
다변량 통계 분석에서 정규성 검정, 시각화 방법 등에 필요한 라이브러리 입니다
library(MVT)
library(MVN)
library(dplyr)
library(car)
library(multifluo)#### 데이터 불러오기
examScor 데이터를 불러옵니다
원활한 분석을 위해 결측치를 제거하고
데이터 형태와 요약 정보를 확인해봅시다
data(examScor)
examScor <- examScor %>% na.omit()
examScor %>% head()
examScor %>% summary()
#### 각 과목별 일변량 정규성 검정
과목별로 데이터 프레임을 분리합시다
메카 <- examScor %>% select(mechanics)
벡터 <- examScor %>% select(vectors)
대수 <- examScor %>% select(algebra)
분석 <- examScor %>% select(analysis)
통계 <- examScor %>% select(statistics)그리고 이들을 numeric으로 변환합니다
편의상 "메카(mechanics)"에 대해서만 실행해보겠습니다
메카_vector <- 메카 %>% as.vector()
메카_vector <- 메카_vector %>% unlist()
메카_num <- 메카_vector %>% as.numeric()각각에 대해 정규성 검정 및 시각화를 해봅시다
## Q-Q plot (1)
Q-Q plot에 대해서는 아래 위키백과를 참고해주세요
https://en.wikipedia.org/wiki/Q%E2%80%93Q_plot
n <- 메카_num %>% length()
p <- (1:n)/(n+1)
q <- qnorm(p, mean(메카_num), sd(메카_num))
sort_q <- q %>% sort()
메카_sort <- 메카_num %>% sort()
메카_QQ <- plot(sort_q, 메카_sort, xlab = "Quantiles from Normal Distribution", ylab = "Sample Quantiles", main = "Q-Q plot-mechanics")
abline(0,1,col="Red")얼마나 abline(0,1,col="Red")에 적합한지 상관계수로 알아봅시다
cor(sort_q, 메카_sort) [1] 0.9886617
## Q-Q plot (2)
qqnorm()으로 Q-Q plot을 그려보겠습니다
메카_norm <- qqnorm(메카_num, pch = 1, main = "Q-Q plot(2)-mechanics")
qqline(메카_num, col = "Blue", lwd = 2)얼마나 qqline(메카_num, col = "Blue", lwd = 2)에 적합한지 상관계수로 알아봅시다
메카_sort_norm_x <- 메카_norm$x %>% sort()
메카_sort_norm_y <- 메카_norm$y %>% sort()
cor(메카_sort_norm_x, 메카_sort_norm_y)[1] 0.9873895
## Q-Q plot (3)
좀더 다양한 옵션이 추가된 (이상치, 신뢰구간 등) 추가된 Q-Q plot을 그려봅시다
메카_qqplot <- 메카_num %>% qqPlot(main = "Q-Q Normal Q-Q plot(2)-mechanics") # 참고 : qqplot2
ggplot2를 이용한 Q-Q을 그리면 좀더 다양한 옵션을 시각화 할 수 있습니다
추가로 필요한 라이브러리는 다음과 같습니다
library(qqplotr)
library(tidyverse)
numeric형태인 메카_num을 변수 메카_score를 가지는 Data Frame으로 변화하여 따로 저장합니다
메카_df <- data.frame(메카_score = 메카_num) 그리고 Confidence Band(보통 Confidence Interval로 많이 쓰는데 시각화하면 Band형태가 되기에 이렇게 부르는것 같습니다)를 Normal, MLEs, Kolmogorov-Smirnov test, Aldor_Noiman으로 계산하여 시각화 해봅시다.
아래표는 bandType에 대한 정리입니다
bandType = Option pointwise Normal boot MLEs ks Kolmogorov-Smirnov test ts Aldor_Noiman 자세한 설명은 아래 CRAN Page를 참조하시면 되겠습니다
https://cran.r-project.org/web/packages/qqplotr/qqplotr.pdf
그리고 qqplotr로 Q-Q plot를 그려봅시다
메카_qqplot2 <- ggplot(data = 메카_df , mapping = aes(sample = 메카_score)) +
ggtitle("Q-Q plot-ggplotr-mechanics") +
geom_qq_band(bandType = "pointwise", mapping = aes(x = 메카_score, fill = "Normal"), alpha = 0.5) +
geom_qq_band(bandType = "boot", mapping = aes(x = 메카_score, fill = "Bootstrap"), alpha = 0.5) +
geom_qq_band(bandType = "ks", mapping = aes(x = 메카_score, fill = "KS"), alpha = 0.5) +
geom_qq_band(bandType = "ts", mapping = aes(x = 메카_score, fill = "TS"), alpha = 0.5) +
stat_qq_line() +
stat_qq_point() +
labs(x = "Theoretical Quantiles", y = "Sample Quantiles") +
scale_fill_discrete("Bandtype")# Kolmogorov-Smirnov Test
Kolmogorov-Smirnov Test는 표본의 정규성을 검정하는 비모수 검정입니다. 비모수 검정은 데이터의 수가 정규성을 만족할 만큼 충분하다고 생각하지 않을때 적용하는 방법입니다
정규성을 만족하는 개수를 어떻게 구하는가는 또 다른 수리통계학적 방법이 있는데
"표본 크기에 따른 검정력함수의 비교(최강력 검정 : Most Powerful Test, MP test)"로 필요한 표본의 크기를 산출 할수 있습니다
저는 이론적으로만 접해본적 있고 구현하지는 못해봤기에 다음기회에 다뤄보기로 하겠습니다
조금 말이 길어졌는데 비모수 검정을 적용할 경우는 일반적(경험적)으로 표본의 수가 30이하이면 해봄직 합니다
ks.test(메카_num, pnorm, mean(메카_num), sd(메카_num), alternative = "two.sided") One-sample Kolmogorov-Smirnov test
data: 메카_num
D = 0.092019, p-value = 0.4455
alternative hypothesis: two-sided여기서 H0 : 관측한 표본과 비교대상(정규분포)에 차이가 없다 입니다
H0을 기각하지 못합니다
# Shapiro-Wilk Test
Shapiro-Wilk Test는 표본의 정규성을 검정하는 모수적 검정입니다. 표본의 수가 충분할 경우 적용합니다
shapiro.test(메카_num) Shapiro-Wilk normality test
data: 메카_num
W = 0.97241, p-value = 0.05708여기서 H0 : 정규분포(Normal distrubution)을 따른다 입니다
아슬아슬하게 H0을 기각합니다
다음은 이변량 삼변량 정규분포의 검정과 시각화를 다루겠습니다
'R + Statsitic (통계학)' 카테고리의 다른 글