Skip to Content
StaticsF-test

F-test

아래는 **F 검정(F-test)**에 대한 개념과 Python 예시(주로 분산 동질성 검정과 일원분산분석(ANOVA) 관련)까지 정리한 내용입니다.


1. F 검정(F-test) 개요

F 검정은 두 가지 주요 맥락에서 흔히 쓰입니다.

  1. 두 집단(또는 여러 집단)의 분산을 비교하기 위해 사용 (예: 등분산성 검정, 분산분석의 기본 아이디어)
  2. 회귀분석에서 전체 회귀모형이 유의한지(모형 적합성) 검정할 때 사용 (ANOVA 테이블에서 F 통계량) 이때 ‘F’는 영국의 통계학자 Ronald A. Fisher의 이름에서 유래하며, F 분포(F-distribution)를 활용하는 검정이라는 의미입니다.

1.1 F 분포(F-distribution)란?

  • 카이제곱(Chi-square) 분포를 자유도(df1, df2)로 나누어 만든 비율분포
  • 연속확률분포이며, 0 이상에서 정의됨 (음수 값이 없음)
  • 두 집단(혹은 여러 집단)의 분산비(Variance Ratio)가 어떤 분포를 따르는지를 다룰 때 주로 사용됨
  • *F(ν₁, ν₂)**로 표기 (ν₁, ν₂는 자유도)

F 분포의 활용

  • 등분산성 검정(Levene, Bartlett 등): 통계량을 F 분포로 환산
  • 일원분산분석(One-way ANOVA): 집단 간 분산과 집단 내 분산의 비율로 F 값을 계산
  • 회귀분석 ANOVA 테이블: “Regression MS / Residual MS” 형태로 F 값을 계산해 모형 적합 여부 판단

2. 등분산성 검정(Variance Equality Test)

2.1 두 집단 분산 비교 (간단 F-test)

고전적 정의: “두 집단이 정규분포를 이룬다고 가정할 때, 두 분산이 같은지(H₀: σ₁² = σ₂²) 확인”

2.1.1 검정 통계량

F=s12s22F = \frac{s_1^2}{s_2^2}

  • s12,s22s_1^2, s_2^2: 각 표본 분산
  • 귀무가설(H₀): σ12=σ22\sigma_1^2 = \sigma_2^2
  • 대립가설(H₁): (양측 검정) σ12≠σ22\sigma_1^2 \neq \sigma_2^2 검정 시 df1=n1−1\text{df}_1 = n_1 - 1, df2=n2−1\text{df}_2 = n_2 - 1를 사용해 F 분포와 비교
  • 만약 F 값이 극단적으로 크거나(>임계값) 작으면(1/F 값이 크면) → 귀무가설 기각

주의: 이 고전적 F-test는 정규성 가정에 민감함.

2.1.2 Python에서의 예시

import numpy as np import scipy.stats as stats # 가상의 두 집단 생성 (정규분포 가정) np.random.seed(42) group1 = np.random.normal(loc=50, scale=5, size=30) group2 = np.random.normal(loc=50, scale=10, size=30) # 고전적 F-test (간단히 수작업) s1_sq = np.var(group1, ddof=1) s2_sq = np.var(group2, ddof=1) F_value = s1_sq / s2_sq df1 = len(group1) - 1 df2 = len(group2) - 1 # 양측 검정 -> 한쪽 꼬리 판단 후 *2 p_value_one_tailed = 1 - stats.f.cdf(F_value, df1, df2) # F_value < 1 인 경우 대칭성을 고려해야 하므로, if-else로 나눠 처리할 수도 있음 if F_value > 1: p_value = 2 * p_value_one_tailed else: p_value = 2 * stats.f.cdf(F_value, df1, df2) print("[Simple F-test for Variance Equality]") print(f"F-value = {F_value:.4f}, df1 = {df1}, df2 = {df2}, p-value = {p_value:.4f}")

