Statistics
Hypothesis Test
bomishot
2023. 2. 26. 19:30
- 가설(귀무가설, 대립가설)
- 1종 오류, 2종 오류
- 검정 방법론
- 단측 검정, 양측 검정
- p-value 계산, 의미
- 검정 결과 해석 → insight 얻기
가설검정
특정 모집단에 대한 가설을 세우고, 이 가설을 sample data를 사용하여 검토하는 추론 과정
- 귀무가설 (H0) (Null Hypothesis)
- 데이터를 수집하기 전, 사실이라고 믿는 가설
- 디폴트 가설, 자연 그대로의 상
- = 등호 사인 포함 ( ≤, ≥, =)
- 대립가설(H1) (Alternative Hypothesis)
- 귀무가설과 대립되는 가설
- 문제에서 나온 말 그대로. 우리가 사실이라고 주장하는 가설
- =등호 사인 미포함 (<, >, !=)
1종 오류, 2종 오류
1종 오류(FP)
- 귀무가설이 참인데, 기각한 경우 → 대립가설 참
- 실제로 죄가 없는데, 유죄 선고한 경우
2종 오류 (FN)
- 대립가설이 참인데, 귀무가설을 기각하지 않은 경우
- 실제로 죄가 있는데, 무죄 선고한 경우
귀무가설이 참,거짓인 지 먼저 본다음, 판단한 것이 귀무가설 기각한 것인지 기각하지 않은것인지 판단 후 → 몇종오류인지 판단
- 가설 세우기
- 단측 검정 (one sample t-test) : (< >)한 쪽만 보니 5% 잡음
- 양측 검정 (two sample t-test) : (= ≠) 양 쪽 다 봐야하니, 2.5%, 97.5% 잡음
방향성이 있냐없냐 차이.
단측이든,양측이든 95%안에 들어오면, 두 평균값의 차이는 우연히 발생한 것이므로 두 집단의 평균값은 통계적으로 같은것임.
가설검정은 우리에게 모집단의 모수에 관한 정보를 주는 것이지
샘플 데이터의 통계치에 대한 정보를 주는 것이 아님.
검정 방법론
: 우리는 데이터를 이용하여 어떤 가설(H0, H1)을 채택할지 결정하는데 두 가지 방법이 있다.
신뢰구간 확인
평균의 표본 분포 → 95% 신뢰구간 확인 후, 결정
np.random.seed(10)
means=[]
for _ in range(10000):
bootsample = drug[drug['호르몬투약']==True].sample(drug.shape[0], replace=True)
means.append(bootsample.키.mean())
# 신뢰구간 확인
low = np.percentile(means, 5) # 단측 검증이므로
# histogram, axvline 이용해 95% 신뢰구간의 lower limit보다 작은지 큰지 확인
p-value 확인
- 유의확률 (p-value) : 귀무가설을 지지하는 정도
- 귀무가설의 분포에 샘플 데이터의 평균값보다 큰 면적 확인 → 이 면적이 0.05보다 작으면 귀무가설이 인데, 기각했을 때의 오류가 5%보다 작음을 의미
- p-value < 0.05
- 귀무가설 참인데, 기각하기 충분한 증거가 있음
- 대립가설 채택
np.random.seed(10)
means = []
for _ in range(10000):
sample = drug[drug.성장호르몬==True].sample(drug.shape[0], replace=True)
means.append(sample.키.mean())
# 샘플 데이터에서 성장호르몬 투약한 사람의 평균 키
sample_mean = drug[drug.성장호르몬==True].키.mean()
# 귀무 분포를 표본 평균 분포의 모양 그대로 하기 위해
sample_std = np.std(means)
# visulization
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')
More Study
독립성, 정규성, 등분산 검정
T-test 사용 전, 데이터가 정규분포를 따르는지, 두 집단 간의 분산이 같은지 등의 가정이 성립하는 지 먼저 검토할 것!
- 독립성 검정
- 정규성 검정
- t-test 사용을 위해서, 확률 분포가 정규 분포를 따르는 지 확인하는 것이 중요
- stats.shapiro(표본)
- H0 : 정규성을 만족한다
- H1 : 정규성을 만족하지 않는다.
- -> sample size가 크지 않을때 사용하기 좋은 함수
- -> sample size가 커서 miniproject할 때 정규성 결과 오류남. -> kstest 사용하면 sample size가 클때도 정규성 결과 정확히 나왔었음 -> 정규성을 만족하지 않는 모집단을 그대로 t-test에 적용하는 것은 부적절함
- 등분산 검정
- stats.levene(표본1, 표본2) : 두 표본 평균 분포의 등분산 확인
- H0 : 각 샘플의 분산이 같다.
- H1 : 각 샘플의 분산이 다르다.
- T-test stats.ttest_ind(샘플1,샘플2, equal=False) -> 분산이 같지 않아서
- equal=False이용 (분산이 같냐, 다르냐에 따라 함수의 검정 방법이 달라짐)
- stats.levene(표본1, 표본2) : 두 표본 평균 분포의 등분산 확인
T-test
- T-test의 목적
- 두 집단 간 평균 차이 검정하기 위해 사용!
- 모집단 : z-test
- 표본 : t-test
- A대학 남학생들의 키가 B대학 남학생들보다 크다는 생각이 들었다. 두 대학 남학생들의 키는 같을까?다를까?A대학 남학생 평균키 = 178.5cm→ 1.4cm의 차이는 과연 큰 걸까? 작은걸까?→ 누구를 가지고 와서 비교해야할까?
- 두 집단의 데이터 사이의 평균적인 거리는 1.4cm이다.
- 두 집단의 데이터들의 표준편차는 XXXcm이다.
- 만약 이 1.4cm가 표준편차 XXXcm보다 현저히 작다면, 이 1.4cm의 차이에 큰 의미를 둘 수 없다. (우연히 발생했겠지)
- but, 1.4cm가 표준편차 XXXcm보다 현저히 크다면, 이 1.4cm의 차이에 큰 의미를 둘 수 있다. (우연히 발생x)→ 결론적으로, t-test는 평균값의 차이, 표준편차의 비율이 얼마나 큰지 작은지를 결정하는 통계적 과정!
- 표준편차(분산)
- 왜 정규분포를 활용하나?
- t-test는 두 집단 간의 평균 차이가 유의한지 검정하기 위해, 두 집단의 분포가 정규분포를 따른다는 가정을 기반으로 한다.
- 이 가정은 CLT(중심극한정리)에 기반함.→ t-test에서는 각 집단의 표본이 정규분포를 따른다고 가정하여 분석 진행!
- 정규분포 : mean, std로만 규정
- mean, std가 다른 무한개의 서로 다른 정규 분포 존재
- 정규분포 아래의 면적은 확률 의미
- 면적을 구하기 위해서는 적분을 해야하는데, 그것은 미친짓이므로, 우리가 가진 정규분포를 표준정규분포로 바꾸어 계산하자(z-score)
- 표준정규분포 : mean=0, std=1인 정규분포
- z-score값, 표준정규분포표 이용해서하는 테스트 : z-test
- 표준정규분포 : mean=0, std=1인 정규분포
- 면적을 구하기 위해서는 적분을 해야하는데, 그것은 미친짓이므로, 우리가 가진 정규분포를 표준정규분포로 바꾸어 계산하자(z-score)
- t-test는 두 집단 간의 평균 차이가 유의한지 검정하기 위해, 두 집단의 분포가 정규분포를 따른다는 가정을 기반으로 한다.
- 신뢰도 95%일 때, 표준정규분포(Standard normal Distribution)과 T-Distribution의 차이는?
- 신뢰도 95%는 모집단에서 추출한 표본이 모집단의 평균을 얼마나 정확하게 추정할 수 있는지에 대한 확률을 나타낸다.
- 표준정규분포 : 모집단의 분산을 알고 있는 경우에 사용
- t-distribution : 모집단의 분산을 모르는 경우 or 표본의 크기가 작은 경우 사용 (정규분포와 비슷하지만, 표본의 크기에 따라서 자유도가 조절되는 분포)
- t-distribution은 dg(자유도=n-1)이 커짐에 따라, standard normal distribution에 가까워짐.
- T-test 시,
ttest_ind
와 ttest_1samp
함수는 둘 다 가설 검정에서 사용되는 함수로
ttest_ind
: 독립 표본 t-검정을 수행하는 함수로, 두 개의 독립된 데이터 셋에서 추출한 표본들의 평균값을 비교하여 두 집단 간의 평균 차이가 유의미한지 검정합니다. 두 개의 샘플 데이터가 독립된 데이터셋으로부터 추출되었다는 가정 하에 수행됩니다.ttest_1samp
: 대응 표본 t-검정을 수행하는 함수로, 하나의 샘플 데이터셋에서 두 개의 관측값(대응되는 쌍) 간의 평균 차이가 유의미한지 검정합니다. 예를 들어, 동일한 집단에서 전후의 관측값이 있는 경우 대응 표본 t-검정을 사용할 수 있습니다.
!! 요약 !!
ttest_ind
: 두개의 독립된 집단 간의 평균 차이 검정에 사용되고,
ttest_1samp
: 한 집단 평균값과 모집단의 평균값 의 차이 검정에 사용
import numpy as np
from scipy.stats import ttest_ind, ttest_1samp
# ttest_ind 예시
# 두 개의 독립적인 표본 데이터가 있다고 가정
data1 = np.array([3, 5, 7, 9, 11])
data2 = np.array([2, 4, 6, 8, 10])
# 두 표본 데이터의 평균값이 유의미하게 차이나는지 검정
t_statistic, p_value = ttest_ind(data1, data2)
# ttest_1samp 예시
# 하나의 표본 데이터가 있다고 가정
data = np.array([2, 4, 6, 8, 10])
# 표본 데이터의 평균값이 특정한 값인 5(한 집단의 평균값이라 생각)와 유의미하게 차이나는지 검정
t_statistic, p_value = ttest_1samp(data, 5)
np.random.normal
(mean값, std값, 생성할 난수의 개수)- default : 표준정규분포 (mean=0, std=1)
Chi-square Test (카이제곱 검정)
범주형 데이터의 빈도가 예상 빈도와 같은지 검정Chi-square Test 가설검정 단계
눈여겨보기!!
- null(H0), alternative(H1) hypothesis 정하기
- H0: 두 변수 간에 상관관계가 없다. (독립적이다)
- H1: 두 변수 간에 상관관계가 있다.
- choose level of significance(알파값)
- find critical value (c.v) : 카이제곱분포표보고 찾기
- find test statistic (분산구하기)
- draw your conclusion
- isin() 함수를 사용하여 특정 값이 포함되어 있는지 여부(boolean)를 판단할 수 있습니다.
# '구' 열에서 '서울시', '공원녹지사업소', '시설관리공단'을 포함하지 않은 행만 선택
df = df[~df['구'].isin(['서울시', '공원녹지사업소', '시설관리공단'])]
참고 (statQuest - youtube)