통계학 공부

가설검정 (단일, 독립, 대응표본 t검정)

myun0506 2026. 2. 17. 22:23

- 가설검정의 기본 순서 

STEP1: 가설 설정 - 귀무가설과 대립가설 각각 설정
STEP2: 가설에 적합한 검정 방법 선택
STEP3: 유의수준 결정
STEP4: 검정방법에 따라서 표본의 검정통계량과 p-value 계산
STEP5: 유의수준과 p-value를 비교하여 귀무가설의 기각여부 결정

 

- 가설검정의 종류 

  • 분포에 따른 구분
검정 방식 관련 분포 활용대상 대상 검정통계량
Z-검정 표준정규분포(Z분포) 집단 개수: 주로 2개
표본의 평균 비교
모집단의 분산을 알 수 있는 경우
연속형 자료
t-검정 t분포 집단 개수: 주로 2개
표본의 평균 비교
모집단의 분산을 알 수 없는 경우
연속형 자료
F-검정 (분산분석 ANOVA) F분포 집단 개수: 주로 3개 이상
두 개 이상의 그룹의 분산 비교
3개 이상의 집단 간 평균의 차이 비교
연속형 자료
이항 비율 검정 이항분포
표준정규분포(Z-분포)
집단 개수 : 1개 or 2개
표본의 비율 비교 ( ex. 전환율 비교)
범주형 자료
카이제곱검정 카이제곱분포 집단 개수: 주로 2개 이상
독립성 검정 : 두 범주형 변수가 독립적인지
적합도 검정 : 데이터가 특정 분포를 따르는지
범주형 자료
  • 상황에 따른 구분 (모수검정)
비교 대상  상황 검정  관련분포  전제조건
평균 한 집단 vs 기준값 단일표본 t검정 t분포 정규성
독립된 두 집단 독립표본 t검정 t분포 정규성, 등분산성
대응된 두 집단 대응표본 t검정 t분포 정규성
세 집단 이상 ANOVA F분포 정규성, 등분산성, 독립성
비율 한 집단 vs 기준값 단일표본 이항비율 z-검정 이항분포 표본수가 커야 함 ( np > 5, n(1-p) > 5)
n: 표본의 크기, p: 표본에서 구한 비율
독립된 두 집단 이표본 이항비율 z-검정 이항분포 표본수가 커야 함 ( np_1 > 5, np_2>5, n(1-p_1) > 5, n(1-p_2)>5)
독립성
현실적으로 모집단의 분산을 알 수 있는 경우가 많지 않기 때문에 t-검정을 주로 사용합니다.

 

- t-검정

1개 또는 2개의 집단 간 평균 차이를 비교하는 검정 방법. 정규분포를 가정.

 

  • t-검정의 전제
    • 정규성: 정규분포에서 나온 데이터라는 전제를 가짐
    • 등분산성 : 비교 대상의 분산이 같다
    • → 전제가 어긋날 경우 비모수검정(non-parametric test)을 고려해야 함
  • t-검정의 종류
    • 단일표본 t검정 (One-Sample t-test)
      • 하나의 집단 평균이 특정 기준값과 다른지 비교
      • 예 : 학생들의 평균 수면시간이 7시간과 다른가?
        • 귀무가설 : 모집단의 평균은 7시간이다.
        • 대립가설 : 모집단의 평균은 7시간이 아니다.
      • 연구 맥락에 따라 의미 있는 기준값을 설정하는 것이 중요
    • 이표본 t검정 (Two-Sample t-test)
      • 독립표본 t검정과 동의어
      • 서로 독립된 두 집단의 평균 차이 비교
      • 예 : 남학생과 여학생의 평균 키가 다른가?
        • 귀무가설 : 두 집단의 평균은 같다.
        • 대립가설 : 두 집단의 평균은 다르다.
      • 전제 조건 : 정규성, 등분산성
        • 정규성이 어긋날 경우 → Mann-Whitney U검정 사용 (비모수 대안)
        • 정규성은 충족, 등분산성이 어긋날 경우 → Welch t검정을 사용 (정규성 가정은 여전하지만 분산은 달라져도 괜찮음)
    • 대응표본 t검정 (Paired t-test)
      • 같은 집단에서 전과 후를 비교하거나, 쌍을 이룬 데이터 비교
      • 예 : 약 복용 전후의 혈압 차이 → 비교 대상이 같은 사람, 같은 특성
      • 두 시점의 차이값(후 - 전) 자체가 정규성을 가져야 함
        • 정규성 어긋날 경우 : Wilcoxon signed-rank 검정 사용
  • 대응 여부 구분하기
