데이터과학 기초/통계

파이썬으로 단일표본 t-test 돌리기

eigenvector 2022. 8. 2. 10:54
반응형

이전 시간에는 t 분포를 활용한 검정 중, 가장 많이 쓰이고 유명한  독립 표본 검정(independent t-test)을 알아보았습니다.

 

2022.07.29 - [데이터과학 기초/Python배우기] - 파이썬으로 독립표본 t-test 돌리기

 

오늘은 t-test 중, 단일표본(1-Sample) t 검정을 배워보겠습니다.

 


t-test지만, 조건이 다른 두 검정(단일표본) 방식

 

단일표본 t 검정은 t 분포를 쓴다는 점에서 다른 t 검정과 같이 묶이지만 다른 접근 방식을 갖고 있습니다.

 

이름에서 확인되듯(단일표본, 1-sample) "두 집단 대신 하나의 집단을 분석할 때" 사용되기 때문입니다.

 

(참고로 종속표본 검정의 경우 "두 집단을 비교하지만, 두 집단이 독립되지 않은 상태"일 때 사용합니다)

 

그렇다면, 단일 표본 검정은 어떨 때 사용할까요?

 

단일 표본 검정은 하나의 집단(데이터)에서 특정값이 갖는 위치를 확인하는 데 사용합니다.

 

듣기에는 모호하지만, 구체적 사례로 들어가면 어렵지 않습니다.

 

예시)

전 국민을 대상으로 스트레스 지수 측정을 했을 때, 스트레스 지수의 평균값이 50이라고 보고됐습니다.

학생 1000명을 대상으로 스트레스 측정을 했을 때, 학생들이 평균보다 더 높거나 낮은 스트레스를 받는지 알 수 있을까요?

 

이와 같은 문제가 주어졌을 때, 연구자들은 구체적인 가설을

 

학생들의 스트레스 평균이 50과 통계적으로 차이가 없다는 생각을 귀무가설

학생들의 스트레스 평균이 50과 통계적으로 차이가 있다는 생각을 대립가설

 

로 설정하여, t 분포를 통해 검정하는 방법을 취합니다.

 

이 문제를 파이썬으로 풀어보도록 하죠.


준비

오늘 사용할 패키지는 이전 시간과 동일하게 Pandas, Pingouin, Seaborn 입니다.

 

과거 포스팅을 참조하여 설치를 진행해 주시면 됩니다.

 

(코딩 환경은 자유지만, 주피터 환경을 추천합니다)


데이터 로드

위에서 주어진 문제를 해결하기 위해 데이터를 로드한 후 기술적 분석을 수행해 봅시다.

 

샘플 데이터는 1000명을 대상으로 조사한 스트레스 지수입니다.

 

아래 csv 파일을 다운로드하여서 파이썬 폴더에 넣어주세요.

 

stress.csv
0.01MB

 

이제, 주피터 노트북을 실행하고 다음과 같이 데이터를 로드합니다.

 

import pandas as pd
import pingouin as pg
import seaborn as sns

survey = pd.read_csv("stress.csv")
survey.head()

데이터가 문제없이 로드된 것이 확인됍니다.

 

이제, 결측 값(missing), 이상치(outlier) 등의 문제가 존재하는지 확인하기 위해 기술 분석을 수행합니다.

 

survey.Stress.describe()

기술 분석 결과를 보면, 결측값 문제나 이상치(급격하게 높거나 낮은 값)가 없어 보입니다.

 

(최대~최솟값도 지정한 범위 내에 있고, count도 1000개로 조사한 인원 수와 동일합니다)

 

이제, 분포의 구체적인 모습을 확인하기 위해 seaborn으로 분포 시각화를 수행해 보겠습니다.

 

데이터가 많은 만큼 밀도 함수도 같이 넣어주면 좋을 것 같습니다.

 

import seaborn as sns

# 밀도함수 같이 표기
sns.displot(survey, x="Stress", kde=True)

 

