2025.12.05 TIL (본캠프, 35일차)
오늘은 통계의 가장 핵심이라고 할 수 있는 "가설검정"에 대해 배우는 날이었다.
지난 며칠간 배운 신뢰구간, 신뢰도 개념이 이 가설검정으로 모두 하나로 통합되었다.
가설검정이란 무엇인가??
첫 번째 깨달음: 가설검정은 의사결정의 도구다
가설검정을 배우기 전까지 나는 "통계학자들만 쓰는 복잡한 계산"이라고 생각했다. 하지만 오늘 배운 내용은 완전히 달랐다.
가설검정의 본질은 간단하다:
- "내 데이터에서 관찰된 차이가 정말 의미 있는 차이인가?"
- "이것이 우연의 일치일까, 아니면 실제 차이일까?"
A/B 테스트를 할 때, "A 버전의 클릭률이 B 버전보다 높다"고 해서 바로 A를 선택할 수는 없다. 그 차이가 통계적으로 유의미한지 확인해야 한다. 이것이 바로 가설검정이다.
귀무가설과 대립가설: 역할 분담
처음에는 헷갈렸다. 왜 두 개의 가설이 필요할까?
- 귀무가설(H₀): "차이가 없다" → 기본 가정, 보수적 입장
- 대립가설(H₁): "차이가 있다" → 증명하려는 주장
통계에서는 "차이가 없다"는 것이 기본 가정이다. 우리는 이 기본 가정을 깨뜨릴 충분한 증거를 제시해야 한다.
쉽게 설명하자면, 법정에서 "무죄 추정"과 비슷하다. 증거가 충분하지 않으면 무죄인 것처럼, 증거가 충분하지 않으면 "차이가 없다"고 결론 내리는 것이다.
p-value: 가설검정의 핵심
"p-value = 0.02"라는 것은 뭘까?
강의에서 배운 정의: "귀무가설이 참일 때, 우리의 데이터가 우연히 발생했을 가능성"
즉, 실제로는 차이가 없는데도 이런 데이터가 나올 확률이 2%라는 뜻이다. 충분히 낮으면 (보통 5% 미만), 우리는 귀무가설을 기각하고 "차이가 있다"고 결론 내린다.
상황에 맞는 가설검정 선택하기
그러면 "어떤 검정을 써야 할까?"
통계 검정 방법들은 굉장히 다양하다.
t검정, ANOVA, 카이제곱검정, Mann-Whitney U검정...
하지만 오늘 배운 내용으로 체계가 잡혔다. 핵심은 질문들에 답하는 것이다:
- 데이터 타입은? 수치형인가, 범주형인가?
- 집단은 몇 개? 1개, 2개, 3개 이상?
- 관계는? 독립인가, 대응(쌍)인가?
- 전제 조건? 정규분포를 따르는가?
평균을 비교하는 경우: 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 기초, 시각화)을 모두 활용할 수 있는 의사결정 도구가 바로 가설검정이다.
데이터 분석가는 단순히 "숫자를 본다"에서 벗어나 "그 숫자가 의미 있는가?"를 판단할 수 있어야 한다.
지금까지 배운 통계를 정리하였지만 아직 이해되지 않은 부분들이 많다.
주말에 복습을 해야한다.....