# 일원배치 분산분석(one-way ANOVA)
# 분산분석은 두 개 이상의 다수 집단 간 평균을 비교하는 통계분석
# 일원배치 분산분석은 반응값에 대한 하나의 범주형 변수의 영향을 알아보기 위해 사용되는 검증 방법
# 모집단의 수에 제한 없으며, 각 표본의 수가 같지 않아도 됨
# F 검정 통계량 이용
# 각 집단의 측정치는 서로 독립적이고, 정규분포를 따르며, 각 집단 측정치의 분산은 같다고 가정
# 귀무가설 : k개의 집단 간 모평균에는 차이가 없다
# 대립가설 : k개의 집단간 모평균이 모두 같다고 말할 수 없다
# 사후검정
# 귀무가설이 기각되어, 적어도 한 집단에서 평균의 차이가 있음이 통계적으로 증명되었을 경우, 어떤 집단들에 대해 평균의 차이가 존재하는지 알아보기 위해 실시하는 분석
# Iris data 에서 종(Species)별로 꽃받침의 폭(Sepal.Width)의 평균이 같은지 혹은 차이 있는지 확인
import pandas as pd
import numpy as np
iris_data = pd.read_csv('../data/iris.csv')
iris_data.head(100)
iris_data.target.value_counts()
import seaborn as sns
import matplotlib.pyplot as plt
# scatter plot by groups
sns.scatterplot(x = 'target', y = 'sepal width', hue = 'target', style = 'target', s = 100, data = iris.data)
plt.show()
target_list = iris_data['target'].unique()
# 3개의 집단 시리즈 형태로 만들어주기
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']
# 정규성 확인
print(stats.shaprio(setosa))
print(stats.shaprio(versicolor))
print(stats.shaprio(virginica))
# 각각 집단은 정규성 만족
# 등분산성 확인
stats.levene(setosa, versicolor, virginica)
# 세 집단간 분산 같다고 결론
# ANOVA 분석
stats.f_oneway(setosa, versicolor, virginica)
# p-value가 유의수준보다 작아 귀무가설 기각
# 적어도 세 집단 중 하나는 평균이 다르다고 말할 수 있음
# 사후검정
# 특히 어떤 종들 간에 꽃받침의 폭 차이가 있는지
from statsmodels.stats.multicomp import pairwise_tukeyhsd
from statsmodels.stats.multicomp import MultiComparison
mc = MultiComparison(data = Iris_data['sepal width'], groups = Iris_data['target'])
tuekeyhsd = mc.tukeyhsd(alpha = 0.05)
tuekeyhsd.summary()
# 각각에 대해 모두 t-test 진행했다고 이해하면 됨
fig = tuekeyhsd.plot_simultaneous()
# diff는 오른쪽 집단 - 왼쪽 집단 값을 나타낸다
# 추가 함수 사용방법 예시
# 정규성을 만족하지 않을 때
stats.kruskal(setosa, versicolor, virginica)
# 등분산성을 만족하지 않을 때
import pingouin as pg
pg.welch_anova(data = iris_data, dv = 'sepal width', between = 'target')
# 이원배치 분산분석 two-way ANOVA
# 분산분석에서 반응값에 대해 두 개의 범주형 변수의 영향을 알아보기 위해 사용되는 검증 방법
# 각 집단의 측정치의 분포는 정규분포여야 한다 -> 정규성
# 각 집단의 분산은 같다 -> 등분산성
# 주효과와 교호작용효과
# 교호작용 효과는 한 독립변수가 종속변수에 미치는 영향이 다른 독립변수의 수준에 따라서 달라지는지를 분석
# 교호작용이 없을 시에 주효과를 분석한다
# 교호작용이 있을 시는 검정이 무의미함
# 변속기 종류(am 변수)와 실린더 개수(cyl)에 따라 주행거리(mpg 변수) 평균에 유의미한 차이가 있는지 분석
# 상호작용효과 검정에 대한 가설
# 귀무가설 : 변속기 종류와 실린더 개수 간에는 상호작용 효과가 없다
# 대립가설 : 변속기 종류와 실린더 개수 간에는 상호작용 효과가 있다
# 주효과 검정에 대한 가설
# 귀무가설 : 실린더 개수에 따른 주행거리의 차이는 존재하지 않는다
# 대립가설 : 실린더 개수에 따른 주행거리의 차이는 존재한다
# 귀무가설 : 변속기 종류에 따른 주행거리 차이는 존재하지 않는다
# 대립가설 : 변속기 종류에 따른 주행거리 차이는 존재한다
import pandas as pd
import numpy as np
mtcars = pd.read_csv('mtcars.csv')
mtcars.info()
mtcars.cyl.value_counts()
mtcars.am.value_counts()
# 독립변수와 종속변수 Series 형태로 변경
cyl = mtcars['cyl']
am = mtcars['am']
mpg = mtcars['mpg']
mtcars = mtcars[['mpg', 'cyl', 'am']]
# 분산분석 수행
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
# formula 작성시, 컬럼명이 꼭 데이터셋 내에 있는 명과 같아야 함
formula = 'mpg ~ C(cyl) * C(am)'
model = ols(formula, mtcars).fit()
aov_table = anova_lm(model, typ=2)
# 상호작용 효과에 대한 검정결과, p-value 값이 유의수준보다 크므로 귀무가설을 기각하지 않는다
from statsmodels.graphics.factorplots import interaction_plot
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize = (6,6))
fig = interation_plot(cyl, am, mpg, colors = ['red', 'blue'], markers = ['D', '^'], ms = 10, ax = as)
# 일반적으로 두 선이 서로 교차하고 있으면, 상호작용이 존재한다고 해석
# 여기서는 두 선이 교차하고 있지 않으므로, 상호작용 효과가 없다고 결론