# @title Z検定
import numpy as np
from scipy import stats
def ab_test_conversion_rate(conversions_a, sample_size_a, conversions_b, sample_size_b, alpha=0.05):
"""
ABテストの初回課金率の検定を行う関数
:param conversions_a: グループAの課金者数
:param sample_size_a: グループAのサンプルサイズ
:param conversions_b: グループBの課金者数
:param sample_size_b: グループBのサンプルサイズ
:param alpha: 有意水準(デフォルトは0.05)
:return: None
"""
# 課金率の計算
rate_a = conversions_a / sample_size_a
rate_b = conversions_b / sample_size_b
# プールされた標準誤差の計算
pooled_se = np.sqrt(rate_a * (1 - rate_a) / sample_size_a +
rate_b * (1 - rate_b) / sample_size_b)
# Z統計量の計算
z_score = (rate_a - rate_b) / pooled_se
# p値の計算(両側検定)
p_value = 2 * (1 - stats.norm.cdf(abs(z_score)))
# 結果の出力
print(f"グループA 課金率: {rate_a:.4f}")
print(f"グループB 課金率: {rate_b:.4f}")
print(f"課金率の差: {rate_a - rate_b:.4f}")
print(f"Z統計量: {z_score:.4f}")
print(f"p値: {p_value:.4f}")
if p_value < alpha:
print(f"p値({p_value:.4f})が有意水準({alpha})より小さいため、")
print("帰無仮説を棄却します。グループ間に統計的に有意な差があります。")
else:
print(f"p値({p_value:.4f})が有意水準({alpha})以上のため、")
print("帰無仮説を棄却できません。グループ間に統計的に有意な差があるとは言えません。")
# 使用例
conversions_a = 180 # グループAの課金者数
sample_size_a = 1000 # グループAのサンプルサイズ
conversions_b = 150 # グループBの課金者数
sample_size_b = 1000 # グループBのサンプルサイズ
ab_test_conversion_rate(conversions_a, sample_size_a, conversions_b, sample_size_b)
グループA 課金率: 0.8362
グループB 課金率: 0.8145
課金率の差: 0.0216
Z統計量: 0.6784
p値: 0.4975
p値(0.4975)が有意水準(0.05)以上のため、
帰無仮説を棄却できません。グループ間に統計的に有意な差があるとは言えません。