데이터 평균이 50 이상이고, 높은 스트레스 수치가 많아  보입니다.

 

기술적으로 분석해 볼 때, 학생 집단은 스트레스 지수가 높은 편에 속하는 것 같습니다.

 

하지만, "그럴 것 같다"와 "통계적으로 유의하다"는 다릅니다.

 

이런 경향이 통계적으로 유의한 지 구체적인 검정을 통해 확인해 봅시다.

 


단일 표본 t-test를 위한 단계

t-test를 수행하기 전 우리는 데이터가 통계 기법을 사용하기 적합한지 조건을 확인해야 합니다.

 

이전 시간의 독립 표본 검정의 경우, 자동 보정 기능을 썼지만, 단일 표본 검정은 해당 기능을 사용하기 어렵습니다.

 

그렇기 때문에, 오늘은 직접 조건을 확인해 보도록 하겠습니다.

 

샤피로-윌크 검정(Shapiro-Wilk)

샤피로-윌크 검정은 데이터의 정규성(normailty)을 검정하는 데 사용됩니다.

 

이는 데이터가 통계적 기법을 사용하기 적당한 분포를 가지고 있는지 확인하는 과정입니다.

 

데이터가 적합한 분포를 가질 경우 "정규분포를 따른다"라고 하며, 이는 많은 통계기법의 전제 조건이 됩니다.

 

(이 부분은 자세히 설명하면 엄청나게 길어지지만, 통계학 강좌가 아니기 때문에 일단 넘어가도록 하죠)

 

정규성 검정으로 많이 사용되는 샤피로-윌크 검정을 수행해 보겠습니다.

 

import pingouin as pg

pg.normality(survey.Stress)

일반적으로 p-value가 0.05보다 낮은 경우 "정규성이 위배" 되고 그 외의 경우 "정규성이 만족"된다고 봅니다.

 

데이터가 정규성을 가진다고 확인됐기 때문에, 다음 단계로 넘어가겠습니다.

 

단일 표본 t 검정

 

우리는 학생들의 스트레스 지수 평균이 전체 인구 평균(50)과 유의미한 차이가 있는지 확인하려 합니다.

 

이를 위해, 설문의 스트레스 변수(Stress) 값을 단일표본 t검정 함수에 전체 인구 평균(50)과 같이 넣어줍니다.

 

import pingouin as pg

avg_stress = 50

results = pg.ttest(survey.Stress, avg_stress)
results

결과가 나왔지만, p-value가 약간 거슬리는군요.

 

소수점 3자리 내로 정리하도록 해 보겠습니다.

 

results.round(3)

 

p-value를 기준으로 볼 때, 귀무가설이 기각됩니다(p<0.001).

 

즉, 학생들의 스트레스 지수 평균은 50과 통계적으로 같지 않습니다(=차이가 납니다).

 

여기서 주의해야 할 사실은 two-sided 검정이기 때문에 "크다", "작다"가 아닌 "같지 않다"라고 해야 한다는 점입니다.

 

(우리는 앞선 기술 분석으로 평균이 더 크다는 사실을 알지만, 신뢰구간(Confidence Interval)을 통해 확인해 볼 수도 있겠군요)

 


결과 보고

이전 포스팅에서 말한 바와 같이, 검정 결과 보고는 세 가지를 넣어 한 단락 정도 적어주시면 됩니다.

 

1. 통계 검정 종류

~를 확인하기 위해 단일표본 t검정(one-sample t-tset)을 수행했다

 

2. 통계수치

검정 결과 t(999) = 46.222, p < 0.001, 신뢰구간 95%에서 [64.41, 65.59]로 대립가설을 채택한다(=귀무가설을 기각한다 = 평균이 ~와 같지 않았다)

 

3. 결과 해석

통계적으로 학생의 스트레스 수치는 ~로 ~보다 높은 상태였다.

반응형