본문 바로가기
통계 분석

[Python] 일표본 t-검정(대응하는 비모수 검정)

by DongGoo 2023. 11. 8.

T-검정은 대표적인 모수검정 중 하나입니다. 이번 글에서는 T-검정의 종류와 파이썬에서의 사용법,

이에 대응하는 비모수적 검정법을 알아보도록 하겠습니다.

T-검정의 종류

t-검정에는 일표본 t-검정, 독립 표본 t-검정, 대응 표본 t-검정등이 대표적인 t-검정법이 있습니다.

파이썬 scicpy 라이브러리의 stats모듈에서 여러가지 t-검정을 수행하는 함수를 제공하고 있습니다.

1. 일표본 t-검정 (One-sample t-test)

모집단의 평균을 알고 있을 때, 연구자가 분석하고자 하는 표본집단과 이미 알고 있는 모집단과의 평균

차이를 분석하기 위해 사용하는 검정법입니다.

이때, 모집단의 평균이 아닌 임의로 설정한 평균과 비교하는 것도 가능합니다.

일표본 T-검정의 전제조건

일표본 T-검정을 수행하기 위해서는 다음과 같은 조건이 성립되어야 합니다.

1. 정규성 : 표본 데이터는 정규 분포를 따라야합니다.

정규성을 확인 하는 방법은해당 글에서 확인하실수 있습니다.

https://big-data97.tistory.com/70

 

[Python] 정규성 검정

1. 정규성이란? 정규성이란 데이터의 분포가 정규 분포를 따르는지 나타내는 통계적 개념입니다. 정규 분포란 평균을 중심으로 양쪽으로 대칭인 종 모양의 분포를 말합니다. 평균(m)이 100, 표준

big-data97.tistory.com

일표본 T-검정의 가설

귀무가설(H0) : 모집단의 평균과 표본집단의 평균은 같다.

대립가설(H1) : 모집단의 평균과 표본집단의 평균은 다르다.

 

검정의 결과는 초기에 설정한 유의수준을 0.05라고 한다면 유의확률(p값)이 0.05보다 크면 귀무가설을 채택하고,

0.05보다 작다면 대립가설을 채택하게 됩니다.

Python에서의 일표본 T-검정

Python에서 일표본 t-검정을 수행하기 위해 scicpy 라이브러리의 stats 모듈에서 제공하는 ttest_1samp 함수를 사용할 수 있습니다.

일표본 T-검정 예제

평균키는 165라 판단할수 있는지 귀무가설과 대립가설을 설정한 후 유의수준 5%로 검정하라.


위의 문제에 대한 가설설정을 설정합니다.

귀무가설(H0) : 100명의 키의 평균은 165cm이다.

귀무가설(H0) : 100명의 키의 평균은 165cm이 아니다.

 

우선 예제의 데이터는 아래와 같습니다.

import pandas as pd 
df = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/height1.csv')
print(df)

우선 데이터의 정규성을 검정하기 위해 데이터의 수를 확인합니다.

데이터의 수가 5000개가 넘어가게 되면 anderson검정을 실행합니다.

데이터의 수(row)가 100개이므로 shapiro를 통해 정규성을 검정합니다.

from scipy.stats import shapiro

static, pvalue = shapiro(df)
print(pvalue) # 0.4558176100254059

p값이 0.05이상이므로 귀무가설을 채택합니다.(데이터는 정규성을 만족한다.)

데이터가 정규성을 만족하기 때문에 일표본 t-검정을 통해 평균값 차이에 대해 검정합니다.

ttest_1samp의 매개변수

ttest_1samp ( a , popmean , axis = 0 , nan_policy = 'propagate' , Alternative = 'two-facing' , * , keepdims = False  )

  • a : 표본데이터
  • popmean : 모집단의 평균
  • nan_policy  {‘propagate’, ‘omit’, ‘raise’} : 값들중 NaN값을 처리하는 방법입니다.
    • propagate: 통계가 계산되는 축 슬라이스(예: 행)에 NaN이 있는 경우 출력의 해당 항목은 NaN이 됩니다.
    • omit: 계산을 수행할 때 NaN은 생략됩니다. 통계가 계산되는 축 조각에 데이터가 충분하지 않은 경우 출력의 해당 항목은 NaN이 됩니다.
    • raise: NaN이 있으면 a가 ValueError발생합니다.
  • alternative{‘two-sided’, ‘less’, ‘greater’} : 대립 가설을 정의합니다.(기본값은 two-sided)
    • two-sided: 표본의 기본 분포 평균이 주어진 모집단 평균( popmean ) 과 다릅니다.
    • less: 표본의 기본 분포 평균이 주어진 모집단 평균( popmean ) 보다 작습니다.
    • greater: 표본의 기본 분포 평균이 주어진 모집단 평균( popmean ) 보다 큽니다.

자세한 내용은 아래의 링크를 참고하시길 바랍니다.

https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_1samp.html

 

scipy.stats.ttest_1samp — SciPy v1.11.3 Manual

previous scipy.stats.binned_statistic_dd

docs.scipy.org

 

a = df,

popmean = 165,

nan_policy = NaN값이 없으므로 넘어갑니다.

alternative = 평균 키가 165cm가 아니다는 평균 키가 165cm 이하 일수도, 165cm 이상일 수도 있기 때문에 양측 검정인 'two-sided'를 선택합니다.( two-sided는 default 값이 기 때문에 선택하지 않아도 됩니다.)

