여러 그룹간의 통계적으로 유의미한 차이를 검정하는 통계적 절차를 분산분석이라고 하며, 줄여서 ANOVA(아노바)라고 한다.
4개 웹페이지의 점착성, 즉 방문자가 페이지에서 보낸 시간을 의미하며 초 단위로 보여준다.
각 페이지는 총 5명의 방문자가 있으며 독립적인 데이터 집합이다.
단지 두 그룹을 비교하는 것이라면 문제는 단순할 것이지만 5개의 평균에 대해서 그룹간의 6가지 비교를 해야한다.
1페이지와 2페이지 비교
1페이지와 3페이지 비교
1페이지와 4페이지 비교
2페이지와 3페이지 비교
2페이지와 4페이지 비교
3페이지와 4페이지 비교
한 쌍씩 비교하는 횟수가 증가할 수록 우연히 일어난 일에 속을 가능성이 커진다. 따라서 전체적인 총괄검정을 할 수 있는 ANOVA가 여기서 사용된다.
ANOVA를 토대로 재표본추출 과정을 살펴보자
observed_variance = four_sessions.groupby('Page').mean().var()[0]
print('Observed means:', four_sessions.groupby('Page').mean().values.ravel())
print('Variance:', observed_variance)
# Permutation test example with stickiness
def perm_test(df):
df = df.copy()
df['Time'] = np.random.permutation(df['Time'].values)
return df.groupby('Page').mean().var()[0]
print(perm_test(four_sessions))
>>>
Observed means: [172.8 182.6 175.6 164.6]
Variance: 55.426666666666655
21.61333333333339
from scipy import stats
import statsmodels.api as sm
import statsmodels.formula.api as smf
from statsmodels.stats import power
model = smf.ols('Time ~ Page', data=four_sessions).fit()
aov_table = sm.stats.anova_lm(model)
print(aov_table)
>>>
df sum_sq mean_sq F PR(>F)
Page 3.0 831.4 277.133333 2.739825 0.077586
Residual 16.0 1618.4 101.150000 NaN NaN
Df는 자유도, Sum Sq는 제곱합, Mean Sq는 평균제곱(평균제곱편차), F value는 F통계량 을 가리킨다.
res = stats.f_oneway(four_sessions[four_sessions.Page == 'Page 1'].Time,
four_sessions[four_sessions.Page == 'Page 2'].Time,
four_sessions[four_sessions.Page == 'Page 3'].Time,
four_sessions[four_sessions.Page == 'Page 4'].Time)
print(f'F-Statistic: {res.statistic / 2:.4f}')
print(f'p-value: {res.pvalue / 2:.4f}')
>>>
F-Statistic: 1.3699
p-value: 0.0388
지금까지 설명한 분산분석은 변하는 요소(그룹)가 하나인 '일원'ANOVA이다. 하지만, 주말대 평일 이라는 두번째 요소를 고려하면(그룹A주말, 그룹A평일,그룹B주말, 그룹B평일..)에 관한데이터가 있다고 가정하자. 이때 필요한 것이 이원ANOVA이다.
이러한 여러요인과 효과를 모델링 할 수 있는 회귀와 로지스틱 회귀같은 완전한 통계 모델을 위한 첫걸음이 바로 이원 ANOVA이다.