Bayesian A/B testing for proportions
Project description
Bayesian A/B Testing for Proportions
A Python package for Bayesian hypothesis testing of success-rate differences in any Bernoulli-like experiment, using analytic and approximate inference methods. Input data can be binary (0/1) or real-valued on (0, 1) — continuous scores are automatically binarized at a configurable threshold. Typical applications include comparing treatments, groups, items, model variants, or any two conditions whose outcomes can be expressed as proportions. Please check out our Getting Started guide for installation and quick examples.
Features
- Effect-size inference for proportions — estimate and test the difference in success rates for both paired and non-paired samples
- Savage–Dickey Bayes Factor — test a point-null hypothesis ($\delta = 0$) without fitting a separate null model
- Posterior of the null & ROPE — quantify the posterior mass inside a Region of Practical Equivalence for nuanced decisions beyond simple reject/accept
- Posterior predictive checks — assess model fit by comparing observed data to data simulated from the posterior
- Bayes Factor Design Analysis (BFDA) — plan sample sizes to reach a target level of evidence before running the experiment
- Sequential / streaming design — update the posterior batch-by-batch as data arrive and stop early once the Bayes factor crosses an upper or lower threshold (
SequentialNonPairedBayesPropTest,SequentialPairedBayesPropTest) - Publication-ready plots — posterior distributions, predictive checks, Savage–Dickey density-ratio plots, BFDA power curves, and sequential BF₁₀ trajectories out of the box
Models
| Model | Class | Method | When to use |
|---|---|---|---|
| Non-paired Beta–Bernoulli | NonPairedBayesPropTest |
Conjugate Beta posteriors per arm; P(B>A) by quadrature, Δ summaries by Monte Carlo | Independent groups, exact & fast |
| Paired Logistic (Laplace) | PairedBayesPropTest |
MAP + Laplace approximation | Paired scores, large n, fast iteration |
| Paired Logistic (Pólya–Gamma) | PairedBayesPropTestPG |
Exact Gibbs sampling | Paired scores, small n, exact posterior |
Quick start
import numpy as np
from bayesprop.resources.bayes_nonpaired import NonPairedBayesPropTest
# Binary or [0,1]-valued data:
y_A = np.array([1,1,0,1,1,0,1,1,1,1,1,1,1,0,1,1,1,0,1,1]) # 16/20 = 0.80
y_B = np.array([0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,0,0]) # 6/20 = 0.30
# Fit posterior & summarise
model = NonPairedBayesPropTest(seed=42).fit(y_A, y_B)
s = model.summary
print(f"\nMean Δ (θ_A − θ_B) = {s.mean_delta:+.4f}")
print(f"95% CI = [{s.ci_95.lower:.4f}, {s.ci_95.upper:.4f}]")
print(f"P(A > B) = {s.p_A_greater_B:.4f}")
# ── Unified decision ─────────────────────────────────────────────────
d = model.decide()
bf = d.bayes_factor
print("\n--- Unified Decision ---")
print(f" Bayes Factor: BF₁₀ = {bf.BF_10:.2f} → {bf.decision}")
print(f" Posterior Null: P(H₀|D) = {d.posterior_null.p_H0:.4f} → {d.posterior_null.decision}")
print(f" ROPE: {d.rope.decision} ({d.rope.pct_in_rope:.1%} in ROPE)")
# Plots
model.plot_posteriors()
model.plot_savage_dickey()
Installation
pip install BayesProp
Or with uv:
uv pip install BayesProp
For development (from source):
git clone https://github.com/AVoss84/bayesProp.git
cd bayesprop
uv venv --python 3.13
uv sync
source .venv/bin/activate
Dependencies
- Python ≥ 3.13
- numpy, scipy, matplotlib, pandas
- pydantic (v2)
- polyagamma
References
- Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A. & Rubin, D. B. (2013). Bayesian Data Analysis (3rd ed.). Chapman & Hall/CRC.
- Kruschke, J. K. (2018). Rejecting or accepting parameter values in Bayesian estimation. Advances in Methods and Practices in Psychological Science, 1(2), 270–280.
- Polson, N. G., Scott, J. G. & Windle, J. (2013). Bayesian inference for logistic models using Pólya–Gamma latent variables. JASA, 108(504), 1339–1349.
- Schönbrodt, F. D. & Wagenmakers, E.-J. (2018). Bayes factor design analysis: Planning for compelling evidence. Psychonomic Bulletin & Review, 25(1), 128–142.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file bayesprop-0.1.0.7.tar.gz.
File metadata
- Download URL: bayesprop-0.1.0.7.tar.gz
- Upload date:
- Size: 65.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c69bdc3f58f0636a76109718e24dc1981f18d32fa3bc02a06e5cbd2468f9f4b8
|
|
| MD5 |
de915394eb1ef2922be35a4a91438852
|
|
| BLAKE2b-256 |
18829780a78e923dcb9d557a7594abdab7eb6a78a010bec66f4babac2151e5ac
|
Provenance
The following attestation bundles were made for bayesprop-0.1.0.7.tar.gz:
Publisher:
publish_pypi.yml on AVoss84/bayesProp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
bayesprop-0.1.0.7.tar.gz -
Subject digest:
c69bdc3f58f0636a76109718e24dc1981f18d32fa3bc02a06e5cbd2468f9f4b8 - Sigstore transparency entry: 1519605537
- Sigstore integration time:
-
Permalink:
AVoss84/bayesProp@264c11e93757a9169644a46203bbebc2828129ca -
Branch / Tag:
refs/heads/main - Owner: https://github.com/AVoss84
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish_pypi.yml@264c11e93757a9169644a46203bbebc2828129ca -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file bayesprop-0.1.0.7-py3-none-any.whl.
File metadata
- Download URL: bayesprop-0.1.0.7-py3-none-any.whl
- Upload date:
- Size: 54.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
97db75abd53d409426404eccff5fa7fad39c5fdaf1cd6276913b958cb27f77e8
|
|
| MD5 |
398ccf21e909768cd12185fa6b3bdb75
|
|
| BLAKE2b-256 |
e01cdf144ab0aebde7ff1d2385251300412ac85d5aad53ee76349d1d9cbb375c
|
Provenance
The following attestation bundles were made for bayesprop-0.1.0.7-py3-none-any.whl:
Publisher:
publish_pypi.yml on AVoss84/bayesProp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
bayesprop-0.1.0.7-py3-none-any.whl -
Subject digest:
97db75abd53d409426404eccff5fa7fad39c5fdaf1cd6276913b958cb27f77e8 - Sigstore transparency entry: 1519605582
- Sigstore integration time:
-
Permalink:
AVoss84/bayesProp@264c11e93757a9169644a46203bbebc2828129ca -
Branch / Tag:
refs/heads/main - Owner: https://github.com/AVoss84
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish_pypi.yml@264c11e93757a9169644a46203bbebc2828129ca -
Trigger Event:
workflow_dispatch
-
Statement type: