샘플 데이터 생성
# 랜덤 시드 설정 (재현 가능성 위해)
np.random.seed(42)
# 데이터 생성 조건
n_samples = 1000 # 샘플 수
category_A_levels = ['A1', 'A2'] # category A의 수준 (dof = 1)
category_B_levels = ['B1', 'B2'] # category B의 수준 (dof = 1)
# 상호작용 효과를 반영한 평균값 설정
mean_values = {
('A1', 'B1'): 10,
('A1', 'B2'): 15,
('A2', 'B1'): 15, # 상호작용으로 인해 여기서는 값이 커짐
('A2', 'B2'): 10 # 상호작용으로 인해 여기서는 값이 작아짐
}
# 표준 편차 설정 (등분산성 유지)
std_dev = 3
# 샘플 데이터 생성
data = []
for _ in range(n_samples):
# 무작위로 category A와 category B를 선택
A = np.random.choice(category_A_levels)
B = np.random.choice(category_B_levels)
# 해당 그룹의 평균 값에 따라 정규 분포에서 종속 변수 값을 생성
mean = mean_values[(A, B)]
dependent_variable = np.random.normal(loc=mean, scale=std_dev)
# 데이터 저장
data.append([A, B, dependent_variable])
# 데이터프레임 생성
df = pd.DataFrame(data, columns=['category_A', 'category_B', 'dependent_variable'])
정규성 확인


등분산성 확인

잔차의 독립성(자기 상관) 확인


ANOVA table 확인

category_A의 주효과:
category_B의 주효과:
category_A와 category_B 간의 상호작용 효과 :
상호작용 효과 시각화

에타 제곱확인

category_A는 전체 분산 중 약 0.1%(0.001)을 설명한다. 이는 category_A가 종속 변수에 미치는 영향이 매우 작다는 것을 의미한다.
category_B는 전체 분산 중 거의 영향을 미치지 않는다고 볼 수 있다. 즉, category_B가 종속 변수에 미치는 효과는 매우 미미하거나 무시할 만한 수준이다.
상호작용 효과(category_A)는 전체 분산 중 약 40.3%를 설명한다. 이는 category_A와 category_B가 함께 작용할 때 종속 변수에 상당한 영향을 미친다는 것을 의미한다.
잔차(Residual)는 설명되지 않는 변동성으로, 전체 분산 중 약 59.5%는 독립 변수들로 설명되지 않는다는 것을 의미한다. 이는 종속 변수의 변동성을 설명하는 데 있어, 여전히 많은 부분이 다른 요인(독립 변수 이외의 요인)이나 오차에 기인한다는 것을 암시한다.
사후검정

| 컬럼 | 설명 |
|---|---|
| group1 / group2 | 비교하는 두 그룹 |
| meandiff | 두 그룹 간의 평균 차이 |
| p-adj | 조정된 p-value |
| lower / upper | 95% 신뢰구간 |
| reject | 두 그룹 간의 차이가 유의미한지 아닌지를 나타냄 |