코드스테이츠 AI 부트캠프/Section 1

AIB_121_복습정리 : 가설검정, T-test

yourhm 2021. 9. 26. 13:28

가설검정

모집단에 대한 정보를 알아보기 위하여, 모집단에 대한 어떤 가설을 설정한 뒤에 표본의 통계량을 통해 통계적으로 유의한지 판정하여 그 가설의 채택 여부를 결정하는 통계적 추론 방법.

 

1) 귀무가설

- 처음부터 버릴 것으로 예상하는 가설

- 직접 검증의 대상이 되는 가설로 연구자가 부정하고자 하는 가설

- 이 약을 먹은 사람과 안먹은 사람의 차이가 없다.

 

2) 대립가설

- 처음부터 채택할 것으로 예상하는 가설

- 귀무가설에 반대되는 사실로 연구자가 주장하고자 하는 가설

- 이 약을 먹은 사람과 안먹은 사람의 차이가 있다.

 

3) 유의확률(significance probability)

- p값(p-value)

- 1종 오류를 범할 확률

- 귀무가설을 지지하는 정도

- 유의확률(p값)이 유의수준(alpha)보다 작으면 귀무가설을 기각하고 대립가설을 채택한다.

- "아주 작다" 의 판단 기준이 유의수준이다 → 1%, 5%, 10%

 

4) 오류의 종류(type of error)

- 1종 오류: 귀무가설이 참인데, 거짓으로 판정하여 귀무가설을 기각할 오류

- 2종 오류: 귀무가설이 거짓인데, 참으로 판정하여 귀무가설을 채택할 오류

 

5) 유의수준(significance level)

- 알파(alpha)값

- 1종 오류를 범할 확률의 최대값, 즉 1종 오류의 최대 허용 한계를 의미한다.

- 유의수준 5% = 100번 실험을에서 1종 오류를 범하는 최대 허용 한계가 5번. (=1종 오류 발생 확률의 최대값이 0.05)

- 통계적인 가설 검정에서 사용되는 기준값으로 95%의 신뢰도를 기준으로 한다면 0.05가 유의수준 값이 된다.

 

 

T-test 란?

• one sample t-test : 1개 표본 데이터의 평균이 특정값과 동일한지 비교

     - one-side test : 평균이 특정값과 같다 or 같지 않다 를 검정

     - two-side test : 평균이 특정값보다 크다 or 크지 않다 또는 작다 or 작지 않다 를 검정

     - side(= tail = direction 단어들과 동일한 의미로 쓰임.)

• two sample t-test : 2개 표본 데이터의 평균이 서로 동일한지 비교

 

 

[참고자료]

Anderson Jo님 블로그, Hypothesis Test

(http://incredible.ai/statistics/2019/06/15/Hypothesis-Test/)

 

PN님 블로그, 기초통계학 t-test 이해하기

(https://m.blog.naver.com/sw4r/222035001670)

 

EXUPERY님 블로그, 헷갈리는 양측검정, 단측검정

(https://exupery-1.tistory.com/75)

 

행복한엄쌤님 블로그, 플어쓰는 통계 t 검정이란?

(https://m.blog.naver.com/sendmethere/221333164258)

 

 

 

 


파이썬 코딩 연습하기💬

 np.random.seed( )

보통 np.random.seed()를 고정하여 난수의 생성 패턴을 동일하게 관리할 수 있다.

특정 시드 값은 여러번 실행해도 동일한 난수를 생성한다.

동일한 시드 값으로 인해 환경이 동일하게 유지되는 경우, 다른 컴퓨터에서도 동일한 난수를 생성한다.

=> 즉 예측 가능한 난수를 생성한다.

 

 

 numpy.random.choice( )

랜덤으로 샘플을 발생시켜주는 함수

random.choice(a, size=None, replace=True, p=None)

<파라미터>

• a

     - 샘플을 발생시킬 모집단 지정

     - 1-D array-like 또는 np.arange(a) 에 들어갈 정수

 size

     - 출력될 샘플의 사이즈.

     - int 또는 tuple of ints, optional

     - 디폴트는 None이며, 이 경우 a single value가 리턴됨.

 replace

     - 복원추출 여부

     - boolean, optional

     - TRUE: 복원추출 / FALSE: 비복원추출

 p

     - 만약 모집단 내 각 원소별로 표본에 뽑힐 확률 p를 알고 있거나, 혹은 지정해주고 싶은 경우 입력.

     - 1-D array-like, optional

     - 디폴트는 None이며, 이 경우 모두 동일한 균등 확률로 추출함.

 

[참고자료]

Rfriend 블로그, np.random.choice() 메소드로 임의표본 추출하기 (https://rfriend.tistory.com/548)

 

 

 랜덤 샘플 발생하는 방법 2가지 비교 pandas / numpy 

[참고자료]

https://blog.softhints.com/pandas-random-sample-of-a-subset-of-a-dataframe-rows-or-columns/

https://www.geeksforgeeks.org/how-to-randomly-select-rows-from-pandas-dataframe/

https://kongdols-room.tistory.com/125

 

 

 scipy.stats.ttest_1samp(a, popmean)

one sample의 표본평균에 대한 t-test를 계산해주는 함수.

=> 't-statistic' , 'p-value' 를 return한다.

 

<파라미터>

a : array_like (sample observation) => 샘플데이터

popmean: float or array_like (귀무가설에서의 기대값)=> 검정하려는 값

 

예시

np.random.seed(1111)
coin=np.random.binomial(n=1, p=0.5, size=1000)
print(np.mean(coin))

0.509

from scipy import stats

result=stats.ttest_1samp(coin, 0.5)   #t-test 실행

result.statistic   #result에서 t-statistic만 출력
result.pvalue   #result에서 p-value만 출력

 

 

 scipy.stats.ttest_ind(a, b, alternative='two-sided')

two independent samples 의 표본평균들에 대한 t-test를 계산해주는 함수.

=> 't-statistic' , 'two-tailed p-value' 를 return한다.

 

<파라미터>

a, b : array_like (sample observation) => 두개의 샘플데이터의 shape이 꼭 같아야함.

alternative : default is 'two-sided'

 

 

 


🔽 헤더? 컬럼명 수정하기

방법 1) 인덱스가 0이 아닌 1부터 시작하니까 reset_index() 해줘야함.

import pandas as pd

data_url = "https://~~~"
df = pd.read_csv(data_url, sep='\t')
df = df.replace({'-':0})

new_header = df.iloc[0]
df = df[1:]
df.columns = new_header
df.reset_index(drop=True, inplace=True) # 인덱스 리셋
df

 

방법 2) 데이터 처음 읽어올 때 skiprows 파라미터 사용하니까 인덱스 리셋할 필요가 없어짐!

import pandas as pd

data_url = "https://~~~"
df = pd.read_csv(data_url, sep='\t', skiprows=1)
df = df.replace({'-':0})
df

 

🔽 데이터 프레임 특정 열(컬럼) 조회하기, 선택하기

df['Column_name']

 

🔽 데이터 프레임 특정 행 데이터 제외하기

방법 1) 

# 0, 5, 10 번째 행 데이터 drop

df_rev = df.drop([0,5,10]) 
df_rev

 

방법 2)

  • df[df['A'].isin(['aa','bb','cc'])]
    : A 컬럼의 값이 ['aa','bb','cc']를 포함하는 것만 골라낸다.
  • df[~df['A'].isin(['aa','bb','cc'])]
    : A 컬럼의 값이 ['aa','bb','cc']를 제외하고 나머지를 골라낸다.
df[~df['Column_name'].isin(['aa','bb','cc']