본문 바로가기
어디에 어떤 모수 검정과 비모수 검정을 쓸 수 있는지 대탐험 - 그리고 파이썬

여러 가지 모수적 검정 방법을 짚고 왔습니다. 그러니까, 잠시 정리하면서 쉬는 페이지.  "표본크기가 작을 때는 어떻게 해야 하죠?" 편에서 비모수 방법을 추천하는 경우가 있었는데, 각 모수적 방법에 대한 비모수적 방법이 무엇이 있는지 한 번은 이름 정도를 정리하는 것이 어떨까 해서 테이블로 다짜고짜 만들어 보았습니다. - 아직 분산분석 ANOVA에서 사용하는 F검정은 살펴보지 않았습니다만, ANOVA는 ANOVA대로 곧 자세히 다룰 테니까 걱정하지 마세요. ANOVA는 이름만 거창하지 그렇게 어려운 것은 아닙니다 -

아이고, 표를 만들어보니 말이죠, 정말 여러가지 검정 방법이 있었군요. 그래도 지금까지 같이 왔으니까 모수적 방법에 대해서는 대략 어렵지 않게 알 수 있을 것이라 생각합니다. 

모수적 방법과 비모수적 방법에 대해서 이야기하자면, 이제까지는 표본평균이 정규분포인 경우에 모수 검정을 보았는데, 표본평균의 평균과 분산만 알면 표본평균이 이루는 분포를 완전히 파악할 수 있기 때문에 가능했던 것입니다. 그러나, 그렇지 못할 경우에는 비모수적인 방법을 사용해서 검정을 해야 하는데,  비모수적인 방법은 표본평균이 정규 분포하지 않는 경우이므로 정규성 가정을 하지 않고요, 평균과 분선이 아닌 순위를 이용하여 검정을 합니다. - 비모수 검정의 원리까지 다루려고 보면 데이터 과학을 하기도 전에 쓰러질 수 있어서 매우 곤란할 수 있으니 비모수 검정의 원리는 적당히 그러려니 넘어가는 것이 신상에 이롭겠습니다. - 즉 이때는 평균보다는 표본들을 크기 순서대로 늘어놓은 후에 중앙값을 기준으로 검정을 하게 됩니다. 그러니까 비모수적 방법은 이상치 (Outlier)에 둔감합니다. 그리고 표본의 정규성 가정이 가능한 상태에서 비모수적 방법을 사용하게 되면 정확도가 떨어지고요 그러니까 모수적, 비모수적 방법은 적절하게 사용해야 원하는 결과를 얻을 수 있겠습니다. 

어쨌든 어디에 어떤걸 쓰게 되는지 테이블로 정리해 봤으니, 이걸 파이썬으로 하게 되면 어떤 것을 이용해서 하게 되는지 이번 기회에 간단하게 정리해 볼까 합니다. 원리를 알았으니까 손으로 푸는 것도 좋지만 그다음에는 눈에 힘을 풀고, 간단하게 파이썬에게 맡기고 결과만 해석하면 되니, 편리한 세상입니다. - 코쓱 - 우리가 가장 많이 사용하는 방법은 모수적 방법이니까, 모수적인 방법을 먼저 살펴보고 그다음으로 비모수적인 방법을 따져보면 좋겠습니다. 

모든 검정은 Null Hypothesis, Alternative Hypothesis가 있고 검정 결과를 p value로 판단한다는 아주 간단한 절차만이 있을 뿐이라는 점을 가슴속에 품으면 그걸로 충분합니다. 

자~ 그럼 가볼까요?

➊ 서로다른 두 집단의 평균을 비교하는 방법 : 자세한 내용은  "2개 집단 간에 차이가 나는가? Independent Samples t-검정 에 대한 심플함" 편 참고
    Independent samples t Test
    ttest_ind()

Null Hypothesis : 두 집단의 평균의 차이가 없다. 
Alternative Hypothesis : 두 집단의 평균의 차이가 있다. 

import scipy.stats

scipy.stats.ttest_ind(group1, group2, equal_var=False) # 등분산이 아닌 경우

