A/B ٹیسٹ اہمیت کیلکولیٹر
چیک کریں کہ آپ کے A/B ٹیسٹ کا نتیجہ اعدادی طور پر اہم ہے۔ وزیٹرز اور تبدیلیوں درج کریں تاکہ p-value، z-score، اعتماد کا وقفہ، اور رشتہ دار اضافہ حاصل کریں۔
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% وزیٹرز کو تبدیل کرتا ہے جبکہ A کے لیے 10%۔ لیکن کیا یہ فرق صرف خوش قسمتی ہو سکتی ہے، جیسے سکہ کو دس بار پھینکنے سے سات بار سر آ سکتے ہیں؟
یہ کیلکولیٹر بالکل یہ جواب دیتا ہے۔ آپ یہ درج کریں کہ کتنے لوگوں نے ہر ورژن کو دیکھا اور کتنے تبدیل ہوئے، اور یہ آپ کو بتاتا ہے کہ آپ نے جو فرق ناپا ہے وہ حقیقی ہے یا بے ترتیب شور۔ اگر یہ احتمال کافی زیادہ ہے تو آپ کو فاتح ملتا ہے۔ اگر نہیں تو آپ ٹیسٹ چلاتے رہیں۔
دیکھنے کے لیے ایک نمبر ہے 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% رشتہ دار اضافہ ہے۔ کیلکولیٹر تقریباً 0.0007 کی p-value واپس کرتا ہے — 0.05 کے تحت — تو 95% اعتماد پر نتیجہ اعداد و شمار کے لحاظ سے اہم ہے۔ تقریباً، اگر دونوں ورژن بالکل یکساں ہوں تو آپ اس طرح کا فرق ہزار ٹیسٹوں میں ایک بار سے کم دیکھیں گے۔
ریاضی (دو نسبت z-test)
ہڈ کے تحت یہ معیاری دو نسبت z-test ہے، وہی ٹیسٹ جو تعارفی اعداد و شمار میں سکھایا جاتا ہے اور مرکزی A/B ٹولز کے ذریعے استعمال ہوتا ہے۔
-
ہر گروپ کی تبدیلی کی شرح:
جہاں تبدیلیاں ہیں اور وزیٹرز ہیں۔
-
اکٹھی شرح، فرض کرتے ہوئے (null hypothesis کے لیے) دونوں گروپ ایک حقیقی شرح کو شیئر کرتے ہیں:
-
فرق کی معیاری غلطی:
-
z-score — دونوں شرحیں کتنی معیاری غلطیوں کے فاصلے پر ہیں:
-
p-value معیاری عام تقسیم سے آتی ہے۔ دو طرفہ: ۔ ایک طرفہ: ۔
-
اہم جب ، جہاں (تو 95% پر 0.05)۔
کیلکولیٹر فرق کے لیے اعتماد کا وقفہ بھی رپورٹ کرتا ہے، غیر اکٹھی معیاری غلطی کے ساتھ شمار کیا جاتا ہے: حقیقی خلاف کے لیے قابلِ فہم رینج۔ اگر یہ وقفہ 0 کو خارج کرتا ہے تو نتیجہ اہم ہے۔
95% اعتماد پر، ±1.96 سے آگے z (سایہ دار دم، رقبے کا 5%) اہم سمجھا جاتا ہے۔
نتیجے کو ایماندارانہ طریقے سے پڑھنا
- اعداد و شمار کی اہمیت کاروباری اہمیت نہیں ہے۔ ایک 0.1% اضافہ اعدادی طور پر حقیقی ہو سکتا ہے لیکن شپنگ کے قابلِ نہیں۔
- جھانکنا اور جلدی بند نہ کریں۔ ہر دن p-value کو چیک کرنا اور اسے 0.05 سے نیچے جاتے ہی رک جانا آپ کی غلط مثبت شرح کو بڑھاتا ہے۔ نمونہ کا سائز پہلے سے فیصل کریں اور ٹیسٹ کو ختم ہونے دیں۔
- نمونہ سائز کے عام اصول پر نظر رکھیں۔ عام تخمینہ قابلِ اعتماد ہے جب ہر گروپ کے پاس کم از کم ~10 تبدیلیاں اور ~10 غیر تبدیلیاں ہوں۔ چھوٹے نمبروں کے ساتھ، نتیجے کو صرف سمتی سمجھیں۔
- اعتماد ≠ احتمال B بہتر ہے۔ 95% اعتماد کی سطح کا مطلب ہے کہ طریقہ طویل مدت میں زیادہ سے زیادہ 5% وقت غلط ہے — یہ ایک بار بار دیکھنے والے کا بیان ہے، "95% موقع B جیتتا ہے" نہیں۔
- ایک ٹیسٹ، ایک میٹرک۔ ایک وقت میں بہت سے میٹرکس یا متغیرات کو ٹیسٹ کرنا بدقسمتی کے موقع کو بڑھاتا ہے؛ اسے درست کریں (مثال کے طور پر Bonferroni) یا اس ایک میٹرک کو پہلے سے رجسٹر کریں جو ٹیسٹ کا فیصلہ کرتا ہے۔
اسے خود شمار کریں
ہر snippet اوپر دی گئی حل شدہ مثال کے لیے دو طرفہ 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 = کنٹرول وزیٹرز، تبدیلیاں ; A2,B2 = تبدیلی وزیٹرز، تبدیلیاں
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))) # معیاری عام 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 کے اردگرد ہو اس کا مطلب ہے "ابھی کافی ڈیٹا نہیں۔"
کیا یہ Bayesian ہے؟ نہیں — یہ ایک بار بار دیکھنے والا z-test ہے، سب سے زیادہ سکھایا جانے والا اور استعمال شدہ طریقہ۔ Bayesian A/B ٹولز p-value کی بجائے "احتمال B، A کو شکست دیتا ہے" رپورٹ کرتے ہیں؛ دونوں درست ہیں، وہ تھوڑا سا مختلف سوالات کا جواب دیتے ہیں۔