codestates / ds-blog

blog sharing for data science bootcamp course
2 stars 4 forks source link

[최근후] 가설검정이란? (feat. T-test, Chi square test, 베스킨라빈스, 씨스타) #113

Open rmsgn100 opened 4 years ago

rmsgn100 commented 4 years ago

Intro

가설검정 : 가설의 옳고 그름을 통계적인 방법으로 따져 보는 일

가설에는 크게 두가지 종류가 있는데 첫번쨰는 귀무가설 (Nul hypothesis)이고, 두번째는 대립가설(Alternative hypothesis)입니다. 검정 후에, 우리는 이 두가지 가설을 기각(reject)할지 채택(accept)할지 결정해서 통계적 추론을 이끌어낼 수 있습니다. 이때 중요한것은 귀무가설이 기준이되어 추론이 맞는지 아닌지를 보는 과정이 필요합니다. 그리고, 실험결과의 신뢰도를 어느정도로 설정하는지 또한 귀무가설을 처리할 때 필요한 과정입니다.

"통계적으로 유의"하려면, 표본값에 가설검정을 한 결과가 인과관계와 상관관계에 오류가 없고, 그 결과가 모집단을 대표해서 어느정도 의미있는 메세지를 줄 수 있어야 합니다. 예를들어, 전국초등학생의 키의 평균과 표본집단의 평균을 비교하는 실험에서 "초등학생의 키가 50cm 에서 200cm이다" 라고 결론을 냈다면, 이것은 신뢰도 100%를 보장하겠지만 이것은 의미있는 검정결과가 아닙니다. 유의미한 추론을 위해 적절한 신뢰도를 설정해야합니다!

image

용어

  1. 가설검정 : 가설의 옳고 그름을 통계적인 방법으로 따져 보는 일 통계적 가설검정은 통계를 사용하여, 즉, 표본의 평균과 표준편차를 사용해서 가설을 테스트 하는것 입니다.

종류 : 제가 지금껏 배운건 t test, chi square test 두개입니다 ㅎㅎ

  t test : 두 집단의 평균값이 같은지 비교
  chi square test : 두 변수의 연관성을 확인하는 테스트
  1. 표본 추론 큰 데이터를 다 테스트 할 순 없으니 어떤 부분을 떼와서 특성을 분석하는것

    ex) 전국 초등학교 6학년 남자의 키 평균을 구할때 :

    전국 초등학교 6학년 남자의 데이터 : 모집단 (population)
    남산초등학교 6학년 남자의 데이터 : 표본 (sample)
    6학년 평균키는 160cm 일것이다 : 추정 (estimation)
  2. 귀무가설 (null hypothesis = H0) 표본을 가지고 가설검정을 할 때, p value 가 높으면 accept, 낮으면 reject 하는 가설

     t test 의 귀무가설 : 두 집단의 평균값은 같다.
     chi square test 의 귀무가설 : 두 변수는 연관성이 없다.
  3. p-value 가설검정을 할 때 귀무가설이 참인지를 나타내는 0에서 1사이의 숫자. p value가 높을수록 귀무가설을 무시하면 안됨

    t test 에서는 두 집단의 평균값이 비슷할수록 높음
    chi square test 에서는 두 변수의 연관성이 없을수록 높음

Example

1. t-test (두 집단의 평균값이 같은지 비교)

t-test는 평균값을 비교하기위한 검정방법이기때문에 Numerical 데이터를 다뤄야합니다!

예를위해 베스킨라빈스의 아이스크림 콘의 평균 무게가 350g 이라고 광고를 한다고 가정해보겠습니다! 우리는 베스킨라빈스에 가서 표본으로 아이스크림 콘 10개를 사고 그 무게를 측정했을때 그 무게의 평균이 350g일것이라고 생각 할 것입니다. 이것은 귀무가설이 됩니다.

# 라이브러리들
import numpy as np
from scipy import stats

# 아이스크림 10 개를 표본집단으로 뽑기 
icecream1 = 350
s1 = 20
sample1 = np.random.normal(icecream1, s1, 10)

