본문 바로가기
내가 하는 데이터분석/내가 하는 통계분석

[일원배치 분산분석, One-way ANOVA] with Python

by Pymoon 2023. 1. 2.

두 개 이상의 다수 집단 간 평균은 비교하는 분산분석에서 일원배치 분산분석을 복습해 보자.

 

 

 

 

이 전엔 독립표본 T-검정에 대해서 정리하면서 복습해 보았다.

 

독립표본 T-검정

두 집간 간의 평균 차이를 검정하는 T검정에서 독립표본 T-검정을 복습해보자. 기본가정 정규성 만족 (아닐 시 윌콕슨이 부호 순위 검정, 맨휘트니 검정) 등분산성 만족 (아닐 시 Welch`s t-test) 종속

py-moon.tistory.com

 

 

 

기본가정 및 조건

  • 정규성, 독립성을 만족한다 (아닐 시 Kruskal-Wallis test진행)
  • 등분산성을 만족한다 (아닐 시 Welch`s ANOVA진행)
  • 종속변수는 1개 연속형, 독립변수는 1개 범주형
  • 사후검정 진행
  • 주효과(각각의 요인에 의한 효과)

 


 

일원배치 분산분석은 iris데이터를 활용해서 정리하고자 한다.

 

1
2
3
4
5
6
7
8
import pandas as pd
import scipy.stats as stats
import seaborn as sns
import matplotlib.pyplot as plt
 
Iris_data = pd.read_csv('data/iris.csv')
 
Iris_data.head(5)
cs

 

> 분석에 필요한 코드와 데이터를 불러온다.

 

 

 

Iris_data.head()

> head를 사용해서 상위 5개의 데이터를 확인하고 변수들을 확인한다.

 

 

 

 

1
2
3
4
5
6
Iris_data.target.value_counts()
 
 
Iris-setosa        50
Iris-versicolor    50
Iris-virginica     50
cs

 

> target 변수의 고윳값 개수를 각각 확인해 보니, 3개의 고윳값이 있고 각각 50개씩 고르게 분포되어 있었다.

 

 

 

 

1
2
3
4
5
target_list = Iris_data['target'].unique()
 
setosa = Iris_data[Iris_data['target']==target_list[0]]['sepal width']
versicolor = Iris_data[Iris_data['target']==target_list[1]]['sepal width']
virginica = Iris_data[Iris_data['target']==target_list[2]]['sepal width']
cs

 

> target 변수의 고윳값들을 list형태로 target_list 변수에 할당해 주었다.

 

> 그리고, 각각의 종류에 대해서 sepal width(꽃받침의 너비) 변수를 각각 할당해 주었다.

 

 

 

종류별 꽃받침 너비 분포

> 중간과정을 시각화해보았다.

 

> 각각의 꽃의 종류별로 꽃받침의 너비의 분포를 알 수 있다.

 

> 종류별로 꽃받침 너비의 차이가 있어 보인다. 이 차이가 통계적으로 유의한 차인지 확인해보고자 한다.

 

 

 

> 우선, 정규성 검정을 실시한다.

 

1
2
3
print("setosa 변수의 정규성 결과", stats.shapiro(setosa))
print("versicolor 변수의 정규성 결과", stats.shapiro(versicolor))
print("virginica 변수의 정규성 결과", stats.shapiro(virginica))
cs

 

> 샤피로 윌크 검정으로 세 변수에 대해서 정규성 검정을 실시하였다.

 

 

 

귀무가설 : 해당 변수는 정규성을 만족한다.

 

대립가설 : 해당 변수는 정규성을 만족하지 않는다.

 

 

 

1
2
3
setosa 변수의 정규성 결과 ShapiroResult(statistic=0.968691885471344, pvalue=0.20465604960918427)
versicolor 변수의 정규성 결과 ShapiroResult(statistic=0.9741330742835999, pvalue=0.33798879384994507)
virginica 변수의 정규성 결과 ShapiroResult(statistic=0.9673910140991211, pvalue=0.1809043288230896)
cs

 

> 세 결과 모두 유의확률(pvalue)이 유의 수준(0.05) 보다 크으므로 귀무가설을 채택한다.

 

> 즉, 세 집단은 모두 정규분포를 이루고 있다.

 

 

 

> 다음으로 등분산성 검정을 실시한다.

 

1
print("등분산성 검정 결과 :", stats.levene(setosa, versicolor, virginica))
cs

 

> 세 변수에 대해서 등분산 검정을 위해 Levene검정을 실시해 봤다.

 

 

귀무가설 : 세 집단의 분산이 등분산을 이룬다.

 

대립가설 : 세 집단의 분산이 서로 다른 이분산을 이룬다.

 

 

 

1
등분산성 검정 결과 : LeveneResult(statistic=0.6475222363405327, pvalue=0.5248269975064537)
cs

 

> 실시한 결과에서 유의확률(pvalue)이 유의 수준(0.05) 보다 크으므로 귀무가설을 채택한다.

 

> 즉, 세 집단은 서로 분산이 같은 등분산을 이룬다.

 

 

 

> 두 조건(정규성, 등분산성)을 만족했으니 일원배치 분산분석을 실시한다.

 

1
print("일원배치 ANOVA 검정 결과 :", stats.f_oneway(setosa, versicolor, virginica))
cs

 

> stats.f_oneway를 사용해서 세 집단의 평균이 유의한 차이를 가지는지 알아보자.

 

 

귀무가설 : 세 집단에 대해서 sepal width(꽃받침 너비)의 평균은 같다,

 

대립가설 : 세 집단에 대해서 sepal width(꽃받침 너비)의 평균은 유의한 차이를 가진다.

 

 

 

1
일원배치 ANOVA 검정 결과 : F_onewayResult(statistic=47.36446140299382, pvalue=1.3279165184572242e-16)
cs

 

> 알아본 결과에서 유의확률(pvalue)이 유의수준(0.05)보다 작으므로 귀무가설을 기각하고 대립가설을 채택한다.

 

> 즉, 세 집단의 꽃받침 너비의 평균은 서로 유의한 차이를 가진다.

 

 

 

> 그렇다면, 특히 어떤 종류들 간에 꽃받침의 너비에 차이가 있는지 사후검정을 통해 알아보자.

 

 

사후검정

 

 

귀무가설 : 세 집단들 사이의 평균은 같다.

 

대립가설 : 세 집단들 사이의 평균은 유의미한 차이가 있다.

 

 

summary()

> 결과를 살펴보면, p-adj(수정된 pvalue)가 모두 유의수준(0.05)보다 작으므로 모두 귀무가설을 기각하고 대립가설을 채택한다. 

 

> 즉, 세 집단들 사이의 평균은 유의미한 차이가 있다는 결론이다.

 

 


 

OUTTRO.

 

 

나에게 통계분석은 언제, 어느 순간에 해야 하는 것인가를 헷갈리게 하는 존재다.

 

하지만 하나하나 뜯어가며 정리를 해보니 앞에 정리했었던 T검정과 분산분석의 차이점을 알 수 있었다.

 

확실히 정리하기 전후로 이해하는 정도의 차이는 분명하다.

 

앞으로 해야 할 분석과제들이 수없이 쌓여있는데 가설검정과 좀 더 친해져야겠다.