t 검정

우리는 간혹

  1. 인터넷으로 구매한 닭가슴살의 무게가 100g이 맞는지 의심하거나
  2. 꾸준히 운동한 그룹과 운동을 거의 하지 않는 그룹 간의 근육량의 차이가 있는지 혹은
  3. 운동을 거의 하지 않는 그룹에 보충제를 먹여 근육량을 증가시킬 수 있을지 궁금할 수 있다.

이때 우리는 t-검정을 통해 각 경우에서 통계적으로 평균의 차이가 있는지 밝혀낼 수 있다.
우리는 실사례에서 대부분 모집단의 모수를 모르거나, 데이터수가 많지 않은 경우가 존재하는데 이때, t-검정을 통해 모평균을 추정하고 평균의 차이를 비교할 수 있다.
이에 대한 내용으로 모표준편차(σ)를 표본으로부터 추정된 표본표준편차 S로 대신하여 모평균에 대한 추정을 실시하는데, 이러한 과정을 스튜던트화(Studentize)라고 한다.

정의

스튜던트화된 표본 평균이 t분포를 따름을 이용하여 모평균에 대한 추정이나 유의성 검증을 할 수 있다.
이어서 앞선 예시에 대한 실습을 해보자



1. 단일 표본 t-검정(일표본 t검정)

단일 표본 t-검정은 표본이 하나이고 우리가 알고 싶어하는 평균과의 차이가 존재하는지 검증하는 방법이다.

즉, 첫 번째 예시인 인터넷으로 구매한 닭가슴살의 무게가 100g이 맞는지 알아보는데 활용할 수 있다.

몇 가지 조건이 있는데 t검정에서 t분포는 중심극한정리에 따라 표본의 수가 많아질 수록 정규분포에 수렴하게 된다.
만약 표본의 수가 30개 미만인 경우에는 자료에 대한 정규성을 확인해보고 만약 정규성을 만족하면 t-검정을 계속해서 수행하고, 자료가 정규분포를 따르지 않는 경우에는 비모수 검정을 수행한다.

비모수 검정 방법에는 부호 검정(Signed test)와 분포의 형태가 대칭이 경우 부호순위 검정(Signed Rank test)를 해볼 수 있다.

예시를 통해 알아보자

1.1 단일표본 t검정 예제

정의

어느 한 닭가슴살 업체의 닭가슴살 한 봉의 중량을 100g으로 광고하고 있다.
이때, 어느 구매자가 무게 대한 의심을 품고 제품 10개에 대한 무게를 잰 결과 다음과 같다.

94.5, 102.2, 97.7, 104.9, 91.9, 99.2, 99.8, 94.7, 103.2, 101


닭가슴살의 중량이 100g이 맞는지에 대한 가설을 세우고 검정해보자

1단계 : 가설설정

정의

2단계 : 정규성확인
정규분포 분위수대조도(Q-Q plot)을 작성하여 정규모집단을 전제로 하는 방법의 적용에 무리가 없는지 확인

from scipy import stats
import matplotlib.pyplot as plt

weight = [94.5, 102.2, 97.7, 104.9, 91.9, 99.2, 99.8, 94.7, 103.2, 101]

stats.probplot(weight, dist=stats.norm, plot=plt)

정의

그림의 결과처럼 정규모집단의 전제에 무리가 없다고 볼 수 있지만 위의 예시와 같이 자료의 수가 적은 경우에는 문제가 생길 여지가 있다. 이러한 경우 문제에 내재된 이론이나 지식에 근거하여 정규모집단의 가정을 받아들이거나 비모수 검정 방법인 부호검정이나 부호순위검정을 적용한다.

3단계 : p-value 계산

from scipy import stats
import matplotlib.pyplot as plt

weight = [94.5, 102.2, 97.7, 104.9, 91.9, 99.2, 99.8, 94.7, 103.2, 101]

stats.ttest_1samp(weight, 100, alternative='two-sided')

# 결과
# Ttest_1sampResult(statistic=-0.8223221535613596, pvalue=0.4321394915931078)


위 예제에서 t분포의 기각역이 유의수준 0.05에서 t(0.05, 9) = ±1.833 이므로
t 값이 -0.8223일 때 기각역에 속하지 않으므로 닭가슴살의 중량이 100g 이라는 귀무가설을 기각할 수 없다.
이를 유의확률을 통해 확인해보아도 p-value가 0.4321이므로 유의수준 0.05에서 귀무가설을 기각할 수 없고,
해당 업체는 통계적으로 유의한 수준 내에서 양심적으로 닭가슴살을 판매하고 있다고 볼 수 있다.

