[Foundation of Data Science] 가설 검정

2023. 11. 5. 19:36노트/Data Science : 데이터과학

다룰 개념들:

  • 모평균 μ에 대한 가설 검정
  • 단측 검정과 양측 검정

시스템에 Scipy의 최신 버전을 설치하기 위해 명령어를 입력합니다.

!pip install scipy==1.6.1

import scipy 
scipy.__version__
>> '1.7.3'

 

필요한 패키지들을 import 합니다.

# import the important packagews 
import pandas as pd # 데이터 핸들링과 분석을 위한 라이브러리 
import numpy as np # 배열에 사용되는 라이브러리 
import matplotlib.pyplot as plt # 그래프와 시각화를 위한 라이브러리 
import seaborn as sns # 시각화를 위한 라이브러리 

%matplotlib inline 

import scipy.stats as stats # 이 라이브러리는 통계 함수 뿐만 아니라 다양한 확률 분포를 포함하고 있습니다.

 

모평균에 대한 가설 검정

단일 표본 Z-test (모평균의 표준 편차를 알고 있을 때)

모평균의 표준편차를 알고있지만, 모평균의 평균은 알지 못하는 경우는 거의 없지만, 이 경우를 가정해보자.

특정한 E-커머스 회사의 상품의 평균 배송 시간이 5일이고, 표준 편차가 1.3일이라고 경험적으로 알고 있습니다.

이 회사의 새로운 고객 서비스 매니저는 회사가 미끄러질 것을 걱정하여, 45개 주문에 대해 임의로 표본을 수집했습니다. 이 표본의 평균 배송 시간은 5.25일 인것으로 밝혀졌습니다.

상품의 평균 배송 시간은 5일보다 클 것이라는 매니저의 가설은 통계적으로 충분한 증거일까요?

신뢰 수준 α = 0.05 를 사용합시다.

귀무 가설과 대립 가설을 세워봅시다.

μ가 상품의 평균 배송 시간이라고 합시다.

매니저는 다음의 귀무 가설을 테스트 해 볼 것입니다.

 

H0:μ=5

 

반대로 대립 가설은 다음과 같습니다.

 

Ha:μ>5

Z-test를 만족하기 위한 가정들은 ?

  • 표본은 정규 분포로 부터 추출되었습니다. - 표본의 크기가 45 (30 보다 큼)이기 때문에, 중심극한 정리에 의해 표본 평균의 분포도 정규분포가 될 것 입니다. 만약 표본의 크기가 30보다 작다면, 모평균이 정규분포인 것을 알아야 z-test를 적용할 수 있을 것입니다.
  • 관측치들은 단순 랜덤 샘플입니다. - 매니저가 단순 랜덤 샘플을 수집했다고 알고 있습니다.
  • 표준 편차를 알고있습니다. - 네

이 문제를 위해 Z-test를 사용 할 수 있습니다.

다음 단계는 Z-test 통계량을 찾는 것입니다.

# 모평균과 모펴준편차가 5, 1.3이라고 합시다. 
mu, sigma = 5, 1.3 

# 표본 평균이 5.25라고 합시다 
x_bar = 5.25 

# 통계치를 계산합시다. 
test_stat = (x_bar - mu)/ (sigma / np.sqrt(45))
test_stat
>>> 1.2900392177883402

Z-test 통계량이 표준 정규 분포를 따릅니다.

Z-test 통계량의 분포를 그려보고, 통계치가 분포에 어디에 위치해있는지 확인해 봅시다.

# 필요한 함수를 불러옵니다. 
from scipy.stats import norm 

# test통계치와 함께 Z-test 통계량의 분포를 그려봅시다. 
# 계산을 더 잘 시각화 하기 위해 분포를 그려보는 것입니다. 

x = np.linspace(-4, 4, 100)
plt.plot(x, norm.pdf(x, 0, 1))
plt.axvline(x = test_stat, c = 'r')
plt.show()

위 분포에서 통계치보다 같거나 클 확률은 얼마나 될까요?

1 - norm.cdf(test_stat)
>>> 0.09851852092578695

확률은 매우 작지만 대립 가설을 선호하여 귀무 가설을 기각할 정도로 유의할까요?

기각역의 범위/ p-value 의 소개

