본문 바로가기

통계학 기초

[Python] One way ANOVA 분석하기 - 이론부터 코드까지 한 번에

반응형

 

이번 포스팅에서는 ANOVA 중 가장 기초적인 One Way ANOVA 분석에 대해서 이론부터 시작하여 Python 코드로 실제 구현하는 부분까지 다루어볼 것이다. 파이썬 패키지 중에서도 Stats 와 Scipy 패키지를 활용하여 원하는 스타일에 맞게 보고서를 작성하는 연습을 진행해볼 것이다. 

 

 

 

 

[ 글의 목차 ]

1. ANOVA는 무엇이고, One Way ANOVA는 무슨 차이인가?

2. Python으로 One Way ANOVA 분석을 하는 방법

 


 

1. ANOVA는 무엇이고, One Way ANOVA는 무슨 차이인가?

 

✅ 결과 미리보기 - One way ANOVA 분석 이렇게 진행해요!

일원분산분석 진행 과정

 

(1) 일원분산분석(One way ANOVA)의 개념 및 수식

1 - 1) 개념으로 이해하는 ANOVA

  • 분산분석(ANOVA)은 3개 이상의 그룹 간 평균을 비교할 때 쓰는 대표적인 방법
  • 분산분석에 사용 되는 Scale
    • 독립변수: 명목 척도
      e.g. 3개 이상의 반, 축구 Club들, 회사 내 3개의 부서
    • 종속변수: 양적 척도 - Interval Scale 혹은 Ratio Scale
      e.g. 학생들의 수학 점수, 선수들의 Yellow Card 받은 횟수, 부서들의 매출 실적

 

ANOVA를 가장 쉽게 설명한다면 여러 개의 그룹 간에 결과값의 우열을 가리는 통계적인 분석 방법이다. 사실 다양한 분산분석이 존재하는데, 오늘은 가장 쉬운 One-way ANOVA에 대해서 다룰 것이다. 

 

 

  • 일원분산분석은 독립변수가 1개인데, Group이 여러 개일 경우를 의미한다. 
    • 수학 성적에 영향을 미치는 개념적인 변수는 "학교 학급"이라는 것 하나이다. 그래서 결과에 영향을 주는 변수는 "한 개"이기 때문에 One Way 혹은 일원배치 라고 이름이 붙은 것이다.
    • 개념적 변수가 하나여도 실질적 Group은 3개 혹은 그 이상으로 정의될 수 있다. 학급의 예시처럼 여러 개의 반이 될 수도 있고, 지역으로 치면 수많은 읍/면/동이 될 수도 있다.

ANOVA 분석 예시

 

 

1 - 2) 수식으로 이해하는 ANOVA

일원분산분석의 수식

  • 모델이 총 설명하고자 하는 Variance 
    • Between Sample: 그룹 간 발생하는 Variance = SSB
    • Within Sample: 그룹 내 발생하는 Variance =  SSW
    • F-Ratio = SSB / SSW ( F-Statistics는 최소한 1이 넘어야 한다.)
    • 수식의 설명: 그룹 간 차이가 그룹 내 차이보다 훨씬 크다 → 그룹 간 차이가 분명이 있고, 그 숫자 기준은 1이다.
                           근데 아직은 누가 더 높은지는 모른다!!!

핵심적인 것은 변수들끼리 차이가 나는 것을 분류하면 두 가지이다. 첫 번째는 그룹 간 차이가 나는 변량이 있고, 두 번째는 그룹 내에서 차이가 나는 변량이다. 우리의 핵심 가정은 "그룹 간 차이가 있을 것"이라는 관점이기 때문에 SSB가 SSW보다 커야 하고, 그 비율로 따졌을 때는 당연히 1을 넘어서야 ANOVA 모델이 의미를 가지게 된다. 

 

이러한 분석을 실시할 수 있는 코드는 하단에 상세히 기술하도록 하겠다.

 

 

 

 

 

(2) 일원분산분석(One way ANOVA)의 기본 가정

 

모든 ANOVA 분석에 있어서 지켜야할 3가지 기본적인 가정이 있다. 실무에 적용할 때에도 이러한 검증 과정을 거치지 않는다면 타당한 모델로 받아들여지기 힘들 것이다. 

 

