일원 분산 분석은 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()
정규성을 만족하지 못했을때와 등분산을 만족하지 못했을때
# 정규성을 만족하지 못했을때 크루스칼 왈리스
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 |