본문 바로가기

통계학

[통계학] 통계적 유의성 / p-value

통계적 유의성

모집단에 대한 가설이 가지는 '통계적 의미'를 말한다. 다시 말해서, 어떤 실험 결과 자료를 두고 "통계적으로 유의하다."라고 하는 것은 확률적으로 봐서 단순한 우연이라고 생각되지 않을 정도로 의미가 있다는 뜻이다. 반대로 "통계적으로 유의하지 않다."라고 하는 것은 실험 결과가 단순한 우연일 수도 있다는 뜻이다.


귀무 가설(H0)

통계학에서 처음부터 버릴 것을 예상하는 가설. 기본적으로 '참'으로 추정하지만 이 귀무가설을 기각하려는 시도를 통해서 통계적 발견을 하게된다. 수식으로 썼을 때, 같다는 뜻의 equal sign ( = )을 포함하고 있다.

 

=, =>, =<


대립 가설(H1)

귀무가설에 대립하는 명제. 이 가설은 귀무가설처럼 검정을 직접 수행하기는 불가능하며 귀무가설을 기각함으로써 받아들여질 수 있다. 수식에 equal sign ( = )을 포함하지 않는다. 귀무가설과 대립가설은 서로 대립해야하고 겹치는 부분이 있어선 안된다.

 

>, <, !=



유의확률(p-value)

귀무가설을 지지하는 정도. 귀무가설이 참인데, 이를 기각할 확률을 뜻한다.


통상적으로 귀무 가설의 p-value가 5% 이하일 때, 통계적으로 유의하지 않다고 판단하여 기각한다. 하지만 귀무가설이 '참'일 확률이 5%는 존재한다. 그렇기 때문에 '귀무가설이 거짓이고, 대립가설이 참인 것을 95% 확신한다'라고 말할 수 있는 것이다. 

물론 10% 이하에서 기각할 수도 있고, 1% 이하에서 기각할 수도 있다. 이때는 신뢰도도 90%, 99%로 달라질 것이다. 대부분의 경우 95%의 신뢰도를 이용하지만, 의료 실험과 같은 경우처럼 생명과 직결된 경우에는 99%로 설정하기도 한다.

 

 

예시1. One sample 단측검정

약을 섭취한 집단의 키 평균이 172.5cm 이상이라는 가설을 검증하고 싶다면 위와 같은 귀무가설과 대립가설을 세운다.

 

필요한 준비물

① 섭취한 집단의 표본분포 simulate. 이때, 귀무가설과 대립가설이 가장 가까운 지점은 어디인가? 바로 172.5라는 수치다. 이 수치를 중심으로 하여 표본분포를 그린다.

② 섭취한 집단 전체의 평균

 

이 두가지를 통해 아래와 같은 그래프를 얻을 수 있다.

 

#섭취 집단 표본분포 simulate
#이를 모집단이라고 가정 하에 검정을 진행한다
np.random.seed(10)

null_means = []

for _ in range(10000):
  sample = df[df.섭취 == True].sample(df.shape[0], replace=True)
  null_means.append(sample.키.mean())

#표본분포 표준편차 구하기
sample_std = np.std(null_means)

#섭취 집단 데이터 내의 평균 키 구하기
sample_mean = df[df.섭취 == True].키.mean()

#시각화
plt.figure(figsize=(8,5))
null_vals = np.random.normal(172.5, sample_std, 10000) 
plt.hist(null_vals, alpha=0.5)
plt.axvline(sample_mean, color='r', label='Sample Mean')
plt.legend(fontsize=13);

귀무가설이 주장하는 바는 평균키가 172.5보다 작다는 것이다. 그러므로 만약 평균키를 나타내는 저 빨간선이 표본분포의 왼쪽측면에 위치한다면 p-value 구할 필요도 없다. 바로 귀무가설을 기각할 수 없다.

 

하지만 귀무가설의 의견과 대립하는 오른쪽에 있다면? p-value를 구해야한다. p-value는 빨간선부터 그 이상의 수치에 해당하는 그래프의 면적을 구하면 된다. 이 경우 빨간선부터 오른쪽 꼬리의 면적이 필요하다.

 

(null_vals > sample_mean).mean()
#>> 0.0

p-value는 0이므로 귀무가설을 기각할 수 있다. 아래와 같은 방법으로도 p-value를 구할 수 있다.

 

예시2. Two sample 단측검정

이번에는 약을 섭취한 집단의 평균키가 미섭취한 집단보다 크다는 것을 검정하고 싶다. 그렇다면 위와 같은 귀무가설, 대립가설을 세울 수 있다. 이 가설을  p-value를 구하기 쉬운 형태로 만들어보자.

이번에도 준비할 것은 비슷하다.

① 섭취 집단의 표본 평균에서 미섭취 집단의 표본 평균을 뺀 값들 simulate

② 섭취 집단 데이터 내 평균에서 미섭취 집단 데이터 내 평균을 뺀 값

 

#부트스트래핑을 통한 표본분포 구하기

drug_means, nodrug_means, diff_means = [], [], []

for _ in range(10000):
  sample = df.sample(drug.shape[0], replace=True)
  
  drug_mean = sample[sample.섭취 == True].키.mean()
  drug_means.append(drug_mean)

  nodrug_mean = sample[sample.섭취 == False].키.mean()
  nodrug_means.append(nodrug_mean)

  diff_means.append(drug_mean - nodrug_mean)

#표본분포의 표준편차 구하기
sample_diff_std = np.std(diff_means)

#평균치 구하기 
sample_diff_mean = df[df.섭취 == True].키.mean() - df[df.섭취 == False].키.mean()

#시각화
plt.figure(figsize=(8,5))
null_vals = np.random.normal(0, sample_diff_std, 10000) 
plt.hist(null_vals, alpha=0.5, label='null hypothesis')
plt.axvline(sample_diff_mean, color='r', label='statistics')
plt.legend(loc=9, fontsize=13)
plt.show()

이를 통해 아래와 같은 그래프를 얻을 수 있다.

귀무가설을 '0보다 작음'을 주장하고 있다. 그렇다면 빨간선이 나타내는 샘플의 평균치는 어떠한가? 만약 빨간선이 0보다 작다(=표본분포 왼측에 위치)면 더 볼 필요도 없이 '귀무가설을 기각할 수 없다'는 결론이 나온다.

 

하지만 빨간선이 오른쪽에 위치하고 있기 때문에 이 경우에는 p-value를 구해야한다.

(null_vals > sample_diff_mean).mean()

다음과 같이 ttest_ind를 통해 p-value를 구할 수도 있다.  

drug_yes = df[df.섭취 == True]['키']
drug_no = df[df.섭취 == False]['키']

#H0 : drug_yes =< drug_no
h0_pv = ttest_ind(teen_yes, teen_no, equal_var=False, alternative='greater').pvalue

'통계학' 카테고리의 다른 글

[통계학] Z-Score  (1) 2023.02.26
[통계학] 중심 극한 정리  (1) 2023.02.26
[통계학] 분포  (0) 2023.02.26