2-1) 정규성 가정

  • 가정의 의미: 각 변수는 정규 분포를 따라야 한다. 
  • 정규성 검정 방법: Shaprio Test
    • H0: 변수는 정규 분포를 따를 것이다. 
    • H1: 변수는 정규 분포를 따르지 않을 것이다. 
      Shaprio Test를 할 때 결과 값을 해석할 때는 항상 유의하자. 쉽게 말해서 검정 결과는 대립가설을 기각하고, 귀무가설을 채택해야 한다. 

 

참고로 Shaprio Test는 P-value가 나오기 상당히 까다로운 검정이다. 조금 더 실무적인 방법은 변수의 왜도 절대값이 2를 넘지 않으면, 보통 실험을 실시한다. 

 

또 권장하는 방법은 변수의 값을 Log Transformation을 통해서 최대한 정규분포의 모양으로 맞춰주는 것도 학계에서 실행하는 방법 중 하나이다. 

 

  • 코드로 보는 정규성 검정 
1
2
3
4
5
6
import scipy.stats as stats
## 정규성 검정 & 왜도 검사
print( ##Shaprio 검정
stats.shapiro( 데이터를 넣어주세요 )
## 왜도 측정
      , 'skewness test: {}'.format( abs(stats.skew( 데이터를 넣어주세요 , bias = False) ) ) 
      , sep = '\n'
     )
cs

 

 

2 - 2) 등분산성 가정

  • 가정의 의미: 각 변수의 분산은 동일한 수준의 분산을 가져야 한다. 
  • 등분산성 검정 방법: Barlett 검정 또는 Levene 방법
    H0: 변수 간 분산에 유의미한 차이가 없을 것이다. 
    H1: 변수 간 분산에 유의미한 차이가 있을 것이다. 
    따라서 여기서도 귀무가설을 채택하고, 대립가설을 기각하는 결과가 나와야 한다. 
  • 코드로 보는 등분산성 검정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
## 등분산성 검정
## Bartlett’s test tests the null hypothesis that all input samples are from populations with equal variances.
## So best case scenario is not to reject null hypothesis.
from scipy.stats import bartlett
stats.bartlett( Data A
         , Data B
         , Data C
        )
 
 
stats.levene(Data A         
         , Data B
         , Data C            
        )
cs

 

 

2 - 3) 독립성 가정

이것은 그룹 간에 서로 영향을 주고 받으면 안 된다는 가정이다. 이것은 통계적인 숫자로 확인하는 방법보다는 실험 설계에서 결정되어야 할 중요한 변수이다. 

 

 

(3) 일원분산분석의 사후 분석

 

사실 ANOVA에서 효과 설명할 때는 main effect, interaction effect 등 많은 내용이 있지만, 쉽게 설명하기 위해서 가장 이해하기 쉬운 범위로 요약한다. 

  • 현재 상태 요약
    : 집단 간 평균이 확실히 다른 건 알겠는데, 누가 더 높은지는 모르는 상황
  • 사후 분석이 필요한 이유
    : 누가 진짜 제일 높은지 확인하고 싶고, 진짜로 의도한 Group이 더 높은지 낮은지 최종 확인

 

 

3 - 1) Turkey HSD 사후 분석 방법

Turkey HSD 사후 분석 예시

  • group1와 group2는 비교 가능한 모든 그룹 조합이다. 
  • meandiff는 그룹 간 평균 차이를 의미한다. 
  • p-adj는 수정된 p-value로 평균 차이가 유의미한지 가르는 기준이 된다. 
  • lower 95% 신뢰도 구간 중 저점을 의미
  • upper 95% 신뢰도 구간 중 고점을 의미
  • reject는 p-value를 기반으로 이 평균 차이가 의미가 있는지 결과를 알려준다. 
    • False: 귀무가설을 기각하지 못함. 따라서 평균 차이의는 무의미함.
    • True: 귀무가설을 기각함. 따라서 평균 차이는 유의함. 

 

 

3 - 2) BONFERRONI 사후 분석 방법

BONFERRONI 사후 분석 방법 예시

 

BONFERRONI 사후 분석에서도 지표 해석 방법은 위와 사실상 동일하다. pvalue와 reject 여부를 보고 누가 더 높은지 판단하면 된다. 

 

 

 

반응형

2. Python으로 One Way ANOVA 분석을 하는 방법

 

 

