Statics / 통계는 실전이야: t-test.md

통계는 실전이야: t-test

조회

Student's t-test

두 집단간의 평균 차이가 통계적으로 유의한지 확인하기 위해 쓰는 통계 분석 기법입니다. 스튜던트는 그 만든 양반 필명임.

 

t-test의 종류

1. 단일 표본 t-test: 단일 집단의 평균과 특정 값과의 차이가 통계적으로 유의미한지 확인할 때 쓴다.

2. 독립 표본 t-test: 두 집단간 차이를 보는건데, 그 두 집단이 서로 다른 집단이다.

3. 대응 표본 t-test: 두 집단이 비포 앤 애프터다. (예: 운동 전/운동 후)


# 샘플 (샘플 크기가 충분)
group_A = np.random.normal(loc=50, scale=10, size=50)
group_B = np.random.normal(loc=55, scale=12, size=50)
# 샘플(크기는 충분하지 않지만 조건은 만족)
group_C = np.random.normal(loc=100, scale=15, size=15)
group_D = np.random.normal(loc=105, scale=15, size=15)
# 샘플(티테스트 하면 안되는)
group_E = np.random.exponential(scale=2, size=10) # 비정규 분포
group_F = np.random.normal(loc=10, scale=1, size=10)

샘플이 세개임다. 잘 따라오십쇼.


표본 수가 충분할 때

t_stat, p_value = stats.ttest_ind(group_A, group_B)

print(f'T-statistic: {t_stat:.4f}')

if p_value < 0.05:
    print(f"p-value: {p_value:.4e}")
    print(f"Reject the null hypothesis")
else:
    print(f"p-value: {p_value:.4e}")
    print(f"Fail to reject the null hypothesis")

그 표본 수 마지노선이 30이거든요? 30개 넘으면 걍 돌리십쇼.

 

T-statistic: -2.8980
p-value: 4.6337e-03
Reject the null hypothesis

두 집단의 차이가 통계적으로 유의미하다 뭐 이런 얘기다.

 

표본 수가 적다!

다음것도 돌리려고 봤더니... 표본 수가 30개가 안된다? 그래도 10개가 넘었다면 아직 희망은 있습니다. 

 

정규성 검사

# 1. 두 집단의 정규성 검정
stat, p_value = shapiro(group_C)

if p_value < 0.05:
    print(f"p-value: {p_value:.4e}")
    print(f"정규성을 만족하지 않으므로, T-test를 할 수 없습니다. ")
else:
    print(f"p-value: {p_value:.4e}")
    print(f"정규성을 만족하므로, T-test를 할 수 있습니다.")
# 1. 두 집단의 정규성 검정
stat, p_value = shapiro(group_D)

if p_value < 0.05:
    print(f"p-value: {p_value:.4e}")
    print(f"정규성을 만족하지 않으므로, T-test를 할 수 없습니다. ")
else:
    print(f"p-value: {p_value:.4e}")
    print(f"정규성을 만족하므로, T-test를 할 수 있습니다.")

일단 정규성과 등분산성을 만족하고 표본의 수가 10보다는 크면 t-test 돌릴 수는 있다. 근데 문제가 뭐냐… 정규성을 둘 중 하나라도 만족하지 않으면 비모수 검정으로 빠지셔야 합니다. t-test는 데이터가 정규분포를 따른다는 모수적 가정을 기반으로 하거든… 혹시 시각적으로 보고싶다 그러면 큐큐플롯 함 그려보십쇼.

 

등분산성 검사

# 등분산성 검정
stat, p = levene(group_C, group_D)

print(f"Levene test statistic: {stat:.4f}")
if p < 0.05:
    print("등분산성을 만족하지 않으므로, 등분산 t-test를 할 수 없습니다.")
else:
    print("등분산성을 만족하므로, 등분산 t-test를 할 수 있습니다.")

이거 돌리면 등분산인지도 확인 가능하다. 아마 그룹 C, 그룹 D는 표본 수는 적지만 조건을 만족하는 걸로 만들어서 당연하게도 등분산성을 만족할 것이다. 아 큐큐도 일자예요? 둘다 일자면 t-test 합격이다.

 

t_stat, p_value = stats.ttest_ind(group_C, group_D)

print(f'T-statistic: {t_stat:.4f}')

if p_value < 0.05:
    print(f"p-value: {p_value:.4e}")
    print(f"Reject the null hypothesis")
else:
    print(f"p-value: {p_value:.4e}")
    print(f"Fail to reject the null hypothesis")
T-statistic: -1.4077
p-value: 1.7024e-01
Fail to reject the null hypothesis

귀무가설 기각은 실패했다. 두 집단간 차이가 통계적으로 유의하진 않다네...

 

정규성, 등분산성 위반 시

그룹 E, F 역시 표본의 수가 작기때문에 정규성 및 등분산성 검정을 해봤는데 등분산이 아니고 한쪽이 정규성을 위반한다. 그럼 어떻게 해요? 비모수로 빠지셔야죠.

 

본인이 하려던 t-test가 대응 표본이면 윌콕슨 부호순위 검정(단일표본도)을, 독립 표본이면 여기서도 자주 봤던 맨-휘트니 U 검정을 하면 된다. 아 등분산성도 망했어요? 그러면 웰치스 t-test도 있습니다.

 

u_stat, p_val = stats.mannwhitneyu(group_E, group_F, alternative='two-sided')

print("=== Mann-Whitney U Test 결과 ===")
print(f"U 통계량: {u_stat:.2f}")
print(f"p-value: {p_val:.4e}") # 지수 표기법으로 출력 (매우 작을 경우 대비)

# 3. 결과 해석
alpha = 0.05
if p_val < alpha:
    print(f"\n[해석] p-value가 {alpha}보다 작으므로, 두 집단간의 차이는 통계적으로 매우 유의미합니다.")

else:
    print(f"\n[해석] p-value가 {alpha}보다 크므로, 두 집단 간의 차이가 통계적으로 유의미하다고 볼 수 없습니다.")

이건 독립표본이니까 맨 휫흐니로 틀어보겠음.

 

=== Mann-Whitney U Test 결과 ===
U 통계량: 0.00
p-value: 1.8267e-04

[해석] p-value가 0.05보다 작으므로, 두 집단간의 차이는 통계적으로 매우 유의미합니다.

그렇다고 합니다.

'Statics' 카테고리의 다른 글

통계는 실전이야: Chi-square(카이제곱검정)  (0) 2026.02.02
정규성, 그리고 비모수검정  (0) 2026.02.01
PCA, MCA, FAMD  (0) 2026.01.29
섀넌 엔트로피  (0) 2026.01.28
MSA, 폐암 분석 파일에 통계분석 추가  (0) 2026.01.23

댓글

홈으로 돌아가기

검색 결과

"search" 검색 결과입니다.