구분 독립 t 검정 대응 t 검정 
데이터 구조 두 집단이 전혀 다른 사람들  같은 사람의 전/후 변화
예시 실험군 vs 대조군  복용 전 vs 복용 후
검정이름 이표본 t검정 대응표본 t검정

 

  • t-검정의 전제: 정규성과 등분산성
    • 정규성 : 표본이 정규분포를 따르는 모집단에서 나왔다고 가정
    • 등분산성 : 두 집단의 분산이 동일하다고 가정
  • 정규성 검정 : 표본이 정규분포를 따르고 있는지 검정
방법 설명 사용 시기
Q-Q플랏 정규분포와 데이터의 분위수를 비교하는 시각적 도구 탐색적 단계, 직관적 확인
히스토그램 확인 데이터 분포의 대칭성과 종모양을 시각적으로 확인 보조 자료로 사용
샤피로-윌크 검정 귀무가설: “정규분포이다” (p < 0.05면 정규성 기각) 소표본일 때 효과적
Kolmogorov-Smirnov 검정 (KS 검정) 이론적 분포(정규분포 등)와 데이터 분포의 차이 검정 대체로 샤피로보다 덜 민감

 

표본의 크기가 클 때 정규성 가정 완화

n > 30이면 ( 표본의 크기가 크면 ) 중심극한 정리에 의해 자료가 정규분포가 아니더라도 정규성 가정을 기반으로 한 검정(t-검정 등)을 사용할 수 있다.

ex) Q-Q 플랏의 결과가 약간 삐져나온 정도인데 샤피로-윌크 검정에서 p-value < 0.05로 정규성 기각을 하려 했지만 표본의 크기가 크면 정규성을 가정으로 검정을 할 수 있음 (정규성 가정 완화할 수 있다)

그러나, 표본 수가 작은데 분포가 다음과 같은 특징을 보이면, 비모수 검정을 사용한다.
- 극단적 비대칭
- heavy tail
- 명백한 이상치

 

  • 등분산성 검정
방법 설명 사용 시기
Levene 검정 귀무가설: "두 집단의 분산은 같다" 가장 널리 쓰이며 정규성 민감도 낮음
Bartlett 검정 세 집단 이상에서 분산 동질성 검정 2개 이상 집단의 분산이 동일한지 검정 (정규성 가정 강함)
정규성은 충족, 등분산성이 어긋날 경우 : Welch t검정을 사용

 

- 정리

  단일 독립 대응
모두 만족 단일표본 t-검정 독립표본- t검정 대응표본 - t검정
정규성 불만족 (비모수 검정) Wilcoxon 부호 순위 검정 Mann Whitney U-검정 Wilcoxon 부호 순위 검정
등분산성 불만족 (비모수 검정) - (단일 표본이므로 등분산성 검정 필요 없음) Welch t검정 - (같은 표본이므로 등분산성 검정 필요 없음)
모수는 숫자값 자체를 가지고 비교를 하지만 비모수 검정의 경우엔 중앙값과 같이 그 값이 어디에 위치해있는지를 기준으로 비교를 함

 

