빅데이터 전문가 되기
분산 분석(The Analysis of Variance) 본문
😸 분산 분석이란?
- 세 개 이상 다수의 집단을 서로 평균에서 분산값을 비교하기 위한 가설검정 방법
- 여러 개의 그룹 간에 결과값의 우열을 가리는 통계적인 분석 방법
- 예시: 학생들의 수학 점수, 부서들의 매출 실적, 3개 이상의 반 등..
- 분산 분석의 종류
- 일원분산분석(One-Way ANOVA)
- 이원분산분석(Two-Way ANOVA)
- 다원변량분산분석(MANOVA)
- 공분산분석(ANCOVA)
- 일원분산분석(One way ANOVA)
- 독립변수가 1개이며, Group이 여러 개일 경우에 사용하는 분석방법
- 예시 : A,B,C의 반이 있을 때 수학 성적 확인 (독립변수는 학급으로 한 개임.)
첫 번째 예시를 들어 설명하겠습니다.
- 약의 종류가 있을 때, 치료방법과 효과에 대한 데이터가 있다.
- 이 때, 데이터에 대하여 분산 분석을 통하여 구하라.
- 가설 설정
- 귀무가설 : 세 그룹의 평균은 같다.
- 대립가설 : 적어도 하나의 평균은 다르다.
# 데이터 불러오기
import seaborn as sns
import pandas as pd
df = pd.read_csv("https://raw.githubusercontent.com/ethanweed/pythonbook/main/Data/clintrial.csv")
df.head()
👉 데이터 시각화
- 데이터를 시각화하여 세 종류 약의 효과에 대한 평균을 알아보도록 하겠습니다.
import seaborn as sns
ax = sns.pointplot(x='drug', y='mood_gain', data = df)
sns.despine()
- 평균을 그래프로 보았을 때 'joyzepam'의 효과가 높아보이는 것으로 보이긴 합니다.
👉 잔차의 정규성 검정
- 정규성 검정
- 귀무가설: 변수는 정규분포를 따를 것이다.
- 대립가설: 변수는 정규분포를 따르지 않을 것이다.
import statsmodels.api as sm
from statsmodels.formula.api import ols
formula = 'mood_gain ~ drug'
model = ols(formula, data=df).fit()
res = model.resid
res
# pingouin으로 정규성 확인
import pingouin as pg
# pg.normality(res)
# shaprio로 정규성 확인
from scipy.stats import shapiro
shapiro(res)
> ShapiroResult(statistic=0.9601900577545166, pvalue=0.605305016040802)
- statistic(W)는 정규성 가정을 평가하는데 사용되는 것으로 1에 가까울수록 데이터가 정규분포에 따른다는 증거입니다.
따라서, W값이 1에 가깝다고 볼 수 있으므로 잔차가 정규분포를 따른다고 해석할 수 있습니다.
- p_value의 값은 유의수준 0.05 이상인 0.60으로 귀무가설을 채택, 대립가설을 기각합니다.
따라서, 변수는 정규 분포를 따른다는 것을 확인할 수 있습니다.
- 만약 정규성 위반 시에는 비모수 검정(Kruskal-Wallis rank sum test)을 해줄 수 있습니다.
👉 등분산성 검정
- 등분산성 검정
- 귀무가설: 종속 변수("mood_gain")의 분산이 서로 다른 그룹("drug")간에 동일하다.
- 대립가설: 종속 변수의 분산이 서로 다른 그룹간에 동일하지 않다.
# 등분산성 확인
import pingouin as pg
pg.homoscedasticity(data=df, dv='mood_gain', group='drup').round(2)
- W값은 클수록 그룹간의 분산이 크게 다르다는 뜻입니다. 이 때 W의 값은 1.47이므로 그룹 간의 분산이 크게 다르지 않다고 해석할 수 있습니다.
- p_value의 값은 유의수준 0.05 이상인 0.26으로 귀무가설을 채택, 대립가설을 기각합니다.
따라서, 종속 변수의 분산이 서로 다른 그룹 간에 동일하다고 판단할 수 있습니다.
- equal_var에서 True는 등분산성 가정이 충족된다는 가정하에서 분석이 진행되었다는 것을 의미합니다.
- 따라서, 주어진 데이터에서는 등분산성 가정이 충족된다고 판단할 수 있습니다.
👉 분산 분석
import statsmodels.api as sm
from statsmodels.formula.api import ols
formula = 'mood_gain ~ drug'
model = ols(formula, data=df).fit()
aov_table = sm.stats.anova_lm(model, typ=2)
aov_table
- sum_sq는 데이터의 변화를 측정하는 척도로 값이 클수록 해당 요인이 전체 변동성에 기여하는 정도가 크다는 뜻입니다.
- df(자유도)는 모집단에서 독립적인 데이터의 수를 알려주는 것으로 약의 종류는 3개이므로 N-1을 적용하면 2가 됩니다.
여기서 Residual는 각 그룹의 갯수가 6개이므로 N-1을 했을 때, 5개에서 총 3종류이므로 15개가 됩니다.
- F는 F-통계로 큰 값일수록 그룹 간의 차이가 통계적으로 유의미하다는 뜻을 가집니다.
- 결과적으로 해석하면 drug는 종속 변수(mood_gain)를 설명하는데 중요한 역할을 한다고 해석할 수 있습니다.
👉 사후 검정
- 각 그룹간의 평균의 차이를 비교해보겠습니다.
- 이때 결과는 independent t-test를 하는 것과 동일합니다.
pg.pairwise_tukey(data=df, dv='mood_gain', between='drug')
- 'anxifree'와 'joyzepam' 평균 차이는 -0.7667로 'anxifree' 평균이 'joyzepam' 평균보다 0.7667 작다는 것을 의미합니다.
표준 오차(se)는 0.175858이며, T-값은 -4.359를 가지며, p-tukey값은 0.05이하로 'anxifree'와 'joyzepam'은 평균의 차이가 통계적으로 유의미하다는 것을 뜻합니다.
- 'anxifree'와 'placebo' 평균 차이는 0.2667로 'anxifree'평균이 'placebo' 평균보다 0.2667 크다는 것을 의미합니다.
표준 오차(se)는 0.175858이며, T-값은 1.516를 가지며, p-tukey값은 0.05이상으로 'anxifree'와 'placebo'은 평균의 차이가 통계적으로 유의미하게 다르지 않다는 것을 뜻합니다.
- 'joyzepam'과 'placebo' 평균 차이는 1.033로 'joyzepam' 평균이 'placebo' 평균보다 1.033 크다는 것을 의미합니다.
표준 오차(se)는 0.175858이며, T-값은 5.875를 가지며, p-tukey값은 0.05이하로 'joyzepam'과 placebo'은 평균의 차이가 통계적으로 유의미하다는 것을 뜻합니다.
'통계' 카테고리의 다른 글
두 집단의 평균 비교 t-test(대응표본) (0) | 2023.06.15 |
---|---|
두 집단의 평균 비교 t-test(독립표본) (0) | 2023.06.13 |
One Sample t-test (0) | 2023.06.12 |
z-test(z-통계량) (0) | 2023.06.09 |
통계 관련 자료 모음 (0) | 2023.04.18 |