안내
마지막에서는 R을 활용한 추론통계를 수행한다. 기초통계가 평균과 관련된 분포를 확인하는 것이었다면(평균, 중위값, 최대값, 최소값, 분위계수, 표준편차, 분산 등), 추론통계는 가설을 검증하는 작업이라고 볼 수 있다.
최신 통계의 트렌드는 크게 보아 1) 예측 분석(predictive analysis, Machine Learning을 통해 수행)과 2) 다변량 회귀분석의 확장, 3) 베이지언 통계라고 볼 수 있다. 예측 분석이 컴퓨터 과학자들이 주로 개척하는 영역이라면, 회귀분석과 베이지언 통계는 통계학자를 포함한 사회과학자들이 끊임없이 탐구하는 영역이라고 볼 수 있다.
이번 장에서는 주눅들지 않는 수준에서 수행할 수 있는 통계 검정 기법을 배우도록 하겠다. 모두다 수학을 싫어하고 필자 역시 싫어하기 때문에 간단한 수준만 수행하도록 한다.
준비
특별한 준비가 필요하지 않다. R이야말로 애초부터 통계분석을 하기 위해 만든 프로그래밍 언어이기 때문이다.
One-sampe t-test
One-sample t-test는 모집단의 평균이 정해져 있을 때, 표본의 평균이 모집단의 평균과 신뢰구간(95%)에서 같은지(H0:귀무가설), 다른지(H1:대립가설)를 검정하는 테스트다.
x <- c(15.5, 11.21, 12.67, 8.87, 12.15, 9.88, 2.06, 14.50, 0, 4.97)
mean(x)
## [1] 9.181
sd(x)
## [1] 5.234965
shapiro.test(x)
##
## Shapiro-Wilk normality test
##
## data: x
## W = 0.92341, p-value = 0.3863
t.test(x, mu=8.1)
##
## One Sample t-test
##
## data: x
## t = 0.653, df = 9, p-value = 0.5301
## alternative hypothesis: true mean is not equal to 8.1
## 95 percent confidence interval:
## 5.436132 12.925868
## sample estimates:
## mean of x
## 9.181
t-test 결과를 보면 p-value는 0.53으로 귀무가설이 기각되지 않는다. 즉 모집단과 표본은 통계적으로 유의미한 평균의 차이를 갖지 않는다는 의미다. 여기에서 단측검정을 실시해볼 수도 있다. 기존의 양측검정은 '차이'를 검증하는 것이었다면, 단측검정은 '방향 + 차이'를 검증하는 셈이다. 즉, "더 큰지", "더 작은지"를 검증하는 것이다.
t.test(x, mu=8.1, conf.level = 0.99, alter="greater")
## Warning in t.test.default(x, mu = 8.1, conf.level = 0.99, alter =
## "greater"): partial argument match of 'alter' to 'alternative'
##
## One Sample t-test
##
## data: x
## t = 0.653, df = 9, p-value = 0.265
## alternative hypothesis: true mean is greater than 8.1
## 99 percent confidence interval:
## 4.510276 Inf
## sample estimates:
## mean of x
## 9.181
paired t-test vs wilcoxon signed-rank test
이번에는 모집단의 평균을 모를 때, 두 집단을 비교하는 t-test다. 이를 위해 paired t-test와 wilcoxon signed-rank test를 실시해 본다.
data(sleep)
head(sleep)
## extra group ID
## 1 0.7 1 1
## 2 -1.6 1 2
## 3 -0.2 1 3
## 4 -1.2 1 4
## 5 -0.1 1 5
## 6 3.4 1 6
str(sleep)
## 'data.frame': 20 obs. of 3 variables:
## $ extra: num 0.7 -1.6 -0.2 -1.2 -0.1 3.4 3.7 0.8 0 2 ...
## $ group: Factor w/ 2 levels "1","2": 1 1 1 1 1 1 1 1 1 1 ...
## $ ID : Factor w/ 10 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
with(sleep,
shapiro.test(extra[group == 2] - extra[group == 1]))
##
## Shapiro-Wilk normality test
##
## data: extra[group == 2] - extra[group == 1]
## W = 0.82987, p-value = 0.03334
with(sleep,
wilcox.test(extra[group == 2] - extra[group == 1], exact=F))
##
## Wilcoxon signed rank test with continuity correction
##
## data: extra[group == 2] - extra[group == 1]
## V = 45, p-value = 0.009091
## alternative hypothesis: true location is not equal to 0
with(sleep,
t.test(extra[group == 1],
extra[group == 2], paired= T))
##
## Paired t-test
##
## data: extra[group == 1] and extra[group == 2]
## t = -4.0621, df = 9, p-value = 0.002833
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -2.4598858 -0.7001142
## sample estimates:
## mean of the differences
## -1.58
p-value는 두 검정 모두에서 유의미하게 나온다(p-value <0.05). 따라서 두 집단에는 유의미한 통계적 차이가 있다. 본 데이터에서는 수면제가 유의미한 효과가 있었다는 이야기가 된다.
ANOVA 테스트 : 집단별 차이가 통계적으로 의미가 있는지 검증해 보기
- 10대, 20대, 30대의 평균 소비액, 정말로 유의미한 차이인지 확인하려면?
매우 간단하면서도 유용한 분석 방법부터 살펴보자. 일원배치 분산분석(One-way ANOVA)은 독립된 세 집단 이상의 평균을 비교하고자 할 때 사용하는 분석 방법이다. 좀 더 자세히는 평균의 차이가 의미가 있는지 없는지를 알아보고자 할 때 사용한다.
예를 들어보겠다. 연령대 별로 월 평균 게임에 사용하는 금액을 조사했더니, 10대는 18,200원, 20대는 20,500원 30대는 19,300원을 사용한다는 결과가 나왔다고 가정해 보자. 이러한 구매 금액이 정말로 유의미한 차이인지는 어떻게 확인할 수 있을까? 1,000원 정도씩 차이가 나는데, 이걸 차이가 있다고 보아야 하는 건지, 차이가 매우 근소하기 때문에 차이가 없다고 보아야 할 것 같기도 하고…
이럴 때 일원배치 분산분석을 사용하면 이러한 집단 간 평균 차이가 통계적으로 의미가 있는 숫자인지 아닌지를 판단할 수 있다.
일원배치 분산분석은 회사에서도 자주 사용하는 편이다. 특히 플레이어 분석을 할때 연령대 별, 게임 이용 기간 대 별 등등 그룹으로 구분해서 보아야 할 때는 거의 필수적으로 사용하기 때문에 알아두면 쓸모가 많은 분석 방법이다. 게다가 매우 간단하다. 예제로 한번 확인해 보겠다.
일원배치 분산분석의 예
R에 내장되어 있는 iris 데이터로 일원배치 분산분석을 해보자. 일원배치 분산 분석을 할 때는 aov 함수와 bartlett.test 함수 두가지를 사용한다.
먼저 aov으로 일원배치 분산분석(ANOVA)을 해 보겠다. 기본 적인 문법은 aov(대상변수~그룹변수, data=데이터명)의 순서로 하면 된다. 이때 주의해야 할 점은 그룹 변수는 범주형(factor)이어야 한다는 것이다. (가지고 있는 데이터 셋으로 분석하실 때는 as.factor함수를 사용해서 변수 유형을 변경해야 한다.)
analysis<-aov(Sepal.Width~Species, data=iris)
summary(analysis)
## Df Sum Sq Mean Sq F value Pr(>F)
## Species 2 11.35 5.672 49.16 <2e-16 ***
## Residuals 147 16.96 0.115
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
일원배치 분산분석 결과 P-value 값이 매우 작게 나와 귀무가설이 기각됐다. (***표시) 이 결과만 보면” iris의 품종(Species) 별로 Sepal.Width 평균은 다르다”라고 판단할 수가 있는 것이다. 단, 일원배치 분산분석이 성립하기 위한 전제 조건이 있다. 바로 오차의 등분산성 검정이다. bartlett.test함수를 사용하면 간단히 확인할 수 있다.
bartlett.test(Sepal.Width~Species, data=iris)
##
## Bartlett test of homogeneity of variances
##
## data: Sepal.Width by Species
## Bartlett's K-squared = 2.0911, df = 2, p-value = 0.3515
p-value가 0.05보다 크므로 귀무가설을 기각할 수가 없다. 오차의 등분산성 가정을 만족한다고 판단할 수가 있다.