- 가설검정

  • 표본 데이터를 통해 모집단의 가설을 검증하는 과정
  • 즉, 데이터가 특정 가설을 지지하는지 평가하는 과정 
  • 귀무가설과 대립가설을 설정하고 귀무가설을 기각할지를 결정 
  • 두가지 전략을 취할 수 있음
    • 확증적 자료분석 
      • 미리 가설들을 먼저 세운 다음 가설을 검증해 나가는 분석 
    • 탐색적 자료분석 
      • 가설을 먼저 정하지 않고 데이터를 탐색해보면서 가설 후보들을 찾고 데이터의 특징을 찾는 것 
  • 통계적유의성
    • 결과가 우연히 발생한 것이 아니라 어떤 효과가 실제로 존재함을 나타내는 지표 
    • p값은 귀무가설이 참일경우 관찰된 통계치가 나올 확률을 의미 
    • 일반적으로 p값이 0.05 미만이면 결과를 통계적으로 유의하다고 판단
  • p-값 
    • 귀무가설이 참일 때, 관찰된 결과 이상으로 극단적인 결과가 나올 확률 
    • 일반적으로 p-값이 유의수준보다 작으면 귀무가설을 기각 
  • p-값을 통한 유의성 확인
    • p-값이 0.03이라면 3%확률로 우연히 이러한 결과가 나올 수 있음
    • 즉, 유의수준보다 낮은 확률!!!로 귀무가설이 참일 때 이러한 유의미한 결과가 나올 수 있음
    • 효과가 없다면 0.03%의 확률로 이러한 결과가 나올텐데 이 확률이 굉장히 낮으니까 효과가 없다는 가설이 거짓이지 않을까?
  • 가설검정
    • 모수가 특정 값과 같은지 다른지 테스트 
# 기존 약물(A)와 새로운 약물(B) 효과 데이터 생성
A = np.random.normal(50, 10, 100)
B = np.random.normal(55, 10, 100)

# 평균 효과 계산 
mean_A = np.mean(A) 
mean_B = np.mean(B) 

# t-검정 수행 
t_stat, p_value = stats.ttest_ind(A, B) 

print(f"A 평균 효과: {mean_A}")
print(f"B 평균 효과: {mean_B}")
print(f"t-검정 통계량: {t_stat}")
print(f"p-값: {p_value}")
""" 
A 평균 효과: 50.67957035675973
B 평균 효과: 54.549213204404225
t-검정 통계량: -2.7330499997739275
p-값: 0.006843169283450394
"""
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

# 1. 자유도(df) 계산 (독립표본 t-검정의 경우: n1 + n2 - 2)
df = len(A) + len(B) - 2

# 2. t-분포 곡선을 그리기 위한 x축 설정
x = np.linspace(-4, 4, 1000)
y = stats.t.pdf(x, df) # t-분포의 확률밀도함수

plt.figure(figsize=(10, 6))
plt.plot(x, y, label='t-distribution (df={})'.format(df), color='black')

# 3. 계산된 t-통계량 위치에 수직선 긋기
plt.axvline(t_stat, color='red', linestyle='--', label=f'Calculated t-stat: {t_stat:.2f}')

# 4. p-값에 해당하는 영역 색칠하기 (양측 검정)
# t-통계량이 양수일 때 오른쪽 꼬리, 음수일 때 왼쪽 꼬리를 기준으로 색칠
x_fill = np.linspace(abs(t_stat), 4, 100)
plt.fill_between(x_fill, stats.t.pdf(x_fill, df), color='red', alpha=0.3, label='p-value area (one side)')
plt.fill_between(-x_fill, stats.t.pdf(-x_fill, df), color='red', alpha=0.3)

