One-Way ANOVA

이정훈·2026년 2월 6일

One-Way ANOVA

  • 하나의 독립변수가 categorical, 종속변수는 continuous 일 떄 one-way ANOVA 적용

    Two-Way ANOVA
    두 개의 독립변수(Cat)와 종속변수 간의 interaction(교호작용) 및 평균 비교
    χ2χ 2 독립성 검정
    두 범주형 변수가 독립인지, 연관성이 있는지 확인

  • t-test를 여러번 사용하면 1종 오류가 증가하여 신뢰도 X

  • 직관적으로 그룹간의 평균간의 거리 / random한 변화의 정도를 의미

"분산"으로 "평균"을 비교?

업로드중..

  • Betwwen-Variance가 크다는 것은 그룹간의 평균간의 거리가 얼마나 멀리 떨어져 있는지 "짐작"할 수 있음
  • "짐작"이라 한 이유는 기준이 없기 때문에 통계적으로 판단할 수 없음
  • 그래서 Within-Variance를 기준으로 두 분산을 비교 -> F값

    Within-Variance는 random한(무의미한) 변화의 정도

  • Betwwen-VarianceWithin-Variance보다 충분히 커야 통계적으로 크다고 말할 수 있음 → 평균값이 전체평균과는 다르다

ANOVA의 3가지 가정

  1. 정규성 (Normality): 각 집단의 표본은 정규분포를 따라야 함
  2. 등분산성 (Homogeneity of Variance): 모든 집단의 분산은 같아야 함
    • Check: Bartlett Test, Levene Test
  3. 독립성 (Independence): 표본들은 서로 독립적

가설 설정

  • 귀무가설 (H0H_0): 모든 집단의 평균은 동일하다. (차이가 없다)
    H0:μA=μB=μC=H_0: \mu_A = \mu_B = \mu_C = \dots
  • 대립가설 (H1H_1): 적어도 한 집단의 평균은 다르다.

ANOVA Table

변동 요인SS (제곱합)df (자유도)MS (Variance)F-value (분산/분산)P-value
집단 간
(Between)
SSBSSBk1k-1MSB=SSBk1MS_B = \frac{SSB}{k-1}F=MSBMSWF = \frac{MS_B}{MS_W}p=fdist(f,df1,df2)p=fdist(f, df_1, df_2)
집단 내
(Within)
SSWSSWNkN-kMSW=SSWNkMS_W = \frac{SSW}{N-k}--
합계
(Total)
SSTSSTN1N-1---
  • kk: 집단의 수
  • NN: 전체 데이터 개수
  • SST=SSB+SSWSST = SSB + SSW

    SST식의 항인 (yijyˉ)=(yijyˉi)Within+(yˉi>yˉ)Between(y_{ij} - \bar{y}_{\cdot\cdot}) = \underbrace{(y_{ij} - \bar{y}_{i\cdot})}_{\text{Within}} + \underbrace{(\bar{y}_{i\cdot} - >\bar{y}_{\cdot\cdot})}_{\text{Between}}
    위항으로 분해하여 제곱된 값을 풀어주면 교차항이 생기고, 교차항는 "편차의 합"으로 0

4. 결과 해석 (F-value와 P-value)

  • F값을 구했다면 F분포 상에서 이 값이 얼마나 유의한지 확인.

  • P-value < 유의수준(α\alpha, 0.05):
    • H0H_0 기각 \rightarrow "집단 간 평균의 차이가 통계적으로 유의하다."
  • P-value \ge 유의수준(α\alpha, 0.05):
    • H0H_0 채택 \rightarrow "집단 간 평균이 다르다고 할 증거가 없다."

5. 한계점과 사후 검정 (Post-hoc)

  • ANOVA는 모든 그룹의 평균이 같은지 통계적 유의성을 검정해주지만, 귀무가설이 기각된 경우 "구체적으로 어떤 그룹끼리 평균이 다른가?"에 대한 설명은 제시하지 않음
  • 구체적인 차이를 확인하기 위해 Tukey's HSD, Bonferroni, Scheffe 등의 사후검정(Post-hoc Analysis)이 추가로 필요

from scipy import stats

n = df_prob2.shape[0]
g_mean = df_prob2['loading_log'].mean()
k = len(df_prob2['product_code'].unique())

ssb = df_prob2.groupby('product_code')['loading_log'].apply(lambda ts: (ts.mean() - g_mean) ** 2 * ts.count()).sum()
ssw = df_prob2.groupby('product_code')['loading_log'].apply(lambda ts: ((ts - ts.mean()) ** 2).sum()).sum()

f_value = (ssb / (k - 1)) / (ssw / (n - k))
p_value = stats.f.sf(f_value, (k - 1), (n - k))

f_value, p_value
profile
AngDDo

0개의 댓글