사실 One-way ANOVA의 코드는 굉장히 단순한 편이다. 만약 코드의 내용을 보고도 잘 이해되지 않는다면, 통계 이론을 보는 것을 권장한다. 

 

(1) 기초 데이터 형태

  • 변수의 설명
    • 종속변수 Posterior: 각 그룹이 선택될 확률을 0 ~ 1까지 표현한 것이다. 
    • 독립변수 Group: 그룹은 A, B, C로 단순하다. 
  • 가설
    • H0: Mean(A) = Mean(B) = Mean(C)
    • H1: 모두 같지는 않다. 

 

(2) 변수별 사전 검정 과정 진행

  • 등분산성 검정 해석 방법 및 실습

등분산성 검정 해석 방법

 

보다시피 두 모델 모두 p-value가 0.05를 훨씬 넘나드는 값을 보여주었다. 따라서 A,B,C 변수들은 등분산성을 만족한다. 

 

  • 정규성 검정 해석 방법 및 실습

정규성 검정 해석 방법

 

 

Shaprio 검정 결과 0.04로 귀무가설이 기각 됐지만, 세 변수 모두 왜도가 2를 넘지 않기 때문에 정상적으로 분석을 실시해도 문제가 없을 것으로 보인다. 

 

 

(3) Oneway AVONVA 분석 실시

  • 코드로 보는 ANOVA 분석 방법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
## Stats Model을 활용한 방법1. 
F, p = stats.f_oneway(posterior_A_samples
                      , posterior_B_samples
                      , posterior_C_samples)
print'F-Ratio: {}'.format(F)
    , 'p-value:{}'.format(p)
     , sep = '\n')
 
## Stats Model을 활용한 방법2. 
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
 
model = ols('posterior ~ C(group)', temp_df).fit()
anova_lm(model)
cs

 

분석 코드 자체는 그렇게 길지는 않다. 첫 번째 방법은 단순하게 stats.f_oneway를 써서 결과만 보여주는 방법이 있다.

 

두 번재는 ols 방법을 통해 보다 보기 좋은 Reporting을 할 수도 있다. 나 같은 경우 항상 두 번째 수식을 활용해서 진행하려고 습관을 들이고 있다. 

 

  • 분석 결과 해석 예시
    • F-Ratio가 62로 1을 넘었기 때문에 그룹 간 평균에 차이가 있음을 시사한다. 
    • 모델의 p-value 또한 유의하기 때문에 62 Ratio를 받아들인다. 
    • 따라서 이번 분석의 경우 사후 분석이 반드시 필요하다. 
      (쉽게 말해서 아직 누가 제일 높은지 모른다.)

 

 

(4) Oneway AVONVA 분석 실시

  • 코드로 보는 ANOVA 사후 분석
1
2
3
4
5
6
7
8
9
10
## Turkey HSD 방식
comp = mc.MultiComparison(temp_df['posterior'], temp_df['group'])
result = comp.tukeyhsd()
result.summary()
 
 
## BONFERRONI 방식
comp = mc.MultiComparison(temp_df['posterior'], temp_df['group'])
tbl, a1, a2 = comp.allpairtest(stats.ttest_ind, method= "bonf")
tbl
cs

 

역시나 사후 분석 또한 코드로 보면 굉장히 단순하다. 각 모델에 맞는 파라미터만 잘 지정하면 금방 분석이 끝난다. 

 

  • ANOVA 사후 분석 결과 해석
ANOVA 사후 분석 실습

여기서는 Turkey HSD 결과를 해석해보는 실습을 하겠다. 

 

우선 P-value가 유의하게 나온 것은 "A와 C" 및 "B와 C"이다. 따라서 C가 가장 낮은 평균을 보여주었다고 해석할 수 있다. 

 

다만, A와 B는 결과가 유의하지 않기 때문에 A가 다소 높더라도 일반화할 수 없는 결과이다. 이러한 것에 대해서 보다 깊은 인사이트를 얻으려면, 오른쪽 그래프와 같이 시각화를 하면 더 쉽게 알 수 있다. 

 

 

 

 

여기까지 하면 oneway ANOVA 분석을 다 한 것이다. 사실 이러한 분석은 자동화 프로그램으로 짜서 보다 다양하고 많이 수행하게 서비스를 만들면 더욱 좋을 것이다. 

반응형