codestates / codestates/ds-blog
[최근후] 가설검정이란? (feat. T-test, Chi square test, 베스킨라빈스, 씨스타)
- Dominant language
- No language data
- Stars
- 2
- Forks
- 4
- PR merge metrics
- No merged PRs in 30d
Description
# Intro
가설검정 : 가설의 옳고 그름을 통계적인 방법으로 따져 보는 일
가설에는 크게 두가지 종류가 있는데 첫번쨰는 귀무가설 (Nul hypothesis)이고, 두번째는 대립가설(Alternative hypothesis)입니다. 검정 후에, 우리는 이 두가지 가설을 기각(reject)할지 채택(accept)할지 결정해서 통계적 추론을 이끌어낼 수 있습니다. 이때 중요한것은 귀무가설이 기준이되어 추론이 맞는지 아닌지를 보는 과정이 필요합니다. 그리고, 실험결과의 신뢰도를 어느정도로 설정하는지 또한 귀무가설을 처리할 때 필요한 과정입니다.
"통계적으로 유의"하려면, 표본값에 가설검정을 한 결과가 인과관계와 상관관계에 오류가 없고, 그 결과가 모집단을 대표해서 어느정도 의미있는 메세지를 줄 수 있어야 합니다. 예를들어, 전국초등학생의 키의 평균과 표본집단의 평균을 비교하는 실험에서 "초등학생의 키가 50cm 에서 200cm이다" 라고 결론을 냈다면, 이것은 신뢰도 100%를 보장하겠지만 이것은 의미있는 검정결과가 아닙니다. 유의미한 추론을 위해 적절한 신뢰도를 설정해야합니다!

# 용어
1. 가설검정 : 가설의 옳고 그름을 통계적인 방법으로 따져 보는 일
통계적 가설검정은 통계를 사용하여, 즉, 표본의 평균과 표준편차를 사용해서 가설을 테스트 하는것 입니다.
> 종류 : 제가 지금껏 배운건 t test, chi square test 두개입니다 ㅎㅎ
>> t test : 두 집단의 평균값이 같은지 비교
>> chi square test : 두 변수의 연관성을 확인하는 테스트
2. 표본 추론
큰 데이터를 다 테스트 할 순 없으니 어떤 부분을 떼와서 특성을 분석하는것
> ex) 전국 초등학교 6학년 남자의 키 평균을 구할때 :
>> 전국 초등학교 6학년 남자의 데이터 : 모집단 (population)
>> 남산초등학교 6학년 남자의 데이터 : 표본 (sample)
>> 6학년 평균키는 160cm 일것이다 : 추정 (estimation)
3. 귀무가설 (null hypothesis = H0)
표본을 가지고 가설검정을 할 때, p value 가 높으면 accept, 낮으면 reject 하는 가설
>> t test 의 귀무가설 : 두 집단의 평균값은 같다.
>> chi square test 의 귀무가설 : 두 변수는 연관성이 없다.
4. p-value
가설검정을 할 때 귀무가설이 참인지를 나타내는 0에서 1사이의 숫자. p value가 높을수록 귀무가설을 무시하면 안됨
>> t test 에서는 두 집단의 평균값이 비슷할수록 높음
>> chi square test 에서는 두 변수의 연관성이 없을수록 높음
# Example
### 1. t-test (두 집단의 평균값이 같은지 비교)
t-test는 평균값을 비교하기위한 검정방법이기때문에 Numerical 데이터를 다뤄야합니다!
예를위해 베스킨라빈스의 아이스크림 콘의 평균 무게가 350g 이라고 광고를 한다고 가정해보겠습니다!
우리는 베스킨라빈스에 가서 표본으로 아이스크림 콘 10개를 사고 그 무게를 측정했을때 그 무게의 평균이 350g일것이라고 생각 할 것입니다. 이것은 귀무가설이 됩니다.
```py
# 라이브러리들
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)
```
결과 :
```py
Ttest_1sampResult(statistic=-0.939768760450161, pvalue=0.37187213720785606)
```
결론 : 여기서 pvalue=0.371 라는 높은값이 나왔기 때문에, 신뢰도 95%를 위한 결론을 위해 우리의 귀무가설 "**표본의 평균값은 모집단의것과 동일하다**" 를 무시할 수 없음! -> 귀무가설 채택
---
이렇게 우리는 1샘플 t-test를 사용해서 베스킨라빈스의 광고가 거짓이 아님을 파악했습니다!
혹시 10개의 샘플이 우연히 350에 가까운 평균값을 가지는것이 아닌가? 라는 의심을 할 수 있습니다. 맞아요! 샘플의 크기가 작으면 오차의 크기도 커지기때문에, 모집단과 차이를 만들 수 있어요. 그렇다면 표본의 크기를 더 키운다면 (n값 증가) 오차의 크기도 작아집니다~ 그럼 더 모집단의 평균과 가까운 표본평균을 구할 수 있을거에요.

(s = 표준편차, n = 샘플의 크기)
---
### 2. chi square test (두 변수의 연관성을 확인하는 테스트)
t-test와 다르게 chi square test는 두 변수의 관계를 확인하는 검정방법이기에 Categorical 데이터를 다뤄야합니다!
```py
# 라이브러리들
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
```

보시기에 뭔가 연관이 있을것같죠?! 그럼 chi square test를 사용해 테스트 해보겠습니다!
```py
chi2_contingency(sex_surv)
```
결과 :
```py
(260.71702016732104,
1.1973570627755645e-58,
1,
array([[193.47474747, 120.52525253],
[355.52525253, 221.47474747]]))
```
위에서부터,
* The test statistic : 260.71702016732104
* p-value : 1.1973570627755645e-58 (거의 0)
* Degrees of freedom : 1
* The expected frequencies : array([[193.47474747, 120.52525253], [355.52525253, 221.47474747]]))
-->> 귀무가설 : 두 변수 (성별, 사망여부) 는 연관성이 없다.
-->> p value 가 거의 0 인걸보아 귀무가설은 무시되어도 됨
-->> 결론 : 두 변수 (성별, 사망여부) 는 연관성이 있을 수 있다.
---
이렇게 t-test와 chi square test를 사용해 다양한 자료형(numerical, categorical)을 가지는 데이터를 검정하는 방법을 봤습니다! 이것들을 사용할때 주의해야 할 점이라면, 테스트는 숫자로만 결론을 내리기때문에 인과관계와 상관관계에 오류가 있어도 그것을 잡아내지 못합니다..! 그렇기에 attributes를 더 자세히 들여다보는 습관을 가지는게 좋습니다!
예를들어, 어떤 데이터분석 결과가 "**가수 씨스타가 티비에 많이 나올수록 익사사고를 당하는 사람들이 증가한다**" 라고 말한다면, chi square test로 검정을 해봤자 이것은 숫자로만 판단하기때문에 그 말이 사실인것처럼 결론지어질 수 있습니다. 하지만 이것은 씨스타가 여름에 활발히 활동하는 가수여서, 그 시즌에 물놀이를 가는 사람들이 많고, 그로인해 익사 사고율도 높아지는 것입니다!
적재 적소에 이런 가설검정들을 사용하시고 결과를 무조건 믿는건 위험한 태도입니다~!
Contributor guide
No contributing guide indexed for this repository
Research direction
No repository file, test, or entry point is named in the issue. Start by inspecting how ds-blog stores and publishes posts, then determine whether this article is intended to become a post and what review or validation process applies. Done means the article is placed in the expected location and its examples and rendered content are accepted.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- numpy, pandas, python
- Domain
- data, documentation
- Issue type
- Documentation
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100