[업무 지식]/Python
[A/B test] 온라인 / 대면 학습
에디터 윤슬
2025. 2. 13. 23:37
표준오차 계산 함수
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}")
온라인 학습 그룹 평균: 73.64, 신뢰 구간: (70.62243066639022, 76.64809550382253)
대면 학습 그룹 평균: 78.55, 신뢰 구간: (76.83767633789478, 80.25729282877188)
분포 시각화
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)
# 이미지 저장
output_path = "learning_distribution.png" # 저장할 파일 경로와 이름
plt.savefig(output_path, dpi=300, bbox_inches='tight') # dpi는 해상도 설정
plt.show()