일원 분산 분석은 2개 이상의 집단의 평균을 비교하는 통계분석 방법이다.

종속 변수는 연속형이어야하고, 독립변수는 범주형 변수이어야한다.

 

귀무가설( H0 ) : 모든 집단의 평균의 차이가 없다.

대립가설( H1 ) : 집단내 1개 이상의 평균은 유의한 차이가 있다.

 

분산분석표

요인 제곱합 자유도 제곱평균 F-Value
집단 간 SSR a = 집단수 -1 MSR=SSR/a F=MSR/MSE
집단 내 SSE b = 전체데이터수-집단수 MSE=SSE/b
합계 SST a+b = 전체이이터수-1    

 

 

 

반응값에 대한 하나의 범주형 변수의 영향을 알아보기 위해 사용되는 검증 방법이다.

일원분석 분산

 

 

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_iris

iris = load_iris()
df = pd.DataFrame(data = iris.data, columns=iris.feature_names)
df["target"] = iris.target_names[iris.target]

# IRIS의 품종에 따른 sepal length의 평균의 차이 검정
setosa = df.loc[df.target=="setosa", "sepal length (cm)"].copy()
versicolor = df.loc[df.target=="versicolor", "sepal length (cm)"].copy()
virginica = df.loc[df.target=="virginica", "sepal length (cm)"].copy()

# 1. 정규성 검정
from scipy.stats import shapiro
_, pval1 = shapiro(setosa)
_, pval2 = shapiro(versicolor)
_, pval3 = shapiro(virginica)
pval1, pval2, pval3
# (0.4595010578632355, 0.4647378921508789, 0.25831347703933716)
# pvalue가 유의수준 0.05보다 커서 귀무가설을 기각할 수 없고, 정규성을 만족한다.

# 2. 등분산 검정
from scipy.stats import levene
_, pval = levene(setosa, versicolor, virginica)
pval
# 0.0022585277836218586
# pvalue가 0.05보다 작아 등분산을 만족하지 못한다. 
# 시험으로 4등분산임을 가정하고 one-way anova를 진행한다.

# 3. One-way Anova
from scipy.stats import f_oneway
_, pval = f_oneway(setosa, versicolor, virginica)
np.round(pval, 5)
# 0.0
pvalue 가 유의수준 0.05 보다 작아 귀무가설을 기각하고, 3개중 1개이상은 평균의 차이가 유의하다.

# 4. 사후검정
from statsmodels.stats.multicomp import pairwise_tukeyhsd
from statsmodels.stats.multicomp import MultiComparison
mc=MultiComparison(data=df["sepal length (cm)"], groups=df.target)
print(mc.tukeyhsd(alpha=0.05))
#   Multiple Comparison of Means - Tukey HSD, FWER=0.05   
#=========================================================
#  group1     group2   meandiff p-adj lower  upper  reject
#---------------------------------------------------------
#    setosa versicolor     0.93   0.0 0.6862 1.1738   True
#    setosa  virginica    1.582   0.0 1.3382 1.8258   True
#versicolor  virginica    0.652   0.0 0.4082 0.8958   True
#---------------------------------------------------------
# 3품종의 pvalue가 모두 0.05보다 작아,3개 모두 평균의 차이가 유의한다.

# 5. 그래프 출력
from statsmodels.stats.multicomp import pairwise_tukeyhsd
mc.tukeyhsd(alpha=0.05).plot_simultaneous()

MultiComparison

 

정규성을 만족하지 못했을때와 등분산을 만족하지 못했을때

# 정규성을 만족하지 못했을때 크루스칼 왈리스
from scipy.stats import kruskal
_, pval = kruskal(setosa, versicolor, virginica)
np.round(pval)
# 0

# 등분산을 만족하지 못했을때
import pingouin as pg
pg.welch_anova(data=df, dv="sepal length (cm)", between="target")
#	Source	ddof1	ddof2	F	p-unc	np2
#0	target	2	92.211145	138.908285	1.505059e-28	0.618706
# pvalue가 0.05보다 작아 평균 차이가 있다.

'통계' 카테고리의 다른 글

모수 유의성 검정(Significance test)  (1) 2023.10.11
가우시안 혼합 분포 군집(GaussianMixture)  (0) 2023.09.26
GridSearchCV  (0) 2023.09.03
Kaggle dataset download  (0) 2023.08.15
선형 회귀 분석 - Linear regression model python  (0) 2023.07.06

+ Recent posts