※ 만약 표본의 크기가 충분히 크다면 t분포를 사용할 것이 아니라 정규분포를 사용해서 기각역을 z_0.025 = 1.96으로 설정하면 된다.



2. 독립 표본 t-검정(이표본 t검정)

독립 표본 t-검정은 두 번째 예시인 꾸준히 운동한 그룹운동을 거의 하지 않는 그룹 간의 근육량의 차이가 있는지 알아보기 위한 방법이다.

독립 표분 t검정에서는 기본적으로 2가지의 자료 구조를 요구한다.

  • 두 그룹의 레코드는 각 모집단에서 랜덤으로 추출된 자료이다.
  • 두 그룹은 서로 독립적으로 관측된 것이다.

다만 두 그룹이 공통분산이라는 전제하에서 합동 이표본 t-검정(pooled two-sample t-test)과 공통분산의 전제가 없는 경우 자유도를 조절하여 사용하는 비합동 이표본 t-검정(unpooled two-sample t-test)로 나눌 수 있다.
합동 이표본 t-검정은 당연 공통분산의 조건에 유의해야하고,
만약 이표본의 크기가 서로 다르고 전제조건마저 충족되지 않으면 그 유효성이 쉽게 상실되므로 유의해야한다.

대부분의 통계패키지에서는 두 집단의 분산이 동일함을 가정하고 있으므로 유의확률이 0.05보다 작다면 두 집단의 분산이 같지 않다고 보면 된다.

2.1 독립표본 검정 예제

정의
어느 몸무게가 70kg인 일반인과 헬창 그룹의 체성분검사 결과는 다음과 같다. 헬창그룹의 골격근량이 일반인과 비교하여 차이가 있는지 비교해보자

1단계 : 가설설정 정의

2단계 : 등분산검정

import numpy as np
np.random.seed(1)
normal_group = np.random.uniform(low=20, high=30, size=30 ).tolist()
addicted_group = np.random.uniform(low=35, high=45, size=30 ).tolist()

# Levene 등분산 검정
levene = stats.levene(normal_group, addicted_group)

 결과
 LeveneResult(statistic=0.002846877556293093, pvalue=0.9576315070504511)

p-value가 0.05보다 크므로 등분산성 가정을 만족한다고 볼 수 있다.

3단계 : p-value 계산

import numpy as np
np.random.seed(1)
normal_group = np.random.uniform(low=20, high=30, size=30 ).tolist()
addicted_group = np.random.uniform(low=35, high=45, size=30 ).tolist()

# 합동 이표본 t검정
stats.ttest_ind(normal_group, addicted_group, equal_var = True, alternative='less') # equal_var = True 등분산일 때

# 결과
# Ttest_indResult(statistic=-19.558840622920485, pvalue=3.24726680601367e-27)

p-value가 0.05보다 작으므로, 두 그룹의 골격근량의 차이가 없다는 귀무가설을 기각하고 첫번째 그룹(일반인)이 두번째 그룹(헬창) 그룹보다 작다는 대립가설을 채택하여 헬창 그룹의 근육량은 통계적으로도 유의하게 일반인 그룹과 차이가 있음을 확인할 수 있다.



3. 대응 표본 t-검정

대응표본 t-검정은 세 번째 예시인 운동을 거의 하지 않는 그룹에 보충제를 먹여 근육량을 증가시킬 수 있을지를 알아보는 경우에 적용시킬 수 있다.
일반적으로 비교의 효과를 높이고자 동질적인 실험단위에 쌍을 이루어 두 처리를 적용하고 비교하지만 본 예제에서는 특정 처리의 전과 후에 대한 비교만 진행한다.

3.1 대응 표본 t-검정 예제

정의

어느 몸무게가 70kg인 일반인 그룹에 한 달간 헬스 보충제를 복용시키고 처리의 전,후의 차이가 있는지 비교해보자

1단계 : 가설설정

정의

2단계 : 정규성 확인

  • 생략

3단계 : p-value 확인

import numpy as np
np.random.seed(1)
before = np.random.uniform(low=20, high=30, size=30 ).tolist()
after = np.random.uniform(low=20, high=33, size=30 ).tolist()

# 대응 표본 t검정
stats.ttest_rel(before, after)

# 결과
# Ttest_relResult(statistic=-1.9403252597103817, pvalue=0.06211890717328462)

유의수준 0.05에서 귀무가설을 채택하고 보충제 복용 전 후의 차이가 없다고 볼 수 있다.


Leave a comment