[업무 지식]/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()