plt.title('T-Distribution and P-value Visualization')
plt.xlabel('t-value')
plt.ylabel('Density')
plt.legend()
plt.show()

  • p-value는 t 값 바깥쪽의 빨간 부분 적분한 값!
  • t-value가 가운데 부분 (0에 가까운) 에 있다면 차이가 없다는 귀무가설이 일어날 법한 평범한 확률임
  • but 바깥쪽 꼬리 부분에 있다면 차이가 이정도로 크게 날 확률은 매우 희박하다는 것을 보여주는 영역임.
  • t-value 바깥쪽 면적(p-value)가 0.05보다 작게 나왔다는 것은 이런 극단적인 결과가 나올 확률이 5% 미만으로 매우 낮으니 이건 단순한 우연이 아니라 유의미한 차이다!!!라고 결론을 내리는 근거가 됨
  1. 가설 설정 (용의자 선상): "이 약물(B)은 기존 약물(A)이랑 똑같을 거야. (귀무가설)"
  2. 데이터 증거 수집: 실험을 해보니 효과 차이가 꽤 크게 났고, 그걸 계산해보니 $t$-통계량이 나왔습니다.
  3. 확률 계산 (p-value): "만약 진짜로 효과가 똑같다면(귀무가설이 참이라면), 이렇게 큰 차이가 날 확률이 **고작 3%($p=0.03$)**밖에 안 되는데?"
  4. 최종 결론: "3%라는 희박한 확률이 우연히 일어났다고 보기엔 너무 억지스러워. 차라리 '효과가 똑같다'는 처음 가설이 틀렸다고 보는 게 훨씬 합리적이야!"

즉, p-value가 작다는 건:

"우연이라고 하기엔 너무나도 '말이 안 되는(희귀한)' 상황이 벌어졌다. 그러므로 이건 우연이 아니라 실제 약물의 효과다!"라고 선언하는 것입니다.

 

 - t 검정

  • 두 집단 간의 평균 차이가 통계적으로 유의미한지 확인하는 검정방법 
  • 독립표본 t검정과 대응표본 t검정으로 나뉨
    • 독립표본 t검정
      • 두 독립된 그룹의 평균을 비교
    • 대응표본 t검정
      • 동일한 그룹의 사전/사후 평균을 비교
  • p-값을 통한 유의성 확인
    • 두 클래스의 시험성적 비교 (독립표본 t검정)
    • 다이어트 전후 체중 비교 (대응표본 t검정)
# 학생 점수 데이터
scores_method1 = np.random.normal(70,10,30)
scores_method2 = np.random.normal(75,10,30) 

# 독립표본 t검정
t_stat, p_val = stats.ttest_ind(scores_method1, scores_method2)
print(f"T-statistic: {t_stat}. P-value: {p_val}")
# T-statistic: 0.18014269599828237. P-value: 0.8576684770959845

 

- 다중검정

  • 여러 가설을 동시에 검정! 하지만 오류가 발생할 수 있음!
  • 각 검정마다 유의수준을 조정하지 않으면 1종 오류 (귀무가설이 참인데 기각하는 오류) 발생 확률이 증가
  • 보정 방법
    • 본페르니 보정, 튜키 보정, 던넷 보정, 윌리엄스 보정 등
    • 가장 대표적이고 기본적인게 본페로니 보정
# 세 그룹의 데이터 생성
np.random.seed(42) 
group_A = np.random.normal(10, 2, 30)
group_B = np.random.normal(12, 2, 30)
group_C = np.random.normal(11, 2, 30)

# 세 그룹 간 평균 차이에 대한 t 검정 수행
p_values = []
p_values.append(stats.ttest_ind(group_A, group_B).pvalue)
p_values.append(stats.ttest_ind(group_B, group_C).pvalue)
p_values.append(stats.ttest_ind(group_C, group_A).pvalue)

# 본페로니 보정 적용
alpha = 0.05 
adjusted_alpha = alpha / len(p_values)

# 결과 출력
print(f"본페로니 보정되기 전 유의 수준: {alpha:.4f}")
for i, p in enumerate(p_values): 
    if p < alpha: 
        print(f"검정 {i+1}: 유의미한 차이 발견 (p={p:.4f})")
    else:
        print(f"검정 {i+1}: 유의미한 차이 없음 (p={p:.4f})")

# 결과 출력
print(f"본페로니 보정된 유의 수준: {adjusted_alpha:.4f}")
for i, p in enumerate(p_values): 
    if p < adjusted_alpha: 
        print(f"검정 {i+1}: 유의미한 차이 발견 (p={p:.4f})")
    else:
        print(f"검정 {i+1}: 유의미한 차이 없음 (p={p:.4f})")