> Ttest_indResult(statistic=-2.670573872669349, pvalue=0.01108318824471652)


이렇게 하면 t Test가 아주 간단하게 해결되고, 결과를 해석한다면 p value가 1.1%이므로 Null Hypothesis가 기각됩니다. 이때 equal_var=True이면 Independent Samples t Test이고, equal_var=False이면 Welch's t Test입니다. 이건 좀 편리하군요.

여기에 덧붙여서 어차피 t(z) Test이니까 비율검정은 다음과 같이 합니다. 자세한 내용은 "비율에 관한 검정 이야기와 A/B테스트"편

from statsmodels.stats.proportion import proportions_ztest

count = np.array([count_b, count_a])
nobs = np.array([n_b, n_a])
stat, pval = proportions_ztest(count, nobs, alternative="larger")

> (2.548235957188127, 0.004413460638565666)


count는 관측, nobs(number of observations) 시행이고, 이것을 list로 주면 각각의 비를 각각의 비로 계산해서 계산해 주는 데 이때의 Hypothesis는 두 개의 비율이 같다는 것이 포함된 것이 Null Hypothesis이고, 즉 p1≥p2 또는 p1≤p2 이고, Alternative Hypothesis는 순서대로 p1이 "smaller" than p2 (p1<p2), 또는 p1이 "larger" than p1 (p1>p2)로 하여 String으로 인자를 줄 수 있습니다. - 물론 two-sided로 줄수도 있습니다. 그때는 Null Hypothesis가 p1=p2가 되겠군요. - 예의 결과 해석을 하면 통계량, p value 순이고요, 그러니까 p value가 4.41%니까 Null Hypothesis(p1≤p2)를 기각하고, Alternative Hypothesis "larger" 인 p1>p2을 채택합니다.

    비모수검정의 경우
    Mann-Whitney U 검정
    mannwhitneyu()

from scipy.stats import mannwhitneyu

mannwhitneyu(x, y)

> MannwhitneyuResult(statistic=0.5, pvalue=0.007985348176890053)


결과 해석은 모수 검정과 마찬가지로 p value가 0.79%로써 Null Hypothesis를 기각합니다. 

➋ 대응표본의 차이가 있는지 확인하는 방법 : 자세한 내용은 "대응표본 차이 검정의 유익함 - Paired t test -" 편 참고 
    Paired t Test
    ttest_rel()

Null Hypothesis : 대응표본끼리의 차이가 없다. 
Alternative Hypothesis : 대응표본끼리의 차이가 있다. 

import scipy.stats

scipy.stats.ttest_rel(dat, dat)

> Ttest_relResult(statistic=-2.9868874599588247, pvalue=0.007578486289181322)


결과를 해석한다면 p value가 0.75%이므로 Null Hypothesis를 기각합니다. 

    비모수검정의 경우  
    Wilcoxon 순위 검정
    wilcoxon()

from scipy.stats import wilcoxon
wilcoxon(x, y)

> WilcoxonResult(statistic=12.0, pvalue=0.7353166906373405)


해석은 모수검정과 똑같습니다. 73%니까, Null Hypothesis를 기각하지 못합니다. 

➌ 3집단 이상 평균의 차이를 확인 : 
    ANOVA분석의 결과를 통한 F Test 
    f_oneway()


Null Hypothesis : 모든 집단의 평균의 차이가 없다. 
Alternative Hypothesis : 적어도 한 개 집단의 평균은 차이가 난다. 

from scipy.stats
scipy.stats.f_oneway(group1, group2, group3)

> F_onewayResult(statistic=262.7129127080777, pvalue=5.385523527223916e-44)


이런 검정의 결과라면 p value가 엄청나게 작네요. Null Hypothesis기각! 입니다. 최소한 한 개 집단의 평균이 다른 것 같습니다. 

ANOVA의 F검정의 경우에도 이분산이 경우에는 Welch's Test를 하게 되는데요. scipy에는 이분산을 검정할 수 있는 module이 제공되지 않아서 pingouin이라는 module를 이용해서 검정을 할 수 있습니다. 굉장히 편리한 점은 pandas dataframe을 직접 데이터로 넣을 수 있다는 점입니다. 

