치즈의 AI 녹이기

Significance Test 하기 본문

인공지능 대학원생의 생활/구글링

Significance Test 하기

개발자 치즈 2022. 4. 20. 14:33

가설검정이란, 

모집단의 특징에 대한 통계적 가설을 추출된 표본을 통하여 검토하는 추론 방법이다.

 

대립가설 : 주장하고자 하는 사실

귀무가설:  기각하고자 하는 사실 

 

방법 : 검정 통계량을 구한 뒤 일정 기준을 만족시키는 가를 확인함

일정 기준의 척도는 유의 수준과 p값이 됨. 

 

p값(유의 확률) : 귀무가설이 옳다는 가정 하에 검정 통계량(귀무가설보다 극단적인 결과가 실제로 관측될 확률) 

유의수준 : 1종 오류의 상한선, 1종 오류가 일어날 확률의 최대허용치

이는 귀무가설이 옳은데 실수로 기각될 확률(1종 오류)를 범하게 될 확률을 최소화 하기 위함

 

만약 귀무가설이 옳다는 가정 하에 검정 통계량이 계산될 확률인 p값이 정해진 유의수준을 넘어선다면,

1종 오류를 범할 가능성이 커졌다고 간주하고, 귀무가설을 함부로 기각하지 않는다. 

 

예를들어,

검정 통계량을 구한 후, 유의 수준이 0.05(신뢰도 95%)이라면,

p값이 0.05보다 작을 경우 귀무가설을 기각한다.

즉, 대립가설이 참이라는 사실을 신뢰수준 95% 확률로 주장할 수 있다는 의미다. 

 

<독립표본 T-test 방법>

1. 등분산 가정

A그룹과 B그룹 사이의 분산의 차이가 커질 때 분석하는 의미가 적어지는 것을 피하기 위함. 

[데이터] -> [데이터 분석] -> [F-검정 : 분산에 대한 두 집단]

 

대립가설: A그룹 분산 != B그룹 분산

귀무가설: A그룹 분산 = B그룹 분산

 

단측 검정 결과에 X2를 하여 양측검정(같거나 다르거나)를 확인함. 

유의수준보다 검정 결과가 높을 시, '귀무가설: A그룹 분산 = B그룹 분산'이라는 귀무가설을 채택한다. 

 

2. 독립표본 T-test

서로 분산이 같다는 것을 전제로 진행함. 

[데이터] -> [데이터 분석] -> [t-검정: 등분산 가정 두집단]

양측 검정 결과를 확인하여 유의수준보다 높으면 귀무가설을 채택하고, 그렇지 않으면 대립가설을 채택한다. 

 

<코드를 이용하여 수행하는 예시>

위와 같은 시트에서 significance test를 수행하기 위한 코드를 짜보았다. 

 

 

import csv
import pandas as pd

csv_input = pd.read_csv(filepath_or_buffer="/content/sigir-perform0216.csv", encoding="ms932", sep=",")
csv_input.head(5)

for model in ["sakt", "akt", "cl4kt", "rdemkt"]:
  for data in ["algebra05", "bridge06", "assistments09", "slepemapy"]:
    for metric in ["auc_d", "acc_d", "acc_w"]:
      print(f"{model} | {data} | {metric}")
      print(csv_input[(csv_input.Model==model) & (csv_input.Dataset==data)].groupby('de_type')[metric].mean().round(4))
      print("*"*20)
      
      
from scipy import stats
# !pip install pingouin
import pingouin as pg

def levene(group1, group2, a, info):
  l, p = stats.levene(group1,group2)

  if p > a:
      # print("\n 결과: 두집단의 분산의 동질성검정결과는 유의하다.")
      return
  else:
      print('두 집단의 분산의 동질성(homegeneity)검정 결과 \n')
      print(f'1. levene test statistics = {l:.2f}')
      print(f'2. levene test p-value = {p:.4f}')
      print(info)
      print("\n 결과: 집단의 분산의 동질성검정결과는 유의하지 않다.")
      print("*"*20)

def ttest(group1, group2, a, info):
  result = pg.ttest(group1, group2, correction='auto')

  if result['p-val'].values[0] > a:
    return
  elif result['p-val'].values[0] <= 0.01:
    print(0.01, info[1:])
    print("\n 결과: 검정결과는 유의하다.")
    print("*"*20)
  else:
    print(info)
    print("\n 결과: 검정결과는 유의하다.")
    print("*"*20)

target_csv = csv_input
for a in [0.05]:
  for model in ["sakt"]:
    for data in ["algebra05", "bridge06", "assistments09", "slepemapy"]:
      for metric in ["auc_d", "acc_d", "acc_w"]:
        pass_ = []
        for de in ["basic_10", "monotonic_10", "relative_10"]:
            target = target_csv[(target_csv.Model==model) & (target_csv.Dataset==data)]
            group1 = target[target.de_type == "alibi1_10"][metric]
            group2 = target[target.de_type == de][metric]
            output = levene(group1, group2, a, [a, de, model, data, metric])
            if output:
              pass_.append(ttest(group1, group2, a, [a, de, model, data, metric]))
        if sum(pass_) == 3: 
          print(model, data, metric," 검정결과는 유의하다.")
          print("*"*20)

 

참고 링크: 

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=running_p&logNo=90179747003&view=img_9 

 

[통계의 초석 - 9주차] 엑셀을 이용한 독립표본 t-test(검정)

  오늘은 독립표본 T-test에 대해서 알아보도록 하자.   이 분석을 사용할 때는 집단들 간의 평...

blog.naver.com

https://blog.naver.com/PostView.naver?blogId=shoutjoy&logNo=222209601666 

 

python(파이썬) scipy에 의한 t검정(t-test) 방법:: ttest_ind, pg.ttest 박중희

python(파이썬) scipy에 의한 t검정(ttest) 방법:: 박중희 통계분석을 하다보면 분석하는 기존의 package의...

blog.naver.com