[PYTHON]-(02) 데이터 마이닝[t검정]
t 검정
우리는 간혹
- 인터넷으로 구매한 닭가슴살의 무게가 100g이 맞는지 의심하거나
- 꾸준히 운동한 그룹과 운동을 거의 하지 않는 그룹 간의 근육량의 차이가 있는지 혹은
- 운동을 거의 하지 않는 그룹에 보충제를 먹여 근육량을 증가시킬 수 있을지 궁금할 수 있다.
이때 우리는 t-검정을 통해 각 경우에서 통계적으로 평균의 차이가 있는지 밝혀낼 수 있다.
우리는 실사례에서 대부분 모집단의 모수를 모르거나, 데이터수가 많지 않은 경우가 존재하는데 이때, t-검정을 통해 모평균을 추정하고 평균의 차이를 비교할 수 있다.
이에 대한 내용으로 모표준편차(σ)를 표본으로부터 추정된 표본표준편차 S로 대신하여 모평균에 대한 추정을 실시하는데, 이러한 과정을 스튜던트화(Studentize)라고 한다.
/스튜던트화.png)
스튜던트화된 표본 평균이 t분포를 따름을 이용하여 모평균에 대한 추정이나 유의성 검증을 할 수 있다.
이어서 앞선 예시에 대한 실습을 해보자
1. 단일 표본 t-검정(일표본 t검정)
단일 표본 t-검정은 표본이 하나이고 우리가 알고 싶어하는 평균과의 차이가 존재하는지 검증하는 방법이다.
즉, 첫 번째 예시인 인터넷으로 구매한 닭가슴살의 무게가 100g이 맞는지 알아보는데 활용할 수 있다.
몇 가지 조건이 있는데 t검정에서 t분포는 중심극한정리에 따라 표본의 수가 많아질 수록 정규분포에 수렴하게 된다.
만약 표본의 수가 30개 미만인 경우에는 자료에 대한 정규성을 확인해보고 만약 정규성을 만족하면 t-검정을 계속해서 수행하고, 자료가 정규분포를 따르지 않는 경우에는 비모수 검정을 수행한다.
비모수 검정 방법에는 부호 검정(Signed test)와 분포의 형태가 대칭이 경우 부호순위 검정(Signed Rank test)를 해볼 수 있다.
예시를 통해 알아보자
1.1 단일표본 t검정 예제
/닭가슴살.png)
어느 한 닭가슴살 업체의 닭가슴살 한 봉의 중량을 100g으로 광고하고 있다.
이때, 어느 구매자가 무게 대한 의심을 품고 제품 10개에 대한 무게를 잰 결과 다음과 같다.
닭가슴살의 중량이 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