R 통계적 가설 검정 (T-검정, ANOVA)

통계적 가설 검정(Statistical hypothesis testing)은 데이터에서 나타난 차이나 변화가 ‘실제’인지 아니면 그냥 우연의 결과인지 확인하는 절차다.

보통 사회과학 쪽 분야에서는 통계적 가설 검정을 SPSS를 많이 사용했는데, 이제는 R로 해보자.

물론 파이썬으로도 충분히 가능하다. 그러고보니 예전에 이런 포스팅도 하긴 했었다.

아무튼 이번에는 R로…!

아래 순서로 하나씩 살펴보자.

  • 단일표본 T-검정 (1 Sample T-Test)
  • 독립표본 T-검정 (2 Sample T-Test)
  • 분산 분석 (ANOVA: Analysis of Variance)

단일표본 T-검정 (1 Sample T-Test)

R은 stats 패키지에 t.test()라는 함수를 가지고 있다.

사용법은 아래와 같다.

results <- t.test(sample_distribution, mu = expected_mean)

sample_distribution에는 내가 가지고 있는 샘플의 분포를 넣어주면 되고, expected_mean 자리에 내가 예상하는 모집단의 평균 값을 넣어주면 되겠다.

그러면 이 t.test() 함수는 p-value를 돌려주는데, 이 p-값은 내가 가진 샘플 데이터가 예상하는 평균값을 갖는 분포에서 나온 것임을 확신할 수 있는지 알려주는 지표다.

예를 들어 이렇게 ages라는 벡터가 평균 30을 가진 모집단으로부터 나온 데이터일 것이라는 귀무가설을 세우고 t-test를 시행하면

results <- t.test(ages, mu = 30)

이런 결과가 나온다.


    One Sample t-test

data:  ages
t = 0.59738, df = 13, p-value = 0.5605
alternative hypothesis: true mean is not equal to 30
95 percent confidence interval:
 27.38359 34.61641
sample estimates:
mean of x 
       31 

이 ages들의 평균은 31인데, p-값이 0.5605로 흔히 얘기하는 0.05보다 크다. 즉, 귀무가설을 기각하기가 어렵다. 평균 30의 모집단으로부터 나온 분포라는 결론을 내릴 수 있다는 뜻이다.


독립표본 T-검정 (2 Sample T-Test)

두 집단 간의 평균이 차이가 있는지 알아보는 t-test도 쉽게 할 수 있다.

results <- t.test(distribution_1, distribution_2)

이렇게 쓰면 끝이다.

여기서 돌려주는 p-값은 이 두 벡터 간의 평균 차이가 우연히 발생할 확률(sampling error)을 의미한다는 점을 명심하자.

예를 들어 week_1, week_2라는 두 벡터를 넣어 각 모집단의 평균이 같은지, 차이가 있는지 비교해보자.

results <- t.test(week_1, week_2)

결과는 이렇게 나온다.


    Welch Two Sample t-test

data:  week_1 and week_2
t = -3.5109, df = 94.554, p-value = 0.0006863
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -5.594299 -1.552718
sample estimates:
mean of x mean of y 
 25.44806  29.02157 

week_1와 week_2의 평균은 각각 25.44806와 29.02157인데 p-값은 0.0006863, 흔히 기준으로 삼는 0.05보다 작다.

이 평균 차이는 우연히 발생한 것으로 보기 어렵다는 의미이고, 결국 두 집단 간의 평균이 같다는 귀무가설은 기각, 평균 차이가 있다고 결론을 내릴 수 있겠다.


분산 분석 (ANOVA: Analysis of Variance)

3개 이상의 샘플을 비교하려면 t-test는 부적절하다. 예를 들어 3개 샘플을 비교할 때 두 개씩 선택해서 총 3번의 t-test를 할 수도 있겠으나, 이렇게 t-test를 여러번 하면 1종 오류를 발생시킬 확률이 너무 높아진다.

그래서 보통 분산분석(ANOVA: Analysis of Variance)을 하게 된다. ANOVA는 모든 데이터 집합의 평균이 동일하다는 귀무가설을 검정한다. 즉, 이 귀무가설을 기각한다는 얘기는 한 개 이상의 집합이 다른 평균값을 가졌다는 뜻이다. (ANOVA에서는 그게 어떤 집합인지 알려주는 것까지는 하지 않는다. 그건 사후 검정을 통해 확인해야 한다.)

예를 들어 이런 데이터프레임 df가 있다고 해보자.

store라는 열에는 store_a, store_b, store_c라는 3개의 종류가 담겨 있는데, 이 store마다 sales의 평균값에 차이가 있는지 확인하려는 ANOVA를 하려면 이렇게.

results <- aov(sales ~ store, data = df)
summary(results)

sales ~ store라고 표현했는데, sales 평균 값이 store에 따라 차이가 있는지 보겠다는 뜻이다. 그리고 p-값을 확인하려면 이렇게 summary() 함수를 사용해야 한다.

결과가 이런 식으로 나온다.

             Df Sum Sq Mean Sq F value   Pr(>F)    
store         2   3985  1992.6   8.957 0.000153 ***
Residuals   447  99437   222.5                     
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Pr(>F)이라고 써진 게 p-값이다. 0.000153니까 매우 작은 거다. 그래서 친절하게 별 세 개 표시(***)까지 해준 걸 볼 수 있다.

즉, 이 세 집단의 이 평균 차이는 우연히 발생한 것으로 보기 어렵다는 의미이고, 결국 두 집단 간의 평균이 같다는 귀무가설은 기각, 평균 차이가 있다고 결론을 내릴 수 있겠다.


R이 확실히 통계 돌리기 쉽게 만들어지긴 했구나. 오늘은 일단 여기까지.

추천 글

댓글 남기기