확률이 매우 작지만, 우리는 대립가설을 채택하기 위해 귀무가설을 기각하거나, 그 반대의 경우로 결론을내기에 충분한 결론을 지을 수 없습니다. 이를 결정하기 위해여, 다음 접근법 중 하나를 사용해야 합니다.

1- 기각역의 범위 접근

2- p-value 접근

기각역의 범위 접근

이 방식에 대해 우리는 다음의 단계를 따를 필요가 있습니다.

  1. 신뢰 수준의 값 (α)를 선택해야 합니다.
  2. (α 는 귀무가설이 맞다면 이를 기각할 확률입니다. )
  3. 그리고나서, 우리는 그래프에서 기각역의 범위를 찾습니다.
  4. 검정 통계량이 기각역 범위에 떨어진다면, 귀무가설을 기각합니다. 그렇지 않다면, 귀무가설을 기각하지 않습니다.

주어진 예시에서, Z 검정 통계량은 위의 그림에서 보여줬듯, 표준 정규분포를 따릅니다. Z 값이 분포의 가장 오른쪽 같에 놓여있다면, 귀무가설에 대항하는 가장 강한 근거를 제공하는 것이빈다. 기각역의 범위를 찾기 위해서, 우리는 (임계치라 부르는) Z 값을 찾아야 합니다. 이는 오른쪽 끝에 있는 α의 범위입니다.

# 필요한 함수를 호출합니다. 
from scipy.stats import norm 

# 임계치를 찾습니다. 
critical_val = norm.ppf(1-.05)
critical_val
>>> 1.6448536269514722

임계치는 우리가 귀무가설을 기각할 영역과 귀무가설을 기각하지 않을 영역을 구분합니다. 아래 그림을 보세요.

 

# 검정통계량 분포를 그리고, 기각역과 채택역을 표시합니다. 
# 계산을 더 잘 시각화 하기 위해서 분포 그림을 그립니다. 
x = np.linspace(-4, 4, 100)
plt.plot(x, norm.pdf(x, 0, 1))
plt.axvline(x = critical_val, c = 'r')
x1 = np.linspace(critical_val, 4, 50)
plt.fill_between(x1, norm.pdf(x1, 0, 1), color = 'r')
plt.annotate('Recject Null', (2, 0.20))
plt.annotate('  Do Not Reject\n         Null', (-1, 0.20))
plt.show()

 

인사이트

우리의 통계치 (~ 1.29)는 기각역에 있지 않기 때문에 귀무가설을 기각할 수 없습니다. 그래서 상품의 평균 배송시간이 5일보다 더 크다고 말할 충분한 통계적 증거를 가지고 있지 않습니다.

p-value 접근

기각역의 범위 접근도 우리에게 바람직한 결론을 주지만, 증거의 강도에 대해서는 어떤 것도 말해주지 않습니다. 그래서, 통계학자들은 귀무가설에 대한 증거의 강도를 측정할 수 있는 p-value 방식을 더 선호합니다.

이 방식에 대해 우리는 다음의 단계를 따를 필요가 있습니다.

  1. 신뢰 수준의 값 (α)를 선택해야 합니다.
  2. 그리고나서, 우리는 p-value를 구합니다.
  3. p-value ≤ α 라면 귀무가설을 기각합니다. 그렇지 않으면 귀무가설을 기각할 수 없습니다.

p-value 는 관측된 검정통계량보다 더 극단의 결과를 확인할 확률입니다. 위 의 예시에서 p-value 는 표준 정규분포 곡선에서 검정통계량의 오른쪽 영역에 있는 값 입니다.

 

# 계산된 검정통계량에 따라 검정통계량 분포를 그립니다.
# 계산을 더 잘 시각화 하기 위해서 분포 그림을 그립니다. 
x = np.linspace(-4, 4, 100)
plt.plot(x, norm.pdf(x, 0, 1))
plt.axvline(x = test_stat, c = 'r')
x1 = np.linspace(test_stat, 4, 50)
plt.fill_between(x1, norm.pdf(x1, 0, 1), color = 'r')
plt.show()

# p-value를 계산합니다. 
1- norm.cdf(test_stat)
>>> 0.09851852092578695

 

인사이트

p-valeu ~ 0.098 이 신뢰수준보다 더 크기 때문에 귀무가설을 기각할 수 없습니다. 그래서 상품의 평균 배송 시간이 5일보다 더 크다고 말하기에 충분한 통계적 증거를 가지지 못합니다.