import pingouin as pg
pg.welch_anova(dv='score', between='group', data=df)

>
	Source	ddof1	F         p-unc	
	group	2	    9.717     0.001598


결과를 해석하면 ddof1은 집단에 대한 자유도니까, 즉 3개 집단을 비교했겠군요, 흠. 그리고 그 다음이 검정 결과 해석에 중요한 F 통계량과, p value(p-unc) 인데요, p value가 매우 작군요. Null Hypothesis 기각!입니다. 후훗! 

    비모수적 검정의 경우에는 
    Kruskal-Wallis H 검정
    kruskal() 

from scipy.stats import kruskal

kruskal(a, b, c)

> KruskalResult(statistic=6.047476974964328, pvalue=0.04861911622342764)


해석은 모수검정과 마찬가지로 p value가 4.8%이므로 Null Hypothesis를 기각한다. 정도로 결론 맺을 수 있겠군요. ANOVA를 다룰 때 다시 들여다보겠지만 Regression으로도 ANOVA검정이 가능합니다. 미리 충격적인 사실을 이야기하자면 두 개는 분석의 관점이 다를 뿐이고 실은 검정의 관점에서 보면 같은 것이거든요. ANOVA가 Regression의 특수형이랄까요? 그건 그때 가서 보고, 지금은 깨끗하게 잊어주세요.

➍ 3개 이상의 집단에서 변화의 차이가 있는지 확인하는 방법 
    RMANOVA의 F검정
    AnovaRM()

Null Hypothesis : 각 id에 대해서 짝을 지은 3개 이상의 그룹에 대한 dependent variable의 평균은 모두 차이가 없다. 
Alternative Hypothesis : 각 id에 대해서 짝을 지은 3개 이상의 그룹에 대한 dependent variable의 평균은 최소한 1개는 차이가 난다. 

참고로 이 함수는 pandas data frame을 직접적으로 받을 수 있으며, dependent varaible이 관심 있는 데이터이고, groups가 어떤 그룹에 속하는가에 대한 데이터입니다.

from statsmodels.stats.anova import AnovaRM

print(AnovaRM(data=df, depvar='dependent_variable', subject='unique_id', within=['groups']).fit())

>
              Anova
==================================
     F Value Num DF  Den DF Pr > F
----------------------------------
groups 24.7589 3.0000 12.0000 0.0000
==================================


결과를 해석하자면 F값이 너무 커서 p value가 0처럼 나왔거든요. 그러니까 Null Hypothesis는 기각입니다. 

비모수적 방법을 이야기 한다면 
    Friedman 검정 
    friedmanchisquare()

from scipy.stats import friedmanchisquare

friedmanchisquare(a, b, c, d)

> FriedmanchisquareResult(statistic=6.359999999999999, pvalue=0.09535032301698126)


결과를 해석하면 p value가 9.5%이기 때문에 Null Hypothesis를 기각하지 못한다입니다. 

➎ 독립성, 동질성을 확인하는 방법 : 자세한 내용은 "독립성(연관성), 동질성 검정의 차이와 그들의 정체 - χ² 카이스퀘어 검정 "편 참고 
    카이스퀘어 χ² 검정 
    chi2_contingency()

보통 카이제곱검정읕 비모수적 검정 방법으로 많이들 분류하는데, χ²의 분포를 이용하기 때문에 분포를 가정할 수 있으므로 모수로 분류했습니다만, Gaussian이 아니라는 점에서는 비모수일 수도 있겠네요. 

독립성검정은,
Null Hypothesis : 응답 범주들끼리는 서로 관련이 없다(독립적이다, 범주에 따라 차이 없다)
Alternative Hypothesis : 응답 범주들끼리는 서로 관련이 있다(독립적이지 않다, 범주에 따라 차이가 있다)

그리고, 동질성검정은,
Null Hypothesis : 응답 범주들끼리는 서로 분포가 동일하다
Alternative Hypothesis : 응답범주들끼리는 서로 분포가 동일하지 않다

import scipy.stats

chi2, pvalue, dof, expected = scipy.stats.chi2_contingency([row1, row2]) # 순서대로 chi2, p, dof, expected

