본문 바로가기
통계 분석

[Python] T-검정의 종류와 구현2(대응하는 비모수 검정)

by DongGoo 2023. 11. 10.

이전글에서 일표본 t-검정에 해당하는 파이썬 구현방법과 대응하는 비모수 검정 방법을 알아보았습니다.

이번 글에서는 독립표본 T-검정( independent t-test )과 이에 대응하는 만-휘트니U검정비모수 검정에 대해서 알아보도록 하겠습니다.

1. 독립표본 T-검정( independent t-test )

독립표본 T-검정은 2표본 T-검정이라고도 불립니다.

독립표본 T-검정이란 두 집단 간 평균치의 차이를 비교하는 통계 검정 방법입니다.

이 검정의 가설 설정은 아래와 같습니다.

귀무가설(H0) : "집단A와 집단B의 평균이 동일하다."

대립가설(H1) : "집단A와 집단B의 평균이 동일하지않다."

 

독립표본 T-검정( independent t-test )을 수행하기 위해서는 3가지 조건이 충족 되어야 합니다.

전제 조건

  1. 두 집단의 데이터는 정규분포를 따라야한다.(정규성을 만족해야 한다.)
  2. 두 집단의 분산이 동일해야한다. (등분산성을 만족해야한다.)
  3. 두 집단의 데이터가 독립이어야 한다.(독립성을 만족해야한다.)
  4. 연속형 데이터여야 한다.
    • 연속형 데이터에 대해서만 수행할 수 있습니다.

위의 조건이 충족 되지 않은 경우 다른 검정 방법을 사용해야합니다.

 

Python 독립표본 T-검정

Python에서 독립표본 T-검정을 시행하기 위해서는 scipy 라이브러리 stats 모듈의 ttest_ind함수를 사용할 수 있습니다.

 

ttest_ind함수의 매개변수는 아래와 같습니다.

scipy.stats.ttest_ind(a, b, axis=0, equal_var=True, nan_policy='propagate', permutations=None, random_state=None, alternative='two-sided', trim=0, *, keepdims=False)

      • a,b : 두개의 독립적인 표본집단을 의미합니다.(집단의 데이터는 연속형이어야 합니다.)
      • equal_var : 분산이 동일한지에 대한 가정, 분산이 동일하다면 True 아니면 False
      • nan_policy : 입력 NaN을 처리하는 방법을 정의합니다.
        • propagate: 통계가 계산되는 축 슬라이스(예: 행)에 NaN이 있는 경우 출력의 해당 항목은 NaN이 됩니다.
        • omit: 계산을 수행할 때 NaN은 생략됩니다. 통계가 계산되는 축 조각에 데이터가 충분하지 않은 경우 출력의 해당 항목은 NaN이 됩니다.
        • raise: NaN이 있으면 a가 ValueError발생합니다.
      • alternative : 대립 가설을 정의합니다. 다음 옵션을 사용할 수 있습니다(기본값은 'two-sided'):
        • two-sided : 표본의 기본 분포 평균이 동일하지 않습니다.
        • less : 첫 번째 표본의 기본 분포 평균이 두 번째 표본의 기본 분포 평균보다 작습니다.
        • greater : 첫 번째 표본의 기본 분포 평균이 두 번째 표본의 기본 분포 평균보다 큽니다.

구현

우선 데이터를 불러옵니다.

import pandas as pd 
import matplotlib.pyplot as plt

df1 = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/ind1.csv')
df2 = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/ind2.csv')

좌 : df1, 우 : df2

정규성 검정과 등분산 검정을 실시한다.

from scipy.stats import shapiro
from scipy.stats import bartlett
# 정규성 검정
print(shapiro(df1))
print(shapiro(df2))
# ShapiroResult(statistic=0.9860946536064148, pvalue=0.379673033952713)
# ShapiroResult(statistic=0.990182638168335, pvalue=0.6793646216392517)

# 등분산성 검정
print(bartlett(df1['data'],df2['data']))
# BartlettResult(statistic=4.170597307474754, pvalue=0.04113129672708929)

 

정규성을 만족하기 때문에 bartlett을 통해 등분산 검정을 실행합니다.

결과 정규성과 등분산성을 모두 만족하기 때문에 독립표본 t검정(=이표본 t검정)을 실행합니다.

from scipy.stats import ttest_ind

print(ttest_ind(df1,df2,equal_var=True))
# TtestResult(statistic=array([2.76719074]), pvalue=array([0.00619015]), df=array([198.]))

 

분산이 동일하기 때문에 equal_var의 값을 True로 설정해줍니다.

결과 해석

pvalue의 결과 0.006으로 0.01보다 작은 값이므로 유의수준 1%하에서도 두집의단의 평균은 동일하지 않다는 대립가설을 채택 할수 있습니다.

즉, "두집단의 평균은 유의한 차이를 보이지 않는다"

2. 대응하는 비모수 검정

독립표본 t-검정의 전제조건이 충족 되지 않을때 비모수 검정을 통해 두 집단간의 중앙값을 비교합니다.

만-휘트니U검정

두 독립표본 간의 중앙값 차이를 검증하는 비모수 검정입니다.

특징

  1. 두 집단은 독립성을 가져야한다.
  2. 정규성을 만족하지 않아도 된다.
  3. 연속형 변수 혹은 순서형변수.(범주형 변수에는 적용하지 못합니다.)
  4. 중앙값의 차이를 비교한다.
  5. 결측값이 존재해선 안된다.

가설

만-휘트니U검정의 가설은 아래와 같습니다.

귀무가설(H0) : "집단A와 집단B의 중앙값이 동일하다."

대립가설(H1) : "집단A와 집단B의 중앙값이 동일하지않다."

Python

파이썬에서 만-휘트니U검정을 시행하기 위해서 scipy 라이브러리 stats묘듈의 mannwhitneyu함수를 통해 구현할 수 있습니다.
데이터를 불러옵니다.

import pandas as pd 
import matplotlib.pyplot as plt
df = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/scipy5.csv')

 

해당 데이터에는 결측값이 존재하기 때문에 결측값을 제거한 후 진행해야 합니다.

from scipy.stats import shapiro

print(shapiro(df['B'].dropna()))
print(shapiro(df['A']))
# ShapiroResult(statistic=0.9639433026313782, pvalue=0.00013568344002123922)
# ShapiroResult(statistic=0.93753981590271, pvalue=6.175894240456614e-10)

 

결측값을 제거한 후 정규성 검정을 한 결과 두 그룹 모두 정규성을 가지지 않기 때문에 만-휘트니U검정을 실행합니다.

* 두 집단중 한 집단이라도 정규성을 만족하지 못하는 경우 독립 표본 t검정을실행 할 수 없습니다.

from scipy.stats import mannwhitneyu

print(mannwhitneyu(df['A'],df['B'].dropna()))
# MannwhitneyuResult(statistic=27036.0, pvalue=0.9807458376150018)

결과해석

만-휘트니 U검정을 실행한 결과 pvalue값이 0.98로 귀무 가설을 채택하는 결과가 나왔습니다.

즉, "두집단 간의 중앙값에는 유의한 차이가 없다" 입니다.