핵심 요약

  • 우리는 기각역의 범위와 p-value 접근방식 둘다를 사용하여 평균 배송시간이 5일보다 더 크다고 말 할 수 있는 충분한 통계적 증거를 가지지 못한다는 동일한 결과를 보였습니다.

단측 검정(One-tailed Tests) 과 양측 검정 (Two-tailed Tests)

예시를 봅시다.

음료수 제조업체의 가장 잘 팔린 상품은 표준편차 50ml 의 600ml 콜라 입니다.

고객은 병에 최소한 600 ml의 콜라가 담겨져 있는지 테스트를 원합니다. 그는 병 안의 콜라의 양이 600 ml보다 작다고 의심하고 있습니다.

고객에 의해 형성된 귀무가설은 아래와 같고

H0 : 𝜇=600

 

이와 반하여 대립 가설은 아래와 같습니다.

Ha : 𝜇<600

 

그러나, 품질 보증 팀은 병안에 콜라양이 정확히 600ml 임을 원합니다. 품질 보증 팀은 병안에 콜라의 양이 600 ml와 다르지 않다는 것을 확실히 하길 원합니다.

품질 보증팀의 귀무가설은 아래와 같고

𝐻0:𝜇=600

 

대립가설은 아래와 같습니다.

𝐻𝑎:𝜇600

 

그래서, 단측 검정과 양측검정이 문제의 본질에 따라 달라집니다.

양측 검정의 예시

당신이 회사의 품질 보증 팀을 위해 일한다고 가정해 봅시다. 경험적으로 병안의 콜라양의 평균은 600 ml 이고, 표준 편차는 50 ml라고 알려져 있습니다.

당신은 36개의 랜덤 샘플된 병을 수집하였고 콜라의 36개 표본의 콜라양의 평균은 580 ml 였습니다.

병안의 콜라양이 600ml와 다른지 신뢰수준 0.05 수준하에서 검증하려고 합니다. 이를 위한 충분한 통계적 근거를 가지고 있나요?

Z-test 를 만족하는 가정인가요?

  • 표본이 정규분포로 부터 수집되었는지 - 표본 크기가 36개 (30보다 큰 수) 이므로, 중심극한 정리가 표본 평균의 분포가 정규분포를 따른 다는 것을 증명합니다. 만약 샘플사이즈가 30개보다 작다면, 모집단의 분포가 정규분포라면, Z test를 적용할 수 있을 것입니다.
  • 관측치들은 단순 랜덤 샘플로 부터 수집되었는지 - 단순 랜덤 샘플로 부터 수집하였다고 위에서 정의하였습니다.
  • 표본 편차가 알려져 있는지 - Yes

오! 우리는 이 문제에 Z-test를 사용할 수 있습니다.

다음 단계는 검정통계량을 찾아봅시다.

# 모평균과 모표준편차가 각각 600, 50이라고 가정해봅시다. 
mu, sigma = 600, 50 

# 표본평균이 580 이라고 가정해봅시다. 
x_bar = 580 

# 검정 통계량을 계산합시다. 
test_stat = (x_bar - mu ) / (sigma / np.sqrt(36))
test_stat
>>> -2.4

 

양측 검정의 기각역 범위 방식을 사용해 봅시다.

위의 예시에서, Z 검정 통계량은 표본 정규분포를 따릅니다. 분포의 왼쪽 끝과 오른쪽 끝에 있는 Z 값은 귀무 가설에 대한 강력한 증거를 제공합니다. 기각역 범위를 찾기 위해, (임계치라 불리는) Z 값을 찾아 왼쪽과 오른쪽 끝에 𝛼/2 만큼의 영역을 줄 것입니다.

# import the required function 
from scipy.stats import norm 

# 임계치를 찾습니다. 
critical_val1 = norm.ppf(1- (0.05/2))
critical_val2 = norm.ppf(0.05/2)

# 기각영역과 채택 영역을 그려 봅니다. 
# 계산을 더 잘 시각화 하기 위해서 분포 그림을 그립니다. 

