정규성 만족, 등분산 만족 : one-way anova 정규성 만족, 등분산 불만족 : welch’s anova 정규성 불만족 : kruskal-wallis H test
1. x1,x2,x3의 변수들의 평균의 차이가 존재하는지 검정하라. 차이가 존재한다면 사후 분석까지 진행하라.
# 데이터 로드
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/anova.csv')
data = df.x1
data2 = df.x2
data3 = df.x3
# 시각화
fig,ax = plt.subplots(1, 2, figsize = (12, 4))
ax[0].hist(data,alpha = 0.3, bins = 30, label = 'x1')
ax[0].hist(data2,alpha = 0.3, bins = 30, label = 'x2')
ax[0].hist(data3,alpha = 0.3, bins = 30, label = 'x3')
ax[0].legend()
labels = ['x1', 'x2', 'x3']
lst = [data,data2,data3]
ax[1].boxplot(lst, labels = labels)
plt.show()
# 정규성 검정
from scipy.stats import shapiro
print(shapiro(data))
print(shapiro(data2))
print(shapiro(data3))
if (shapiro(data)[1] >= 0.05) & (shapiro(data2)[1] >= 0.05) & (shapiro(data3)[1] >= 0.05):
print('모든 변수가 정규성을 만족')
else:
print('정규성을 만족하지 않음')
# 등분산 검정
from scipy.stats import levene
statistic, p_value = levene(data, data2, data3)
print(levene(data, data2, data3))
if p_value < 0.05:
print('귀무가설 기각 → 변수들의 분산이 동일하다고 할 수 없음')
else:
print('귀무가설 기각 → 변수들의 분산이 동일하다고 할 수 있음')
# ANOVA
from scipy.stats import f_oneway
statistic, p_value = f_oneway(data, data2, data3)
print(f_oneway(data, data2, data3))
if p_value < 0.05:
print('귀무가설 기각 → 변수들의 평균에 차이가 있다고 할 수 있음')
else:
print('귀무가설 기각 → 변수들의 평균에 차이가 있다고 할 수 없음')
# 사후검정
# 방법1) tukey's HSD
from statsmodels.stats.multicomp import pairwise_tukeyhsd
posthoc = pairwise_tukeyhsd(dfm.value, dfm.variable, alpha = 0.05)
print(posthoc)
# 시각화
fig = posthoc.plot_simultaneous()
plt.show()
# 방법2) 봉페로니 교정
from statsmodels.sandbox.stats.multicomp import MultiComparison
import scipy.stats
comp = MultiComparison(dfm.value, dfm.variable)
result = comp.allpairtest(scipy.stats.ttest_ind, method = 'bonf')
print(result[0])
[output] ShapiroResult(statistic=0.9979789853096008, pvalue=0.27395427227020264) ShapiroResult(statistic=0.9979418516159058, pvalue=0.2591271996498108) ShapiroResult(statistic=0.9987621307373047, pvalue=0.7300694584846497) 모든 변수가 정규성을 만족 LeveneResult(statistic=2.71270174202054, pvalue=0.06652021922816238) 귀무가설 기각 → 변수들의 분산이 동일하다고 할 수 있음 F_onewayResult(statistic=209.88499932318638, pvalue=4.919152988455592e-86) 귀무가설 기각 → 변수들의 평균에 차이가 있다고 할 수 있음
2. x1,x2,x3의 변수들의 평균의 차이가 존재하는지 검정하라.
# 데이터 로드
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/anova2.csv')
data = df.x1
data2 = df.x2
data3 = df.x3
# 시각화
fig,ax = plt.subplots(1, 2, figsize = (12, 4))
ax[0].hist(data,alpha = 0.3, bins = 30, label = 'x1')
ax[0].hist(data2,alpha = 0.3, bins = 30, label = 'x2')
ax[0].hist(data3,alpha = 0.3, bins = 30, label = 'x3')
ax[0].legend()
labels = ['x1', 'x2', 'x3']
lst = [data,data2,data3]
ax[1].boxplot(lst, labels = labels)
plt.show()
# 정규성 검정
from scipy.stats import shapiro
print(shapiro(data))
print(shapiro(data2))
print(shapiro(data3))
if (shapiro(data)[1] > 0.05) & (shapiro(data2)[1] > 0.05) & (shapiro(data3)[1] > 0.05):
print('모든 변수가 정규성을 만족')
else:
print('정규성을 만족하지 않음')
# 등분산 검정
from scipy.stats import levene
statistic, p_value = levene(data, data2, data3)
print(levene(data, data2, data3))
if p_value <= 0.05:
print('귀무가설 기각 → 변수들의 분산이 동일하다고 할 수 없음')
else:
print('귀무가설 기각 → 변수들의 분산이 동일하다고 할 수 있음')
# ANOVA
from scipy.stats import f_oneway
statistic, p_value = f_oneway(data, data2, data3)
print(f_oneway(data, data2, data3))
if p_value < 0.05:
print('귀무가설 기각 → 변수들의 평균에 차이가 있다고 할 수 있음')
else:
print('귀무가설 기각 → 변수들의 평균에 차이가 있다고 할 수 없음')
[output] ShapiroResult(statistic=0.9886645078659058, pvalue=0.5584133863449097) ShapiroResult(statistic=0.9924368858337402, pvalue=0.8519019484519958) ShapiroResult(statistic=0.9848724007606506, pvalue=0.31092315912246704) 모든 변수가 정규성을 만족 LeveneResult(statistic=1.845797549925243, pvalue=0.15970603203147626) 귀무가설 기각 → 변수들의 분산이 동일하다고 할 수 있음 F_onewayResult(statistic=2.386152612702158, pvalue=0.09374426938585023) 귀무가설 기각 → 변수들의 평균에 차이가 있다고 할 수 없음
3. target 변수들에 의해 value값들의 평균의 차이가 존재하는지 검정하라.
# 데이터 로드
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/anova8.csv')
data = df[df.target == 'a'].value
data2 = df[df.target == 'b'].value
data3 = df[df.target == 'c'].value
# 시각화
fig,ax = plt.subplots(1, 2, figsize = (12, 4))
ax[0].hist(data, alpha = 0.3, bins = 30, label = 'a')
ax[0].hist(data2, alpha = 0.3, bins = 30, label = 'b')
ax[0].hist(data3, alpha = 0.3, bins = 30, label = 'c')
ax[0].legend()
labels = ['a', 'b', 'c']
lst = [data, data2, data3]
ax[1].boxplot(lst, labels = labels)
plt.show()
# 정규성 검정
from scipy.stats import shapiro
print(shapiro(data))
print(shapiro(data2))
print(shapiro(data3))
if (shapiro(data)[1] > 0.05) & (shapiro(data2)[1] > 0.05) & (shapiro(data3)[1] > 0.05):
print('모든 변수가 정규성을 만족')
else:
print('정규성을 만족하지 않음')
# 정규성을 만족하지 않으므로 비모수 검정인 kruskal 검정
from scipy.stats import kruskal
statistic, p_value = kruskal(data, data2, data3)
print(kruskal(data, data2, data3))
if p_value < 0.05:
print('귀무가설 기각 → 변수들의 평균에 차이가 있다고 할 수 있음')
else:
print('귀무가설 기각 → 변수들의 평균에 차이가 있다고 할 수 없음')
[output] ShapiroResult(statistic=0.9666392207145691, pvalue=0.012299093417823315) ShapiroResult(statistic=0.9713972210884094, pvalue=0.10934212058782578) ShapiroResult(statistic=0.9651247262954712, pvalue=0.41566193103790283) 정규성을 만족하지 않음 KruskalResult(statistic=6.9277037668798584, pvalue=0.03130893110123) 귀무가설 기각 → 변수들의 평균에 차이가 있다고 할 수 있음
4. target 변수들에 의해 value값들의 평균의 차이가 존재하는지 검정하라.
# 데이터 로드
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/anova10.csv')
data = df[df.target == 'a'].value
data2 = df[df.target == 'b'].value
data3 = df[df.target == 'c'].value
# 시각화
fig,ax = plt.subplots(1, 2, figsize = (12, 4))
ax[0].hist(data, alpha = 0.3, bins = 30, label = 'a')
ax[0].hist(data2, alpha = 0.3, bins = 30, label = 'b')
ax[0].hist(data3, alpha = 0.3, bins = 30, label = 'c')
ax[0].legend()
labels = ['a', 'b', 'c']
lst = [data,data2,data3]
ax[1].boxplot(lst, labels = labels)
plt.show()
# 정규성 검정
from scipy.stats import shapiro
print(shapiro(data))
print(shapiro(data2))
print(shapiro(data3))
if (shapiro(data)[1] > 0.05) & (shapiro(data2)[1] > 0.05) & (shapiro(data3)[1] > 0.05):
print('모든 변수가 정규성을 만족')
else:
print('정규성을 만족하지 않음')
# 등분산 검정
from scipy.stats import levene
statistic, p_value = levene(data, data2, data3)
print(levene(data, data2, data3))
if p_value <= 0.05:
print('귀무가설 기각 → 변수들의 분산이 동일하다고 할 수 없음')
else:
print('귀무가설 기각 → 변수들의 분산이 동일하다고 할 수 있음')
# 정규성은 만족하나 등분산성은 만족하지 않으므로 welch test로 검정
import pingouin as pg
test_result = pg.welch_anova(dv = 'value', between = 'target', data = df)
display(test_result)
if test_result['p-unc'].values[0] < 0.05:
print('귀무가설 기각 → 변수들의 평균에 차이가 있다고 할 수 있음')
else:
print('귀무가설 기각 → 변수들의 평균에 차이가 있다고 할 수 없음')
[output] ShapiroResult(statistic=0.9835560917854309, pvalue=0.2487850785255432) ShapiroResult(statistic=0.9923046231269836, pvalue=0.9479172825813293) ShapiroResult(statistic=0.9523518681526184, pvalue=0.19537365436553955) 모든 변수가 정규성을 만족 LeveneResult(statistic=4.530341210288782, pvalue=0.011923468290294024) 귀무가설 기각 → 변수들의 분산이 동일하다고 할 수 없음 귀무가설 기각 → 변수들의 평균에 차이가 있다고 할 수 없음