In [1]:
from __future__ import print_function, division

자료 안내: 여기서 다루는 내용은 아래 사이트의 내용을 참고하여 생성되었음.

https://github.com/rouseguy/intro2stats

가설검정

주요내용

미국 51개 주에서 거래된 담배(식물) 도매가 데이터와 pandas 모듈을 활용하여 가설검정을 실행하는 방법을 터득한다.

주요 예제

  • 캘리포니아 주에서 2014년도와 2015년도에 거래된 담배(식물)의 도매가의 가격차이 비교
  • 검정방식
    • t-검정
    • 카이제곱 검정

가설검정 6단계

가설검정은 아래 6개의 단계를 따른다.

1) 검정 대상인 영가설을 결정한다.

2) 영가설을 검증할 때 사용할 통계방식을 선택한다.

3) 기각역을 정한다.

  • 보통 상위 또는 하위 5%로 정함

4) 검정통계를 위한 p-값을 찾는다.

5) 표본결과가 기각역 안에 들어오는지 확인한다.

6) 결정을 내린다.

  • p-값이 기각역에 들어갈 경우 영가설을 기각한다.

주요 모듈

numpy와 pandas 이외에 통계전용 모듈인 stats 모듈을 임포트 한다.


In [2]:
import numpy as np
import pandas as pd
from scipy import stats

GongSu25 임포트하기

또한 GongSu25 내용 전체를 임포트한다.


In [3]:
from GongSu25_Statistics_Sampling_Distribution import *

주의

weed_pd에 이미 month와 year 열이 추가되었음을 기억한다.


In [4]:
weed_pd.head()


Out[4]:
State HighQ HighQN MedQ MedQN LowQ LowQN date month year
0 Alabama 339.06 1042 198.64 933 149.49 123 2014-01-01 1 2014
1 Alaska 288.75 252 260.60 297 388.58 26 2014-01-01 1 2014
2 Arizona 303.31 1941 209.35 1625 189.45 222 2014-01-01 1 2014
3 Arkansas 361.85 576 185.62 544 125.87 112 2014-01-01 1 2014
4 California 248.78 12096 193.56 12812 192.92 778 2014-01-01 1 2014

예제

캘리포니아 주에서 2014년 1월과, 2015년 1월에 거래된 상품 담배(식물) 도매가 평균의 차이 살펴보기

2014년 1월 데이터 추출하기


In [5]:
ca_2014_01 = weed_pd[(weed_pd.State=="California")\
                     & (weed_pd.year==2014)\
                     & (weed_pd.month==1)].HighQ

자료형을 어레이로 변환한다.

이유: stats 모듈은 데이터프레임 대신에 어레이를 활용한다.


In [6]:
weed_ca_jan2014 = np.array(ca_2014_01)

2014년 1월 거래가 평균


In [7]:
weed_ca_jan2014.mean()


Out[7]:
248.44548387096771

2015년 1월 데이터 추출하기


In [8]:
ca_2015_01 = weed_pd[(weed_pd.State=="California")\
                     & (weed_pd.year==2015)\
                     & (weed_pd.month==1)].HighQ

In [9]:
weed_ca_jan2015 = np.array(ca_2015_01)

2015년 1월 거래가 평균


In [10]:
weed_ca_jan2015.mean()


Out[10]:
243.60225806451612

2014년 1월과 2015년 1월 거래가 평균의 차이


In [11]:
weed_ca_jan2014.mean() - weed_ca_jan2015.mean()


Out[11]:
4.843225806451585

t-검정 예제

앞서 살펴 보았듯이 캘리포니아 주에서 2014년 1월에 거래된 상품 담배(식물) 도매가의 평균이 2015년 1월에 비해 4.84 달러 정도 높았다. 이 정도 차이가 유의미한지 여부를 판단해 보자. 즉, 2015년 1월의 도매가 1년 전에 비해 현저하게 떨어졌는지, 아니면 그 정도는 인정할 수 있는 오차범위 안에 있는 것인지 여부를 판단해야 한다.

여기서는 t-검정 방식을 이용하여 평균 도매가의 차이의 유의미성을 판단한다. 이를 위해 영가설을 아래와 같이 세운다

H0: 2014년 1월과 2015년 1월 상품 담배(식물) 도매가 평균값의 차이는 별 의미가 없다.

이제 t-검정을 이용하여 p-값을 결정한다.

주의

  • t-검정에 대한 자세한 설명은 여기서는 다루지 않는다.
  • stats 모듈에 있는 ttest_ind 함수를 이용하면 간단하게 p-값을 구할 수 있다.

