contents
summary
A/B 테스트 결과 데이터를 활용해, 각 그룹의 신뢰 구간을 Python으로 계산하는 방법을 실습합니다.
import pandas as pd
import numpy as np
# 데이터 로드
data = pd.read_csv("online_classroom.csv")
online = data.query("format_ol==1")["falsexam"]
face_to_face = data.query("format_ol==0 & format_blended==0")["falsexam"]
# 표준 오차 계산 함수
def se(y: pd.Series):
return y.std() / np.sqrt(len(y))
# z statistic 설정 (95% 신뢰 수준)
z = 1.96
# 신뢰 구간 계산 함수
def confidence_interval(mean, se, z=1.96):
margin = z * se
return mean - margin, mean + margin
# 온라인 학습 그룹
online_mean = online.mean()
online_se = se(online)
online_ci = confidence_interval(online_mean, online_se)
# 대면 학습 그룹
face_to_face_mean = face_to_face.mean()
face_to_face_se = se(face_to_face)
face_to_face_ci = confidence_interval(face_to_face_mean, face_to_face_se)
print(f"온라인 학습 그룹 평균: {online_mean:.2f}, 신뢰 구간: {online_ci}")
print(f"대면 학습 그룹 평균: {face_to_face_mean:.2f}, 신뢰 구간: {face_to_face_ci}")
두 그룹의 신뢰 구간이 겹치지 않으므로, 대면 학습이 온라인 학습보다 시험 점수에 유의미한 영향을 미쳤을 가능성이 큽니다.
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
# 데이터 준비
x_online = np.linspace(online_mean - 4*online_se, online_mean + 4*online_se, 1000)
y_online = norm.pdf(x_online, loc=online_mean, scale=online_se)
x_face_to_face = np.linspace(face_to_face_mean - 4*face_to_face_se, face_to_face_mean + 4*face_to_face_se, 1000)
y_face_to_face = norm.pdf(x_face_to_face, loc=face_to_face_mean, scale=face_to_face_se)
# 신뢰 구간
online_ci_x = [online_ci[0], online_ci[1]]
face_to_face_ci_x = [face_to_face_ci[0], face_to_face_ci[1]]
# 시각화
plt.figure(figsize=(12, 6))
# 온라인 학습 그룹
plt.fill_between(x_online, y_online, alpha=0.3, label="Online Learning CI", color="blue")
plt.plot(x_online, y_online, label="Online Learning Distribution", color="blue")
# 대면 학습 그룹
plt.fill_between(x_face_to_face, y_face_to_face, alpha=0.3, label="Face-to-Face CI", color="green")
plt.plot(x_face_to_face, y_face_to_face, label="Face-to-Face Distribution", color="green")
# 신뢰 구간 강조
plt.axvline(online_ci[0], color="blue", linestyle="--", alpha=0.7)
plt.axvline(online_ci[1], color="blue", linestyle="--", alpha=0.7)
plt.axvline(face_to_face_ci[0], color="green", linestyle="--", alpha=0.7)
plt.axvline(face_to_face_ci[1], color="green", linestyle="--", alpha=0.7)
# 라벨링 및 설명
plt.title("Distribution and Confidence Interval for Online vs Face-to-Face Learning")
plt.xlabel("Exam Scores")
plt.ylabel("Probability Density")
plt.legend()
plt.grid(alpha=0.3)
plt.show()

통계적 검정은 다음 두 가지 가설을 비교합니다:
2-Sample t-test는 두 그룹의 평균 차이가 통계적으로 유의미한지 검정하는 방법입니다. 이 테스트는 두 그룹 간의 차이가 단순히 우연히 발생한 것인지, 아니면 실제로 의미 있는 차이인지를 판단하는 데 사용됩니다.
t-test는 두 그룹의 평균 차이가 통계적으로 유의미한지 검정하는 방법입니다. A/B 테스트에서 자주 사용하는 검정으로, 그룹 A와 B의 평균을 비교하여 귀무가설이 참인지 판단합니다.
[참고] 다른 통계 검정 테스트와 비교
| 테스트 | 사용 조건 | 장점 | 제한 |
|---|---|---|---|
| 2-Sample t-test | 정규성 가정, 두 그룹 평균 비교 | 단순, 효율적, 널리 사용됨 | 정규성 가정이 불만족 시 부적합 (샘플 작을때 n<30) |
| Mann-Whitney U Test | 비정규분포, 극단값 존재 | 정규성을 가정하지 않음, 순위 기반 검정 | 평균이 아닌 중앙값 비교 |
| Welch’s t-test | 두 그룹 분산이 다를 때 | 분산 차이가 큰 경우에도 신뢰할 수 있음 | 2-Sample t-test와 결과가 비슷 |
| Chi-Square Test | 범주형 데이터 비교 | ||
| (예:성공/실패) | 범주형 데이터에 적합 | 연속형 데이터에 부적합 | |
| Bayesian Testing | 확률적 결과 해석을 원할때 | 직관적 결과 제공 (확률 기반) | 계산 복잡, 사전 분포 설정 필요 |
| ANOVA | 세 개 이상의 그룹 비교 | 다수 그룹 비교 가능 | 그룹 간 세부 차이는 추가 분석 필요 |
2-Sample t-test가 A/B 테스트에서 널리 사용되는 이유

import pandas as pd
from scipy.stats import ttest_ind
# 데이터 로드
data = pd.read_csv("online_classroom.csv")
online = data.query("format_ol==1")["falsexam"]
face_to_face = data.query("format_ol==0 & format_blended==0")["falsexam"]
# t-test 실행
t_stat, p_val = ttest_ind(online, face_to_face, equal_var=False)
print(f"t-statistic: {t_stat:.2f}")
print(f"p-value: {p_val:.4f}")
if p_val < 0.05:
print("통계적으로 유의미한 차이가 있습니다.")
else:
print("통계적으로 유의미한 차이가 없습니다.")
결과 예시:

🤔 6.1 Practical Significance란?
다음 시간에 더 깊게 들어가보도록 하겠습니다.
key points