from scipy.stats import ttest_1samp

static, pvalue = ttest_1samp(df['height'],165)
# 3.2017884987150644, 0.0018367171548080209

 

결과 해석

유의수준을 5%로 설정했기 때문에 pvalue값이 0.05보다 작은지 확인합니다.

pvalue값이 0.0018 이기 때문에 귀무가설( 100명의 키의 평균은 165cm이다. )을 기각합니다.

따라서 "표본데이터의 100명의 키의 평균은 165cm가 아니다." 라는 결과를 얻을수 있습니다.

 

2. 대응하는 비모수 검정법

윌콕슨 부호 순위 검정( Wilcoxon signed-rank tes  )

관련된 두 표본집단(대응표본)의 중앙값에 차이가 있는지 판단하기 위한 비모수적 방법입니다.

윌콕슨 부호 순위 검정법은 표본이 정규 분포를 따르지 않거나, 표본의 크기가 작은 경우 주로 사용합니다.

윌콕슨 부호 순위 검정의 전제조건

  • 대응 표본: 검정을 수행하는 두 표본 집단은 서로 관련이 있어야 합니다.
    예를 들어 같은 개체에서 두 번의 측정이 이루어진 경우, 또는 같은 조건에서 두 개의 다른 처리가 적용된 경우 등입니다.
  • 연속성: 데이터는 연속적이어야 합니다. 즉, 순서를 매길 수 있어야 합니다.
  • 대칭성: 데이터의 분포는 대칭적이어야 합니다. 이것은 윌콕슨 검정이 중앙값의 차이를 검정하기 때문입니다.

윌콕슨 부호 순위 검정의 가설

귀무가설(H0) : 값 차이의 중앙값은 0이다.(= 값의 차이가 없다.)

대립가설(H0) : 값 차이의 중앙값은 0이 아니다.(= 값의 차이가 있다.)

예제

닭가슴살의 중량의 중앙값이 100g이라고 할 수 있는지 유의수준 5%로 검정하라.

04. [산격동 너구리] 윌콕슨 부호 순위 검정(일표본) 예제.csv
0.00MB

 

 

 

데이터를 불러옵니다.

import pandas as pd
df = pd.read_csv('C:\\Users\\Admin\\Desktop\\윌콕슨.csv')
print(df)

 

위와 마찬가지로 정규성 검정을 실행합니다.

from scipy.stats import shapiro

static, pvalue = shapiro(df)
print(pvalue) # 0.062427107244729996

pvalue가 0.05보다 크기 때문에 정규성을 만족하지 못합니다.

때문에 비모수 검정이고 일표본 t-검정과 대응하는 wilcoxon검정을 실행합니다.

 

wilcoxon검정의 매개변수

scipy.stats.wilcoxon(x, y=None, zero_method='wilcox', correction=False, alternative='two-sided', method='auto', *, 

axis=0, nan_policy='propagate', keepdims=False)

 

  • x : 첫 번째 측정 세트(이 경우 y두 번째 측정 세트) 또는 두 측정 세트 간의 차이(이 경우 y지정되지 않음)는 1차원이어야 합니다.
  • y : 두 번째 측정 세트( x첫 번째 측정 세트인 경우) 또는 지정되지 않음( x두 측정 세트 간의 차이인 경우)은 1차원이어야 합니다. (선택 사항)
  • zero_method {“wilcox”, “pratt”, “zsplit”}, (선택 사항)
    동일한 값("차이 0" 또는 "0")을 갖는 관측값 쌍을 처리하는 데는 다양한 규칙이 있습니다.
    • wilcox: 모든 0차 차이를 삭제합니다(기본값). 
    • pratt: 순위 프로세스에 차이 0을 포함하지만 0의 순위를 내립니다(보다 보수적).
    • zsplit: 순위 프로세스에 제로 차이를 포함하고 제로 순위를 양수 순위와 음수 순위로 분할합니다.
  • alternative{“two-sided”, “greater”, “less”}
    대립 가설을 정의합니다. 기본값은 'two-sided'입니다. 다음에서는 쌍을 이루는 샘플 간의 차이점을 나타냅니다.
    • two-sided: 기본 분포가 0을 중심으로 대칭이 아닙니다.
    • less: 기본 분포가 0에 대해 대칭인 분포보다 확률적으로 작습니다.
    • greater : 기본 분포가 0에 대해 대칭인 분포보다 확률론적으로 더 큽니다.

자세한 내용은 아래의 링크를 참고하시길 바랍니다.

https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.wilcoxon.html

 

scipy.stats.wilcoxon — SciPy v1.11.3 Manual

Either the second set of measurements (if x is the first set of measurements), or not specified (if x is the differences between two sets of measurements.) Must be one-dimensional. Warning When y is provided, wilcoxon calculates the test statistic based on

docs.scipy.org

 

wilcoxon검정을 실행합니다.

from scipy.stats import wilcoxon

static, pvalue = wilcoxon(df['weight']-100)
static,pvalue # 10.0, 0.1640625

결과해석

pvalue 값이 0.164이므로 귀무가설을 채택합니다.

즉, "닭 가슴살의 중량의 중앙값과 100g은 유의한 차이가 없다."라는 결론을 낼 수 있습니다.