본문 바로가기

AI

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

"어떤 광고를 하고, 어떤 프로모션을 진행했을 때 매출이 가장 잘 나올까?"

라는 주제로 실습 데이터를 직접 만들어 분석해 보죠.

1. 분석 시나리오: 광고 매체 & 프로모션 전략

  • 독립변수 1 (광고 매체): SNS, TV, 유튜브 (3개 집단)
  • 독립변수 2 (프로모션 유형): 1(할인 쿠폰), 2(사은품 증정) <- 숫자형 범주 데이터!
  • 종속변수: 매출액 (단위: 백만 원)

가설 설정 (h0 & h1)

  1. 광고 매체(주효과): 광고 매체에 따른 평균 매출액 차이는 없다.
  2. 프로모션(주효과): 프로모션 유형에 따른 평균 매출액 차이는 없다.
  3. 상호작용 효과: 광고 매체와 프로모션 유형 간에는 상호작용 효과가 없다. (즉, 광고에 따라 프로모션 효과가 달라지지 않는다.)

2. 실습 데이터 생성

외부 데이터 없이 바로 실행 가능하도록 코드를 구성했습니다.

Python
 
import pandas as pd

# 직접 실습할 수 있는 데이터 생성
data = {
    '광고': ['SNS', 'TV', 'Youtube'] * 10,
    '프로모션': [1, 1, 1, 2, 2, 2] * 5,  # 1:할인, 2:사은품
    '매출액': [
        50, 45, 60, 55, 48, 65, 52, 44, 62, 58, 47, 68, # 1~12
        51, 46, 61, 56, 49, 66, 53, 43, 63, 59, 46, 69, # 13~24
        49, 45, 59, 54, 48, 64                          # 25~30
    ]
}
df = pd.DataFrame(data)
print(df.head())

3. 이원 분산 분석 수행 (핵심: 범주형 처리)

가장 많이 실수하는 부분이 바로 숫자로 된 범주형 변수를 그대로 넣는 것입니다. C()를 사용해 "이건 숫자가 아니라 그룹 이름이야!"라고 알려줘야 합니다.

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

# C()를 사용하여 '프로모션'이 범주형임을 명시
# '광고 * 프로모션'은 주효과와 상호작용을 모두 포함합니다.
model = ols('매출액 ~ 광고 * C(프로모션)', data=df).fit()
anova_table = anova_lm(model)

print(anova_table)

결과 해석법

  • 광고 (PR(>F)): 0.05보다 작다면 광고 매체별 매출 차이가 확실히 있는 겁니다.
  • C(프로모션) (PR(>F)): 0.05보다 작다면 프로모션 전략에 따라 매출이 달라지는 거죠.
  • 광고:C(프로모션) (PR(>F)): 이게 핵심! 만약 0.05보다 작다면, "SNS는 사은품이 잘 먹히는데, TV는 할인이 더 잘 먹힌다"는 식의 조합의 힘(상호작용)이 존재한다는 뜻입니다.

4. 사후 검정 (Post-hoc)

어떤 광고 매체가 최고였는지, 어떤 프로모션이 더 효과적이었는지 구체적으로 뜯어봅니다.

Python
 
from statsmodels.stats.multicomp import pairwise_tukeyhsd

# 1. 광고 매체에 대한 사후검정
tukey_ad = pairwise_tukeyhsd(df['매출액'], df['광고'], alpha=0.05)
print("--- 광고 매체 사후 검정 ---")
print(tukey_ad.summary())

# 2. 프로모션에 대한 사후검정 (숫자형이므로 문자열 변환 필수)
tukey_promo = pairwise_tukeyhsd(df['매출액'], df['프로모션'].astype(str), alpha=0.05)
print("\n--- 프로모션 사후 검정 ---")
print(tukey_promo.summary())
  • reject가 True인 항목이 서로 통계적으로 유의미하게 차이가 나는 그룹들입니다.

5. 더 엄격한 기준, Bonferroni (본페로니)

투키보다 보수적인 방법이죠.

Python
 
from scipy import stats
from statsmodels.stats.multicomp import MultiComparison

# 광고 매체 비교
mc = MultiComparison(df['매출액'], df['광고'])
bon_result = mc.allpairtest(stats.ttest_ind, method="bonf")
print(bon_result[0])
  • pval_corr(보정된 p-value)이 0.05보다 작은지 확인하는 것이 포인트입니다!

마치며

이원 분산 분석에서 꼭 기억할 것은 두 가지입니다.

  1. C(변수): 숫자로 된 집단 구분 변수는 반드시 범주형 처리를 할 것!
  2. 광고 * 프로모션: 상호작용 효과까지 한 번에 확인하는 가장 쉬운 방법!

 

'AI' 카테고리의 다른 글

일원분산분석( one-way ANOVA ) with python  (0) 2026.05.14
분산분석 ANOVA  (0) 2026.05.13
카이제곱 검정  (0) 2026.05.11
Qdrant + NCP Clova Embedding으로 AI 기반 매칭 시스템 구축하기  (2) 2025.12.04