# 본페로니 보정되기 전 유의 수준: 0.0500
# 검정 1: 유의미한 차이 발견 (p=0.0000)
# 검정 2: 유의미한 차이 없음 (p=0.1461)
# 검정 3: 유의미한 차이 발견 (p=0.0058)
# 본페로니 보정된 유의 수준: 0.0167
# 검정 1: 유의미한 차이 발견 (p=0.0000)
# 검정 2: 유의미한 차이 없음 (p=0.1461)
# 검정 3: 유의미한 차이 발견 (p=0.0058)
  • 본페로니 보정
    • 유의수준을 p_value의 개수로 나누어 더 기준을 타이트하게 만듦 (그룹이 3개여서 p_values가 3개로 나옴..)
  • 이번 사례에서는 본페로니 보정을 하기 전과 한 후의 결과가 같지만 실무에선 달라지는 경우 많음

 

- 귀무가설

  • 언제나!!! '차이가 없다', '특별한 일이 일어나지 않았다', '서로 관련이 없다'는 보수적인 입장!
  • 독립성 검정
    • 귀무가설:  변수간 상관이 없다 (독립이다)
    • p값이 유의수준보다 낮으면 귀무가설 기각이니까 연관이 있다, 즉 독립이 아니다
    • p값이 유의수준보다 높으면 귀무가설 채택이니까 연관이 없다, 독립이다.
  • 적합도 검정
    • 귀무가설: 예상과 차이가 없다 (일치한다) 
    • P값이 유의수준보다 낮으면 귀무가설 기각이니까 차이가 있다, 즉 관측 분포와 기대 분포가 일치하지 않는다 (정상이 아니다)
    • p값이 유의수준보다 높으면 귀무가설 채택이니까 차이가 없다, 즉 관측 분포와 기댓값이 일치한다 (정상이다. 골고루 나온다)

- 카이제곱검정

  • 범주형 데이터의 표본분포가 모집단 분포와 일치하는지 검정 (적합도 검정)
  • 두 범주형 변수 간의 독립성을 검정 (독립성 검정)
  • 적합도 검정
    • 관찰된 분포와 기대된 분포가 일치하는지 검정
    • p값이 높으면 관측분포와 기댓값에 차이가 있다
    • p값이 낮으면 관찰된 분포가 기대된 분포에 일치한다
  • 독립성 검정
    • 두 범주형 변수 간의 독립성을 검정
    • p값이 높으면 귀무가설대로 두 범주형 변수에 연관성이 없다, 즉 독립이다
    • p값이 낮으면 귀무가설 기각으로 두 범주형 변수에 연관성이 있다, 즉 독립성이 없다
# 적합도 검정
observed = [20, 30, 25, 25]
expected = [25, 25, 25, 25]
chi2_stat, p_value = stats.chisquare(observed, f_exp=expected)
print(f"적합도 검정 카이제곱 통계량: {chi2_stat}, p-값: {p_value}")
# 적합도 검정 카이제곱 통계량: 2.0, p-값: 0.5724067044708798
# p-value가 0.05보다 큼 --> 귀무가설대로 관측값과 기댓값에 차이가 없다 

# 독립성 검정
observed = np.array([[10, 10, 20], [20, 20, 40]])
chi2_stat, p_value, dof, expected = stats.chi2_contingency(observed)
print(f"독립성 검정 카이제곱 통계량: {chi2_stat}, p-값: {p_value}")
# 독립성 검정 카이제곱 통계량: 0.0, p-값: 1.0
# p-value가 0.05보다 큼 --> 두 범주형 변수는 연관이 없다 --> 독립이다

# 나이와 흡연 여부 독립성 검정
observed = np.array([[30, 10], [20, 40]])
chi2_stat, p_value, dof, expected = stats.chi2_contingency(observed)
print(f"독립성 검정 카이제곱 통계량: {chi2_stat}, p-값: {p_value}")
# 독립성 검정 카이제곱 통계량: 15.041666666666666, p-값: 0.00010516355403363106
# p-value가 0.05보다 작음 --> 귀무가설 기각 --> 두 범주형 변수는 연관이 있다 --> 독립성이 없다