# @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)以上のため、
帰無仮説を棄却できません。グループ間に統計的に有意な差があるとは言えません。
おすすめの記事