- 개념
* 통계적 가설검정 : 모집단의 모수에 관하여 두 가지 가설을 세우고 표본으로부터 계산되는 통계량을 이용하여 어느 가설이 옳은지 판단하는 통계적인 방법
* T 검정 : 모수 검정 방법 중 하나로, 단일 집단의 검정 및 집단 간 비교 분석을 목적으로 한다.
* 가설 : 모집단의 특성, 특히 모수에 대한 가정 혹은 잠정적인 결론
귀무가설(Null Hypothesis) | 기존과 비교하여 차이, 효과가 없음을 나타내는 가설 |
대립가설(Alternative Hypothesis) | 주장하는 가설. 차이, 효과가 있음을 입증하고자 하는 가설 |
>> 결론 : 귀무가설을 기각한다 or 귀무가설을 기각하지 못한다(= 귀무가설 채택)
>> T-검정에서의 가설 설정
귀무가설(H0) | 모평균과 표본평균은 같다 |
대립가설(H1) | 모평균과 표본평균은 같지 않다 |
* 유의하다 : 귀무가설의 가정을 바탕으로 했을 때 표본으로부터 계산되는 통계량이 드문 값이고, 그것이 우연이 아니라 의미가 있을 때 사용
* 유의수준 : 귀무가설이 기각역에 들어가는 확률(귀무가설을 기각하게 되는 확률의 크기)
* 임계값 : 기각역 경계선상의 값
* 검정통계량 : 검정에 사용되는 표본 통계량. 귀무가설이 참이라는 전제 하에 추출된 확률표본의 정보를 이용해 계산
* p값(p-value) : 귀무가설이 맞다고 할 때 얻어진 결과보다 실제값이 더 극단에 위치할 확률
(p값이 유의수준보다 작을 때 : 귀무가설 기각 / 그렇지 않을 때 : 귀무가설 채택)
* 가설검정의 두 가지 오류
제 1종 오류 | 귀무가설이 옳을 때,귀무가설을 기각하는 오류 |
제 2종 오류 | 대립가설이 옳을 때, 귀무가설을 채택하는 오류 |
* z 통계량 / t 통계량
1) z 검정 : z 통계량 : 모집단, 모평균, 모분산을 다 알고 있을 때
2) t 검정 : t 통계량 : 표본 추출, 표본 평균과 표본 분산을 알고 있을 때
- 예시1 (t-test)
* 문제상황
어느날 편의점 감자튀김을 구매한 A 학생
-> A가 구매한 감자튀김 무게는 122.02g, 감자튀김은 평균 130g으로 알려져 있음
-> 2주간 매일 감자튀김 구매 후 무게 측정
-> 14개 표본 평균 : 128.451g
-> A는 편의점에 14개의 감자튀김 무게 표본 평균이 130g보다 작다고 항의했으나 편의점 측은 우연이라 일축
-> 14개 표본의 평균이 128.451g으로 나온 것은 정말 우연일까?
* 어떤 통계 검정 방법을 사용해야 할까? :
: t-test, One Sample T-test
: 표본 14개이므로 정규성 검정 진행
-> 정규성 검정을 통과했다면 One Sample T-Test(하나의 모집단의 평균을 특정값과 비교하는 것)
+) 모수 검정 시 데이터가 30개 미만일 경우, 정규분포 검사를 한다. (통과 못하면 비모수검정 실시)
* 귀무가설과 대립가설 설정
+ 귀무가설 : 모평균(130g)과 표본평균(128.451)이 같다.
+ 대립가설(1) : 모평균(130g)과 표본평균(128.451)이 같지 않다. (양측검정)
+ 대립가설(2) : 모평균(130g)이 표본평균(128.451)보다 크다. (단측검정)
* 라이브러리 불러오기
import numpy as np
import pandas as pd
from scipy import stats
* 감자튀김 무게 데이터 불러오기
df = pd.read_csv('data/ch11_potato.csv')
sample = np.array(df['무게'])
* 표본평균 구하기
s_mean = np.mean(sample)
s_mean
# out:
128.4507142857143
*(14개의) 표본평균이 모평균 130g보다 적은지 여부 알아보기
+ 전제 : 여기서는 감자튀김의 표본집단이 정규분포를 따르고 있다 -> 정규성 검정을 할 필요가 없다
(= 비모수 검정을 쓸 필요가 없다/모수 검정을 하면 된다)
모분산이 9임을 알고 있다고 전제한다.
rv = stats.norm(130, # 모평균
np.sqrt(9/14)) # 9 모분산, 14 표본의 개수
rv.isf(0.95) # 0.95 신뢰구간 95%
# out:
128.68118313069039
(=임계값이 128.681)
>> 표본평균이 128.681g 이하의 무게가 되는 것은 5% 확률로 발생한다는 뜻
>> 즉 A가 추출한 표본평균이 128.451g이었던 것은 5% 확률로 발생하는 드문 사건
* 검정통계량 구하기
# 모평균 130
z = (s_mean - 130) / np.sqrt(9/14)
# out:
-1.932298779026813
* 임계값 구하기
# 검정 통계량에 관한 임계값을 구하기
rv = stats.norm()
rv.isf(0.95)
# out:
-1.6448536269514722
>> 위의 검정통계량과 비교해보면 임계값보다 검정통계량이 더 작다는 사실을 알 수 있다. (임계값>검정통계량)
>> 즉 귀무가설은 기각(=평균이 130g보다 작다)
* p값 구하기
rv.cdf(z)
# out:
0.026661319523126635
>> p값은 약 0.027, 즉 유의수준 0.05보다 작은 값이다.(귀무가설 기각)
- 예시2 (가설검정 오류)
위 예시(감자튀김)로 두 가지 오류를 설명할 수 있다.
(1) 제1종 오류
* 실제로 평균이 130g인데도 불구하고 평균은 130g보다 작다고 결론을 내리는 상황
* False Positive(오탐) : 검출하지 말아야 할 것을 검출한 것
* 1종 오류 범한 비율 알아보기
rv = stats.norm(130, 3)
c = stats.norm().isf(0.95)
n_samples = 10000
cnt = 0
for _ in range(n_samples):
sample_ = np.round(rv.rvs(14), 2)
s_mean_ = np.mean(sample_)
z = (s_mean_ - 130) / np.sqrt(9/14)
if z < c:
cnt += 1
cnt / n_samples
# out:
0.052
>> 1종 오류를 범할 비율은 0.053 / 약 5%의 비율로 130g보다 작다고 잘못 탐지하는 것과 같다.
* 위험률 : 1종 오류를 범할 확률(유의수준과 일치)
좀 더 엄격하게 적용하고 싶다고 하면 유의수준 1%에서 가설검정을 수행
(2) 제2종 오류
* 실제로 표본평균이 130g보다 작음에도 불구하고 표본평균은 130g보다 작다라는 결론을 얻을 수 없는 상황
* false negative(미탐) : 본래 검출해야 하는 것을 검출하지 못함
* 2종 오류 범하는 비율 알아보기
(A가 비밀 문서를 입수하여 감자튀김의 평균이 128g으로 설정되어 있는 것을 알고 있다고 가정)
rv = stats.norm(128, 3) # 실제 감자튀김의 평균이 128g
c = stats.norm().isf(0.95)
n_samples = 10000
cnt = 0
for _ in range(n_samples):
sample_ = np.round(rv.rvs(14), 2)
s_mean_ = np.mean(sample_)
z = (s_mean_ - 130) / np.sqrt(9/14)
if z >= c:
cnt += 1
cnt / n_samples
# out:
0.198
>> 제2종 오류를 범하는 비율은 0.198(검정력)
>> 제대로 탐지하지 못할 확률(미탐)이 약 20%라는 뜻
+) 제 2종 오류는 언제나 모집단의 정보에 의존한다. 본래 모집단의 정보는 알 수 없으므로 분석가는 모집단의 구체적인 정보를 알 방법이 없다. (제2종 오류는 제어할 수 없는 확률임)
* 현실적으로 모집단을 아는 것은 불가능하다.(건강보험과 통계/전국민 데이터가 있는 국가 자료가 아니라면)
모분산을 알고 있다=모집단을 알고 있다=모평균 구할 수 있다 라는 뜻(모평균에 대해 검정할 필요성 못 느낌)
- 예시3 (양측검정과 단측검정)
* 위에서는 '모평균이 130g보다 작다'라는 대립가설로 가설검정을 수행했는데, 이처럼 한쪽만 검정을 수행하는 것을 단측검정이라고 한다.
* '모평균이 130g이 아니다'라는 대립가설로 가설검정을 수행할 수도 있는데, 모평균이 130g보다 작은 경우뿐만 아니라 큰 경우도 고려하게 된다. 이를 양측검정이라고 한다.
* 양측검정 예시
z = (s_mean - 130) / np.sqrt(9/14) # 검정통계량
z
# out:
-1.932
rv = stats.norm() # 임계값
rv.interval(0.95) # 신뢰구간 95%
# out:
(-1.960, 1.960)
>> 검정통계량과 임계값을 비교하면 검정통계량이 귀무가설을 채택하는 구간에 있음을 알 수 있다.
>> 양측검정에서는 귀무가설이 기각되지 않는다.
rv.cdf(z) * 2 # p값 구하기 # 양측검정이기 때문에 양쪽 면적을 고려하여 누적밀도함수 값 2배
# out:
0.053
>> p값이 유의수준 0.05보다 크다는 것을 알 수 있다.(귀무가설 기각되지 않음)
'Python' 카테고리의 다른 글
통계검정별 사용함수 정리(+예시) (0) | 2024.01.12 |
---|---|
가설검정 (2표본 문제에 관한 가설검정) (1) | 2024.01.11 |
[plotly] 사용법 간단 정리 (0) | 2024.01.09 |
[pandas] 데이터 둘러보기, 다뤄보기 (0) | 2024.01.09 |
[seaborn] 데이터 시각화(+matplotlib) (1) | 2024.01.08 |