サイトアイコン アマチュア無線局JS2IIU

【Streamlit】A/Bテストの結果分析アプリ:統計的評価の可視化

こんにちは、JS2IIUです。
今回はA/BテストのアプリをStreamlit上に構築していきたいと思います。統計的な処理を入れたアプリにしていきます。今回もよろしくお願いします。

はじめに

Webサイトやアプリの改善において、「どちらのデザインがより効果的か?」を検証する方法としてA/Bテストは非常に有効です。

本記事では、PythonのStreamlitというツールを使って、A/Bテストの結果データを読み込み、統計的に効果を評価し、グラフで可視化するアプリを作る方法を解説します。

A/Bテストとは?

そもそもA/Bテストとは?

A/Bテストとは、2つのパターン(AとB)を比較し、どちらがより効果的かをデータで判断する方法です。

たとえば、

この2つを同じ条件で表示し、どちらのクリック率が高いかを比較することで、「赤いボタンの方が効果的だ」といった判断ができます。

A/Bテストでよく使われる指標

統計的に効果を評価するとは?

「Bの方がCVRが高かった!」だけでは本当に効果があるとは言えません。たまたま差が出ただけかもしれないからです。

そこで使うのが統計的検定です。

ポイント用語(ざっくりと・・・)

用語意味
p値(p-value)「偶然でこの差が出る確率」。値が小さいほど偶然とは言いにくい。
有意水準(例:0.05)p値がこの値より小さければ「統計的に有意」と判断します。

たとえば、

アプリを作る手順

ステップ1:必要なライブラリのインストール

まずは以下のライブラリをインストールしてください。

Bash
pip install streamlit pandas scipy

ステップ2:サンプルデータの準備

まず、次のようなCSVファイルを用意しましょう(ab_test_data.csvなどの名前で保存):

Plaintext
group,conversion
A,1
A,0
A,1
B,0
B,1
B,1

ステップ3:Streamlitアプリの作成

以下のコードを ab_test_app.py という名前で保存してください。

Python
import streamlit as st
import pandas as pd
from scipy.stats import chi2_contingency
import matplotlib.pyplot as plt

st.title("🔍 A/Bテスト結果分析アプリ")

# ファイルアップロード
uploaded_file = st.file_uploader("A/Bテスト結果のCSVファイルをアップロードしてください", type="csv")

if uploaded_file is not None:
    # データ読み込み
    df = pd.read_csv(uploaded_file)
    st.subheader("📄 アップロードされたデータ")
    st.dataframe(df)

    # 集計
    summary = df.groupby('group')['conversion'].agg(['sum', 'count'])
    summary['conversion_rate'] = summary['sum'] / summary['count']

    st.subheader("📊 コンバージョン率の比較")
    st.dataframe(summary)

    # 可視化
    fig, ax = plt.subplots()
    summary['conversion_rate'].plot(kind='bar', color=['skyblue', 'salmon'], ax=ax)
    ax.set_ylabel("Conversion Rate")
    st.pyplot(fig)

    # カイ二乗検定
    contingency_table = pd.crosstab(df['group'], df['conversion'])
    chi2, p, dof, expected = chi2_contingency(contingency_table)

    st.subheader("📈 統計的検定の結果(カイ二乗検定)")
    st.write(f"**p値(p-value)**: `{p:.4f}`")

    if p < 0.05:
        st.success("この結果には統計的に有意な差があります(p < 0.05)")
    else:
        st.info("統計的に有意な差は見られません(p ≥ 0.05)")
else:
    st.info("CSVファイルをアップロードしてください")
https://js2iiu.com/wp-content/uploads/2025/05/50_01.mov

1. 必要なライブラリをインポート

Python
import streamlit as st
import pandas as pd
from scipy.stats import chi2_contingency
import matplotlib.pyplot as plt

2. アプリケーションのタイトルを設定

Python
st.title("🔍 A/Bテスト結果分析アプリ")

3. ユーザーによるCSVファイルのアップロード

Python
uploaded_file = st.file_uploader("A/Bテスト結果のCSVファイルをアップロードしてください", type="csv")

4. アップロードされたファイルの処理

Python
if uploaded_file is not None:
    # データ読み込み
    df = pd.read_csv(uploaded_file)
    st.subheader("📄 アップロードされたデータ")
    st.dataframe(df)

5. A/Bテスト結果の集計

Python
    # 集計
    summary = df.groupby('group')['conversion'].agg(['sum', 'count'])
    summary['conversion_rate'] = summary['sum'] / summary['count']

    st.subheader("📊 コンバージョン率の比較")
    st.dataframe(summary)

6. 可視化(バーグラフ)

Python
    # 可視化
    fig, ax = plt.subplots()
    summary['conversion_rate'].plot(kind='bar', color=['skyblue', 'salmon'], ax=ax)
    ax.set_ylabel("Conversion Rate")
    st.pyplot(fig)

7. カイ二乗検定を実行

Python
    # カイ二乗検定
    contingency_table = pd.crosstab(df['group'], df['conversion'])
    chi2, p, dof, expected = chi2_contingency(contingency_table)

8. 統計的検定の結果表示

Python
    st.subheader("📈 統計的検定の結果(カイ二乗検定)")
    st.write(f"**p値(p-value)**: `{p:.4f}`")

9. 結果の解釈

Python
    if p < 0.05:
        st.success("この結果には統計的に有意な差があります(p < 0.05)")
    else:
        st.info("統計的に有意な差は見られません(p ≥ 0.05)")

10. ファイルがアップロードされていない場合

Python
else:
    st.info("CSVファイルをアップロードしてください")

ステップ4:アプリの起動

以下のコマンドでStreamlitアプリを起動します。

Bash
streamlit run ab_test_app.py

ブラウザが開いてアプリが表示されます。CSVファイルをアップロードすれば、自動で分析が実行され、統計結果とグラフが表示されます。

補足:入力用CSVデータの作成(ダミーデータ)

上の動画では、以下のプログラムで作成したCSVファイルを入力しています。

Python
import pandas as pd
import numpy as np

# データ数を増やしてサンプルデータを生成
np.random.seed(42)  # 再現性を持たせるためにシードを設定

# AグループとBグループに分けて、コンバージョンの1と0をランダムに生成
n = 100  # サンプル数
data = {
    'group': np.random.choice(['A', 'B'], size=n),
    'conversion': np.random.choice([0, 1], size=n, p=[0.7, 0.3])  # 30%の確率でコンバージョンあり
}

# DataFrameを作成
df = pd.DataFrame(data)

# CSVファイルとして保存
df.to_csv('ab_test_data_large.csv', index=False)

まとめ

このブログでは、以下の内容を学びました:

Streamlitを使えば、コードが少なくても効果的な分析アプリを作成できます。実務でも学習でも、ぜひ活用してみてください。

参考リンク

最後に書籍のPRです。
24年11月に第3版が発行された「scikit-learn、Keras、TensorFlowによる実践機械学習 第3版」、Aurélien Géron 著。下田、牧、長尾訳。機械学習のトピックスについて手を動かしながら網羅的に学べる書籍です。ぜひ手に取ってみてください。

最後まで読んでいただきありがとうございます。

モバイルバージョンを終了