>
(3.7094082916185345,
 0.05410656868624693,
 1,
 array([[ 53., 147.],
        [ 53., 147.]]))


결과를 해석한다면 p value가 두 번째 이므로 5.41%로 Null Hypothesis를 기각할 수 없다. 정도로 해석합니다. 

기대도수가 5%이하인 셀이 전체의 20%가 넘는다면, 
Fisher의 Exact 검정 
fisher_exact() 

data = [[8, 4],
         [4, 9]]

import scipy.stats as stats

print(stats.fisher_exact(data))

> (4.5, 0.1152)

이런 식으로 Fisher검정을 합니다. 이 경우에는 p value가 11.5%니까, Null Hypothesis를 기각하지 못하겠군요. 


헉헉. 열심히 파이썬으로 어떻게 검정을 하는지 살펴보았는데 말이죠. 2개 정도만 더하면 마무리 지을 수 있겠습니다. 그 두 개가 무엇이냐 하면,  정규성 검정과 등분산 검정입니다. 정규성 검정은 "표본 크기가 작을 때는 어떻게 해야 하죠? 정규성 검정은 꼭? 이걸 모르면 궁금증의 지옥 행" 편에서 더 실무적인 "확인"방법을 다뤘었는데, 지금은 파이썬을 이용하는 것이니까 scipy에서 제공하는 함수를 이야기하도록 하겠습니다. 참고로 정규성검정과 등분산성검정은 비모수 검정이 없습니다. 당연한 이야기겠죠. 

➏ 정규성을 확인하는 방법
    대표적 : Shapiro-Wilk
    shapiro() 

Null Hypothesis : 표본으로 유추한 모집단은 Gaussian이다. 
Alternative Hypothesis : 표본으로 유추한 모집단은 Gaussian이 아니다. 

from scipy.stats import shapiro 

stat, p  = shapiro(data)


간단하죠? p value를 보고 Null Hypothesis를 검정하면 됩니다.

➐ 등분산을 확인하는 방법
    Barlett : 모집단의 정규성이 확인되는 경우 (바틀렛)
    barlett()
    Levene : 모집단의 정규성과 관계없이 확인 가능  (레빈)
    Levene()

Null Hypothesis : 표본으로 유추한 각각 집단의 모집단의 분산은 동질 하다. 
Alternative Hypothesis : 표본으로 유추한 각각 집단의 모집단의 분산은 동질 하지 않다. 

from scipy.stats import bartlett, levene 
leven

bartlett(group1, group2, group3)
> BartlettResult(statistic=2.8785737872360935, pvalue=0.23709677363455822)

levene(group1, group2, group3)
> LeveneResult(statistic=1.1191856948703909, pvalue=0.3412266241254737)


당연히 해석은 p value를 기준으로 하면 됩니다. 


헉헉헉. 모든 검정에서의 Null Hypothesis를 보면 이전에 보았듯이, 모두 분포 가정이 가능한 가설입니다. 여러 개를 한꺼번에 봐도 그렇다는 점을 다시 한번 둘러 보게 되었다고 생각합니다. 

ANOVA는 검정이 아닌데도 불구하고 마치 검정처럼 취급되고 있는 경우가 많은데, 그 이유는 특별히 정해진 절차를 통해서 데이터의 통계량을 구하고, 그 통계량을 이용해서 정해진 F검정을 하기 때문에 그렇다고 보면 되겠습니다. 그러니까 표본만 있다면 쉬리리릭 F검정 결과까지 아무 생각 없이 진행되니까, 마치 ANOVA를 검정처럼 취급하고 함수 1개로 구현하고 있습니다. 그렇지만 ANOVA도 엄연하게 정해진 절차에 따라 데이터를 분석하고 그 분석 결과를 검정하는 것이니까 ANOVA는 검정이 아니라 분석 기법이고, 검정은 F Test라고 봐야 하겠습니다. 

친절한 데이터 사이언스 강좌 글 전체 목차 (링크) -



댓글





친절한 데이터 사이언스 강좌 글 전체 목차 (링크) -