하지만, 실제로는 등분산성 검정을 위해 scipy.stats.levene 또는 bartlett, fligner 등을 사용할 때가 많습니다. 그 함수들도 내부적으로 F 분포(또는 카이제곱) 기반의 검정을 수행합니다.


2.2 Levene’s test, Bartlett’s test

  • Levene’s test: 정규성 가정이 완벽히 충족되지 않아도 비교적 견고(robust).
  • Bartlett’s test: 정규성 가정이 엄격히 요구됨(정규성 위배 시 민감).
# 예시: Levene’s test stat_lev, p_lev = stats.levene(group1, group2, center='mean') print("[Levene's Test]") print(f"Statistic = {stat_lev:.4f}, p-value = {p_lev:.4f}") # 예시: Bartlett’s test stat_bart, p_bart = stats.bartlett(group1, group2) print("\n[Bartlett's Test]") print(f"Statistic = {stat_bart:.4f}, p-value = {p_bart:.4f}")
  • p-value < 0.05 → “등분산 가정 기각”
  • p-value ≥ 0.05 → “등분산 가정 채택(기각 못 함)”

3. 일원분산분석(One-way ANOVA)

3.1 ANOVA(Analysis of Variance)와 F 검정

  • *일원분산분석(One-way ANOVA)**은 “세 개 이상의 집단 평균이 모두 같은지?”를 확인하기 위한 기법이며, 핵심 아이디어는 다음과 같습니다.
  • 귀무가설(H₀): 모든 집단의 모평균이 같다() μ1=μ2=⋯=μk\mu_1 = \mu_2 = \dots = \mu_k
  • 대립가설(H₁): 적어도 한 집단은 평균이 다르다 이를 검정하기 위해, **집단 간 분산(Between-group variability)**과 집단 내 분산(Within-group variability) 비율을 구해 F 통계량을 계산합니다.

3.1.1 F 통계량 (ANOVA)

F=MSBetweenMSWithinF = \frac{\text{MS}_\text{Between}}{\text{MS}_\text{Within}}
  • MS = Mean Square(제곱합을 자유도로 나눈 값)
MSBetween=SSBetweenk1\text{MS}_\text{Between} = \frac{\text{SS}_\text{Between}}{k-1} MSWithin=SSWithinNk\text{MS}_\text{Within} = \frac{\text{SS}_\text{Within}}{N-k}
  • kk: 집단 수
  • NN: 전체 표본 수

3.1.2 검정 절차

  1. 여러 집단에서 표본을 수집(각 집단 크기 ) nin_i
  2. 분산분석 테이블을 구성 → F 값 계산
  3. F 분포를 참조해 p-value 산출
  4. p-value < 0.05 등 → 귀무가설 기각(즉, 집단 간 평균 차이가 통계적으로 유의)

3.2 Python 실습 예시 (One-way ANOVA)

3.2.1 가상의 데이터 생성

  • 예: 3개의 그룹(A, B, C)의 키(height)
    • A 평균=170, B=172, C=175, 표준편차=5 (가정)
    • 각 그룹 표본 크기=30
import numpy as np import pandas as pd import scipy.stats as stats np.random.seed(100) group_A = np.random.normal(170, 5, 30) group_B = np.random.normal(172, 5, 30) group_C = np.random.normal(175, 5, 30)

3.2.2 ANOVA (stats.f_oneway)

f_stat, p_value = stats.f_oneway(group_A, group_B, group_C) print("[One-way ANOVA]") print(f"F-statistic = {f_stat:.4f}, p-value = {p_value:.4f}") alpha = 0.05 if p_value < alpha: print("=> 귀무가설 기각: 세 그룹 간 평균에 유의한 차이가 있음.") else: print("=> 귀무가설 채택(기각 실패): 유의한 평균 차이를 찾지 못함.")

