일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- SQL
- f-string
- python
- 태블로
- 리스트
- map
- DATE_SUB
- 다중공선성
- 아티클스터디
- 프로그래머스
- 데이터시각화
- Til
- 내일배움캠프
- Set
- 내배캠_학습기록
- 데이터전처리
- 통계학
- 이중for문
- 가설검정
- ★
- 한줄for문
- Join
- Max
- 선형회귀
- AB테스트
- 시각화
- 반복문
- 내일배움일지
- SQLD
- Leetcode
- Today
- Total
노력에는 지름길이 없으니까요
3.4 다중검정 본문
☑️ 다중검정
여러 가설을 동시에 검정할 때 발생하는 문제
각 검정마다 유의수준을 조정하지 않으면 1종 오류(귀무가설이 참인데 기각하는 오류) 발생 확률이 증가
1종 오류가 무엇인지랑 왜 다중검정시 발생확률이 증가하는지는 밑에서 다시 설명! 지금은, 어떤 오류가 발생할 수 있다는 정도로 이해!
☑️ 보정 방법
본페로니 보정, 튜키 보정, 던넷 보정, 윌리엄스 보정 등이 있음
가장 대표적이고 기본적인게 본페로니 보정
import numpy as np
import scipy.stats as stats
# 세 그룹의 데이터 생성
np.random.seed(42)
group_A = np.random.normal(10, 2, 30)
group_B = np.random.normal(12, 2, 30)
group_C = np.random.normal(11, 2, 30)
# 세 그룹 간 평균 차이에 대한 t검정 수행
p_values = []
p_values.append(stats.ttest_ind(group_A, group_B).pvalue)
p_values.append(stats.ttest_ind(group_A, group_C).pvalue)
p_values.append(stats.ttest_ind(group_B, group_C).pvalue)
# 본페로니 보정 적용
alpha = 0.05
adjusted_alpha = alpha / len(p_values)
# 결과 출력
print(f"본페로니 보정된 유의 수준: {adjusted_alpha:.4f}")
for i, p in enumerate(p_values):
if p < adjusted_alpha:
print(f"검정 {i+1}: 유의미한 차이 발견 (p = {p:.4f})")
else:
print(f"검정 {i+1}: 유의미한 차이 없음 (p = {p:.4f})")
이번에도 Outstanding_Debt 기준으로 한 번 분석해봤다.
이미지를 확인하면 일단 유의한 차이가 난다고 볼 수 있을 것 같은데, 결과도 그럴지?
# 세 그룹의 데이터 생성
group_A = df_test_standard['Outstanding_Debt']
group_B = df_delay_standard['Outstanding_Debt']
group_C = df[df['Credit_Mix']=='Bad']['Outstanding_Debt']
# 세 그룹 간 평균 차이에 대한 t검정 수행
p_values = []
p_values.append(stats.ttest_ind(group_A, group_B).pvalue)
p_values.append(stats.ttest_ind(group_A, group_C).pvalue)
p_values.append(stats.ttest_ind(group_B, group_C).pvalue)
p_values
> [np.float64(1.3385045166032079e-111),
np.float64(0.0),
np.float64(2.016154922108308e-83)]
# 본페로니 보정 적용
alpha = 0.05
adjusted_alpha = alpha / len(p_values)
# 결과 출력
print(f"본페로니 보정된 유의 수준: {adjusted_alpha:.4f}")
for i, p in enumerate(p_values):
if p < adjusted_alpha:
print(f"검정 {i+1}: 유의미한 차이 발견 (p = {p:.4f})")
else:
print(f"검정 {i+1}: 유의미한 차이 없음 (p = {p:.4f})")
> 본페로니 보정된 유의 수준: 0.0167
검정 1: 유의미한 차이 발견 (p = 0.0000)
검정 2: 유의미한 차이 발견 (p = 0.0000)
검정 3: 유의미한 차이 발견 (p = 0.0000)
역시나 Outstanding_Debt에 대해서는 모두 유의한 차이가 있다는 결과가 나왔다.
그렇다면 아래의 변수는 어떨까?
범위가 작은 편이긴 하지만, 이 애매한 변화에 대한 결과는 어떨지 다중검정을 진행해봤다.
# 세 그룹의 데이터 생성
group_A = df_test_standard['Changed_Credit_Limit']
group_B = df_delay_standard['Changed_Credit_Limit']
group_C = df[df['Credit_Mix']=='Bad']['Changed_Credit_Limit']
# 세 그룹 간 평균 차이에 대한 t검정 수행
p_values = []
p_values.append(stats.ttest_ind(group_A, group_B).pvalue)
p_values.append(stats.ttest_ind(group_A, group_C).pvalue)
p_values.append(stats.ttest_ind(group_B, group_C).pvalue)
p_values
> [np.float64(2.2327138229972563e-12),
np.float64(6.313563946062749e-73),
np.float64(0.06660149684276556)]
# 본페로니 보정 적용
alpha = 0.05
adjusted_alpha = alpha / len(p_values)
# 결과 출력
print(f"본페로니 보정된 유의 수준: {adjusted_alpha:.4f}")
for i, p in enumerate(p_values):
if p < adjusted_alpha:
print(f"검정 {i+1}: 유의미한 차이 발견 (p = {p:.4f})")
else:
print(f"검정 {i+1}: 유의미한 차이 없음 (p = {p:.4f})")
> 본페로니 보정된 유의 수준: 0.0167
검정 1: 유의미한 차이 발견 (p = 0.0000)
검정 2: 유의미한 차이 발견 (p = 0.0000)
검정 3: 유의미한 차이 없음 (p = 0.0666)
그룹 B와 그룹 C 간의 차이는 없다는 결과가 나왔다. (!)
즉, 중신용 아웃라이어 그룹과 저신용 그룹 간 차이가 없다 = 유사하다는 결론이 되는데,
역시 중신용 아웃라이어 그룹에 대한 조치를 취할 필요가 있다고 생각할 수 있겠다.
검정 하나씩 배우면서 내가 아는 데이터를 넣고 확인해보는 과정이 정말 즐거운 것 같다.
'통계학' 카테고리의 다른 글
3.6 제 1종 오류와 제 2종 오류 (0) | 2024.08.02 |
---|---|
3.5 카이제곱검정 (0) | 2024.08.02 |
3.2 가설검정 (0) | 2024.08.02 |
3.1 A/B 검정 (0) | 2024.08.02 |
분포를 고르는 방법 (0) | 2024.08.01 |