ماشین حساب معناداری آزمون A/B
بررسی کنید که نتیجه آزمون A/B شما از نظر آماری معنادار است. تعداد بازدیدکنندگان و تبدیلها را وارد کنید تا مقدار P، امتیاز Z، فاصله اطمینان و افزایش نسبی را دریافت کنید.
ماشین حساب معناداری آزمون A/B
تعداد بازدیدکنندگان و تبدیلها برای هر نسخه را وارد کنید تا بررسی کنید آیا تفاوت واقعی است یا فقط نویز.
نتایج
از نظر آماری معنادار
تفاوت بعید است که ناشی از شانس باشد در سطح اطمینان انتخابی شما.
Chance this gap is just luck — lower is stronger.
How far apart the two rates are, in standard errors.
The likely range for the true difference.
مستندات
آزمایش A/B در یک دقیقه
شما یک دکمه، یک عنوان یا یک جریان پرداخت را تغییر دادید. نسخه A نسخه قدیمی است، نسخه B نسخه جدید است. B بهتر به نظر میرسد — 15% از بازدیدکنندگان تبدیل شدند در مقابل 10% برای A. اما آیا این شکاف فقط شانس نیست، مانند وقتی که یک سکه را ده بار پرتاب کنید و هفت بار رو بیاید؟
این ماشینحساب دقیقاً به این سؤال پاسخ میدهد. شما تعداد افرادی که هر نسخه را دیدهاند و چند نفر تبدیل شدهاند را وارد میکنید و آن احتمال این را به شما میگوید که تفاوتی که اندازهگیری کردید واقعی است تا نویز تصادفی. اگر این احتمال به اندازه کافی زیاد باشد، برنده را پیدا کردید. اگر نه، تست را ادامه میدهید.
عددی که باید نگاه کنید p-value است: احتمال دیدن تفاوتی حداقل این بزرگ اگر دو نسخه واقعاً یکسان بودند. p-value کوچک (مثلاً زیر 0.05) به معنی "این به ندرت به صورت تصادفی اتفاق میافتد، بنابراین تفاوت احتمالاً واقعی است."
نحوه استفاده
- بازدیدکنندگان — چند نفر منحصر به فرد هر نسخه را دیدهاند.
- تبدیلها — چند نفر از آنها کاری که برایتان مهم است انجام دادند (خریداری کردند، ثبتنام کردند، کلیک کردند).
- سطح اطمینان — چقدر مطمئن میخواهید پیش از تعیین برنده باشید. 95% استاندارد صنعت است.
- فرضیه — دو طرفه میپرسد "آیا B با A متفاوت است؟" (محفوظتر، پیشفرض)؛ یک طرفه فقط میپرسد "آیا B بهتر از A است؟" (حساستر، اما باید قبل از اجرای تست جهت را تصمیم بگیرید).
نتیجه بهصورت زنده بهروز میشود و ورودیها در URL صفحه ذخیره میشوند، بنابراین میتوانید نتیجه را نشانیگذاری کنید یا به اشتراک بگذارید. بازنشانی فرم را پاککند؛ بارگذاری دادههای نمونه یک مثال تکمیلشده را پر میکند.
یک مثال تکمیلشده
| بازدیدکنندگان | تبدیلها | نرخ | |
|---|---|---|---|
| A (کنترل) | 1,000 | 100 | 10.0% |
| B (تغییر) | 1,000 | 150 | 15.0% |
این افزایش مطلق 5 درصدی و افزایش نسبی +50% است. ماشینحساب p-value حدود 0.0007 را برمیگرداند — زیر 0.05 — بنابراین با اطمینان 95% نتیجه آماریمعنیدار است. بهطور تقریبی، اگر دو نسخه کاملاً یکسان بودند، یک تفاوت این اندازه را کمتر از یک بار در هزار تست میدیدید.
ریاضیات (آزمون z دو نسبت)
درونسازی این آزمون z دو نسبت استاندارد است، همان آزمونی که در آمار مقدماتی تدریس میشود و توسط ابزارهای A/B اصلی استفاده میشود.
-
نرخ تبدیل هر گروه:
که در آن تبدیلها و بازدیدکنندگان است.
-
نرخ ترکیبشده، با فرض (برای فرضیه صفر) هر دو گروه یک نرخ واقعی را به اشتراک میگذارند:
-
خطای استاندارد تفاوت:
-
امتیاز z — چند خطای استاندارد دو نرخ از هم جدا هستند:
-
p-value از توزیع نرمال استاندارد میآید. دو طرفه: . یک طرفه: .
-
معنیدار هنگامی که ، که در آن (بنابراین 0.05 در 95%).
ماشینحساب همچنین یک فاصله اطمینان برای تفاوت را بهکمک خطای استاندارد غیرترکیبشده گزارش میکند : محدوده معقول برای شکاف واقعی. اگر این فاصله 0 را شامل نشود، نتیجه معنیدار است.
در اطمینان 95%، z فراتر از ±1.96 (دمهای سایهدار، 5% از ناحیه) بهعنوان معنیدار شمار میرود.
خواندن نتیجه درست
- اهمیت آماری اهمیت تجاری نیست. بهبود 0.1% میتواند آماری واقعی باشد اما ارسال آن ارزش ندارد.
- نگاه نکنید و زود متوقف نشوید. بررسی p-value هر روز و متوقف کردن لحظهای که زیر 0.05 سقوط کند، میزان مثبت کاذب شما را افزایش میدهد. اندازه نمونه را از قبل تصمیم بگیرید و تست را تکمیل کنید.
- قانون شماره انگشتی حجم نمونه را بررسی کنید. تقریب نرمال هنگامی قابل اعتماد است که هر گروه حداقل ~10 تبدیل و ~10 عدم تبدیل داشته باشد. با اعداد کوچک، نتیجه را فقط جهتدار در نظر بگیرید.
- اطمینان ≠ احتمال B بهتر است. سطح اطمینان 95% به معنی روش حداکثر 5% مواقع در درازمدت اشتباه است — این یک گفتار فراوانیگرا است، نه "احتمال 95% که B برنده شود."
- یک تست، یک متریک. آزمایش متریکهای متعدد یا انواع همزمان، احتمال تصادف را افزایش میدهد؛ برای آن اصلاح کنید (مثلاً Bonferroni) یا متریک منفرد را که تست را تصمیم میدهد قبل از ثبت کنید.
خود را محاسبه کنید
هر متن برای مثال تکمیلشده بالا p-value دو طرفه را محاسبه میکند.
1=2*(1-NORM.S.DIST(
2 (B2/A2 - B1/A1) /
3 SQRT(((B1+B2)/(A1+A2))*(1-(B1+B2)/(A1+A2))*(1/A1+1/A2)),
4 TRUE))
5' A1,B1 = control visitors, conversions ; A2,B2 = variation visitors, conversions
61from math import sqrt, erf
2
3def ab_pvalue(n1, x1, n2, x2, two_sided=True):
4 p1, p2 = x1 / n1, x2 / n2
5 p = (x1 + x2) / (n1 + n2)
6 se = sqrt(p * (1 - p) * (1 / n1 + 1 / n2))
7 z = (p2 - p1) / se
8 phi = lambda v: 0.5 * (1 + erf(v / sqrt(2))) # standard normal CDF
9 return 2 * (1 - phi(abs(z))) if two_sided else 1 - phi(z)
10
11print(ab_pvalue(1000, 100, 1000, 150)) # ~0.00072
121// erf via Abramowitz & Stegun 7.1.26
2function erf(x) {
3 const s = x < 0 ? -1 : 1;
4 x = Math.abs(x);
5 const t = 1 / (1 + 0.3275911 * x);
6 const y = 1 - ((((1.061405429 * t - 1.453152027) * t + 1.421413741) * t
7 - 0.284496736) * t + 0.254829592) * t * Math.exp(-x * x);
8 return s * y;
9}
10const phi = z => 0.5 * (1 + erf(z / Math.SQRT2));
11
12function abPValue(n1, x1, n2, x2, twoSided = true) {
13 const p1 = x1 / n1, p2 = x2 / n2, p = (x1 + x2) / (n1 + n2);
14 const se = Math.sqrt(p * (1 - p) * (1 / n1 + 1 / n2));
15 const z = (p2 - p1) / se;
16 return twoSided ? 2 * (1 - phi(Math.abs(z))) : 1 - phi(z);
17}
18console.log(abPValue(1000, 100, 1000, 150)); // ~0.00072
191public static double abPValue(int n1, int x1, int n2, int x2) {
2 double p1 = (double) x1 / n1, p2 = (double) x2 / n2;
3 double p = (double) (x1 + x2) / (n1 + n2);
4 double se = Math.sqrt(p * (1 - p) * (1.0 / n1 + 1.0 / n2));
5 double z = (p2 - p1) / se;
6 // Phi via the error function; erf approximated (A&S 7.1.26) separately.
7 double phi = 0.5 * (1 + erf(Math.abs(z) / Math.sqrt(2)));
8 return 2 * (1 - phi);
9}
101static double AbPValue(int n1, int x1, int n2, int x2) {
2 double p1 = (double)x1 / n1, p2 = (double)x2 / n2;
3 double p = (double)(x1 + x2) / (n1 + n2);
4 double se = Math.Sqrt(p * (1 - p) * (1.0 / n1 + 1.0 / n2));
5 double z = (p2 - p1) / se;
6 double phi = 0.5 * (1 + Erf(Math.Abs(z) / Math.Sqrt(2)));
7 return 2 * (1 - phi);
8}
91#include <cmath>
2
3double ab_pvalue(int n1, int x1, int n2, int x2) {
4 double p1 = (double)x1 / n1, p2 = (double)x2 / n2;
5 double p = (double)(x1 + x2) / (n1 + n2);
6 double se = std::sqrt(p * (1 - p) * (1.0 / n1 + 1.0 / n2));
7 double z = (p2 - p1) / se;
8 double phi = 0.5 * (1 + std::erf(std::fabs(z) / std::sqrt(2.0)));
9 return 2 * (1 - phi);
10}
111import "math"
2
3func abPValue(n1, x1, n2, x2 float64) float64 {
4 p1, p2 := x1/n1, x2/n2
5 p := (x1 + x2) / (n1 + n2)
6 se := math.Sqrt(p * (1 - p) * (1/n1 + 1/n2))
7 z := (p2 - p1) / se
8 phi := 0.5 * (1 + math.Erf(math.Abs(z)/math.Sqrt2))
9 return 2 * (1 - phi)
10}
111// erf from the `libm` crate; std has no erf.
2fn ab_pvalue(n1: f64, x1: f64, n2: f64, x2: f64) -> f64 {
3 let (p1, p2) = (x1 / n1, x2 / n2);
4 let p = (x1 + x2) / (n1 + n2);
5 let se = (p * (1.0 - p) * (1.0 / n1 + 1.0 / n2)).sqrt();
6 let z = (p2 - p1) / se;
7 let phi = 0.5 * (1.0 + libm::erf(z.abs() / 2f64.sqrt()));
8 2.0 * (1.0 - phi)
9}
101function ab_pvalue($n1, $x1, $n2, $x2) {
2 $p1 = $x1 / $n1; $p2 = $x2 / $n2;
3 $p = ($x1 + $x2) / ($n1 + $n2);
4 $se = sqrt($p * (1 - $p) * (1 / $n1 + 1 / $n2));
5 $z = ($p2 - $p1) / $se;
6 $phi = 0.5 * (1 + erf(abs($z) / sqrt(2)));
7 return 2 * (1 - $phi);
8}
91def ab_pvalue(n1, x1, n2, x2)
2 p1, p2 = x1.to_f / n1, x2.to_f / n2
3 p = (x1 + x2).to_f / (n1 + n2)
4 se = Math.sqrt(p * (1 - p) * (1.0 / n1 + 1.0 / n2))
5 z = (p2 - p1) / se
6 phi = 0.5 * (1 + Math.erf(z.abs / Math.sqrt(2)))
7 2 * (1 - phi)
8end
91# R has this built in: prop.test does the whole thing.
2prop.test(c(100, 150), c(1000, 1000), correct = FALSE)$p.value # ~0.00072
3سؤالات متداول
چه حجم نمونهای نیاز دارم؟ حجمی که بهبود معنیداری قابل تشخیص باشد. حداقل، هدفگذاری برای حداقل چند صد تبدیل در هر انواع؛ از ماشینحساب اختصاصی حجم نمونه استفاده کنید.
دو طرفه یا یک طرفه؟ دو طرفه استفاده کنید مگر اینکه دلیل محکم و متعهدانه قبلی برای فقط مراقبت بهبود داشته باشید. یک طرفه حساسیت شما را دو برابر میکند اما مانع از واکنش به B بدتر است.
چرا ماشینحساب فاصله اطمینان نشان میدهد؟ محدوده معقول تفاوت واقعی را نشان میدهد، نه فقط تصمیم بله/خیر. فاصله گستردهای که 0 را شامل میشود به معنی "هنوز اطلاعات کافی نیست."
آیا این بیزی است؟ خیر — این یک آزمون z فراوانیگرا است، روش پرآموختگیتر و پرکاربردیتر است. ابزارهای A/B بیزی "احتمال بقایای B بهتر از A" را به جای p-value گزارش میکنند؛ هر دو معتبر هستند، آنها سؤالات کمی متفاوتی را پاسخ میدهند.