Máy tính Kiểm thử A/B có ý nghĩa
Kiểm tra xem kết quả kiểm thử A/B của bạn có ý nghĩa thống kê không. Nhập khách truy cập và chuyển đổi để nhận giá trị P, điểm Z, khoảng tin cậy và nâng cao tương đối.
Máy tính Kiểm thử A/B có ý nghĩa
Nhập số lượng khách truy cập và chuyển đổi cho mỗi biến thể để kiểm tra xem sai khác là thực tế hay chỉ là nhiễu.
Kết quả
Có ý nghĩa thống kê
Sai khác không có khả năng là do ngẫu nhiên ở mức tin cậy bạn chọn.
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.
Tài liệu hướng dẫn
Kiểm thử A/B trong một phút
Bạn đã thay đổi nút, tiêu đề hoặc quy trình thanh toán. Phiên bản A là phiên bản cũ, phiên bản B là phiên bản mới. B trông tốt hơn — nó chuyển đổi 15% khách truy cập so với 10% cho A. Nhưng khoảng cách đó có thể chỉ là may mắn, giống như cách tung đồng xu mười lần có thể cho bảy mặt?
Máy tính này trả lời chính xác điều đó. Bạn nhập số lượng người thấy mỗi phiên bản và bao nhiêu người chuyển đổi, và nó cho bạn biết xác suất sai khác mà bạn đo được là thực tế chứ không phải nhiễu ngẫu nhiên. Nếu xác suất đó đủ cao, bạn có một người chiến thắng. Nếu không, bạn tiếp tục chạy kiểm thử.
Con số duy nhất cần xem là giá trị P: khả năng thấy khoảng cách ít nhất lớn như vậy nếu hai phiên bản thực sự giống hệt nhau. Một giá trị P nhỏ (giả sử dưới 0,05) có nghĩa là "điều này sẽ hiếm khi xảy ra do may mắn, vì vậy sai khác có thể là thực tế."
Cách sử dụng nó
- Khách truy cập — bao nhiêu người duy nhất được hiển thị mỗi phiên bản.
- Chuyển đổi — bao nhiêu trong số họ đã làm việc mà bạn quan tâm (mua, đăng ký, nhấp).
- Mức độ tin cậy — bạn muốn chắc chắn đến mức nào trước khi gọi người chiến thắng. 95% là tiêu chuẩn ngành.
- Giả thuyết — hai phía hỏi "B có khác A không?" (an toàn hơn, mặc định); một phía chỉ hỏi "B có tốt hơn A không?" (nhạy cảm hơn, nhưng bạn phải quyết định hướng trước khi chạy kiểm thử).
Kết quả cập nhật trực tiếp và các đầu vào được lưu trữ trong URL trang, vì vậy bạn có thể đánh dấu hoặc chia sẻ kết quả. Đặt lại xóa biểu mẫu; Tải dữ liệu mẫu điền vào một ví dụ đã làm việc.
Một ví dụ đã làm việc
| Khách truy cập | Chuyển đổi | Tỷ lệ | |
|---|---|---|---|
| A (kiểm soát) | 1.000 | 100 | 10,0% |
| B (biến thể) | 1.000 | 150 | 15,0% |
Đó là nâng cao tuyệt đối 5 điểm phần trăm và nâng cao +50% tương đối. Máy tính trả về giá trị P khoảng 0,0007 — dưới 0,05 — vì vậy ở mức tin cậy 95%, kết quả là có ý nghĩa thống kê. Đại khái, nếu hai phiên bản thực sự giống hệt nhau, bạn sẽ thấy khoảng cách lớn này ít hơn một lần trong một nghìn kiểm thử.
Phép toán (bài kiểm tra z tỷ lệ hai)
Ở phía sau, đây là bài kiểm tra z tỷ lệ hai tiêu chuẩn, cùng một bài kiểm tra được dạy trong thống kê giới thiệu và được sử dụng bởi các công cụ A/B chính.
-
Tỷ lệ chuyển đổi của mỗi nhóm:
trong đó là chuyển đổi và là khách truy cập.
-
Kết hợp tỷ lệ, giả sử (đối với giả thuyết null) cả hai nhóm chia sẻ một tỷ lệ thực tế:
-
Sai số tiêu chuẩn của sai khác:
-
Điểm z — bao nhiêu sai số tiêu chuẩn ngoài hai tỷ lệ:
-
Giá trị P đến từ phân phối chuẩn tắc . Hai phía: . Một phía: .
-
Có ý nghĩa khi , trong đó (vì vậy 0,05 ở 95%).
Máy tính cũng báo cáo một khoảng tin cậy cho sai khác, được tính toán với sai số tiêu chuẩn không kết hợp : phạm vi hợp lý cho khoảng cách thực tế. Nếu khoảng đó không bao gồm 0, kết quả là có ý nghĩa.
Ở mức tin cậy 95%, z vượt quá ±1,96 (các đuôi bóng, 5% diện tích) được tính là có ý nghĩa.
Đọc kết quả một cách trung thực
- Ý nghĩa thống kê không phải là ý nghĩa kinh doanh. Nâng cao 0,1% có thể thực tế về mặt thống kê nhưng không đáng để gửi.
- Đừng nhìn trộm và dừng sớm. Kiểm tra giá trị P hàng ngày và dừng lại khoảnh khắc nó chạm dưới 0,05 làm tăng tỷ lệ dương tính giả của bạn. Quyết định kích thước mẫu trước tiên và để kiểm thử hoàn thành.
- Xem quy tắc ngón cái kích thước mẫu. Xấp xỉ bình thường là đáng tin cậy khi mỗi nhóm có ít nhất ~ 10 chuyển đổi và ~ 10 chuyển đổi không. Với những con số nhỏ, hãy coi kết quả chỉ là hướng dẫn.
- Tin cậy ≠ xác suất B tốt hơn. Mức tin cậy 95% có nghĩa là thủ tục sai không quá 5% thời gian trong thời gian dài — nó là một tuyên bố thường xuyên, không phải "95% cơ hội B thắng."
- Một kiểm thử, một số liệu. Kiểm thử nhiều số liệu hoặc biến thể cùng một lúc làm tăng khả năng một sai lầm; sửa lỗi cho nó (ví dụ Bonferroni) hoặc đăng ký trước các số liệu duy nhất quyết định kiểm thử.
Tính toán nó khi bạn
Mỗi đoạn mã tính toán giá trị P hai phía cho ví dụ đã làm việc ở trên.
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
3Câu hỏi thường gặp
Tôi cần kích thước mẫu nào? Đủ để một nâng cao có ý nghĩa sẽ có thể phát hiện được. Là sàn, nhắm ít nhất vài trăm chuyển đổi cho mỗi biến thể; sử dụng một máy tính kích thước mẫu chuyên dụng với tỷ lệ cơ sở của bạn và nâng cao nhỏ nhất đáng để phát hiện.
Hai phía hay một phía? Sử dụng hai phía trừ khi bạn có một lý do vững chắc, cam kết trước để chỉ quan tâm đến cải thiện. Một phía tăng gấp đôi độ nhạy cảm của bạn nhưng cấm phản ứng với B là tệ hơn.
Tại sao máy tính hiển thị khoảng tin cậy? Nó hiển thị phạm vi hợp lý của khoảng cách thực tế, không chỉ là một phán quyết có/không. Một khoảng rộng straddling 0 có nghĩa là "không đủ dữ liệu chưa."
Đây có phải là Bayesian không? Không — nó là một bài kiểm tra z thường xuyên, phương pháp được dạy và sử dụng rộng rãi nhất. Các công cụ A/B Bayesian báo cáo "xác suất B đánh bại A" thay vì giá trị P; cả hai đều hợp lệ, họ trả lời các câu hỏi hơi khác nhau.