개념과 기본 가정
1. 일원분산분석(One-way ANOVA)란?
- 정의: 하나의 독립변수(원인)가 있고, 그 변수가 3개 이상의 집단으로 나뉠 때, 이 집단들의 평균이 모두 같은지, 아니면 차이가 있는지를 검정하는 방법
- 왜 필요한가?
- T-test: 두 집단의 평균만 비교 가능
- ANOVA: 세 집단 이상 비교 가능
- 예:
- 3개 학급 학생들의 수학 점수 평균 비교
- 3종류 비료가 작물 생장에 미치는 효과 비교
- 1종 오류 문제
- 집단이 3개 이상일 때, T-test를 여러 번 반복하면 “우연히 차이가 있다”는 잘못된 결론(1종 오류)이 커짐
- 이를 방지하기 위해 ANOVA 한 번으로 전체 집단을 동시에 비교
2. 일원분산분석의 기본 가정
분석을 하기 전에 지켜야 할 조건
- 정규성 (Normality)
- 각 집단의 데이터가 정규분포(종 모양 곡선)에 가까워야 함
- 예: 키, 시험점수 같은 연속형 자료
- 등분산성 (Homogeneity of variances)
- 각 집단의 데이터 흩어짐(분산)이 비슷해야 함
- 만약 크게 다르면 Welch의 ANOVA 등 대체 방법 사용
- 독립성 (Independence)
- 한 집단의 데이터가 다른 집단에 영향을 주면 안 됨
- 예: 같은 학생을 여러 집단에 넣으면 안 됨
👉 이 세 가지 가정을 만족해야 ANOVA 결과를 신뢰할 수 있음
3. 분산분석의 원리
이름 그대로, “분산”을 이용해 평균 차이를 분석
- 집단 간 분산 (Between-group variance)
- 각 집단 평균이 전체 평균에서 얼마나 떨어져 있는가?
- → 크면 집단 간 차이가 크다는 뜻
- 집단 내 분산 (Within-group variance)
- 같은 집단 안에서 학생들 점수가 얼마나 흩어져 있는가?
- → 개인차, 우연한 변동
- F-통계량
$$F = \frac{\text{집단 간 분산}}{\text{집단 내 분산}}$$
- 집단 간 분산이 집단 내 분산보다 훨씬 크면 → 집단 평균이 다르다고 볼 수 있음
4. 예시와 직관적 이해
- 예시 상황
- 3개 반(1반, 2반, 3반)의 수학 시험 평균이 모두 같은지 확인
- 귀무가설 $H_0$: 세 반의 평균 점수는 같다
- 연구가설 $H_a$: 적어도 한 반의 평균은 다르다
- 직관적 그림
- 집단 간 분산 ↑ → 반별 평균 점수 차이가 큼
- 집단 내 분산 ↓ → 같은 반 학생들 점수가 비슷함
- 결과적으로 F-값 ↑ → “집단 평균이 다르다” 가능성이 커짐
Python 실습 및 결과 해석
1. 실습 환경 준비
- 사용 라이브러리
- `scipy.stats` → ANOVA 수행 (`f_oneway`)
- `pandas` → 데이터 구조화
- `statsmodels` → 사후분석 (Tukey HSD)
- 실습 데이터 시나리오
- 3종류 비료(A, B, C)가 식물 성장에 어떤 차이를 주는지 확인
- 각 비료를 사용한 식물 5개씩의 성장량 기록
2. 일원분산분석 실행
가설 설정
- 귀무가설($H_0$): 세 집단 평균은 같다 ($\mu_A = \mu_B = \mu_C$)
- 연구가설($H_a$): 적어도 하나의 집단 평균은 다르다
Python 코드
import pandas as pd
from scipy import stats
# 1) 가상 데이터 (비료별 성장량, 단위 cm)
fertilizer_a = [15, 18, 16, 17, 19]
fertilizer_b = [22, 21, 25, 24, 23]
fertilizer_c = [10, 12, 11, 13, 9]
# 2) ANOVA 실행
f_stat, p_value = stats.f_oneway(fertilizer_a, fertilizer_b, fertilizer_c)
print(f"F-통계량: {f_stat:.3f}")
print(f"P-값: {p_value:.4f}")
# 3) 유의수준 판단
alpha = 0.05
if p_value < alpha:
print("→ 귀무가설 기각: 세 비료 평균은 모두 같다고 보기 어렵다.")
else:
print("→ 귀무가설 채택: 세 비료 평균은 차이가 없다.")
해석 가이드
- F값이 클수록 집단 평균 간 차이가 크다는 뜻
- P값 < 0.05 → “집단 간 평균 차이 있음”
- P값 ≥ 0.05 → “평균 차이 없음”
3. 사후분석 (Post-hoc analysis)
ANOVA에서 차이가 있다고만 알려줄 뿐, 어느 집단끼리 차이가 있는지는 말해주지 않음 → 사후분석 필요
방법
- 가장 널리 쓰이는 방법: Tukey의 HSD
- 모든 집단 쌍을 비교해 평균 차이 확인
Python 코드
import pandas as pd
import statsmodels.api as sm
from statsmodels.stats.multicomp import pairwise_tukeyhsd
# 데이터프레임 구성
data = pd.DataFrame({
'growth': fertilizer_a + fertilizer_b + fertilizer_c,
'fertilizer': ['A']*5 + ['B']*5 + ['C']*5
})
# Tukey HSD 사후분석
tukey = pairwise_tukeyhsd(endog=data['growth'],
groups=data['fertilizer'],
alpha=0.05)
print("\n=== Tukey 사후분석 결과 ===")
print(tukey)
결과 해석 예시
- 출력에는 집단 쌍(A-B, A-C, B-C) 비교 결과가 나옴
- `reject=True` → 평균이 다르다고 판단
- `reject=False` → 평균이 같다고 볼 수 있음
👉 예를 들어, 결과가 이렇게 나온다면:
- A-B: 차이 있음
- A-C: 차이 있음
- B-C: 차이 없음
→ 즉, 비료 B와 C는 효과가 비슷하지만, 비료 A는 둘과 다름
4. 정리 & 토론
- ANOVA는 세 집단 이상 평균 비교에 사용
- P값만으로는 “차이가 있다/없다”까지만 알 수 있음
- 차이가 있다면 → 반드시 사후분석으로 구체적인 차이 확인 필요
- 실제 적용 예시:
- 학급별 평균 성적 비교
- 지역별 소득 차이 분석
- 약물 종류별 치료 효과 검증