{"id":392714,"date":"2024-06-29T10:34:21","date_gmt":"2024-06-29T10:34:21","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=392714"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=392714","title":{"rendered":"<span>\u041c\u0435\u0442\u043e\u0434\u044b \u0430\u043d\u0430\u043b\u0438\u0437\u0430 A\/B \u0442\u0435\u0441\u0442\u043e\u0432: \u043a\u0430\u043a \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043c\u0435\u0442\u0440\u0438\u043a \u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0432\u044b\u0431\u043e\u0440\u043a\u0438<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9a3\/cd3\/a34\/9a3cd3a348e4ff31e0e4f2e6406b86e9.png\" width=\"1120\" height=\"630\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9a3\/cd3\/a34\/9a3cd3a348e4ff31e0e4f2e6406b86e9.png\"\/><\/figure>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u042f \u0412\u0430\u043d\u044f \u041a\u0430\u0441\u0442\u043e\u0440\u043d\u043e\u0432, \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u00a0\u041b\u0438\u0433\u0438 \u0421\u0442\u0430\u0432\u043e\u043a. \u041d\u0430\u00a0\u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0439 \u0434\u0435\u043d\u044c \u0432\u0441\u0435 \u0432\u043e\u043a\u0440\u0443\u0433 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043e\u00a0\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0430\/\u0431 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u043e\u00a0\u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u00a0\u0438\u0445 \u043f\u0440\u043e\u0432\u043e\u0434\u044f\u0442, \u043d\u0435\u00a0\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0441\u0442\u044c, \u0438\u043b\u0438\u00a0\u0434\u0430\u0436\u0435 \u043d\u0435\u00a0\u0437\u043d\u0430\u044e\u0442, \u043a\u0430\u043a\u00a0\u0438\u0445 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c. \u0417\u0434\u0435\u0441\u044c \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f, \u0437\u0430\u0447\u0435\u043c \u0438 \u043a\u0430\u043a\u00a0\u0434\u0435\u043b\u0430\u0442\u044c \u0430\/\u0431 \u0442\u0435\u0441\u0442\u044b, \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0440\u0430\u0437\u0432\u0435\u044f\u0442\u044c \u0442\u0443\u043c\u0430\u043d \u043d\u0430\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a\u0438\u0435 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u00a0\u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u043d\u0430\u00a0python, \u0447\u0442\u043e\u0431\u044b \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u0441\u0440\u0430\u0437\u0443 \u0438\u043c\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f. <\/p>\n<p>\u0414\u043b\u044f\u00a0\u043a\u043e\u0433\u043e \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f: \u0434\u043b\u044f\u00a0\u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u0432, \u043f\u0440\u043e\u0434\u0430\u043a\u0442\u043e\u0432 \u0438\u043b\u0438\u00a0\u043b\u044e\u0431\u043e\u0433\u043e, \u043a\u0442\u043e \u0441\u0430\u043c \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0430\u0431 \u0442\u0435\u0441\u0442.<\/p>\n<p> \u041a\u0430\u043a\u00a0\u0447\u0438\u0442\u0430\u0442\u044c? \u042f \u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0443\u0447\u0435\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438, \u043d\u043e\u00a0\u043d\u0430\u00a0\u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u044d\u0442\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u0448\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0430\u00a0\u2014 \u0432\u00a0\u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0430\u0431 \u0442\u0435\u0441\u0442, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0432\u00a0\u043d\u0435\u0439 \u043a\u0435\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f\u00a0\u0432\u0430\u0441, \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043c, \u0432\u00a0\u043a\u043e\u043d\u0446\u0435 \u0435\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430\u00a0\u0441\u0432\u043e\u0434\u043d\u0443\u044e \u0441\u0445\u0435\u043c\u0443. <\/p>\n<p>\u041f\u0430\u0440\u0430 \u0441\u043b\u043e\u0432, \u0438 \u043d\u0430\u0447\u043d\u0435\u043c. \u041f\u043e\u043a\u0430 \u044f \u043f\u0438\u0441\u0430\u043b \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e, \u044f \u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u043d\u0435\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043d\u0430\u0443\u0447\u043d\u043e\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043d\u0435\u00a0\u0440\u0430\u0441\u043f\u0443\u0433\u0430\u0442\u044c \u0432\u0430\u0441, \u043d\u043e\u00a0\u0433\u0434\u0435\u2011\u0442\u043e \u043e\u043d\u0430 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f, \u0438\u0437\u0432\u0438\u043d\u0438\u0442\u0435 \u0437\u0430\u00a0\u044d\u0442\u043e\u2026)) <\/p>\n<p>\u0427\u0442\u043e\u00a0\u0436, \u043d\u0430\u0447\u043d\u0435\u043c\u2026<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ea1\/3a8\/7e1\/ea13a87e16a361ce107ddda0d0d707db.png\" width=\"1120\" height=\"630\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ea1\/3a8\/7e1\/ea13a87e16a361ce107ddda0d0d707db.png\"\/><\/figure>\n<p>\u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u0432\u044b\u0431\u043e\u0440\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u043c \u043f\u0443\u0442\u0435\u043c. \u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442, \u044d\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u0440\u0438\u043a\u0443 (\u0438\u043b\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0438), \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435: \u0442\u043e, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0447\u0435\u0433\u043e, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0441\u0430\u043c\u0430 \u0433\u0438\u043f\u043e\u0442\u0435\u0437\u0430. \u0412\u044b\u0431\u043e\u0440 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u0438\u043f\u0430 \u043c\u0435\u0442\u0440\u0438\u043a\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c. \u041c\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043d\u0430 \u0442\u0440\u0438 \u0442\u0438\u043f\u0430:<\/p>\n<ol>\n<li>\n<p>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 (\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0430\u0432\u043e\u043a \u0438\u043b\u0438 \u0437\u0430\u043a\u0430\u0437\u043e\u0432).<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0438\u043b\u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 (\u043a\u043e\u043d\u0432\u0435\u0440\u0441\u0438\u044f \u0432 \u043f\u043e\u043a\u0443\u043f\u043a\u0443, CTR)<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f (\u0440\u0435\u043d\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u043b\u0438 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u044b\u0445 \u043a\u0430\u0440\u0442\u043e\u0447\u0435\u043a \u043a \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u043f\u043e\u043a\u0443\u043f\u043e\u043a).<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1d1\/c36\/f73\/1d1c36f73bb4a0ecd163d07c0adf661e.png\" width=\"1120\" height=\"630\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1d1\/c36\/f73\/1d1c36f73bb4a0ecd163d07c0adf661e.png\"\/><\/figure>\n<p>\u0421\u00a0\u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0438\u043f\u043e\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u00a0\u2014 \u0441\u0432\u043e\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0410\/\u0411 \u0442\u0435\u0441\u0442\u043e\u0432 \u043f\u0440\u043e\u0432\u043e\u0434\u044f\u0442 \u0441\u00a0\u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c\u0438 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0439, \u0442\u043e \u0441\u00a0\u043d\u0435\u0433\u043e \u0438 \u043d\u0430\u0447\u043d\u0435\u043c, \u043e\u043d\u00a0\u0436\u0435 \u0438 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439.<\/p>\n<h3>\u041f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438 (\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435)<\/h3>\n<p>\u0422\u0443\u0442 \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f\u00a0\u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0439 \u044d\u0442\u043e \u043c\u0435\u0442\u043e\u0434 \u0425\u0438\u2011\u041a\u0432\u0430\u0434\u0440\u0430\u0442. \u041d\u043e\u00a0\u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a\u00a0\u0435\u0433\u043e \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c, \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u0434\u043b\u044f\u00a0\u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0433\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043e\u0434\u0438\u043d \u0438\u0437\u00a0\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u00a0\u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/www.evanmiller.org\/ab-testing\/sample-size.html\">\u044d\u0442\u043e\u0442<\/a> \u0438\u043b\u0438\u00a0\u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 statsmodels.stats \u0447\u0435\u0440\u0435\u0437 python, \u0432\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430:<\/p>\n<pre><code class=\"python\">import statsmodels.stats.api as sms  def sample_size_calculator(baseline_rate, minimum_effect, power=0.8, alpha=0.05):      effect_size = sms.proportion_effectsize(baseline_rate, baseline_rate + minimum_effect)     sample_size = sms.NormalIndPower().solve_power(effect_size, power=power, alpha=alpha, ratio=1)     return sample_size  baseline_rate = 0.10  # \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 10% \u043a\u043e\u043d\u0432\u0435\u0440\u0441\u0438\u044f \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0435 minimum_effect = 0.02 # \u0436\u0435\u043b\u0430\u0435\u043c\u043e \u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 2%)  sample_size = sample_size_calculator(baseline_rate, minimum_effect) print(f'\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b: {sample_size:.0f}')<\/code><\/pre>\n<p>\u0412\u00a0\u043e\u0431\u043e\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u0445 \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043a\u043e\u043d\u0432\u0435\u0440\u0441\u0438\u0438, \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f\u00a0\u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0443\u0440\u043e\u0432\u0435\u043d\u044c a (\u043f\u0440\u043e\u0446\u0435\u043d\u0442 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430 \u043f\u0440\u0438\u00a0\u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e\u00a0\u0435\u0435 \u043d\u0435\u0442) \u0438 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438 (\u043f\u0440\u043e\u0446\u0435\u043d\u0442 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442).<\/p>\n<p>\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u044b\u0431\u043e\u0440\u043a\u0438, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043a\u00a0\u0441\u0430\u043c\u043e\u043c\u0443 \u0442\u0435\u0441\u0442\u0443.<\/p>\n<p>\u041e\u043f\u044f\u0442\u044c\u00a0\u0436\u0435, \u0432\u00a0\u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043f\u043e\u043b\u043d\u043e \u0441\u0430\u0439\u0442\u043e\u0432 \u0441\u00a0\u043e\u043d\u043b\u0430\u0439\u043d\u2011\u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/www.evanmiller.org\/ab-testing\/chi-squared.html\">\u0432\u043e\u0442 \u044d\u0442\u043e\u0442<\/a>. \u0415\u0441\u043b\u0438\u00a0\u0436\u0435 \u0432\u044b \u0440\u0435\u0448\u0438\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0442\u0435\u0441\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f python, \u0442\u043e \u0432\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043a\u0440\u0438\u043f\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<pre><code class=\"python\">import numpy as np import scipy.stats as stats  # \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 group_A = np.array([50, 100]) group_B = np.array([60, 90])  # \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0442\u0435\u0441\u0442 chi2, p, dof, ex = stats.chi2_contingency([group_A, group_B], correction=False)  # \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0439\u0442\u0435 lift \u0438 \u0435\u0433\u043e \u0434\u043e\u0432\u0435\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b p1 = group_B[0] \/ group_B.sum() p2 = group_A[0] \/ group_A.sum()  # \u0420\u0430\u0441\u0447\u0435\u0442 lift lift = p1 \/ p2  # \u0420\u0430\u0441\u0447\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 \u0434\u043b\u044f lift se_p1 = np.sqrt(p1 * (1 - p1) \/ group_B.sum()) se_p2 = np.sqrt(p2 * (1 - p2) \/ group_A.sum()) std_error = lift * np.sqrt((se_p1 \/ p1) ** 2 + (se_p2 \/ p2) ** 2)  # \u0414\u043e\u0432\u0435\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b ci = stats.norm.interval(0.95, loc=lift, scale=std_error)  # \u0412\u044b\u0432\u043e\u0434\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b print(\"\u0425\u0438-\u043a\u0432\u0430\u0434\u0440\u0430\u0442 p-value: \", p) print(\"\u0414\u043e\u0432\u0435\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f (lift): \", ci)  # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0435\u0441\u0442\u044c \u043b\u0438 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 if p &lt; 0.05 and ci[0] > 1:     print(\"\u0412\u0430\u0440\u0438\u0430\u043d\u0442 B \u043b\u0443\u0447\u0448\u0435.\") elif p &lt; 0.05 and ci[1] &lt; 1:     print(\"\u0412\u0430\u0440\u0438\u0430\u043d\u0442 A \u043b\u0443\u0447\u0448\u0435.\") else:     print(\"\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0439 \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u043d\u0435\u0442.\") <\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/75a\/9bc\/7d4\/75a9bc7d4eb16d5d662b2fa13401ca83.png\" width=\"1120\" height=\"630\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/75a\/9bc\/7d4\/75a9bc7d4eb16d5d662b2fa13401ca83.png\"\/><\/figure>\n<h3>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435<\/h3>\n<p>\u0412\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u00a0\u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u0430\u0431 \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0441\u00a0\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c\u0438, \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u0442\u0430\u043a\u0438\u0445 \u043c\u0435\u0442\u0440\u0438\u043a \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c: \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0430\u0432\u043e\u043a, \u0434\u043b\u0438\u043d\u0430 \u0441\u0435\u0441\u0441\u0438\u0438 \u0438 \u0442\u0434. \u041f\u0440\u0438\u00a0\u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u0440\u0438\u043a \u0432\u0430\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0441\u0442\u0438. \u0422\u0430\u043a \u043a\u0430\u043a\u00a0\u043c\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u0440\u0430\u043d\u0434\u043e\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0441\u043f\u043b\u0438\u0442\u043e\u0432\u0430\u043d\u0438\u044f, \u0442\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u043c\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0435\u043c\u0441\u044f \u0441\u00a0\u0432\u044b\u0441\u043e\u043a\u0438\u043c \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u0438 (\u0440\u0430\u0437\u043d\u043e\u0441\u0442\u0438) \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e\u00a0\u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u043e \u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430\u00a0\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c CUPED (Controlled pre\u2011post experimental design)\u00a0\u2014 \u044d\u0442\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0441\u0435 \u0447\u0430\u0449\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u00a0\u0410\/\u0411 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u043b\u044f\u00a0\u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432.<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043d\u0438\u0432\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u0438, \u0441\u0435\u0437\u043e\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\u043e\u0432\u044b\u0435 \u0430\u043a\u0446\u0438\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u0430\u043a\u0442\u043e\u0440\u044b. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e\u00a0\u043c\u0435\u0442\u043e\u0434 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/medium.com\/statistics-experiments\/cuped-%D0%B8%D0%BB%D0%B8-%D1%83%D0%B2%D0%B5%D0%BB%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D1%87%D1%83%D0%B2%D1%81%D1%82%D0%B2%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8-%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D0%BA%D0%B8-de7183fc964c\">\u0442\u0443\u0442<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/www.exp-platform.com\/Documents\/2013-02-CUPED-ImprovingSensitivityOfControlledExperiments.pdf\">\u0432\u00a0\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c cuped, \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u043d\u0430\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a \u0432\u00a0\u043f\u0440\u0435\u0434\u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u0435\u0440\u0438\u043e\u0434 \u0438 \u0441\u0430\u043c\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u00a0\u043c\u043e\u043c\u0435\u043d\u0442 \u0442\u0435\u0441\u0442\u0430. \u0414\u043b\u044f\u00a0\u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043a\u0440\u0438\u043f\u0442\u0430:<\/p>\n<pre><code class=\"python\"># \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0438 \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u044e \u043f\u0440\u0435\u0434\u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 mean_pre_test = df['pre_test_metric'].mean() var_pre_test = df['pre_test_metric'].var()  # \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u0446\u0438\u044e \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u0435\u0434\u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u043c\u0435\u0442\u0440\u0438\u043a\u043e\u0439 cov = df[['pre_test_metric', 'test_metric']].cov().iloc[0, 1]  # \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 theta theta = cov \/ var_pre_test  # \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c CUPED df['cuped_metric'] = df['test_metric'] - theta * (df['pre_test_metric'] - mean_pre_test)<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u00a0\u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435, \u0441\u0442\u043e\u0438\u0442 \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u044b\u0431\u043e\u0440\u043a\u0438, \u0442\u0443\u0442 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b\u0431\u043e\u0440\u043a\u0430 \u0431\u043e\u043b\u044c\u0448\u0430\u044f\u2026<\/p>\n<p>\u0422\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430\u00a0\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u00a0\u0446\u0435\u043b\u043e\u043c \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0442 \u044d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0442\u0435\u0441\u0442 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Shapiro%E2%80%93Wilk_test\">\u0428\u0430\u043f\u0438\u0440\u043e\u2011\u0423\u0438\u043b\u043a\u0430<\/a>, \u043e\u043d \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0432\u00a0\u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u0440\u043e\u043c\u0435 \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0432\u044b\u0431\u043e\u0440\u043e\u043a, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043a \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f\u043c \u043e\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438:<\/p>\n<pre><code class=\"python\">import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy.stats import shapiro, norm  # \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 data = pd.read_csv('adjusted_experiment_data.csv') # \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f 'metric' metric_data = data['metric']  # \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0442\u0435\u0441\u0442 \u0428\u0430\u043f\u0438\u0440\u043e-\u0423\u0438\u043b\u043a\u0430 stat, p = shapiro(metric_data)  alpha = 0.05 if p > alpha:     print(\"\u041d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435.\") else:     print(\"\u041d\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435.\")  # \u0413\u0440\u0430\u0444\u0438\u043a \u0441 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c fig, ax = plt.subplots() ax.hist(metric_data, bins=30, density=True, alpha=0.5, label='Data')  # \u0418\u0437\u043c\u0435\u043d\u0438\u043b bins \u043d\u0430 30 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0430  mu, std = norm.fit(metric_data) xmin, xmax = ax.get_xlim() x = np.linspace(xmin, xmax, 100) p = norm.pdf(x, mu, std) ax.plot(x, p, 'k', linewidth=2, label='Normal distribution') ax.legend() plt.show() <\/code><\/pre>\n<p>\u0418\u0442\u0430\u043a, \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u043c, \u0447\u0442\u043e\u00a0\u0436\u0435 \u0434\u0430\u043b\u044c\u0448\u0435..<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0441\u0430\u043c\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0433\u0438\u043f\u043e\u0442\u0435\u0437\u044b, \u0430\u00a0\u0438\u043c\u0435\u043d\u043d\u043e t\u2011test, \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u2011\u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439 \u0441\u0442\u044a\u044e\u0434\u0435\u043d\u0442\u0430, \u043e\u043d \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442, \u0435\u0441\u043b\u0438\u00a0\u0436\u0435 \u043c\u0435\u0436\u0434\u0443 \u0433\u0440\u0443\u043f\u043f\u0430\u043c\u0438 \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u043d\u0435\u0440\u0430\u0432\u043d\u0430\u044f \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u044f, \u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0442\u2011\u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439 \u0423\u044d\u043b\u0447\u0430, \u0432\u00a0\u0446\u0435\u043b\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u043d\u043e\u00a0\u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u0441\u00a0\u043c\u0435\u043d\u044c\u0448\u0438\u043c \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0441\u0442\u0438. \u041e\u0431\u0430 \u0442\u0435\u0441\u0442\u0430 \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 scipy.stats, \u0432\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u043e\u0432:<\/p>\n<pre><code class=\"python\">import pandas as pd import scipy.stats as stats  data = pd.read_csv('adjusted_experiment_data.csv')  control = data[data['group_type'] == 'control']['experiment_data'] test = data[data['group_type'] == 'test']['experiment_data']  # \u0442-\u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439 \u0423\u044d\u043b\u0447\u0430 welch_t, welch_p = stats.ttest_ind(control, test, equal_var=False)  # \u0442-\u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439 \u0421\u0442\u044a\u044e\u0434\u0435\u043d\u0442\u0430 student_t, student_p = stats.ttest_ind(control, test, equal_var=True)   print(\"Welch's t-test:\") print(\"t-statistic: \", welch_t) print(\"p-value: \", welch_p)  print(\"\\nStudent's t-test:\") print(\"t-statistic: \", student_t) print(\"p-value: \", student_p)<\/code><\/pre>\n<p>\u0427\u0442\u043e\u00a0\u0434\u0435\u043b\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439, \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c, \u043d\u043e\u00a0\u0431\u044b\u0432\u0430\u0435\u0442, \u043a\u043e\u0433\u0434\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u043e \u0438\u043b\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435, \u0442\u0443\u0442 \u043d\u0430\u00a0\u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 bootstrap. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f bootstrap \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0435 \u0441\u00a0\u0437\u0430\u043c\u0435\u043d\u043e\u0439 \u0438\u0437\u00a0\u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u00ab\u0432\u044b\u0431\u043e\u0440\u043e\u043a\u00bb. \u041a\u0430\u0436\u0434\u0430\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0430 \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430\u00a0\u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0432\u044b\u0431\u043e\u0440\u043a\u0443, \u043d\u043e\u00a0\u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437\u2011\u0437\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u0432\u00a0\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u0430\u00a0\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">import numpy as np import pandas as pd from scipy.stats import mannwhitneyu from scipy.stats import ttest_ind from scipy.stats import norm import matplotlib.pyplot as plt import seaborn as sns  from tqdm.auto import tqdm import seaborn as sns  plt.style.use('ggplot') def get_bootstrap(     data_column_1, # \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0438     data_column_2, # \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0438     boot_it = 1000, # \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0443\u0442\u0441\u0442\u0440\u044d\u043f-\u043f\u043e\u0434\u0432\u044b\u0431\u043e\u0440\u043e\u043a     statistic = np.mean, # \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0430\u044f \u043d\u0430\u0441 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430     bootstrap_conf_level = 0.95 # \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0441\u0442\u0438 ):     boot_len = max([len(data_column_1), len(data_column_2)])     boot_data = []     for i in tqdm(range(boot_it)): # \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u043f\u043e\u0434\u0432\u044b\u0431\u043e\u0440\u043a\u0438         samples_1 = data_column_1.sample(             boot_len,              replace = True # \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f         ).values                  samples_2 = data_column_2.sample(             boot_len, # \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u044e, \u0431\u0435\u0440\u0435\u043c \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u044b\u0431\u043e\u0440\u043a\u0438             replace = True         ).values                  boot_data.append(statistic(samples_1-samples_2))      pd_boot_data = pd.DataFrame(boot_data)              left_quant = (1 - bootstrap_conf_level)\/2     right_quant = 1 - (1 - bootstrap_conf_level) \/ 2     quants = pd_boot_data.quantile([left_quant, right_quant])              p_1 = norm.cdf(         x = 0,          loc = np.mean(boot_data),          scale = np.std(boot_data)     )     p_2 = norm.cdf(         x = 0,          loc = -np.mean(boot_data),          scale = np.std(boot_data)     )     p_value = min(p_1, p_2) * 2              # \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f     _, _, bars = plt.hist(pd_boot_data[0], bins = 50)     for bar in bars:         if abs(bar.get_x()) &lt;= quants.iloc[0][0] or abs(bar.get_x()) >= quants.iloc[1][0]:             bar.set_facecolor('red')         else:              bar.set_facecolor('grey')             bar.set_edgecolor('black')          plt.style.use('ggplot')     plt.vlines(quants,ymin=0,ymax=50,linestyle='--')     plt.xlabel('boot_data')     plt.ylabel('frequency')     plt.title(\"Histogram of boot_data\")     plt.show()             return {\"boot_data\": boot_data,              \"quants\": quants,              \"p_value\": p_value}<\/code><\/pre>\n<p>\u0424\u0443\u0445, \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0441\u00a0\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c\u0438 \u0432\u0441\u0435\u2026<\/p>\n<h3>\u0421\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0412\u00a0\u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f\u0445 \u0434\u0432\u0430 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u00a0\u2014 \u044d\u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u0430\u00a0\u0437\u043d\u0430\u043c\u0435\u043d\u0430\u0442\u0435\u043b\u044c\u00a0\u2014 \u044d\u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0430\u0432\u043e\u043a \u043d\u0430\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u043b\u0438 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0438\u043b\u0438\u00a0\u0436\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u043a\u0430\u0440\u0442\u043e\u0447\u0435\u043a \u043d\u0430\u00a0\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0445.\u00a0\u0411\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u0441\u0443\u0442\u044c \u0433\u0438\u043f\u043e\u0442\u0435\u0437\u044b \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u00a0\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043c\u0435\u0442\u0440\u0438\u043a, \u0447\u0442\u043e\u00a0\u0436, \u0442\u0443\u0442 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u00a0\u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430\u00a0\u0440\u0430\u0437\u043c\u0435\u0440\u0430\u0445 \u0432\u044b\u0431\u043e\u0440\u043a\u0438.<\/p>\n<p>\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0430<\/p>\n<p>\u0422\u0435\u0441\u0442 \u0421\u0442\u044c\u044e\u0434\u0435\u043d\u0442\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043b\u044f \u043c\u0435\u0442\u0440\u0438\u043a \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u0438\u0437-\u0437\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u0434\u043d\u0430 \u0438\u0437 \u043f\u0440\u0438\u0447\u0438\u043d \u044d\u0442\u043e\u0433\u043e \u2014 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u0438 \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0422\u0435\u0441\u0442 \u0421\u0442\u044c\u044e\u0434\u0435\u043d\u0442\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b \u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b, \u0438 \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u044b\u0431\u043e\u0440\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u0438 \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e. \u041e\u0434\u043d\u0430\u043a\u043e, \u043a\u043e\u0433\u0434\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b \u0438\u043b\u0438 \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u0440\u0438\u043a\u0430 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u043d\u0432\u0435\u0440\u0441\u0438\u044f, \u0433\u0434\u0435 \u0447\u0438\u0441\u043b\u043e \u0443\u0441\u043f\u0435\u0445\u043e\u0432 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u043e\u0431\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u043f\u044b\u0442\u043e\u043a), \u0442\u0430\u043a\u0438\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u044b, \u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043e\u0446\u0435\u043d\u043a\u0438 \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043c\u0435\u0449\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. \u0422\u0443\u0442 \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0414\u0435\u043b\u044c\u0442\u0430-\u043c\u0435\u0442\u043e\u0434. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440. \u0423 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u0443\u0447\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043d\u0438\u043c\u0438 \u0447\u0442\u043e-\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u0434\u043e\u0445\u043e\u0434 \u043d\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0449\u0435\u0433\u043e \u0434\u043e\u0445\u043e\u0434\u0430 \u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432. \u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u0434\u0435\u043b\u0430\u0435\u0442\u0435 \u0442\u0430\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0432\u0430\u0448\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f, \u0438 \u0441 \u043d\u0438\u043c\u0438 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0438 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0414\u0435\u043b\u044c\u0442\u0430-\u043c\u0435\u0442\u043e\u0434 \u2014 \u044d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0447\u043d\u044b\u043c\u0438 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0432\u0430\u0448\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041f\u0440\u043e\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u044d\u0442\u043e \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443 \u0432\u0430\u0448\u0438\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0434\u0435\u043b\u0430\u0435\u0442\u0435 \u0447\u0442\u043e-\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0435 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<pre><code class=\"python\">import numpy as np import scipy.stats as stats  def delta_method_test(control_data, test_data):     # \u0420\u0430\u0441\u0447\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b     mean_control = np.mean(control_data)     mean_test = np.mean(test_data)     var_control = np.var(control_data, ddof=1)     var_test = np.var(test_data, ddof=1)     n_control = len(control_data)     n_test = len(test_data)      # \u0420\u0430\u0441\u0447\u0435\u0442 \u043e\u0431\u0449\u0435\u0439 \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u0438     combined_var = var_control \/ n_control + var_test \/ n_test      # \u0420\u0430\u0441\u0447\u0435\u0442 \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u0438 \u0441\u0440\u0435\u0434\u043d\u0438\u0445     mean_diff = mean_test - mean_control      # \u0420\u0430\u0441\u0447\u0435\u0442 t-\u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438     t_stat = mean_diff \/ np.sqrt(combined_var)      # \u0420\u0430\u0441\u0447\u0435\u0442 p-value     p_value = 2 * (1 - stats.norm.cdf(np.abs(t_stat)))      return p_value  control_group = np.array([\u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b]) test_group = np.array([\u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b]) p_value = delta_method_test(control_group, test_group)  print(f\"P-value: {p_value}\")<\/code><\/pre>\n<h4>\u041c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0430<\/h4>\n<p>\u041d\u0443 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0435\u0441\u043b\u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439. \u0412\u00a0\u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 bootstrap \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0436\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u0435\u043d. \u041d\u043e\u00a0\u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u043c\u044b \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u0440\u0438\u043a\u0443, \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f \u0432\u00a0\u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c\u0438, \u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0431\u043b\u043e\u0447\u043d\u044b\u0439 bootstrap. \u0412\u00a0\u043e\u0431\u044b\u0447\u043d\u043e\u043c bootstrap \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0438\u0437\u00a0\u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0441\u00a0\u0437\u0430\u043c\u0435\u043d\u043e\u0439, \u0432\u00a0\u0431\u043b\u043e\u0447\u043d\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0433\u0440\u0443\u043f\u043f\u0430\u043c\u0438 (\u0438\u043b\u0438 \u0431\u043b\u043e\u043a\u0430\u043c\u0438). \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u00a0\u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0443\u0447\u0435\u0441\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u00a0\u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u00a0\u043a\u043e\u043d\u0446\u0435 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043c \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c \u043d\u0430\u043c t\u2011test.<\/p>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430\u00a0\u043e\u0431\u044b\u0447\u043d\u044b\u0439 bootstrap:<\/p>\n<pre><code class=\"python\">import pandas as pd import numpy as np import scipy.stats as stats  data = pd.read_csv('output.csv')  control = data[data['group'] == 'control'] treatment = data[data['group'] == 'test']  observed_effect = treatment['after'].mean() - control['after'].mean()  # \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u043b\u043e\u043a\u043e\u0432 num_blocks = 100 block_size = len(data) \/\/ num_blocks  bootstrap_samples = [] for i in range(num_blocks):     # \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0431\u043b\u043e\u043a\u0438     block_indices = np.random.choice(range(len(data)), size=block_size, replace=True)     bootstrap_sample = data.iloc[block_indices]      # \u0441\u043f\u043b\u0438\u0442\u0443\u0435\u043c \u043f\u043e \u0433\u0440\u0443\u043f\u043f\u0430\u043c     bootstrap_control = bootstrap_sample[bootstrap_sample['group'] == 'control']     bootstrap_test = bootstrap_sample[bootstrap_sample['group'] == 'test']      # \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u044d\u0444\u0444\u0435\u043a\u0442 \u0447\u0435\u0440\u0435\u0437 bootstrap     bootstrap_effect = bootstrap_test['after'].mean() - bootstrap_control['after'].mean()      bootstrap_samples.append(bootstrap_effect)  # \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 bootstrap bootstrap_std_err = np.std(bootstrap_samples)  # \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c t-test t_statistic = observed_effect \/ bootstrap_std_err p_value = stats.t.sf(np.abs(t_statistic), len(data) - 1) * 2  print(\"Observed treatment effect: \", observed_effect) print(\"Bootstrap estimate of standard error: \", bootstrap_std_err) print(\"t-statistic: \", t_statistic) print(\"p-value: \", p_value) <\/code><\/pre>\n<h4>\u0412\u044b\u0432\u043e\u0434<\/h4>\n<p>\u0412\u00a0\u0438\u0442\u043e\u0433\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 A\/B \u0442\u0435\u0441\u0442, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0430\u043d\u0430\u043b\u0438\u0437\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043c\u0435\u0442\u0440\u0438\u043a \u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0432\u044b\u0431\u043e\u0440\u043a\u0438, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0444\u0430\u043a\u0442\u043e\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430\u00a0\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. \u0412\u0430\u0436\u043d\u043e \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430\u00a0\u043c\u043e\u0449\u043d\u043e\u0441\u0442\u044c\u044e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0441\u043b\u0435 \u0435\u0433\u043e \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e\u00a0\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u043c\u0438.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u044f <a href=\"https:\/\/miro.com\/app\/board\/uXjVPlG4fck=\/?share_link_id=28801291450\">\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432\u00a0Miro \u043e\u0431\u0449\u0443\u044e \u0441\u0445\u0435\u043c\u0443<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u043a\u00a0\u043d\u0430\u0432\u0438\u0433\u0430\u0442\u043e\u0440 \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u0442\u0430\u0442 \u043c\u0435\u0442\u043e\u0434\u0430 \u0434\u043b\u044f\u00a0\u0432\u0430\u0448\u0435\u0433\u043e \u0442\u0435\u0441\u0442\u0430.<\/p>\n<p>\u042f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e\u00a0\u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u043c \u0432\u00a0\u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u0410\\\u0411 \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442 \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u0447\u0442\u043e\u00a0\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u0440\u0430\u0437\u0438\u0442\u0441\u044f \u043d\u0430\u00a0\u0432\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0435 \u0438\u00a0\u043b\u0438\u0447\u043d\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0435.<\/p>\n<p>\u041f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0439\u0442\u0435\u0441\u044c \u043d\u0430 <a href=\"https:\/\/t.me\/vankastor_life_and_product\">\u043c\u043e\u0439 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u043a\u0430\u043d\u0430\u043b<\/a>, \u0433\u0434\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u043a\u0430\u043a \u0443\u043b\u0443\u0447\u0448\u0430\u0442\u044c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u0441\u0442\u0430\u0442\u044c\u044e \u0432\u00a0\u0438\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435, \u0438 \u0434\u043e\u00a0\u0441\u043a\u043e\u0440\u043e\u0439 \u0432\u0441\u0442\u0440\u0435\u0447\u0438!<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/718336\/\"> https:\/\/habr.com\/ru\/articles\/718336\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u042f \u0412\u0430\u043d\u044f \u041a\u0430\u0441\u0442\u043e\u0440\u043d\u043e\u0432, \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u00a0\u041b\u0438\u0433\u0438 \u0421\u0442\u0430\u0432\u043e\u043a. \u041d\u0430\u00a0\u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0439 \u0434\u0435\u043d\u044c \u0432\u0441\u0435 \u0432\u043e\u043a\u0440\u0443\u0433 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043e\u00a0\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0430\/\u0431 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u043e\u00a0\u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u00a0\u0438\u0445 \u043f\u0440\u043e\u0432\u043e\u0434\u044f\u0442, \u043d\u0435\u00a0\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0441\u0442\u044c, \u0438\u043b\u0438\u00a0\u0434\u0430\u0436\u0435 \u043d\u0435\u00a0\u0437\u043d\u0430\u044e\u0442, \u043a\u0430\u043a\u00a0\u0438\u0445 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c. \u0417\u0434\u0435\u0441\u044c \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f, \u0437\u0430\u0447\u0435\u043c \u0438 \u043a\u0430\u043a\u00a0\u0434\u0435\u043b\u0430\u0442\u044c \u0430\/\u0431 \u0442\u0435\u0441\u0442\u044b, \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0440\u0430\u0437\u0432\u0435\u044f\u0442\u044c \u0442\u0443\u043c\u0430\u043d \u043d\u0430\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a\u0438\u0435 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u00a0\u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u043d\u0430\u00a0python, \u0447\u0442\u043e\u0431\u044b \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u0441\u0440\u0430\u0437\u0443 \u0438\u043c\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f. <\/p>\n<p>\u0414\u043b\u044f\u00a0\u043a\u043e\u0433\u043e \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f: \u0434\u043b\u044f\u00a0\u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u0432, \u043f\u0440\u043e\u0434\u0430\u043a\u0442\u043e\u0432 \u0438\u043b\u0438\u00a0\u043b\u044e\u0431\u043e\u0433\u043e, \u043a\u0442\u043e \u0441\u0430\u043c \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0430\u0431 \u0442\u0435\u0441\u0442.<\/p>\n<p> \u041a\u0430\u043a\u00a0\u0447\u0438\u0442\u0430\u0442\u044c? \u042f \u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0443\u0447\u0435\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438, \u043d\u043e\u00a0\u043d\u0430\u00a0\u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u044d\u0442\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u0448\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0430\u00a0\u2014 \u0432\u00a0\u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0430\u0431 \u0442\u0435\u0441\u0442, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0432\u00a0\u043d\u0435\u0439 \u043a\u0435\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f\u00a0\u0432\u0430\u0441, \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043c, \u0432\u00a0\u043a\u043e\u043d\u0446\u0435 \u0435\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430\u00a0\u0441\u0432\u043e\u0434\u043d\u0443\u044e \u0441\u0445\u0435\u043c\u0443. <\/p>\n<p>\u041f\u0430\u0440\u0430 \u0441\u043b\u043e\u0432, \u0438 \u043d\u0430\u0447\u043d\u0435\u043c. \u041f\u043e\u043a\u0430 \u044f \u043f\u0438\u0441\u0430\u043b \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e, \u044f \u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u043d\u0435\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043d\u0430\u0443\u0447\u043d\u043e\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043d\u0435\u00a0\u0440\u0430\u0441\u043f\u0443\u0433\u0430\u0442\u044c \u0432\u0430\u0441, \u043d\u043e\u00a0\u0433\u0434\u0435\u2011\u0442\u043e \u043e\u043d\u0430 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f, \u0438\u0437\u0432\u0438\u043d\u0438\u0442\u0435 \u0437\u0430\u00a0\u044d\u0442\u043e\u2026)) <\/p>\n<p>\u0427\u0442\u043e\u00a0\u0436, \u043d\u0430\u0447\u043d\u0435\u043c\u2026<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u0432\u044b\u0431\u043e\u0440\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u043c \u043f\u0443\u0442\u0435\u043c. \u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442, \u044d\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u0440\u0438\u043a\u0443 (\u0438\u043b\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0438), \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435: \u0442\u043e, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0447\u0435\u0433\u043e, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0441\u0430\u043c\u0430 \u0433\u0438\u043f\u043e\u0442\u0435\u0437\u0430. \u0412\u044b\u0431\u043e\u0440 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u0438\u043f\u0430 \u043c\u0435\u0442\u0440\u0438\u043a\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c. \u041c\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043d\u0430 \u0442\u0440\u0438 \u0442\u0438\u043f\u0430:<\/p>\n<ol>\n<li>\n<p>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 (\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0430\u0432\u043e\u043a \u0438\u043b\u0438 \u0437\u0430\u043a\u0430\u0437\u043e\u0432).<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0438\u043b\u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 (\u043a\u043e\u043d\u0432\u0435\u0440\u0441\u0438\u044f \u0432 \u043f\u043e\u043a\u0443\u043f\u043a\u0443, CTR)<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f (\u0440\u0435\u043d\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u043b\u0438 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u044b\u0445 \u043a\u0430\u0440\u0442\u043e\u0447\u0435\u043a \u043a \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u043f\u043e\u043a\u0443\u043f\u043e\u043a).<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><\/figure>\n<p>\u0421\u00a0\u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0438\u043f\u043e\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u00a0\u2014 \u0441\u0432\u043e\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0410\/\u0411 \u0442\u0435\u0441\u0442\u043e\u0432 \u043f\u0440\u043e\u0432\u043e\u0434\u044f\u0442 \u0441\u00a0\u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c\u0438 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0439, \u0442\u043e \u0441\u00a0\u043d\u0435\u0433\u043e \u0438 \u043d\u0430\u0447\u043d\u0435\u043c, \u043e\u043d\u00a0\u0436\u0435 \u0438 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439.<\/p>\n<h3>\u041f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438 (\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435)<\/h3>\n<p>\u0422\u0443\u0442 \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f\u00a0\u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0439 \u044d\u0442\u043e \u043c\u0435\u0442\u043e\u0434 \u0425\u0438\u2011\u041a\u0432\u0430\u0434\u0440\u0430\u0442. \u041d\u043e\u00a0\u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a\u00a0\u0435\u0433\u043e \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c, \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u0434\u043b\u044f\u00a0\u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0433\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043e\u0434\u0438\u043d \u0438\u0437\u00a0\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u00a0\u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/www.evanmiller.org\/ab-testing\/sample-size.html\">\u044d\u0442\u043e\u0442<\/a> \u0438\u043b\u0438\u00a0\u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 statsmodels.stats \u0447\u0435\u0440\u0435\u0437 python, \u0432\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430:<\/p>\n<pre><code class=\"python\">import statsmodels.stats.api as sms  def sample_size_calculator(baseline_rate, minimum_effect, power=0.8, alpha=0.05):      effect_size = sms.proportion_effectsize(baseline_rate, baseline_rate + minimum_effect)     sample_size = sms.NormalIndPower().solve_power(effect_size, power=power, alpha=alpha, ratio=1)     return sample_size  baseline_rate = 0.10  # \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 10% \u043a\u043e\u043d\u0432\u0435\u0440\u0441\u0438\u044f \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0435 minimum_effect = 0.02 # \u0436\u0435\u043b\u0430\u0435\u043c\u043e \u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 2%)  sample_size = sample_size_calculator(baseline_rate, minimum_effect) print(f'\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b: {sample_size:.0f}')<\/code><\/pre>\n<p>\u0412\u00a0\u043e\u0431\u043e\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u0445 \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043a\u043e\u043d\u0432\u0435\u0440\u0441\u0438\u0438, \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f\u00a0\u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0443\u0440\u043e\u0432\u0435\u043d\u044c a (\u043f\u0440\u043e\u0446\u0435\u043d\u0442 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430 \u043f\u0440\u0438\u00a0\u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e\u00a0\u0435\u0435 \u043d\u0435\u0442) \u0438 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438 (\u043f\u0440\u043e\u0446\u0435\u043d\u0442 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442).<\/p>\n<p>\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u044b\u0431\u043e\u0440\u043a\u0438, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043a\u00a0\u0441\u0430\u043c\u043e\u043c\u0443 \u0442\u0435\u0441\u0442\u0443.<\/p>\n<p>\u041e\u043f\u044f\u0442\u044c\u00a0\u0436\u0435, \u0432\u00a0\u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043f\u043e\u043b\u043d\u043e \u0441\u0430\u0439\u0442\u043e\u0432 \u0441\u00a0\u043e\u043d\u043b\u0430\u0439\u043d\u2011\u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/www.evanmiller.org\/ab-testing\/chi-squared.html\">\u0432\u043e\u0442 \u044d\u0442\u043e\u0442<\/a>. \u0415\u0441\u043b\u0438\u00a0\u0436\u0435 \u0432\u044b \u0440\u0435\u0448\u0438\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0442\u0435\u0441\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f python, \u0442\u043e \u0432\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043a\u0440\u0438\u043f\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<pre><code class=\"python\">import numpy as np import scipy.stats as stats  # \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 group_A = np.array([50, 100]) group_B = np.array([60, 90])  # \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0442\u0435\u0441\u0442 chi2, p, dof, ex = stats.chi2_contingency([group_A, group_B], correction=False)  # \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0439\u0442\u0435 lift \u0438 \u0435\u0433\u043e \u0434\u043e\u0432\u0435\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b p1 = group_B[0] \/ group_B.sum() p2 = group_A[0] \/ group_A.sum()  # \u0420\u0430\u0441\u0447\u0435\u0442 lift lift = p1 \/ p2  # \u0420\u0430\u0441\u0447\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 \u0434\u043b\u044f lift se_p1 = np.sqrt(p1 * (1 - p1) \/ group_B.sum()) se_p2 = np.sqrt(p2 * (1 - p2) \/ group_A.sum()) std_error = lift * np.sqrt((se_p1 \/ p1) ** 2 + (se_p2 \/ p2) ** 2)  # \u0414\u043e\u0432\u0435\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b ci = stats.norm.interval(0.95, loc=lift, scale=std_error)  # \u0412\u044b\u0432\u043e\u0434\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b print(\"\u0425\u0438-\u043a\u0432\u0430\u0434\u0440\u0430\u0442 p-value: \", p) print(\"\u0414\u043e\u0432\u0435\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f (lift): \", ci)  # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0435\u0441\u0442\u044c \u043b\u0438 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 if p &lt; 0.05 and ci[0] > 1:     print(\"\u0412\u0430\u0440\u0438\u0430\u043d\u0442 B \u043b\u0443\u0447\u0448\u0435.\") elif p &lt; 0.05 and ci[1] &lt; 1:     print(\"\u0412\u0430\u0440\u0438\u0430\u043d\u0442 A \u043b\u0443\u0447\u0448\u0435.\") else:     print(\"\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0439 \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u043d\u0435\u0442.\") <\/code><\/pre>\n<figure class=\"full-width\"><\/figure>\n<h3>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435<\/h3>\n<p>\u0412\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u00a0\u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u0430\u0431 \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0441\u00a0\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c\u0438, \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u0442\u0430\u043a\u0438\u0445 \u043c\u0435\u0442\u0440\u0438\u043a \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c: \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0430\u0432\u043e\u043a, \u0434\u043b\u0438\u043d\u0430 \u0441\u0435\u0441\u0441\u0438\u0438 \u0438 \u0442\u0434. \u041f\u0440\u0438\u00a0\u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u0440\u0438\u043a \u0432\u0430\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0441\u0442\u0438. \u0422\u0430\u043a \u043a\u0430\u043a\u00a0\u043c\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u0440\u0430\u043d\u0434\u043e\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0441\u043f\u043b\u0438\u0442\u043e\u0432\u0430\u043d\u0438\u044f, \u0442\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u043c\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0435\u043c\u0441\u044f \u0441\u00a0\u0432\u044b\u0441\u043e\u043a\u0438\u043c \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u0438 (\u0440\u0430\u0437\u043d\u043e\u0441\u0442\u0438) \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e\u00a0\u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u043e \u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430\u00a0\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c CUPED (Controlled pre\u2011post experimental design)\u00a0\u2014 \u044d\u0442\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0441\u0435 \u0447\u0430\u0449\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u00a0\u0410\/\u0411 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u043b\u044f\u00a0\u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432.<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043d\u0438\u0432\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u0438, \u0441\u0435\u0437\u043e\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\u043e\u0432\u044b\u0435 \u0430\u043a\u0446\u0438\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u0430\u043a\u0442\u043e\u0440\u044b. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e\u00a0\u043c\u0435\u0442\u043e\u0434 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/medium.com\/statistics-experiments\/cuped-%D0%B8%D0%BB%D0%B8-%D1%83%D0%B2%D0%B5%D0%BB%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D1%87%D1%83%D0%B2%D1%81%D1%82%D0%B2%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8-%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D0%BA%D0%B8-de7183fc964c\">\u0442\u0443\u0442<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/www.exp-platform.com\/Documents\/2013-02-CUPED-ImprovingSensitivityOfControlledExperiments.pdf\">\u0432\u00a0\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c cuped, \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u043d\u0430\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a \u0432\u00a0\u043f\u0440\u0435\u0434\u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u0435\u0440\u0438\u043e\u0434 \u0438 \u0441\u0430\u043c\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u00a0\u043c\u043e\u043c\u0435\u043d\u0442 \u0442\u0435\u0441\u0442\u0430. \u0414\u043b\u044f\u00a0\u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043a\u0440\u0438\u043f\u0442\u0430:<\/p>\n<pre><code class=\"python\"># \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0438 \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u044e \u043f\u0440\u0435\u0434\u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 mean_pre_test = df['pre_test_metric'].mean() var_pre_test = df['pre_test_metric'].var()  # \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u0446\u0438\u044e \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u0435\u0434\u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u043c\u0435\u0442\u0440\u0438\u043a\u043e\u0439 cov = df[['pre_test_metric', 'test_metric']].cov().iloc[0, 1]  # \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 theta theta = cov \/ var_pre_test  # \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c CUPED df['cuped_metric'] = df['test_metric'] - theta * (df['pre_test_metric'] - mean_pre_test)<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u00a0\u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435, \u0441\u0442\u043e\u0438\u0442 \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u044b\u0431\u043e\u0440\u043a\u0438, \u0442\u0443\u0442 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b\u0431\u043e\u0440\u043a\u0430 \u0431\u043e\u043b\u044c\u0448\u0430\u044f\u2026<\/p>\n<p>\u0422\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430\u00a0\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u00a0\u0446\u0435\u043b\u043e\u043c \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0442 \u044d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0442\u0435\u0441\u0442 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Shapiro%E2%80%93Wilk_test\">\u0428\u0430\u043f\u0438\u0440\u043e\u2011\u0423\u0438\u043b\u043a\u0430<\/a>, \u043e\u043d \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0432\u00a0\u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u0440\u043e\u043c\u0435 \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0432\u044b\u0431\u043e\u0440\u043e\u043a, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043a \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f\u043c \u043e\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438:<\/p>\n<pre><code class=\"python\">import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy.stats import shapiro, norm  # \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 data = pd.read_csv('adjusted_experiment_data.csv') # \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f 'metric' metric_data = data['metric']  # \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0442\u0435\u0441\u0442 \u0428\u0430\u043f\u0438\u0440\u043e-\u0423\u0438\u043b\u043a\u0430 stat, p = shapiro(metric_data)  alpha = 0.05 if p > alpha:     print(\"\u041d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435.\") else:     print(\"\u041d\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435.\")  # \u0413\u0440\u0430\u0444\u0438\u043a \u0441 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c fig, ax = plt.subplots() ax.hist(metric_data, bins=30, density=True, alpha=0.5, label='Data')  # \u0418\u0437\u043c\u0435\u043d\u0438\u043b bins \u043d\u0430 30 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0430  mu, std = norm.fit(metric_data) xmin, xmax = ax.get_xlim() x = np.linspace(xmin, xmax, 100) p = norm.pdf(x, mu, std) ax.plot(x, p, 'k', linewidth=2, label='Normal distribution') ax.legend() plt.show() <\/code><\/pre>\n<p>\u0418\u0442\u0430\u043a, \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u043c, \u0447\u0442\u043e\u00a0\u0436\u0435 \u0434\u0430\u043b\u044c\u0448\u0435..<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0441\u0430\u043c\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0433\u0438\u043f\u043e\u0442\u0435\u0437\u044b, \u0430\u00a0\u0438\u043c\u0435\u043d\u043d\u043e t\u2011test, \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u2011\u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439 \u0441\u0442\u044a\u044e\u0434\u0435\u043d\u0442\u0430, \u043e\u043d \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442, \u0435\u0441\u043b\u0438\u00a0\u0436\u0435 \u043c\u0435\u0436\u0434\u0443 \u0433\u0440\u0443\u043f\u043f\u0430\u043c\u0438 \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u043d\u0435\u0440\u0430\u0432\u043d\u0430\u044f \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u044f, \u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0442\u2011\u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439 \u0423\u044d\u043b\u0447\u0430, \u0432\u00a0\u0446\u0435\u043b\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u043d\u043e\u00a0\u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u0441\u00a0\u043c\u0435\u043d\u044c\u0448\u0438\u043c \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0441\u0442\u0438. \u041e\u0431\u0430 \u0442\u0435\u0441\u0442\u0430 \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 scipy.stats, \u0432\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u043e\u0432:<\/p>\n<pre><code class=\"python\">import pandas as pd import scipy.stats as stats  data = pd.read_csv('adjusted_experiment_data.csv')  control = data[data['group_type'] == 'control']['experiment_data'] test = data[data['group_type'] == 'test']['experiment_data']  # \u0442-\u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439 \u0423\u044d\u043b\u0447\u0430 welch_t, welch_p = stats.ttest_ind(control, test, equal_var=False)  # \u0442-\u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439 \u0421\u0442\u044a\u044e\u0434\u0435\u043d\u0442\u0430 student_t, student_p = stats.ttest_ind(control, test, equal_var=True)   print(\"Welch's t-test:\") print(\"t-statistic: \", welch_t) print(\"p-value: \", welch_p)  print(\"\\nStudent's t-test:\") print(\"t-statistic: \", student_t) print(\"p-value: \", student_p)<\/code><\/pre>\n<p>\u0427\u0442\u043e\u00a0\u0434\u0435\u043b\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439, \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c, \u043d\u043e\u00a0\u0431\u044b\u0432\u0430\u0435\u0442, \u043a\u043e\u0433\u0434\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u043e \u0438\u043b\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435, \u0442\u0443\u0442 \u043d\u0430\u00a0\u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 bootstrap. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f bootstrap \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0435 \u0441\u00a0\u0437\u0430\u043c\u0435\u043d\u043e\u0439 \u0438\u0437\u00a0\u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u00ab\u0432\u044b\u0431\u043e\u0440\u043e\u043a\u00bb. \u041a\u0430\u0436\u0434\u0430\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0430 \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430\u00a0\u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0432\u044b\u0431\u043e\u0440\u043a\u0443, \u043d\u043e\u00a0\u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437\u2011\u0437\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u0432\u00a0\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u0430\u00a0\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">import numpy as np import pandas as pd from scipy.stats import mannwhitneyu from scipy.stats import ttest_ind from scipy.stats import norm import matplotlib.pyplot as plt import seaborn as sns  from tqdm.auto import tqdm import seaborn as sns  plt.style.use('ggplot') def get_bootstrap(     data_column_1, # \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0438     data_column_2, # \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0438     boot_it = 1000, # \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0443\u0442\u0441\u0442\u0440\u044d\u043f-\u043f\u043e\u0434\u0432\u044b\u0431\u043e\u0440\u043e\u043a     statistic = np.mean, # \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0430\u044f \u043d\u0430\u0441 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430     bootstrap_conf_level = 0.95 # \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0441\u0442\u0438 ):     boot_len = max([len(data_column_1), len(data_column_2)])     boot_data = []     for i in tqdm(range(boot_it)): # \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u043f\u043e\u0434\u0432\u044b\u0431\u043e\u0440\u043a\u0438         samples_1 = data_column_1.sample(             boot_len,              replace = True # \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f         ).values                  samples_2 = data_column_2.sample(             boot_len, # \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u044e, \u0431\u0435\u0440\u0435\u043c \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u044b\u0431\u043e\u0440\u043a\u0438             replace = True         ).values      <\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-392714","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/392714","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=392714"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/392714\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=392714"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=392714"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=392714"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}