数据分析之AB testing实战(附Python代码)
大家如果對文章中的數據有需求,請關注公眾號:【數據分析與統計學之美】,回復關鍵詞:【ab測試】!
目錄
??1、增長黑客
???1)前言
???2)運用分析指標框架,驅動互聯網產品和運營
???3)增長黑客大致分為如下幾個步驟
??2、AB testing介紹
???1)AB testing對比方案圖示展示
???2)什么是反饋呢?
???3)如何選取這樣一批小流量用戶呢?
???4)到底什么是AB testing?
???5)如何做AB testing?
?????① 在產品正式迭代發版之前,為同一個目標制定兩個(或以上)方案
?????② 將用戶流量對應分成幾組,在保證每組用戶特征相同的前提下,讓用戶分別看到不同的方案設計
?????③ 根據幾組用戶的真實數據反饋,科學的幫助產品進行決策
??3、AB testing實戰
???1)AB testing的統計學基礎(獨立雙樣本的假設檢驗)
???2)AB testing演示的python代碼
???3)AB testing拓展
1、增長黑客
1)前言
??說到AB testing,就不得不說到增長黑客,這個詞大約在2015年就引入到中國了,但是在2018年開始火熱起來。那么互聯網公司想要增加活躍用戶、增加收入,現在的產品運營還是采用增長黑客這樣一種運營方式,并不是產品經理一拍腦袋就可以想到,或者老板直接拍板決定就可以做到的。大家現在的玩兒法都是“數據驅動”,使用數據驅動方式來幫助運營更好的產品。那什么是“增長黑客”呢?通俗的說就是“樹挪死,人挪活”,互聯網公司想要成長,想要變成一個巨頭,也需要挪一挪、變一變,不斷變換自己的產品,升級自己的產品,否則將會在這樣一個弱肉強食、競爭激烈的生態中,被干掉。我們有時候會覺得互聯網公司就是【融資、燒錢、拉新、融資、燒錢、拉新…上市(倒閉)】這樣一個流程,運氣好的話就上市了,運氣不好的話就倒閉了。但其實很多互聯網公司內部,即使是燒錢,燒錢的方式也是有很多講究的,并不是老板、產品經理或某個總監拍頭決策的。
2)運用分析指標框架,驅動互聯網產品和運營
??具體可以看看,增長黑客,怎么運用分析指標框架,驅動互聯網產品和運營?現在分享一個鏈接,供大家了解:http://www.woshipm.com/data-analysis/439849.html
??整個互聯網內部,無論是產品、營銷、銷售等,現在基本都是采用“數據驅動”這樣一個方式來進行運作的,這也就是“數據分析行業”在最近幾年為什么這么火熱的原因。“增長黑客”很多人用AARRR去總結了一下,如上圖所示,下面我們來對上圖做一個文字說明。
??首選是“獲取用戶”(Acquisition),怎么樣使用一種比較高效的方式(APP、網站、百度或淘寶買一些廣告、)來獲取到用戶,增加用戶數。接著是“增加活躍”(Activation),對于獲取到的用戶,怎么去激活他們,使得他們變得活躍。然后是“提高留存”(Retention),我好不容易通過各種渠道,將用戶拉到我的產品中,怎么讓他們成為我們這個產品的忠實用戶。再接著就是“實現收益”(Revenue),公司運營需要生存,就必須要賺錢獲取收益,那么怎么樣獲取更多的收益?是訂閱更多的VIP用戶,還是賣給用戶更多的產品或者廣告來獲取收益?最后一個是“裂變傳播”(Referral),如果我們前面的過程做的好的話,用戶是不是會幫助我們做裂變傳播,他們自己會口口相傳(微信、朋友圈等),幫助我們做宣傳,幫助我們拓展更多的用戶。
??這樣上述幾個部分就形成了一個良好的閉環,不斷地去良性的發展。
3)增長黑客大致分為如下幾個步驟
??首先是“分析現狀”,分析現在的產品有哪些問題?在哪方面可以提高?
??然后是“設置目標”,你想干什么?像愛奇藝、騰訊視頻等,就是想增加VIP的數量;像淘寶的話,如何更多地增加廣告收入;像抖音地話,如何增加日活,怎么樣讓用戶每天不停地去刷抖音,這樣我會有更多的廣告,更多的活躍用戶數,更多的收入。
??接著是“提出改進方案”,提出方案后,是不是你的方案就是最優的呢?其實并不是,這就是下面所說的需要進行“小規模測試”。
??再接著是“開始小規模測試”,拿出一部分測試用戶,讓他們去看是否滿意,是不是反饋的比較好。怎么知道反饋的好不好呢?就是下面要說的采集分析。
??再接著是“采集分析”,對測試用戶得到的數據進行數據分析,如果反饋效果好,就調整流量,不斷擴大規模去測試。如果反饋效果不好,就停止或者是修改方案(回到前面的步驟),這是一個反復迭代的過程,這個過程也就是“AB testing”。
??“AB testing”就是來幫助我們,通過數據分析的方式,來優化增長黑客這樣一個流程,使用數據驅動的方式,來幫助分析我們的產品,分析我們的用戶反饋。
2、AB testing介紹
1)AB testing對比方案圖示展示
圖示一:天貓兩個網頁的改版
圖示二:微信兩個版本的改版
??產品經理改了一個新的版本,那它到底好不好呢?可不可以一拍腦袋說,覺得哪個好就用哪個呢?萬一反饋不是很好,萬一下降了活躍用戶數量,減少了用戶收入,其實對于大公司來說,都是巨大的損失,誰都承擔不起。所以需要使用像AB testing這樣數據分析的方式,去把這個風險降到最低。還有一個例子就是Facebook,他們有一個級別非常高的高管,推動他們的產品,覺得某個產品這么好、那么好,所有Facebook產品的發布和版本的迭代都需要使用AB testing,小范圍用戶測試的時候,如果發現用戶反饋不好,變得不怎么活躍了,覺得非常難用了,即使這個高管再推動呢,也是不行的,必須使用數據說話,這個產品不好,就放棄這個版本,去研發下一個版本或者尋找另外的突破口。這個東西在國內的好多公司基本都是這么玩兒的,比如說上述微信1.0版本和微信2.0版本,也不是說隨隨便便拍拍腦袋就發給大家使用的,其實也是運用AB testing,很多時候讓大家看到不同的頁面,找到一部分小流量用戶,幫助我們去測試,看看他們的反饋。
2)什么是反饋呢?
??上面很多次我們都提到了“用戶反饋”,那么什么是“反饋”呢?其實就是這部分用戶的使用時長呀,產生的收益呀,像百度這樣的廣告(他有沒有點廣告呀),像愛奇藝這樣的付費網站(他有沒有從一個普通用戶變為一個VIP用戶呀),這些指標等都可以驗證你新的版本是不是好。
3)如何選取這樣一批小流量用戶呢?
??最重的就是隨機性。我們不能僅僅選擇深圳市的某個地方的一些用戶,作為測試用戶。我們也不能僅僅選擇年齡在25-30這樣的限定范圍的一些用戶,作為測試用戶。應該是在你的用戶中隨機抽取比如說1%的用戶,作為小流量用戶去進行版本測試,看看他們的反饋。如果反饋好,我們考慮擴大流量用戶,抽取2%、5%、10%、20%、50%甚至是100%。如果反饋不好,我們選擇是終止此次實驗,尋找新的突破口,還是選擇改進自己的版本。
4)到底什么是AB testing?
??簡單地說:確定兩個元素或版本(A和B)哪個版本更好!
5)如何做AB testing?
① 在產品正式迭代發版之前,為同一個目標制定兩個(或以上)方案;
- 提出想法,設定假設;
- 預估成本,設定優先級;
- 設計方案;
??日常中我們總在說AB testing,做的是兩個版本的對比,其實也可以是ABCD testing,四個版本的對比,只不過實際中我們做得更多的就是AB testing。再有一個,就是預估成本,這個是很有必要的,如果你切了50%的流量(或者更大的流量),將你的新版本上線跑了一周,假如情況非常糟糕,對于大公司來說,可能損失幾個億,或者是幾十個億,因此再進行實驗之前,一定要好好預算一下,你究竟可以承擔多大的風險,最后在設定你的方案。
② 將用戶流量對應分成幾組,在保證每組用戶特征相同的前提下,讓用戶分別看到不同的方案設計;
??注意幾個術語,這個在后面的實戰代碼中有用。在做AB testing的時候,一般分為control組和treatment組,其中control組看到的是老頁面(old page),treatment組看到的是新頁面(new page)。
③ 根據幾組用戶的真實數據反饋,科學的幫助產品進行決策;
??通過分析用戶使用的日志數據,來決定是擴大實驗,還是繼續修改方案,重新迭代。如果判定實驗成功,則擴大實驗范圍。如果判定實驗失敗,終止本次實驗,繼續修改方案
3、AB testing實戰
1)AB testing的統計學基礎(獨立雙樣本的假設檢驗)
??關于假設檢驗這個知識點,我在前面的文章中已經詳細介紹過,這里就不一一說明,截取了幾張圖片供大家參考,大家如果感興趣,可以看一下這篇文章:https://blog.csdn.net/weixin_41261833/article/details/104623377
① ab testing
② 假設檢驗
③ 顯著性水平
④ 統計量
2)AB testing演示的python代碼
??再進行代碼演示之前,我們先對每個字段做一個說明:user_id是用戶的id;timestamp 是用戶訪問頁面的時間;group 表示把新的落地頁分到treatment組、把舊的落地頁分到了control組;landing_page表示的是落地頁;converted 表示的是否轉化,1表示轉化(通俗的說:拿愛奇藝會員來說,普通用戶是否轉換為了VIP用戶,1表示轉換了,0表示未轉換);
import pandas as pd --------------------------------------------------------- # 讀取數據,查看前5行 df = pd.read_csv("ab_test.csv") df.head() --------------------------------------------------------- # 數據預覽,查看數據有多少行、多少列 df.shape --------------------------------------------------------- # 查看數據中是否有空值 df.isnull().any() df.info() --------------------------------------------------------- # 查看數據中的錯誤行 print((True) != (True)) print((True) != (False)) print((False) != (True)) print((False) != (False)) """ true != true fasle treatment new_page true != false true treatment old_page false != true true control new_page false != false false control old_page """ # 下面這句代碼,展示的就是group=treatment且landing_page=old_page和group=control且landing_page=new_page,這樣的錯誤行; num_error = df[((df.group == "treatment")!=(df.landing_page == "new_page"))].shape[0] num_error --------------------------------------------------------- # 去掉錯誤行后,再次查看是否還存在錯誤行 print("沒有刪除錯誤行之前的記錄數:", df.shape[0]) df2 = df[~((df.landing_page == "new_page")&(df.group == "control"))] df3 = df2[~((df2.landing_page == "old_page")&(df2.group == "treatment"))] print("刪除錯誤行之后的記錄數:", df3.shape[0]) print("錯誤行共有",str(df.shape[0]-df3.shape[0]),"條記錄") num_error2 = df3[((df3.group == "treatment")!=(df3.landing_page == "new_page"))].shape[0] num_error2 --------------------------------------------------------- # 查看是否有重復行 print("數據的記錄數為:", df3.user_id.shape[0]) print("將user_id去重計數后的記錄數為:", df3.user_id.nunique()) """ 通過上述分析,可以看出:user_id中有一條記錄數是重復的。接下來,我們可以找出這條重復的記錄,并去重。 """ --------------------------------------------------------- # 查看重復的行 df3[df3.user_id.duplicated(keep=False)] # 去除重復的行 df4 = df3.drop_duplicates(subset=["user_id"],keep="first") df4.shape[0] --------------------------------------------------------- # 我們來看一下control組的轉化率 control_converted = df4.query('group=="control"').converted.mean() control_converted # 再來看一下treatment組的轉化率 treatment_converted = df4.query('group=="treatment"').converted.mean() treatment_converted """ 自己下去思考一下:根據上述結果,老頁面的轉化率比新頁面的轉換率好,是不是就可以說明老頁面好呢? """ --------------------------------------------------------- # 進行獨立兩樣本的假設檢驗 import statsmodels.stats.proportion as sspconverted_old = df4[df4.landing_page == "old_page"].converted.sum() converted_new = df4[df4.landing_page == "new_page"].converted.sum() n_old = len(df4[df4.landing_page == "old_page"]) n_new = len(df4[df4.landing_page == "new_page"]) data = pd.DataFrame({"converted":[converted_old, converted_new],"total":[n_old ,n_new]}) display(data) z_score, p_value = ssp.proportions_ztest(count=data.converted, nobs=data.total, alternative="smaller") print("Z值為:", z_score) print("P值為:", p_value) ---------------------------------------------------------結果如下:
結果分析:通過上述的結果發現,P值為0.9,遠大于0.05,也就是說,我們沒有理由拒絕原假設,即只能接受原假設,也就是新老版本之間沒有太大的差別。我們接下來要做的就是終止這次試驗,繼續優化自身的方案。
3)AB testing拓展
??關于AB testing的相關知識,我們就簡單說到這里,下面再次提供幾個鏈接供大家參考學習:http://m.blog.itpub.net/31555699/viewspace-2653832/ ,https://www.jianshu.com/p/61e6c34d0704
總結
以上是生活随笔為你收集整理的数据分析之AB testing实战(附Python代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 海威超市播音易源码+成品
- 下一篇: Ubuntu 经验 —— Fcitx专题