In [12]:
stats.ttest_ind(weed_ca_jan2014, weed_ca_jan2015, equal_var=True)


Out[12]:
Ttest_indResult(statistic=98.011325238158051, pvalue=6.2979718185084028e-68)

결론

위 결과에 의해 p-값은 사실상 0이 된다. 이 의미는 2014년 1월과 2015년 1월에 거래된 도매가의 차이 정도는 거의 일어날 수 없는 사건이라는 의미이다. 따라서 영가설이 사실상 참일 수 없는 가설이라는 의미이다. 즉, 1년 사이의 도매가의 변화에 큰 의미를 부여할 수 있다는 결론이다.

카이-제곱 검정($\chi$-square test) 예제

전제

2014년 미국 전체에서 이루어진 담배(식물) 거래횟수가 예년의 기록이라고 가정한다.

질문

2015년 미국 전체에서 이루어진 담배(식물) 거래횟수 역시 예년의 기록인지 여부를 판단하라.

2014년 기록 가져오기

2014년도에 이루어진 HighQN, MedQN, LowQN에 대한 정보를 가져온다.


In [13]:
weed_jan2014 = weed_pd[(weed_pd.year==2014) & (weed_pd.month==1)][["HighQN", "MedQN", "LowQN"]]
weed_jan2014.head()


Out[13]:
HighQN MedQN LowQN
0 1042 933 123
1 252 297 26
2 1941 1625 222
3 576 544 112
4 12096 12812 778

2015년 기록 가져오기

2015년도에 이루어진 HighQN, MedQN, LowQN에 대한 정보를 가져온다.


In [14]:
weed_jan2015 = weed_pd[(weed_pd.year==2015) & (weed_pd.month==1)][["HighQN", "MedQN", "LowQN"]]
weed_jan2015.head()


Out[14]:
HighQN MedQN LowQN
51 1539 1463 182
52 350 475 37
53 2638 2426 306
54 846 836 145
55 16512 19151 1096

카이-제곱 검정을 이용한 차이 평가

카이-제곱 검정은 빈도수 차이의 유의미성을 확인할 때 사용한다.

영가설

H0: 2015년도 총 거래횟수가 예년 기록과 비슷하다.

이제 카이-제곱 검정을 이용하여 영가설의 기각여부를 판단한다.

카이-제곱 검정 방식을 이용하려면 먼저 카이-제곱 검정 통계량($\chi^2$)을 구해야 한다.

$$ \chi^2 = \sum (O - E)^2/E $$

여기서 E와 O는 아래의 의미를 갖는다.

  • 기대 도수(E): 2014년도 거래횟수 (예년 기록임)
  • 관측 도수(O): 2015년도 거래횟수

2014년 총 거래횟수

주의

  • apply 함수 활용
  • axis 키워드는 행을 기준으로 할지, 열을 기준으로 할지를 결정함

    • axis=0은 열 별로 apply 적용
    • axis=0은 행 별로 apply 적용
  • 아래 코드는 품종(HighQN, MedQN, LowQN)별로 총 거래횟수를 구한다.


In [15]:
Expected = np.array(weed_jan2014.apply(sum, axis=0))
Expected


Out[15]:
array([2918004, 2644757,  263958])

2015년 총 거래횟수

동일한 방식을 사용한다.


In [16]:
Observed = np.array(weed_jan2015.apply(sum, axis=0))
Observed


Out[16]:
array([4057716, 4035049,  358088])

이제 2014년도 데이터를 기대도수로, 2015년도 데이터를 관측도수로 활용하여 카이-제곱 통계량 $\chi^2$을 계산할 수 있으며, 그 값을 이용하여 p-값을 계산할 수 있다.

하지만, 여기서는 p-값을 구하는 과정은 설명하지 않고, stats 모듈의 chisquare 함수를 활용하여 p-값을 구한다.


In [17]:
stats.chisquare(Observed, Expected)


Out[17]:
Power_divergenceResult(statistic=1209562.2775169075, pvalue=0.0)

결론

p-값이 0이 나왔다. 따라서 영가설을 기각해야 한다. 즉, 2015년 총 거래횟수가 예년과 많이 다르다는 결론이다.

연습문제

연습

캘리포니아 주에서 2015년 1월과 2월에 이루어진 중품(MedQ) 담배(식물) 도매가 의미가 있을 정도로 차이가 있는지 여부를 t-검정을 이용하여 확인하라.

연습

뉴역 주에서 2014년과 2015년에 이루어진 중품(MedQ) 담배(식물) 거래의 총 횟수가 의미가 있을 정도로 차이가 있는지 여부를 카이-제곱 검정을 이용하여 확인하라.