#!/usr/bin/env python
# coding: utf-8

# # 통계적 가설검정
# 
# ![](./가설검정.png)

# In[29]:


import numpy as np
import pandas as pd
from scipy import stats

get_ipython().run_line_magic('precision', '3')
np.random.seed(1111)


# In[30]:


from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity="all"


# In[31]:


df = pd.read_csv('../data/ch11_potato.csv')
sample = np.array(df['무게'])
sample


# In[32]:


# 표본평균 확인

s_mean = np.mean(sample)
s_mean


# ### 통계적 가설 검정이란?
# 
# - 모집단의 모수에 관하여 두 가지 가설을 세우고, 표본으로부터 계산되는 통계량을 이용하여
# 어느 가설이 옳은지를 판단하는 통계적 방법
# 
# - A 학생이 확인하고 싶은 것은 모평균이 130g보다 적은지의 여부

# ### 통계적 가설검정의 흐름
# 
# - A학생이 감자튀김에 관하여 확인하고 싶은 것은 모평균이 130g보다 적은지 여부 임
#     - 여기서는 감자튀김의 모집단이 정규분포를 따르고 있고, 모분산이 9임을 알고 있다고 전제
# 
# - 가정은 ‘모평균이 130g’
# - 감자튀김 표본 14개는 독립성을 띄고 X1,X2,X3,...,X14 ~ N(130,9) 를 따르고 표본평균은 N(130,9/14)를 따른다
# 
# 
# - 표본평균 $\overline{x}$ 가 P($\overline{X}$ <= x) = 0.05를 만족하는 x를 생각
# 

# In[17]:


rv = stats.norm(130, np.sqrt(9/14))

rv.isf(0.95)

# 감자튀김이 128g인 것은 전체에서 5%에 불과하므로 일어나기 어려운 사건임


# ![](./가설검정수식.png)

# ![](./그림11-1.jpg)
# 
# 
# - 표본평균이 128.681g 이하의 무게가 되는 것은 5% 의 확률로 발생하는 드문 사건

# #### 가설검정에서 사용하는 모수에 관한 두 가지 가설
# 
# - 대립가설: 주장하고 싶은 가설 
#     - 예: “차이가 있다”, “효과가 있다”
# 
# - 귀무가설: 대립가설과 반대 
#     - 예: “차이가 없다”, “효과가 없다”
# 
# 
# - 가설검정의 결론
#     - 귀무가설을 기각한다: 귀무가설은 옳지 않다 -> 대립가설에 힘이 실림
#     - 귀무가설을 채택한다: 귀무가설이 옳지 않다고 말할 수 없다

# ![](./가설.png)
# 
# 
# - H0 = 귀무가설

# - ‘귀무가설을 기각한다/채택한다’의 판단은 귀무가설의 가정을 바탕으로 했을 때 표본으로부터 계산되는 통계량이 드문 값인지 여부로 결정
# - 드문 값을 얻으면, 우연이 아니라 의미 있는 값이라고 생각하여 귀무가설을 기각
#     - 유의하다: 우연이 아니라 의미가 있다
#         
#         
# 
# - 귀무가설 ‘모평균은 130g이다’라는 가정을 바탕으로 했을 때 표본평균이 128.451g이 되는 것은 유의하므로 귀무가설은 기각
#     - 표본평균이 128.681g보다 작다면 귀무가설은 기각되고, 128.681g보다 크다면 귀무가설을 채택
#     
#     
# ![](./유의수준.png)

# - p값과 유의수준
# 
# 
# - p값이 유의수준보다 작으면 귀무가설을 기각

# ![](./p값.png)

# ![](./p값1.jpg)
# 
# 
# - p값은 누적분포함수로 구할 수 있음