x = np.linspace(-4, 4, 100)
plt.plot(x, norm.pdf(x, 0, 1))
plt.axvline(x = critical_val1, c = 'r')
x1 = np.linspace(critical_val1, 4, 50)
plt.fill_between(x1, norm.pdf(x1, 0, 1), color = 'r')
plt.axvline(x = critical_val2, c = 'r')
x1 = np.linspace(-4, critical_val2, 50)
plt.fill_between(x1, norm.pdf(x1, 0, 1), color = 'r')
plt.annotate('Reject Null', (2.2, 0.20))
plt.annotate('Reject Null', (-3.5, 0.20)) 
plt.annotate('  Do Not Reject\n        Null', (-1, 0.20)) 
plt.show()

우리의 검정 통계량이 (~ -2.4 ) 기각 영역에 놓여있기 때문에, 우리는 귀무가설을 기각할 수 있습니다. 그래서 우리는 병안에 들어있는 콜라의 양이 600 ml와 다르다 고 말할 충분한 통계적 증거를 가지고 있습니다.

단측 검정 예시

병안의 콜라의 양의 평균이 600ml라고 알려져 있고, 표준 편차가 500ml 라고 하자. 당신이 병안에 콜라가 600 ml 보다 작은지 테스트하길 원하는 고객이라고 가정하자.

당신은 임의로 36개의 병을 수집했다. 수집한 표본의 콜라 양의 평균은 580 ml 였다.

이를 위한 충분한 통계적 증거가 있다고 할 수 있을까요?

Z-test를 만족하는 가정인가요?

  • 표본이 정규분포로 부터 수집되었는지 - 표본 크기가 36개 (30보다 큰 수) 이므로, 중심극한 정리가 표본 평균의 분포가 정규분포를 따른 다는 것을 증명합니다. 만약 샘플사이즈가 30개보다 작다면, 모집단의 분포가 정규분포라면, Z test를 적용할 수 있을 것입니다.
  • 관측치들은 단순 랜덤 샘플로 부터 수집되었는지 - 단순 랜덤 샘플로 부터 수집하였다고 위에서 정의하였습니다.
  • 표본 편차가 알려져 있는지 - Yes

오! Z-test를 이 문제에 적용해 볼 수 있겠습니다.

다음은 검정통계량을 찾는 단계입니다.

# 모평균과 모표준편차가 각각 600, 50이라고 가정해봅시다. 
mu, sigma = 600, 50 

# 표본평균이 580 이라고 가정해봅시다. 
x_bar = 580 

# 검정 통계량을 계산합시다. 
test_stat = (x_bar - mu ) / (sigma / np.sqrt(36))
test_stat
>>> -2.4

단측 검정의 기각역 범위 방식을 사용해 봅시다.

위의 예시에서, Z 검정 통계량은 표본 정규분포를 따릅니다. 분포의 왼쪽 끝에 있는 Z 값은 귀무 가설에 대한 강력한 증거를 제공합니다. 기각역 범위를 찾기 위해, (임계치라 불리는) Z 값을 찾아 왼쪽과 오른쪽 끝에 𝛼 만큼의 영역을 줄 것입니다.

# import the required function 
from scipy.stats import norm 

# 임계치를 찾습니다. 
critical_val = norm.ppf(0.05)

# 기각영역과 채택 영역을 그려 봅니다. 
# 계산을 더 잘 시각화 하기 위해서 분포 그림을 그립니다. 

x = np.linspace(-4, 4, 100)
plt.plot(x, norm.pdf(x, 0, 1))
plt.axvline(x = critical_val, c = 'r')
x1 = np.linspace(-4, critical_val, 50)
plt.fill_between(x1, norm.pdf(x1, 0, 1), color = 'r')
plt.annotate('Reject Null', (-3.5, 0.20)) 
plt.annotate('  Do Not Reject\n        Null', (-1, 0.20)) 
plt.show()

우리의 검정 통계량이 (~ -2.4 ) 기각 영역에 놓여있기 때문에, 우리는 귀무가설을 기각할 수 있습니다. 그래서 우리는 병안에 들어있는 콜라의 양이 600 ml 보다 작다고 말할 충분한 통계적 증거를 가지고 있습니다.

 

핵심 요약

  • 단측 검정 하에서는, 한 방향의 차이점만 고려하였습니다. 그러나 양측검정하에서는, 두 방향에 차이가 있는지 관심이 있었습니다.
  • 문제의 본질에 따라 하나를 선택하세요!