본문 바로가기
프로그래밍/statsmodels

[statsmodels] 2. 분산분석(ANOVA) - 일원분산분석(One Way ANOVA), 이원분산분석(Two Way ANOVA)

by 부자 꽁냥이 2022. 12. 7.

이번 포스팅에서는 statsmodels를 이용하여 분산분석(ANOVA)를 수행해보고자 한다. 분산분석(ANOVA)에는 일원분산분석(One Way ANOVA)과 이원분산분석(Two Way ANOVA)이 있는데 statsmodels 모듈로 각각 어떻게 하는지 살펴보고자 한다.

 

- 목차 -

1. 일원분산분석(One Way ANOVA)

2. 이원분산분석(Two Way ANOVA)

 

분산분석(ANOVA)에 대한 개념은 아래 포스팅을 참고하면 된다.

 

ANOVA(Analysis of Variance, 분산분석)에 대해서 알아보자.

 

ANOVA(Analysis of Variance, 분산분석)에 대해서 알아보자.

이번 포스팅에서는 ANOVA(Analysis of Variance, 분산분석)의 개념과 One Way ANOVA(일원분산분석), Two Way ANOVA(이원분산분석)에 대해서 복습하고 정리해보았다. - 목차 - 1. ANOVA(Analysis of Variance) 2. One Way ANOVA(

zephyrus1111.tistory.com

 


   1. 일원분산분석(One Way ANOVA)

아래와 같이 세가지 학습 방법(TREATMENT_TYPE)에 따른 국어 성적(SCORE) 데이터가 있다고 할 때 일원분산분석(One Way ANOVA)을 해보자.

 

 

데이터는 아래에 첨부해 두었으니 다운받으면 된다.

 

score.xlsx
0.01MB

 

이제 필요한 모듈을 임포트하고 데이터를 불러온다.

 

import pandas as pd

from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm

df = pd.read_excel('../../statistics/score.xlsx')
df.head()

 

 

이제 본격적으로 일원분산분석(One Way ANOVA)을 해보자. 아래 코드는 statsmodels를 이용하여 일원분산분석(One Way ANOVA)을 수행한다.

 

# One Way ANOVA
formula = 'SCORE ~ C(TREATMENT_TYPE)'
lm = ols(formula, df).fit()
anova_table = anova_lm(lm)
anova_table = anova_table.fillna('') ## NaN를 빈 문자열로 대체
anova_table

 

line 2

ols를 사용하기 위해 formula를 SCORE ~ C(TREATMENT_TYPE)로 설정한다. 이때 ~ 표시 왼쪽은 반응 변수 오른쪽은 설명 변수를 말하며 C는 해당 칼럼이 범주형임을 의미한 것이다.

 

line 3

이렇게 설정한뒤 ols에 formula와 데이터프레임을 인자로 전달하고 fit을 이용하여 선형 회귀 모형을 적합한다. 

 

line 4

선형 회귀 모형 적합 결과를 anova_lm에 넘겨주면 ANOVA Table이 Pandas 데이터프레임 형태로 볼 수 있다.

 

코드를 실행하면 아래와 같이 ANOVA Table이 잘 출력되는 것을 알 수 있다.

 

 

위 결과를 통해 학습 방법(TREATMENT_TYPE)간 국어 성적의 차이는 있는 것으로 판단할 수 있다.


   2. 이원분산분석(Two Way ANOVA)

이번에는 촉매량(VOLUME)의 4가지 수준과 반응 온도(TEMPERATURE) 3가지 수준에 따른 약품의 흡수 속도(VELOCITY)에 차이가 있는지 확인해보고자 한다. 아래는 데이터의 일부를 나타낸다. 이때 이원분산분석(Two Way ANOVA)을 해보자.

 

 

데이터는 아래에 첨부해두었으니 다운받으면 된다.

 

velocity.xlsx
0.01MB

 

데이터를 먼저 불러온다.

 

df = pd.read_excel('../../statistics/velocity.xlsx')
df.head()

 

 

아래 코드는 statsmodels를 이용하여 이원분산분석(Two Way ANOVA)을 수행한다.

 

# Two Way ANOVA
formula = 'VELOCITY ~ C(VOLUME) + C(TEMPERATURE) + C(VOLUME):C(TEMPERATURE)'
lm = ols(formula, df).fit()
anova_table = anova_lm(lm)
anova_table = anova_table.fillna('')
anova_table

 

line 2

이원분산분석 방법은 일원분산분석과 거의 동일하나 VOLUME과 TEMPERATURE의 교호작용을 나타내기 위해 formula 중에서 'C(VOLUME):C(TEMPERATURE)'에 콜론(:)이 사용되었다는 점을 주목하자.

 

이제 코드를 실행하면 아래와 같이 ANOVA Table이 잘 출력되는 것을 볼 수 있다.

 

 

확인 결과 촉매량(VOLUME)과 반응 온도(TEMPERATURE)의 주 효과는 존재하지만 교호작용은 존재하지 않다고 판단할 수 있다.


댓글


맨 위로