2025년 2학기 계량분석 강의자료

8주차: 일원분산분석 (One-way ANOVA)

개념과 기본 가정


1. 일원분산분석(One-way ANOVA)란?


2. 일원분산분석의 기본 가정

분석을 하기 전에 지켜야 할 조건

  1. 정규성 (Normality)
    • 각 집단의 데이터가 정규분포(종 모양 곡선)에 가까워야 함
    • 예: 키, 시험점수 같은 연속형 자료
  2. 등분산성 (Homogeneity of variances)
    • 각 집단의 데이터 흩어짐(분산)이 비슷해야 함
    • 만약 크게 다르면 Welch의 ANOVA 등 대체 방법 사용
  3. 독립성 (Independence)
    • 한 집단의 데이터가 다른 집단에 영향을 주면 안 됨
    • 예: 같은 학생을 여러 집단에 넣으면 안 됨

👉 이 세 가지 가정을 만족해야 ANOVA 결과를 신뢰할 수 있음


3. 분산분석의 원리

이름 그대로, “분산”을 이용해 평균 차이를 분석


4. 예시와 직관적 이해

Python 실습 및 결과 해석


1. 실습 환경 준비


2. 일원분산분석 실행

가설 설정

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("→ 귀무가설 채택: 세 비료 평균은 차이가 없다.")

해석 가이드


3. 사후분석 (Post-hoc analysis)

ANOVA에서 차이가 있다고만 알려줄 뿐, 어느 집단끼리 차이가 있는지는 말해주지 않음 → 사후분석 필요

방법

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)

결과 해석 예시

👉 예를 들어, 결과가 이렇게 나온다면:


4. 정리 & 토론