일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- python3
- 파이썬
- PANDAS
- Heap
- Seq2Seq
- gan
- C++
- db
- 재귀
- Python
- 운영체제
- googleapiclient
- 프로그래머스
- 스택
- machine learning
- OS
- GIT
- 국민대
- 회귀
- LSTM
- 정렬
- instaloader
- 머신 러닝
- Stack
- 국민대학교
- programmers
- kmu
- SQL
- 데이터베이스
- Regression
- Today
- Total
정리 노트
가설 검정의 원리 본문
이 포스트는 아래의 책의 내용을 정리하며 작성한 포스트입니다. 여기서 사용되는 예시 또한 책의 예시를 사용합니다.
가설 검정은 분석자가 가설을 검증하기 위한 방법으로 p값(p-value)을 계산해 가설을 지지하는지 여부를 결정합니다.
흔히 신약을 투여한 집단과 위약을 투여한 집단을 비교함으로써 신약의 효과를 검증하는 데이터 분석 예시를 많이 사용합니다. 그러니 여기도 이 예시를 사용하겠습니다. 저희는 "신약이 혈압을 낮추는데 효과가 있다"는 가설을 세우고 이야기를 진행합니다. 실험 데이터(최고 혈압(단위: mmHg))는 아래와 같다고 합시다.
신약 | 위약 |
142 | 145 |
132 | 130 |
127 | 150 |
140 | 142 |
142 | 145 |
130 | 155 |
126 | 148 |
통계학에서의 가설
우리가 세운 가설을 통계학적 관점에서 파악해 봅시다. 신약을 투여한 집단을 모집단 A, 위약을 투여한 집단을 모집단 B라고 합시다. 우리의 가설은 \( \mu_{A} \neq \mu_{B} \)로 표현할 수 있습니다. 만약 우리의 가설이 틀렸다면(신약이 효과가 없다면) \( \mu_{A} = \mu_{B} \)로 될 것입니다.
여기서 2가지 가설이 나왔습니다. 이 중에서 밝히고자 하는 가설의 부정 명제를 귀무가설(null hypothesis)이라 하고, 밝히고자 하는 가설을 대립가설(alternative hypothesis)이라 합니다.
- 귀무가설: 신약의 효과가 없다 (\( \mu_{A} = \mu_{B} \))
- 대립가설: 신약의 효과가 있다 (\( \mu_{A} \neq \mu_{B} \))
보통 가설 검정에서는 귀무가설을 먼저 세우고 이 가설이 틀렸음을 주장해 대립가설을 지지한다는 흐름을 가집니다. 이는 마치 명제가 잘못되었음을 가정하고 모순을 발견함으로써 명제를 증명하는 귀류법과 비슷한 논리로 볼 수 있습니다.
여기서 표본평균과 모집단의 평균 사이에는 표본오차가 존재한다는 것을 다시 기억해 봅시다. 즉, 귀무가설이 옳다 하더라도 \( \bar{x_A} \neq \bar{x_B} \)가 됩니다. 따라서 표본평균 간의 차이가 단순하게 데이터가 퍼져있기 때문인지, 아니면 약의 효과인지를 구별할 필요가 있습니다. 이러한 사고방식이 가설 검정의 바탕이 됩니다.
귀무가설이 옳은 세계
그럼 귀무가설이 틀렸는지 조사하는 과정에 대해 알아봅시다. 먼저 귀무가설이 일단 옳다고 가정합니다. 두 모집단의 평균이 동일한 상황에서 각 모집단에서 표본을 추출합니다. 그러면 두 표본평균 사이에 차이가 발생할 것입니다. 이 작업을 여러 번 진행해 히스토그램을 그려보면 아래처럼 그려집니다.
이를 통해 평균적으로 0이라는 것, 0에 가까운 값이 나오기 쉽다는 것, 꼬리 부분의 값은 비교적 나오기 어렵다는 것을 알 수 있습니다.
다시 현실 세계로
실제 얻은 데이터로 계산한 표본평균의 차이를 생각했을 때, 이 현실의 값은 귀무가설이 옳은 가상의 세계에서 얼마 큼의 빈도로 나올지 생각하는 것이 가설 검정에서 가장 중요한 사고방식입니다.
만약 얻은 현실의 값이 가상의 세계에서 극히 드물다면, 이때는 가상 세계가 잘못됐음을 나타냅니다. 즉, 귀무가설이 옳다는 가정이 틀렸다고 생각할 수 있습니다. 반대로 현실의 값이 가상의 세계에서 자주 나타난다면 귀무가설이 틀렸다고 말할 수 없을 것입니다.
이때 가상 세계에서 얼마나 나타나기 쉬운지 또는 어려운지 평가하기 위해 p값(p-value)을 계산합니다. 이 값은 확률이기 때문에 0 이상 1 이하의 값이 됩니다. 책에서는 p값을 다음과 같이 정의합니다.
P값이란, 귀무가설이 옳다고 가정했을 때 관찰한 값(예 : 평균값의 차이) 이상으로 극단적인 값이 나올 확률을 일컫는다.
이 값이 작다는 것은, 가상 세계에서 봤을 때 현실의 값이 잘 나타나지 않다는 것을 나타냅니다. 예를 들어 현실에서 얻은 평균값 차이가 +10이고 p = 0.01이라면, 귀무가설이 옳은 가상 세계에서 평균값 차이가 +10 이상 또는 -10 이하가 될 확률은 1%입니다.
p값과 유의 수준 \( \alpha \)를 이용한 가설 판정
일반적으로 p값이 0.05 이하인 경우, 귀무가설이 옳다는 가정 아래에서 현실 데이터 값이 잘 나타나지 않는다고 생각해 귀무가설을 기각하고 대립가설을 채택합니다. 이때 평균값의 차이는 통계적으로 유의미한 차이가 있다고 표현합니다. 하지만 이는 대립가설이 무조건 옳다는 것이 아니라 대립가설을 지지하는 하나의 증거임을 의미한다는 것에 주의해야 합니다. 귀무가설을 기각할지 판단할 때의 경계로 이용하는 값을 유의 수준(\( \alpha \))이라 합니다. 위에서 p = 0.01이라 했을 때, 0.01이 바로 유의 수준입니다.
파이썬 코드
혹시나 위의 히스토그램이 어떻게 나왔는지 궁금해하시는 분들이 있을까 봐 파이썬 코드를 아래에 작성합니다.
import random
import matplotlib.pyplot as plt
from math import ceil, log
def mean(l: list) -> float:
if len(l) == 0:
return 0
return sum(l) / len(l)
a = [90, 91, 92, 93, 94, 95, 96, 97, 98]
b = [93.6, 93.7, 93.8, 93.9, 94, 94.1, 94.2, 94.3, 94.4]
diffs = []
cnt = 10000
for _ in range(cnt):
sample_a = random.sample(a, 3)
sample_b = random.sample(b, 3)
diffs.append(mean(sample_a) - mean(sample_b))
print(mean(a)) # 94.0
print(mean(b)) # 94.0
# bins 계산식
# https://medium.datadriveninvestor.com/how-to-decide-on-the-number-of-bins-of-a-histogram-3c36dc5b1cd8
plt.hist(diffs, bins=ceil(1 + log(len(diffs))))
plt.xlabel("Differences between two sample means")
plt.yticks([])
plt.show()
'개념 정리 > 통계' 카테고리의 다른 글
비율을 비교하는 여러가지 방법 (2) | 2024.01.25 |
---|---|
대푯값을 비교하는 여러가지 방법 (1) | 2024.01.11 |
진실과 판단의 4가지 패턴 (1) | 2024.01.04 |
가설 검정 시행 (1) | 2024.01.01 |
표본 오차와 신뢰 구간 (1) | 2023.10.19 |