주의: stats.f_oneway는 기본적으로 “정규성”과 “등분산성”을 가정. 3개 이상의 그룹이므로 levene, bartlett 등으로 등분산성을 검토할 수 있습니다.

3.2.3 사후검정(Post-hoc test)

  • ANOVA 결과가 유의하면, “어떤 그룹 간에 차이가 있는가?”를 추가로 확인해야 합니다.
  • Tukey’s HSDBonferroni correction을 적용한 다중비교 등을 진행. 예: statsmodels.stats.multicomppairwise_tukeyhsd 함수 사용
from statsmodels.stats.multicomp import pairwise_tukeyhsd data = np.concatenate([group_A, group_B, group_C]) groups = ['A']*30 + ['B']*30 + ['C']*30 tukey_result = pairwise_tukeyhsd(endog=data, groups=groups, alpha=0.05) print("\n[Tukey's HSD Post-hoc Test]") print(tukey_result)

4. 회귀분석에서의 F 검정

다중회귀분석이나 단순회귀에서도, “전체 회귀식이 유의한가?”를 확인하기 위해 F 검정을 사용합니다.

  • 귀무가설(H₀): 모든 회귀 계수가 0(즉, 설명변수가 종속변수와 관계가 없다)
  • 대립가설(H₁): 적어도 하나의 계수가 0이 아니다(설명력이 있다) 결과로 나오는 ANOVA 테이블 형태:
SS df MS F p-value Regression SSR k MSR=SSR/k MSR/MSE Residual SSE n-k-1 MSE=SSE/(n-k-1) Total SST n-1
  • F = MSR / MSE
  • MSR(Mean Square Regression) = SSR / k
  • MSE(Mean Square Error) = SSE / (n - k - 1) 이 F 값과 대응 p-value를 통해 회귀모델 전체가 유의미한지 판단합니다.

5. 정리 및 요약

  1. F 검정F 분포를 사용한 검정으로, 다음과 같은 주요 용도가 있음:
  • 두 집단(또는 여러 집단)의 분산 비교 (등분산성 검정)
  • *분산분석(ANOVA)**에서 집단 간 분산대비 집단 내 분산의 비율로 평균 차이 유무 판단
  • 회귀분석 ANOVA 테이블에서 전체 모형의 유의성 검정
  1. F 분포는 0 이상에서 정의되고, 두 카이제곱 분포(자유도 ν1,ν2\nu_1, \nu_2)의 비율로 정의
  2. Python에서의 주요 함수:
  • scipy.stats.f_oneway: 일원분산분석(One-way ANOVA)
  • scipy.stats.levene/bartlett/fligner: 등분산성 검정(내부적으로 F나 카이제곱 개념 활용)
  • 직접 F 통계량을 계산할 수도 있음(예: 2개 그룹 간 분산비)
  1. 가정:
  • 정규성: ANOVA, Bartlett 등은 정규성에 민감
  • 등분산성: ANOVA에서 집단 간 분산이 동질하다고 가정
  • 정규성 및 등분산성이 어긋나면 비모수적 방법(크루스칼-월리스 검정, 브라운-포사이쓰 등) 고려

6. 결론

  • F 검정은 T 검정이나 Z 검정과 마찬가지로, 특정 통계량이 어떤 분포(F 분포)를 따른다는 아이디어로부터 출발합니다.
  • 2개 이상 집단의 분산비나, 분산분석(ANOVA)을 통해 여러 집단 평균의 차이를 검정할 때 핵심적으로 사용됩니다.
  • 실무에서 자주 맞닥뜨리는 등분산성 검정(Levene/Bartlett), ANOVA회귀분석 F 검정이 모두 이 F 검정의 응용 사례라 이해하면 좋습니다. 분석 시에는 정규성·등분산성 가정을 사전에 확인하고, 필요하면 대체 검정(예: Welch ANOVA, Kruskal-Wallis, Fligner-Killeen test 등)을 적용하도록 유념하시기 바랍니다.