# p-value는 이 검정 통계량에 관한 확률인데, 우리가 얻은 검정 통계량보다 크거나 같은 값을 얻을 수 있을 확률을 의미한다.
# 
# 한 가지 짚고 넘어가야할 매우 중요한 포인트 중 하나는 우리가 계산하는 검정 통계량들은 거의 대부분이 귀무가설을 가정하고 얻게되는 값이라는 것이다.
# 
# 다시 말해 두 표본 평균의 차이를 검증한다고 할 때, 두 표본 집단의 모집단은 같다는 가정을 전제한다.
# 
# 그러므로, p-value가 말하고자 하는 것을 대략적으로나마 가벼운 말로 풀어쓰자면 다음과 같다고 할 수 있다.
# 
# "우리가 얻은 데이터에 있는 두 표본 집단이 같은 모집단에서부터 나온거라고 치자.
# 그랬을 때, 우리가 이런 검정 통계량(가령, t-value)을 얻었는데 이게 얼마나 말이되는거냐?"

# #### 검정통계량 Z는 아래와 같이 설정
# - 유의 수준은 0.05(5%로 설정)

# In[33]:


# 검정 통계량
s_mean = np.mean(sample) # 감자튀김 14개의 무게 data인 sample의 평균

z = (s_mean-130) / np.sqrt(9/14)
z


# In[34]:


rv = stats.norm()


# In[36]:


# 확률변수 rv를 이용한 p값 계산
rv.cdf(z)


# * p값을 이용한 귀무가설 검정 흐름
# ![](./그림11-3.jpg)

# ### 단측검정과 양측검정
# 
# - 모평균은 130보다 작다(단측검정) 라는 대립가설이 아닌 모평균은 130g이 아니다라는 대립가설로 가설 검정 수행    
# 
# 
#     - 모평균이 130g보다 작은 경우와 큰 경우도 고려하게 됨 => 양측 검정
#     
# - 동일한 유의수준 $\alpha$ 의 검정이라도 단측 검정 쪽의 기각역이 넓어진다. 
#     - 단측검정은 양측검정보다 귀무가설을 기각하기 쉽다
#     - ex) 유의수준이 5%일 때 양측검정을 진행하면 양측에서 2.5%의 기각역을 가지고
#         - 단측검정을 진행했을 때는 한 측에서만 5%의 기각역 가짐
# 

# ![](./단측검정양측검정.png)

# In[37]:


# 검정통계량은 단측 검정과 동일하다
s_mean = np.mean(sample)

z = (s_mean-130) / np.sqrt(9/14)
z


# In[38]:


# 양측검정이므로 임곗값은 표준 정규분포의 95% 구간에 따라 구할 수 있음
rv = stats.norm()
rv.interval(0.95)

# z가 -1.93으로 인터벌의 -1.95보다 큼 -> 채택역에 들어감 -> 귀무가설이 기각되지 않음


# - 임곗값과 검정 통계량을 비교해 보면 검정통계량이 채택역에 들어 있다. => 귀무가설이 기각되지 않는다

# In[39]:


# 양측검정의 p값을 구할 때는 상단과 하단의 양쪽 면적을 고려할 필요가 있으므로 누적밀도함수의 값을 2배로 함
rv.cdf(z) * 2


# - p값의 유의 수준이 0.05보다 큼 => 귀무가설은 기각되지 않는다

# ### 가설검정에서의 두 가지 오류
# * 제1종오류 : 귀무가설이 옳을 때, 귀무가설을 기각하는 오류
# 
# * 제2종오류 : 대립가설이 옳을 때, 귀무가설을 채택하는 오류
# 
# 
# 
# - 제1종 오류
#     - 실제로 ‘평균이 130g’인데도 ‘평균은 130g보다 작다’라는 결론을 내리는 상황
#     - 본래 검출하지 말아야 할 것을 검출한 것이므로 오탐(false negative)
#     - 위험률: 제1종 오류를 범하는 확률 $\alpha$
# 
# - 제2종 오류
#     - 실제로 ‘평균이 130g보다 작다’인데도 ‘평균은 130g보다 작다’라는 결론을 얻을 수 없는 상황
#     - 본래 검출해야 하는 것을 검출하지 못했으므로 미탐(false negative)
