노력에는 지름길이 없으니까요

3.4 다중검정 본문

통계학

3.4 다중검정

데건 2024. 8. 2. 16:19
728x90

☑️ 다중검정

여러 가설을 동시에 검정할 때 발생하는 문제

각 검정마다 유의수준을 조정하지 않으면 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 간의 차이는 없다는 결과가 나왔다. (!)

즉, 중신용 아웃라이어 그룹과 저신용 그룹 간 차이가 없다 = 유사하다는 결론이 되는데,

역시 중신용 아웃라이어 그룹에 대한 조치를 취할 필요가 있다고 생각할 수 있겠다.

 

검정 하나씩 배우면서 내가 아는 데이터를 넣고 확인해보는 과정이 정말 즐거운 것 같다.

728x90
반응형

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

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