" A / B 검정 "
A와 B 중 어느 것이 더 효과적인지 평가하기 위해 사용되는 검정 방법
방법 : 사용자들을 두 그룹으로 나누고 각 그룹에 다른 버전을 제공한 후 반응을 비교
목적 : 두 그룹 간의 변화가 우연이 아니라 통계적으로 유의미한지 확인
사례 : 마케팅, 웹사이트 디자인 등
# 원칙적으로 Z-검정 or 피셔 정확검정을 사용해야 하나, 간단하게 보여주기 위해 t-test로 진행
# 표본 크기가 크고 전환율이 극단적이지 않다는 가정 -> 이런 경우 t-test 결과는 z-검정 결과와 거의 같음
# 가정된 전환율 데이터
group_a = np.random.binomial(1, 0.30, 100) # 30% 전환율
group_b = np.random.binomial(1, 0.45, 100) # 45% 전환율
# t-test를 이용한 비교
t_stat, p_val = stats.ttest_ind(group_a, group_b)
print(f"T-Statistic: {t_stat}, P-value: {p_val}")
" 가설 검정 "
표본 데이터를 통해 모집단의 가설을 검증, 데이터가 특정 가설을 지지하는지 평가하는 과정
귀무가설(H0)과 대립가설(H1)을 설정하고 귀무가설을 기각할지를 결정
검정을 왜 할까?
방법
단계
결과가 우연히 발생한 것이 아니라 어떤 효과가 실제로 존재함을 나타내는 지표
둘 다 데이터의 모수에 대한 정보를 구하고자 하는 것이지만 접근 방식이 다름
사례 : 새로운 약물이 기존 약물보다 효과 있는지 검정
# 기존 약물(A)와 새로운 약물(B) 효과 데이터 생성
A = np.random.normal(50, 10, 100)
B = np.random.normal(55, 10, 100)
# 평균 효과 계산
mean_A = np.mean(A)
mean_B = np.mean(B)
# t-검정 수행
t_stat, p_value = stats.ttest_ind(A, B)
print(f"A 평균 효과: {mean_A}")
print(f"B 평균 효과: {mean_B}")
print(f"t-검정 통계량: {t_stat}")
print(f"p-값: {p_value}")
# t-검정의 p-값 확인 (위 예시에서 계산된 p-값 사용)
print(f"p-값: {p_value}")
if p_value < 0.05:
print("귀무가설을 기각합니다. 통계적으로 유의미한 차이가 있습니다.")
else:
print("귀무가설을 기각하지 않습니다. 통계적으로 유의미한 차이가 없습니다.")
" t 검정 "
작은 표본에서 두 집단 간의 평균 차이가 통계적으로 유의미한지 검정
표본 수가 적거나 모집단 분산을 모를 때 t-분포를 이용
방법
사례
# 학생 점수 데이터
scores = np.random.normal(72, 8, 25) # 평균 72, 표준편차 8, 표본 25개
# 단일표본 t검정 (평균 70과 비교)
t_stat, p_val = stats.ttest_1samp(scores, 70)
print(f"단일표본 t검정, T-Statistic: {round(t_stat, 2)}, P-value: {round(p_val, 3)}")
# 학생 점수 데이터
scores_method1 = np.random.normal(70, 10, 30)
scores_method2 = np.random.normal(75, 10, 30)
# 독립표본 t검정
t_stat, p_val = stats.ttest_ind(scores_method1, scores_method2)
print(f"독립표본 t검정, T-Statistic: {round(t_stat, 2)}, P-value: {round(p_val, 3)}")
# 같은 학생의 시험 전후 점수
scores_before = np.random.normal(68, 7, 20)
scores_after = scores_before + np.random.normal(5, 3, 20) # 평균 +5 점 상승
# 대응표본 t검정
t_stat, p_val = stats.ttest_rel(scores_before, scores_after)
print(f"대응표본 t검정, T-Statistic: {round(t_stat, 2)}, P-value: {round(p_val, 3)}")
" 다중 검정 "
여러 가설을 동시에 검정, 1종 오류 증가 문제
문제
즉, 다중 검정을 그냥 하면 거짓 양성(false positive)이 많아짐
해결방법
사례 : 세 그룹 간 평균 차이 검정
# 세 그룹의 데이터 생성
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) # 3개(p_value 개수)로 나눔
# 결과 출력
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})")
" 카이제곱 검정 "
범주형 데이터의 적합도 검정, 독립성 검정, 동질성 검정
적합도 검정
독립성 검정
동질성 검정
사례
# 적합도 검정
observed = [20, 30, 25, 25]
expected = [25, 25, 25, 25]
chi2_stat, p_value = stats.chisquare(observed, f_exp=expected)
print(f"적합도 검정 카이제곱 통계량: {chi2_stat:.2f}, p-값: {p_value:.3f}")
# 성별과 흡연 여부 독립성 검정
observed = np.array([[30, 10], [20, 40]])
chi2_stat, p_value, dof, expected = stats.chi2_contingency(observed)
print(f"독립성 검정 카이제곱 통계량: {chi2_stat:.2f}, p-값: {p_value:.3f}")
# 예시 데이터: 지역별 선호 브랜드 (A, B, C)
# 행 = 지역 (서울, 부산, 대구), 열 = 브랜드 (A, B, C)
observed = np.array([
[30, 50, 20], # 서울
[25, 35, 40], # 부산
[20, 40, 40] # 대구
])
# 동질성 검정 (카이제곱 독립성 검정 사용 가능)
chi2_stat, p_value, dof, expected = stats.chi2_contingency(observed)
print(f"동질성 검정 카이제곱 통계량: {chi2_stat:.2f}, p-값: {p_value:.3f}")

주인장 이걸로 공부하니까 잘 들어오네요