1번

F-검정 통계량 :

F = (큰 분산) / (작은 분산)

 

  • df₁(분자 자유도) = 더 큰 분산 쪽의 자유도
  • df₂(분모 자유도) = 더 작은 분산 쪽의 자유도
  • 항상 “분자의 자유도가 분모의 자유도보다 크도록” 맞추는 것

 

 

 

2. 합동분산(Sp²) 추정량

  합동분산에 반드시 np.var(…, ddof=1) 값(=S₁², S₂²)을 넣으셔야 합니다!

 

  • n1, n2 : 집단 표본 크기
  • S₁², S₂² : 각 집단의 표본분산(ddof=1)

Sp2 = ((n1-1)varA + (n2-1)varB) / n1+n2-2

 

 

3번. 합동분산 t검정

import pandas as pd
import numpy as np

df = pd.read_csv("data/bcc.csv")

import pandas as pd
import numpy as np
from scipy import stats

# 데이터프레임 생성(파일에서 읽는 경우는 주석 처리)
# df = pd.read_csv("data/bcc.csv")
# 데이터 직접 복사한 경우 아래처럼 사용 (이미 df에 데이터 있음)

# 1. 그룹 분리
class1 = df[df['Classification']==1]['Resistin']
class2 = df[df['Classification']==2]['Resistin']

# 2. 로그변환
log1 = np.log(class1)
log2 = np.log(class2)

n1, n2 = len(log1), len(log2)
var1 = np.var(log1, ddof=1)
var2 = np.var(log2, ddof=1)

# (1) F-검정: 더 큰 분산/더 작은 분산
if var1 > var2:
    F = var1 / var2
    df1 = n1 - 1
    df2 = n2 - 1
else:
    F = var2 / var1
    df1 = n2 - 1
    df2 = n1 - 1

print(round(F, 3))         # ① F-값

# (2) 합동분산
Sp2 = ((n1-1)*var1 + (n2-1)*var2) / (n1+n2-2)
print(round(Sp2, 3))      # ② 합동분산


# (3) 합동분산 t-검정
mean1 = np.mean(log1)
mean2 = np.mean(log2)
t_num = mean1 - mean2
t_den = np.sqrt(Sp2 * (1/n1 + 1/n2))
t_stat = t_num / t_den
dfree = n1 + n2 - 2
p_val = 2 * (1 - stats.t.cdf(abs(t_stat), df=dfree))

print(round(t_stat, 3))   # ③-1 t-값 
print(round(p_val, 3))    # ③-2 p-값 

# + (3) 합동분산 t-검정 함수 이용방법
t_stat2, p_val2 = stats.ttest_ind(log1, log2, equal_var=True)
print(round(t_stat2, 3), round(p_val2, 3))