Hướng dẫn ab testing python example - ab thử nghiệm ví dụ python
Nội phân chính Show Nội phân chính
Từ thiết kế thử nghiệm đến thử nghiệm giả thuyết1. Thiết kế thí nghiệm của chúng tôiXây dựng một giả thuyết Chọn các biến
Hình ảnh của tác giảscenario for our study:
Ở đây, những gì chúng tôi sẽ làm:A/B test on a subset of your user base users. 1. Thiết kế thí nghiệm của chúng tôiXây dựng một giả thuyếtChọn các biến Chọn cỡ mẫutwo-tailed test:
4. Kiểm tra giả thuyếtp and pₒ stand for the conversion rate of the new and old design, respectively. We’ll also set a confidence level of 95%:
Hình ảnh của tác giảα value is a threshold we set, by which we say “if the probability of observing a result as extreme or more (p-value) is lower than α, then we reject the Null hypothesis”. Since our α=0.05 (indicating 5% probability), our confidence (1 — α) is 95%. Trong bài viết này, chúng tôi sẽ đi qua quá trình phân tích một thí nghiệm A/B, từ việc đưa ra một giả thuyết, thử nghiệm nó và cuối cùng là giải thích kết quả. Đối với dữ liệu của chúng tôi, chúng tôi sẽ sử dụng một bộ dữ liệu từ Kaggle có chứa kết quả của thử nghiệm A/B về những gì dường như là 2 thiết kế khác nhau của một trang web (Old_Page so với New_Page). Nếu bạn muốn theo dõi cùng với mã tôi đã sử dụng, vui lòng tải xuống Jupyter Notebook tại trang GitHub của tôi. Chọn các biếnChọn cỡ mẫutwo groups:
4. Kiểm tra giả thuyết 5. Vẽ kết luận
Ở đây, những gì chúng tôi sẽ làm: Chọn cỡ mẫu2. Thu thập và chuẩn bị dữ liệu 3. Hình dung kết quảthe larger the sample size, the more precise our estimates (i.e. the smaller our confidence intervals), the higher the chance to detect a difference in the two groups, if present. Mặt khác, mẫu của chúng tôi càng lớn, nghiên cứu của chúng tôi càng đắt tiền (và không thực tế). Vậy chúng ta nên có bao nhiêu người trong mỗi nhóm? Cỡ mẫu chúng ta cần được ước tính thông qua một thứ gọi là phân tích năng lượng và nó phụ thuộc vào một số yếu tố:
Vì nhóm của chúng tôi sẽ hài lòng với chênh lệch 2%, chúng tôi có thể sử dụng 13% và 15% để tính toán kích thước hiệu ứng mà chúng tôi mong đợi. May mắn thay, Python chăm sóc tất cả các tính toán này cho chúng tôi:Python takes care of all these calculations for us: # Packages imports
Chúng tôi cần ít nhất 4720 quan sát cho mỗi nhóm.at least 4720 observations for each group. Đã đặt tham số df = pd.read_csv('ab_data.csv') 9 thành 0,8 trong thực tế có nghĩa là nếu có sự khác biệt thực tế về tỷ lệ chuyển đổi giữa các thiết kế của chúng tôi, giả sử sự khác biệt là cái chúng tôi ước tính (13% so với 15%), chúng tôi có khoảng 80% cơ hội để phát hiện nó Như có ý nghĩa thống kê trong thử nghiệm của chúng tôi với kích thước mẫu mà chúng tôi đã tính toán.2. Thu thập và chuẩn bị dữ liệuCông cụ tuyệt vời! Vì vậy, bây giờ chúng tôi có cỡ mẫu cần thiết, chúng tôi cần thu thập dữ liệu. Thông thường tại thời điểm này, bạn sẽ làm việc với nhóm của mình để thiết lập thử nghiệm, có khả năng với sự trợ giúp của nhóm kỹ thuật và đảm bảo rằng bạn thu thập đủ dữ liệu dựa trên kích thước mẫu cần thiết. Tuy nhiên, vì chúng tôi sẽ sử dụng một bộ dữ liệu mà chúng tôi tìm thấy trực tuyến, để mô phỏng tình huống này, chúng tôi sẽ:
*Lưu ý: Thông thường, chúng ta sẽ không cần phải thực hiện bước 4, đây chỉ là vì lợi ích của bài tậpNote: Normally, we would not need to perform step 4, this is just for the sake of the exercise Vì tôi đã tải xuống bộ dữ liệu, tôi sẽ đi thẳng đến số 2. df = pd.read_csv('ab_data.csv') df.info() Có 294478 hàng trong DataFrame, mỗi hàng đại diện cho một phiên người dùng, cũng như 5 cột:294478 rows in the DataFrame, each representing a user session, as well as 5 columns :
Chúng tôi thực sự chỉ sử dụng các cột df.info()3 và df.info()9 để phân tích. Trước khi chúng tôi tiếp tục và lấy mẫu dữ liệu để lấy tập hợp con của chúng tôi, hãy để đảm bảo không có người dùng nào được lấy mẫu nhiều lần. session_counts = df['user_id'].value_counts(ascending=False)
Trên thực tế, có 3894 người dùng xuất hiện nhiều lần. Vì số này khá thấp, chúng tôi sẽ tiếp tục và loại bỏ chúng khỏi DataFrame để tránh lấy mẫu cùng một người dùng. users_to_drop = session_counts[session_counts > 1].index
Lấy mẫuBây giờ, DataFrame của chúng tôi rất đẹp và sạch sẽ, chúng tôi có thể tiến hành và lấy mẫu các mục df.info()0 cho từng nhóm. Chúng ta có thể sử dụng phương pháp session_counts = df['user_id'].value_counts(ascending=False) 7 của Pandas để thực hiện việc này, điều này sẽ thực hiện lấy mẫu ngẫu nhiên đơn giản cho chúng tôi.Lưu ý: Tôi đã đặt print(f'There are {multi_users} users that appear multiple times in the dataset') print(f'There are {multi_users} users that appear multiple times in the dataset') session_counts = df['user_id'].value_counts(ascending=False) 8 so that the results are reproducible if you feel like following on your own Notebook: just use session_counts = df['user_id'].value_counts(ascending=False) 8 in your function and you should get the same sample as I did.control_sample = df[df['group'] == 'control'].sample(n=required_n, random_state=22) ab_test.info()
ab_test['group'].value_counts()
Tuyệt vời, có vẻ như mọi thứ diễn ra như kế hoạch, và chúng tôi đã sẵn sàng để phân tích kết quả của chúng tôi. 3. Hình dung kết quảĐiều đầu tiên chúng ta có thể làm là tính toán một số thống kê cơ bản để có ý tưởng về những mẫu của chúng ta trông như thế nào.basic statistics to get an idea of what our samples look like. conversion_rates = ab_test.groupby('group')['converted'] Đánh giá bởi các số liệu thống kê ở trên, có vẻ như hai thiết kế của chúng tôi đã thực hiện rất giống nhau, với thiết kế mới của chúng tôi hoạt động tốt hơn một chút, khoảng. 12,3% so với tỷ lệ chuyển đổi 12,6%.our two designs performed very similarly, with our new design performing slightly better, approx. 12.3% vs. 12.6% conversion rate. Vẽ sơ đồ dữ liệu sẽ làm cho những kết quả này dễ nắm bắt hơn: plt.figure(figsize=(8,6)) Tỷ lệ chuyển đổi cho các nhóm của chúng tôi thực sự rất gần. Cũng lưu ý rằng tỷ lệ chuyển đổi của nhóm df = pd.read_csv('ab_data.csv') 1 thấp hơn so với những gì chúng tôi mong đợi đã đưa ra những gì chúng tôi biết về AVG của chúng tôi. Tỷ lệ chuyển đổi (12,3% so với 13%). Điều này cho thấy rằng có một số biến thể trong kết quả khi lấy mẫu từ dân số.
Vì vậy, giá trị của nhóm df = pd.read_csv('ab_data.csv') 2 cao hơn. Điều này có phải là sự khác biệt có ý nghĩa thống kê?Is this difference statistically significant?4. Kiểm tra giả thuyếtBước cuối cùng của phân tích của chúng tôi là kiểm tra giả thuyết của chúng tôi. Vì chúng tôi có một mẫu rất lớn, chúng tôi có thể sử dụng xấp xỉ thông thường để tính toán giá trị p của chúng tôi (tức là thử nghiệm z). Một lần nữa, Python làm cho tất cả các tính toán rất dễ dàng. Chúng ta có thể sử dụng mô-đun users_to_drop = session_counts[session_counts > 1].index 4 để có được khoảng giá trị p và khoảng tin cậy:df = pd.read_csv('ab_data.csv') 0
5. Vẽ kết luậnVì giá trị p của chúng tôi = 0,732 cao hơn ngưỡng α = 0,05 của chúng tôi, chúng tôi không thể từ chối giả thuyết null hₒ, điều đó có nghĩa là thiết kế mới của chúng tôi không hoạt động khác biệt đáng kể (chứ đừng nói gì đến mức cũ của chúng tôi :(p-value=0.732 is way above our α=0.05 threshold, we cannot reject the Null hypothesis Hₒ, which means that our new design did not perform significantly different (let alone better) than our old one :( Ngoài ra, nếu chúng ta nhìn vào khoảng tin cậy cho nhóm df = pd.read_csv('ab_data.csv') 2 ([0.116, 0.135] hoặc 11,6-13,5%), chúng ta nhận thấy rằng:
Điều này có nghĩa là nhiều khả năng tỷ lệ chuyển đổi thực sự của thiết kế mới tương tự như đường cơ sở của chúng tôi, thay vì mục tiêu 15% mà chúng tôi đã hy vọng.Đây là bằng chứng nữa cho thấy thiết kế mới của chúng tôi không có khả năng là một sự cải thiện cho thiết kế cũ của chúng tôi, và thật không may, chúng tôi đã trở lại bảng vẽ!
|