728x90
가설 검정
- 모집단에 대해 가설이 통계적으로 유의한지 표본을 통해 알아보는 것
- 질문에 대한 2개의 대립되는 가설을 세우고, 수집한 데이터를 통해 참 or 거짓 판단
귀무가설 (Null Hypothesis) (H0)
- 데이터를 수집하기 전, 사실이라고 믿는 가설
- ex) 변화가 없다 (기존의 상태), 차이가 없다, 다르지 않다, 음성이다 등등
- 수학적으로 = 기호 포함
대립가설 (Alternative Hypothesis)
- 우리가 사실이라고 증명하고 하는 가설
- 귀무가설과 대립 (귀무 가설과 겹치지 않는다)
- ex) 변화가 있다, 차이가 있다, 다르다, 양성이다 등등
- 수학적으로 = 기호 포함 X
1종 오류(Type I Error) vs 2종 오류(Type II Error)

Type I Error
- 귀무가설 참 → 잘못 판단하여 기각
- 어떤 차이 (변화)가 우연히 발생 → 사실이라고 잘못 판단 (경솔하다)
- ⇒ 통계적으로 유의미하다고 잘못 결론
- a(알파), False Positive, 유의수준 (귀무가설이 맞다는 전제하에 틀렸다고 판단할 확률) 이라고도 표현
- ex) “5% 유의수전에서 ~” ⇒ 1종 오류가 일어날 확률 최대 5% (0.05)
Type II Error
- 귀무가설 거짓 → 잘못 판단하여 기각 X
- 어떤 차이(변화) 발생한 것이 사실 → 우연히 일어났다고 잘못 판다 (신중하다)
- b(베타), False Negative
⇒ 통계에서는 경솔은 절대 금물!
그렇기에 일반적으로, 1종 오류 최소화 할 수 있게 가설 설계
(우연히 발생한 일에 넘어가지 않는 것)
가설 세우기
- 단측 검정 (One-sided Test)

- 양측 검정 (Two-sided Test)

검정 방법론
신뢰구간 확인
- Sample → 표본 분포 simulate
- ⇒ 모집단의 분포라고 가정한 후, 귀무가설이 신뢰구간안에 들어가는 것 확인
P-value 확인
- 귀무가설이 맞다는 전제 하에, 해당 데이터가 관측될 확률 (유의 확률)
- “귀무가설이 얼마나 믿을만 한 것인가”에 대한 값 (0 ~ 1) → 기각여부 결정
- p-value < 0.05→ 어떤 차이 (변화)가 우연히 발생한 것이 아니라, 실제일 가능성 높다
- ⇒ 귀무가설을 기각할 통계적 유의성이 있다 (통계적으로 유의하다)
- → 귀무가설이 사실인데 기각했을때의 오류 (1종 오류)가 5% 보다 작다

Student T-test
표준편차가 알려지지 않았지만, 정규분포를 따르는 모집단에서 추출한 표본의 평균값에 대한 가설검정 방법
- 표준편차 = 데이터가 평균값을 기준으로 평균적으로 퍼진 정도
- 통계적으로 차이가 얼마나 유의미 한자 검증
- ex) 성장 호르몬을 복용한 그룹과 복용하지 않은 그룹의 변화된 키 차이 평균을 비교한다고 했을 때,
- 그 차이가 과연 통계적으로 유의미한지 검증
t-value(검정 통계량)
- 두 평균값의 차이에 대한 불확실도를 나눠줌
- 집단 간의 차이와 이러한 차이를 정확하게 판단하기 위해 scaling을 해주는 과정 (normalize)
- t-value가 클 수록, 두 집단의 평균의 차이가 크다

- 한 집단의 평균 검정
- 하나의 데이터 집단 평균 vs 비교하고자 하는 관측치 → 차이 검정
- 데이터 집단 평균과 관측치의 거리가 멀 수록 p-value 값 떨어진다
- stats.ttest_1samp()
- 두 집단 평균 검정 (독립표본 t-test)
- 데이터 집단 2개끼리 비교
- 귀무가설 : 두 집단의 모평균은 동일 (= 차이는 0)
- stats.ttest_ind()
- 데이터 집단 2개끼리 비교
- 대응하는 두 집단의 평균 검정
- 두 집단에 들어있는 사람이 같다
- 귀무가설 : 두 집단의 모평균의 동일 (= 차이는 0)
- stats.ttest_rel()
- 두 집단에 들어있는 사람이 같다
하나의 예시를 들어보겠습니다.
# 두 표본은 독립적인 집단이므로, Two Sample independent t-test를 실시
import numpy as np
from scipy.stats import ttest_ind
# 1조 키 데이터 생성
np.random.seed(10)
group_1 = np.random.randint(140, 190, 35) # (low, high, size)
# 2조 키 데이터 생성
np.random.seed(0)
group_2 = np.random.randint(140, 190, 35) # (low, high, size)
# 가설 검정
# 2조의 평균키가 1조의 평균키보다 크다는 가설
# 귀무가설 - 2조의 평균키가 1조의 평균키 보다 작거나 같다 (1조 ≥ 2조)
# 대립가설 - 2조의 평균키가 1조의 평균키 보다 크다 (1조 < 2조)
# ( 2조, 1조, 1조 보다 2조가 크다는 가설 = 'greater')
pv = ttest_ind(group_2 , group_1, alternative='greater').pvalue
# ttest_ind(a, b, axis=0, equal_var=True, nan_policy='propagate', permutations=None, random_state=None, alternative='two-sided', trim=0)
# 결론
if pv >= 0.05:
print('p-value = {:.2f} >= 0.05 이므로 귀무가설 채택'.format(pv))
else:
print('p-value = {:.2f} < 0.05 이므로 귀무가설 기각'.format(pv))
# p-value = 0.87 >= 0.05 이므로 귀무가설 채택
위 코드를 보게되 T-test를 통해 2조의 평균키가 1조의 평균 키보다 크다는 가설을 검정하는 코드입니다.
귀무가설과 대립가설을 설정하고 scipy의 라이브러리의 ttest_ind메소드를 활용하여 작성하였습니다.
이 글로 인해 조금이나마 도움이 되었으면 좋겠습니다.
감사합니다.
레퍼런스
728x90
반응형
'Data Analysis' 카테고리의 다른 글
| 정규화(Normalization) vs 표준화(Standardization) (0) | 2025.05.14 |
|---|---|
| 이상치(Outliers) 탐지와 처리 방법 (0) | 2025.05.14 |
| 결측치(Missing Values) 처리 (0) | 2025.05.12 |
| 데이터 분석가의 역할 (Data Analyst) (0) | 2023.08.11 |
| EDA의 개념과 데이터 분석 (0) | 2023.04.30 |