본문 바로가기
개발/Python

이원분산분석 (Two-Way ANOVA)

by 피로물든딸기 2025. 8. 16.
반응형

전체 링크

 

다음 데이터에 대해 성별과 과목의 교호 작용 효과가 있는지 판단하라.

 

귀무가설 : 교호작용 효과가 없다. → 두 요인의 결합 효과는 단순히 개별 효과의 합이다 (선형적, 플롯이 평행함)
대립가설 : 교호작용 효과가 있다.

 

가정 : 각 그룹은 정규분포를 따르고 분산이 같으며(등분산성독립된 표본이어야 한다.

import numpy as np
import pandas as pd

# 종속변수 = 점수
# 독립변수 1, 2 = 성별, 수업방식

df = pd.DataFrame({
    'score': [88, 92, 95, 89, 90, 91, 85, 87, 86, 90, 93, 94],
    'gender': ['M', 'M', 'M', 'M', 'F', 'F', 'F', 'F', 'M', 'M', 'F', 'F'],
    'method': ['online', 'online', 'offline', 'offline', 'online', 'online', 'offline', 'offline',
               'online', 'offline', 'online', 'offline']
})

df.head()


ols에 교호 작용 효과를 판단하려는 변수 2개를 *로 수식을 만들고 anova_lm을 이용하면 된다.

from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm

model = ols('score ~ gender * method', data=df).fit()
anova_results = anova_lm(model)

anova_results


참고

 

교호작용이 있는 경우와 없는 경우의 비교는 다음과 같다.

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
import statsmodels.formula.api as smf

# 데이터 생성
np.random.seed(42)
n = 100
A = np.random.choice(['Low', 'High'], size=n)
B = np.random.choice(['X', 'Y'], size=n)

# 교호작용이 없는 경우 (평행한 효과)
y_no_interaction = (
    5 +
    (A == 'High') * 2 +     # A 효과
    (B == 'Y') * 3 +        # B 효과
    np.random.normal(0, 1, size=n)
)

# 교호작용이 있는 경우 (비평행)
y_interaction = (
    5 +
    (A == 'High') * 2 +
    (B == 'Y') * 3 +
    (A == 'High') * (B == 'Y') * 4 +  # interaction 효과
    np.random.normal(0, 1, size=n)
)

# 데이터프레임 생성
df_no_interaction = pd.DataFrame({'A': A, 'B': B, 'y': y_no_interaction})
df_interaction = pd.DataFrame({'A': A, 'B': B, 'y': y_interaction})

# 교호작용 플롯
fig, axes = plt.subplots(1, 2, figsize=(12, 5), sharey=True)

sns.pointplot(x='B', y='y', hue='A', data=df_no_interaction, ax=axes[0])
axes[0].set_title('Interaction Effcet X (parallel)')

sns.pointplot(x='B', y='y', hue='A', data=df_interaction, ax=axes[1])
axes[1].set_title('Interaction Effcet O')

plt.tight_layout()
plt.show()

교호작용이 없는 경우 플롯이 평행한 것을 알 수 있다.

(p-value가 0.05이하 → 교호작용 효과가 있음 → 플롯이 평행하지 않다.)

 

반응형

댓글