# 광고에서 말한 평균값과 표본의 평균값 비교해보기 (1샘플 t test 사용)
stats.ttest_1samp(sample1, 350)

# 아래는 2샘플 t-test 입니다~ 하지만 전체 아이스크림 데이터(모집단)는 없으니 이 상황에선 쓸 수 없음!
# stats.ttest_ind(sample1, sample1)

결과 :

Ttest_1sampResult(statistic=-0.939768760450161, pvalue=0.37187213720785606)

결론 : 여기서 pvalue=0.371 라는 높은값이 나왔기 때문에, 신뢰도 95%를 위한 결론을 위해 우리의 귀무가설 "표본의 평균값은 모집단의것과 동일하다" 를 무시할 수 없음! -> 귀무가설 채택


이렇게 우리는 1샘플 t-test를 사용해서 베스킨라빈스의 광고가 거짓이 아님을 파악했습니다! 혹시 10개의 샘플이 우연히 350에 가까운 평균값을 가지는것이 아닌가? 라는 의심을 할 수 있습니다. 맞아요! 샘플의 크기가 작으면 오차의 크기도 커지기때문에, 모집단과 차이를 만들 수 있어요. 그렇다면 표본의 크기를 더 키운다면 (n값 증가) 오차의 크기도 작아집니다~ 그럼 더 모집단의 평균과 가까운 표본평균을 구할 수 있을거에요. image (s = 표준편차, n = 샘플의 크기)


2. chi square test (두 변수의 연관성을 확인하는 테스트)

t-test와 다르게 chi square test는 두 변수의 관계를 확인하는 검정방법이기에 Categorical 데이터를 다뤄야합니다!

# 라이브러리들
import seaborn as sns
from scipy import stats
from scipy.stats import chisquare  
from scipy.stats import chi2_contingency

# 데이터를 불러옴
titanic = sns.load_dataset("titanic")
sex_surv = pd.crosstab(titanic['sex'], titanic['alive'])
sex_surv
스크린샷 2020-09-18 오후 4 40 46

보시기에 뭔가 연관이 있을것같죠?! 그럼 chi square test를 사용해 테스트 해보겠습니다!

chi2_contingency(sex_surv)

결과 :

(260.71702016732104,
 1.1973570627755645e-58,
 1,
 array([[193.47474747, 120.52525253],
        [355.52525253, 221.47474747]]))

위에서부터,

-->> 귀무가설 : 두 변수 (성별, 사망여부) 는 연관성이 없다.

-->> p value 가 거의 0 인걸보아 귀무가설은 무시되어도 됨

-->> 결론 : 두 변수 (성별, 사망여부) 는 연관성이 있을 수 있다.


이렇게 t-test와 chi square test를 사용해 다양한 자료형(numerical, categorical)을 가지는 데이터를 검정하는 방법을 봤습니다! 이것들을 사용할때 주의해야 할 점이라면, 테스트는 숫자로만 결론을 내리기때문에 인과관계와 상관관계에 오류가 있어도 그것을 잡아내지 못합니다..! 그렇기에 attributes를 더 자세히 들여다보는 습관을 가지는게 좋습니다!

예를들어, 어떤 데이터분석 결과가 "가수 씨스타가 티비에 많이 나올수록 익사사고를 당하는 사람들이 증가한다" 라고 말한다면, chi square test로 검정을 해봤자 이것은 숫자로만 판단하기때문에 그 말이 사실인것처럼 결론지어질 수 있습니다. 하지만 이것은 씨스타가 여름에 활발히 활동하는 가수여서, 그 시즌에 물놀이를 가는 사람들이 많고, 그로인해 익사 사고율도 높아지는 것입니다! 적재 적소에 이런 가설검정들을 사용하시고 결과를 무조건 믿는건 위험한 태도입니다~!

johnnykoo84 commented 4 years ago

correlation is not causation 이라는 말이 있죠. 간단하고 쉬운 예시로 설명을 잘 해주셨네요. 잘 읽었습니다.