AB測試初探

什麼是AB測試?

AB測試的概念來源於生物醫學的雙盲測試,雙盲測試中病人被隨機分成兩組,在不知情的情況下分別給予安慰劑和測試用藥,經過一段時間的實驗後再來比較這兩組病人的表現是否具有顯著的差異,從而決定測試用藥是否有效。互聯網公司的AB測試也採用了類似的概念:將Web或App界面或流程的兩個或多個版本,在同一時間維度,分別讓兩個或多個屬性或組成成分相同(相似)的訪客羣組訪問,收集各羣組的用戶體驗數據和業務數據,最後分析評估出最好版本正式採用。

AB測試的基本步驟

AB測試是一個反覆迭代優化的過程,它的基本步驟如下圖所示可以劃分爲:
1. 設定項目目標即AB測試的目標

  1. 設計優化的迭代開發方案,完成新模塊的開發

  2. 確定實施的版本以及每個線上測試版本的分流比例

  3. 按照分流比例開放線上流量進行測試

  4. 收集實驗數據進行有效性和效果判斷

  5. 根據試驗結果確定發佈新版本、調整分流比例繼續測試或者在試驗效果未達成的情況下繼續優化迭代方案重新開發上線試驗


本文只討論AB測試的分流部分,一種分流算法

兩個前提
  • 不考慮灰度
  • 開啓AB測試後單個用戶每次進入頁面看到的內容相同

思路

  1. 如何才能保證分流的更準確,隨機數是一個不錯的思路,但差異性過大,當流量巨大時誤差率<1%,由於基數過大,誤差值就會很大
  2. 將流量分爲100份,每個頁面按照配置比例佔用對應的份數,實際上就是一個長度爲100的數組,然後再將數組打亂,這樣理論上最大誤差值爲佔比例最大的頁面所佔份數(因爲做了打亂操作,實際誤差值會比這個值低),例如:三個頁面的比例:60%,30%,10%,則最大誤差值爲60。當流量過小時,這個誤差值就不容忽視了。

表面上看,第二種方案更好一些,因爲流量太小時AB測試是沒有意義的,偶然因素太大會導致分析數據能反映的問題有限。

當我們單純的考慮分流算法時,作爲一個有追求的公司,這種誤差也是不允許的,所以我們想出了第三種方案:

基於第二種方案,求每個頁面所佔份數的最大公約數,然後讓份數除以最大公約數,得到一個長度更小的數組,然後再做打亂操作,這樣理論上最大誤差值爲佔比例最大的頁面所佔份數, 例如:三個頁面的比例:60%,30%,10%,則最大誤差值爲6。

實現步驟

  1. 求出參與AB測試的頁面的配置比例的最大公約數
    const computeGreatestCommonDivisor = (numberArray) => {
      numberArray = _.compact(numberArray);
      const length = numberArray.length;
      let greatestComomonDivisor = parseInt(numberArray[0]) || 1;
      if (length < 2) {
        return greatestComomonDivisor;
      }
      for (let i = 1; i < length; i++) {
        let tempNumber = parseInt(numberArray[i]);
        if (!tempNumber) continue;
        while (tempNumber !== 0) { // 歐幾里得最大公約數算法
          const remiander = greatestComomonDivisor % tempNumber;
          greatestComomonDivisor = tempNumber;
          tempNumber = remiander;
        }
      }
      return greatestComomonDivisor;
    }
  1. 創建一個空數組array,將每個比例除以最大公約數得到份數,放入對應份數的該頁面的唯一標識,
  2. 數組長度爲arrayLength,將數組打亂,存入redis
  3. 當用戶訪問時爲用戶生成一個本次AB測試的唯一數值index(從0開始遞增),用index對arrayLength取餘remainder, 保存index到redis
  4. 用這個remainder作爲索引從array中取值,array[remainder], 這個值就是用戶訪問到的頁面,這樣每個用戶按照訪問順序,順序的從數組中取值,當用戶在此訪問時取出index值做相同操作
幾點補充
  • 每組AB測試都需要爲用戶維護一套用戶索引數據結構,在AB測試開啓時重置
  • 求最大公約數,初始化數組,打亂操作都是在初始化AB測試時進行的,不會影響後續的分流操作的性能
  • 收集數據、分析等工作不在本文討論範圍內
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章