Python

가설검정 (t-검정/가설검정 오류/양측검정과 단측검정)

jsys 2024. 1. 11. 18:17

 

- 개념

 

* 통계적 가설검정 : 모집단의 모수에 관하여 두 가지 가설을 세우고 표본으로부터 계산되는 통계량을 이용하여 어느 가설이 옳은지 판단하는 통계적인 방법

 

 

* 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보다 크다는 것을 알 수 있다.(귀무가설 기각되지 않음)