let us not love with words or tongue but actions and truth.

IT/파이썬

ANOVA분석 & POST-HOC (사후검정)

sarah0518 2020. 12. 4. 15:52

그룹간 차이가 있는지 볼 수 있는 ANOVA검정과 사후검정 관련 포스팅을 해보겠습니다.

 

ANOVA분석

우선 분석할 내용은, 4개의 A,B,C,D라는 학급별 수학/영어/과학 점수의 차이가 있는지 분석하는 것입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
score_list=['math','eng','science']
 
from scipy import stats
 
fstat_list=[]
p_list=[]
 
for i in lg_cat_list:
    fstat, p = stats.f_oneway(class_A[i], class_B[i], class_C[i], class_D[i])
 
    fstat_list.append(fstat)
    p_list.append(p)
 
cs

 

기존 내용처럼 DataFrame 화하여 결과를 쉽게 볼수 있도록 하죠.

 

1
2
cat_frames={'f':fstat_list, 'p':p_list}
pd.DataFrame(cat_frames, index=score_list)
cs

 

[output]

위의 결과에서 유추할 수 있는 결론은 수학점수에서 Class간의 차이가 있다는 것입니다.

그럼 이제 어떤 그룹간의 차이가 있는지 사후검정을 해보도록 하죠.

 

사후분석

사후분석 전, 분석을 위한 dataframe을 만들어 줍니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 각 학급별 DataFrame에 group이라는 컬럼을 추가하여, 구분자를 만들어주기
 
class_A=class_A[['math','eng','science']]
class_A['group']=1
 
class_B=class_B[['math','eng','science']]
class_B['group']=2
 
class_C=class_C[['math','eng','science']]
class_C['group']=2
 
class_D=class_D[['math','eng','science']]
class_D['group']=4
 
# 위의 4개의 class 데이터 프레임을 concat합니다. 
class_all=pd.concat([class_A, class_B, class_C, class_D], axis=0)
cs

 

[class all이라는 테이블 형태]

 

사후분석을 위한 사전 준비가 완료 되었습니다.

Bonferroni method를 활용한 ttest검정을 모든 그룹간에 해

보겠습니다. (사후검정 내용)

1
2
3
4
5
6
from statsmodels.sandbox.stats.multicomp import MultiComparison
import scipy.stats

comp = MultiComparison(class_all['math'], class_all['group'])

# Bonferroni 방법을 통해 모든 그룹간 ttest를 진행
result = comp.allpairtest(scipy.stats.ttest_ind, method='bonf')
result[0]

cs

 

[output]

Test Multiple Comparison ttest_ind FWER=0.05 

method=bonf alphacSidak=0.01, alphacBonf=0.008

 

위의 결과를 해석해 보면,

A학급은 C, D 학급의 수학점수와 차이가 있고

B학급은 C학급과 수학점수의 유의차가 존재한다고 할수있다.