카테고리 없음

2025.12.05 TIL (본캠프, 35일차)

D:Connect 2025. 12. 5. 20:54

오늘은 통계의 가장 핵심이라고 할 수 있는 "가설검정"에 대해 배우는 날이었다.

지난 며칠간 배운 신뢰구간, 신뢰도 개념이 이 가설검정으로 모두 하나로 통합되었다.

 

가설검정이란 무엇인가??

첫 번째 깨달음: 가설검정은 의사결정의 도구다

가설검정을 배우기 전까지 나는 "통계학자들만 쓰는 복잡한 계산"이라고 생각했다. 하지만 오늘 배운 내용은 완전히 달랐다.

가설검정의 본질은 간단하다:

  • "내 데이터에서 관찰된 차이가 정말 의미 있는 차이인가?"
  • "이것이 우연의 일치일까, 아니면 실제 차이일까?"

A/B 테스트를 할 때, "A 버전의 클릭률이 B 버전보다 높다"고 해서 바로 A를 선택할 수는 없다. 그 차이가 통계적으로 유의미한지 확인해야 한다. 이것이 바로 가설검정이다.

 

귀무가설과 대립가설: 역할 분담

처음에는 헷갈렸다. 왜 두 개의 가설이 필요할까?

  • 귀무가설(H₀): "차이가 없다" → 기본 가정, 보수적 입장
  • 대립가설(H₁): "차이가 있다" → 증명하려는 주장

통계에서는 "차이가 없다"는 것이 기본 가정이다. 우리는 이 기본 가정을 깨뜨릴 충분한 증거를 제시해야 한다.

쉽게 설명하자면, 법정에서 "무죄 추정"과 비슷하다. 증거가 충분하지 않으면 무죄인 것처럼, 증거가 충분하지 않으면 "차이가 없다"고 결론 내리는 것이다.

 

p-value: 가설검정의 핵심

"p-value = 0.02"라는 것은 뭘까?

강의에서 배운 정의: "귀무가설이 참일 때, 우리의 데이터가 우연히 발생했을 가능성"

즉, 실제로는 차이가 없는데도 이런 데이터가 나올 확률이 2%라는 뜻이다. 충분히 낮으면 (보통 5% 미만), 우리는 귀무가설을 기각하고 "차이가 있다"고 결론 내린다.

 

상황에 맞는 가설검정 선택하기

그러면 "어떤 검정을 써야 할까?"

통계 검정 방법들은 굉장히 다양하다.

t검정, ANOVA, 카이제곱검정, Mann-Whitney U검정...

하지만 오늘 배운 내용으로 체계가 잡혔다. 핵심은 질문들에 답하는 것이다:

  1. 데이터 타입은? 수치형인가, 범주형인가?
  2. 집단은 몇 개? 1개, 2개, 3개 이상?
  3. 관계는? 독립인가, 대응(쌍)인가?
  4. 전제 조건? 정규분포를 따르는가?

평균을 비교하는 경우: t검정 vs ANOVA

t검정 (평균 비교, 1-2개 집단)

강의에서 배운 t검정의 세 가지 종류:

  • 단일표본 t검정: 한 집단의 평균이 기준값(예: 7시간)과 다른가?
  • 독립표본 t검정 : 서로 다른 두 집단(남/여, A/B)의 평균이 다른가? → A/B 테스트에서 가장 자주 사용
  • 대응표본 t검정: 같은 집단의 전후 비교(약 먹기 전/후)

나는 실전 프로젝트에서 가장 자주 마주칠 것 같은 독립표본 t검정에 집중했다.

 
from scipy import stats

# 독립표본 t-test (기본)
t, p = stats.ttest_ind(group_A, group_B, equal_var=True)

# Welch t-test (등분산성 위반시 - 더 안전함)
t, p = stats.ttest_ind(group_A, group_B, equal_var=False)

 

ANOVA (평균 비교, 3개 이상 집단)

3개 이상의 집단을 비교할 때 왜 t검정을 여러 번 못 할까?

t검정을 3번 하면 (A vs B, B vs C, A vs C), 1종 오류(α)가 누적된다. 이것을 "다중 비교 문제"라고 부른다.

ANOVA는 한 번에 모든 집단의 평균 차이를 판단한다:

  • 귀무가설: 모든 집단의 평균이 같다
  • 만약 p < 0.05라면: 적어도 하나의 집단이 다르다 (어느 것인지는 사후검정으로 확인)
 
from scipy.stats import f_oneway

f_stat, p = f_oneway(group1, group2, group3)

 

비율을 비교하는 경우: 이항검정 vs Z검정 vs 카이제곱검정

이항검정 (한 집단의 비율 vs 기준값)

"우리 앱의 재방문율이 50%보다 높은가?" → 이항검정

100명 중 65명이 재방문했을 때, 정말 50% 이상일까, 아니면 우연일까?

Z검정 (두 집단의 비율 비교) 

"남성과 여성의 뉴스레터 오픈률이 다른가?" → Z검정

A/B 테스트에서 "두 집단의 전환율이 다른가?"를 확인할 때 사용한다.

 
from statsmodels.stats.proportion import proportions_ztest
import numpy as np

count = np.array([A_성공수, B_성공수])
nobs = np.array([A_전체, B_전체])

stats, p = proportions_ztest(count, nobs)

 

카이제곱 검정 (범주형 변수 간 관계)

"성별과 구매 여부가 관련이 있는가?" → 카이제곱 독립성 검정

 
import pandas as pd
from scipy.stats import chi2_contingency

contingency = pd.crosstab(df['gender'], df['purchase'])
chi2, p, dof, expected = chi2_contingency(contingency)

 

 

한주의 마지막일을 마무리하며...

35일차는 통계의 큰 그림이 보이기 시작한 날이다.

지난 사전캠프부터 본캠프 초반까지 배운 기술들(SQL, Python 기초, 시각화)을 모두 활용할 수 있는 의사결정 도구가 바로 가설검정이다.

데이터 분석가는 단순히 "숫자를 본다"에서 벗어나 "그 숫자가 의미 있는가?"를 판단할 수 있어야 한다.

지금까지 배운 통계를 정리하였지만 아직 이해되지 않은 부분들이 많다.
주말에 복습을 해야한다.....