使用 A/B 測試創建消息傳遞實驗

當您接觸用戶或開始新的行銷活動時,您需要確保做得正確。 A/B 測試可以透過測試用戶群的選定部分的訊息變體來幫助您找到最佳的措辭和演示。無論您的目標是提高商品保留率還是轉換率,A/B 測試都可以執行統計分析,以確定訊息變體是否優於您所選目標的基準。

若要使用基線對功能變體進行 A/B 測試,請執行以下操作:

  1. 創建你的實驗。
  2. 在測試設備上驗證您的實驗。
  3. 管理您的實驗。

創建一個實驗

使用通知編輯器的實驗可讓您評估單一通知訊息的多個變體。

  1. 登入Firebase 控制台並驗證您的專案中是否啟用了 Google Analytics(分析),以便實驗能夠存取 Analytics 資料。

    如果您在建立專案時未啟用 Google Analytics,則可以在「整合」標籤上啟用它,您可以使用Firebase 控制台中的 > 「專案設定」來存取該標籤。

  2. Firebase 控制台導覽列的Engage部分中,按一下A/B 測試

  3. 按一下「建立實驗」 ,然後在提示您選擇要實驗的服務時選擇「通知」

  4. 輸入實驗的名稱和可選說明,然後按一下「下一步」

  5. 填寫“定位”字段,首先選擇使用您的實驗的應用程式。您也可以透過選擇包含以下內容的選項來定位一部分使用者參與您的實驗:

    • 版本:您的應用程式的一個或多個版本
    • 使用者受眾:用於定位可能包含在實驗中的使用者的分析受眾
    • 使用者屬性:一個或多個 Analytics 使用者屬性,用於選擇可能包含在實驗中的用戶
    • 國家/地區:一個或多個國家或地區,用於選擇可能參與實驗的用戶
    • 設備語言:用於選擇可能包含在實驗中的使用者的一種或多種語言和區域設置
    • 首次開啟:根據用戶第一次開啟您的應用程式的時間來定位用戶
    • 上次應用程式互動:根據用戶上次與您的應用程式互動的時間來定位用戶
  6. 設定目標使用者的百分比:選擇與目標使用者下設定的條件相符的應用程式使用者群的百分比,您希望在實驗中將其平均分配到基準和一個或多個變體中。該百分比可以是 0.01% 到 100% 之間的任意百分比。每個實驗(包括重複實驗)的百分比會隨機重新分配給使用者。

  7. 「變體」部分的「輸入訊息」文字欄位中鍵入要傳送到基線群組的訊息。若要不向基準組傳送訊息,請將此欄位留空。

  8. (可選)若要為實驗中新增多個變體,請點選「新增變體」 。預設情況下,實驗有一個基線和一個變體。

  9. (可選)為實驗中的每個變體輸入名稱,以替換名稱Variant AVariant B等。

  10. 為您的實驗定義一個目標指標,以便在評估實驗變體時使用,並從下拉清單中定義任何所需的其他指標。這些指標包括內建目標(參與度、購買量、收入、留任率等)、Analytics 轉換事件和其他 Analytics 事件。

  11. 選擇您的訊息的選項:

    • 交貨日期:選擇「立即發送」以在儲存後立即啟動實驗,或選擇「計畫」指定將來啟動實驗的時間。
    • 進階選項:若要為實驗中包含的所有通知選擇進階選項,請展開進階選項,然後變更任何列出的訊息選項。
  12. 點擊“查看”以保存您的實驗。

每個專案最多允許進行 300 個實驗,其中最多可包含 24 個正在運行的實驗,其餘為草稿或已完成。

在測試設備上驗證您的實驗

對於每個 Firebase 安裝,您可以檢索與其關聯的 FCM 註冊令牌。您可以使用此令牌在安裝了應用程式的測試設備上測試特定的實驗變體。若要在測試設備上驗證您的實驗,請執行以下操作:

  1. 取得 FCM 註冊令牌如下:

    迅速

    Messaging.messaging().token { token, error in
      if let error = error {
        print("Error fetching FCM registration token: \(error)")
      } else if let token = token {
        print("FCM registration token: \(token)")
        self.fcmRegTokenMessage.text  = "Remote FCM registration token: \(token)"
      }
    }
    

    Objective-C

    [[FIRMessaging messaging] tokenWithCompletion:^(NSString *token, NSError *error) {
      if (error != nil) {
        NSLog(@"Error getting FCM registration token: %@", error);
      } else {
        NSLog(@"FCM registration token: %@", token);
        self.fcmRegTokenMessage.text = token;
      }
    }];
    

    Java

    FirebaseMessaging.getInstance().getToken()
        .addOnCompleteListener(new OnCompleteListener<String>() {
            @Override
            public void onComplete(@NonNull Task<String> task) {
              if (!task.isSuccessful()) {
                Log.w(TAG, "Fetching FCM registration token failed", task.getException());
                return;
              }
    
              // Get new FCM registration token
              String token = task.getResult();
    
              // Log and toast
              String msg = getString(R.string.msg_token_fmt, token);
              Log.d(TAG, msg);
              Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
        });

    Kotlin+KTX

    FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
        if (!task.isSuccessful) {
            Log.w(TAG, "Fetching FCM registration token failed", task.exception)
            return@OnCompleteListener
        }
    
        // Get new FCM registration token
        val token = task.result
    
        // Log and toast
        val msg = getString(R.string.msg_token_fmt, token)
        Log.d(TAG, msg)
        Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
    })

    C++

    firebase::InitResult init_result;
    auto* installations_object = firebase::installations::Installations::GetInstance(
        firebase::App::GetInstance(), &init_result);
    installations_object->GetToken().OnCompletion(
        [](const firebase::Future& future) {
          if (future.status() == kFutureStatusComplete &&
              future.error() == firebase::installations::kErrorNone) {
            printf("Installations Auth Token %s\n", future.result()->c_str());
          }
        });
        

    Unity

    Firebase.Messaging.FirebaseMessaging.DefaultInstance.GetTokenAsync().ContinueWith(
      task => {
        if (!(task.IsCanceled || task.IsFaulted) && task.IsCompleted) {
          UnityEngine.Debug.Log(System.String.Format("FCM registration token {0}", task.Result));
        }
      });
    
  2. Firebase 控制台導覽列上,按一下A/B 測試
  3. 點擊草稿,將滑鼠懸停在您的實驗上,點擊上下文選單 ( ),然後點擊管理測試設備
  4. 輸入測試設備的 FCM 令牌,然後選擇要傳送到該測試設備的實驗變體。
  5. 運行應用程式並確認測試設備正在接收所選變體。

管理您的實驗

無論您是使用遠端設定、通知編輯器或 Firebase 應用程式內訊息建立實驗,您都可以驗證並啟動實驗、在實驗執行時間監控實驗,並增加正在執行的實驗中包含的使用者數量。

實驗完成後,您可以記下獲勝變體使用的設置,然後將這些設置推廣給所有用戶。或者,您可以進行另一個實驗。

開始實驗

  1. Firebase 控制台導覽選單的Engage部分中,按一下A/B 測試
  2. 按一下草稿,然後按一下實驗的標題。
  3. 若要驗證您的應用程式是否包含將包含在您的實驗中的用戶,請展開草稿詳細資訊並在「定位和分發」部分中檢查是否有大於0%的數字(例如, 1% 的用戶符合資格)。
  4. 若要更改您的實驗,請按一下“編輯”
  5. 要開始實驗,請按一下“開始實驗” 。每個項目一次最多可以運行 24 個實驗。

監控實驗

實驗運行一段時間後,您可以檢查其進度,並查看迄今為止參與實驗的使用者的結果。

  1. Firebase 控制台導覽選單的Engage部分中,按一下A/B 測試
  2. 按一下「執行」 ,然後按一下或搜尋實驗的標題。在此頁面上,您可以查看有關正在運行的實驗的各種觀察到的和建模的統計數據,包括以下內容:

    • 與基線的差異百分比:與基線相比,給定變異體的指標改善的衡量。透過將變異體的值範圍與基線的值範圍進行比較來計算。
    • 擊敗基線的機率:給定變體擊敗所選指標的基線的估計機率。
    • observed_metric per user :根據實驗結果,這是指標值隨著時間的推移將落入的預測範圍。
    • Total observed_metric :基線或變異的觀察累積值。該值用於衡量每個實驗變體的執行情況,並用於計算改進值範圍擊敗基線的機率成為最佳變體的機率。根據測量的指標,此列可能被標記為「每個用戶的持續時間」、「每個用戶的收入」、「保留率」或「轉換率」。
  3. 在您的實驗運行一段時間後(FCM 和應用程式內訊息傳遞至少 7 天,遠端配置至少 14 天),此頁面上的資料會指示哪個變體(如果有)是「領先者」。有些測量結果附有長條圖,以視覺化格式呈現資料。

向所有用戶推出實驗

當實驗運行足夠長的時間,您的目標指標有了「領先者」或獲勝變體後,您可以向 100% 的用戶發布該實驗。這使您可以選擇要發佈給所有使用者的變體。即使您的實驗沒有產生明顯的勝利者,您仍然可以選擇向所有用戶發布變體。

  1. Firebase 控制台導覽選單的Engage部分中,按一下A/B 測試
  2. 按一下「已完成」「正在運行」 ,按一下要發佈給所有使用者的實驗,按一下上下文功能表 ( )以推出變體
  3. 透過執行以下操作之一向所有使用者推出您的實驗:

    • 對於使用通知編輯器的實驗,請使用轉出訊息對話方塊將訊息傳送給未參與實驗的其餘目標使用者。
    • 對於遠端配置實驗,選擇一個變體以決定要更新哪些遠端配置參數值。建立實驗時定義的定位條件將作為新條件新增至模板中,以確保推出僅影響實驗所定位的使用者。按一下「遠端配置」中的「檢視」以查看變更後,按一下「發布變更」以完成部署。
    • 對於應用程式內訊息傳遞實驗,使用該對話方塊來確定需要將哪個變體作為獨立的應用程式內訊息傳遞活動推出。選擇後,您將被重定向到 FIAM 撰寫螢幕,以便在發布之前進行任何更改(如果需要)。

展開實驗

如果您發現某個實驗沒有為 A/B 測試帶來足夠的用戶來宣布領先者,則可以增加實驗的分發範圍,以覆蓋應用程式用戶群的更大比例。

  1. Firebase 控制台導覽選單的Engage部分中,按一下A/B 測試
  2. 選擇您要編輯的正在執行的實驗。
  3. 實驗概述中,按一下上下文功能表 ( ),然後按一下編輯正在執行的實驗
  4. 「目標」對話方塊顯示一個選項,用於增加正在運行的實驗中的使用者百分比。選擇一個大於目前百分比的數字,然後按一下「發布」 。實驗將推送至您指定的使用者百分比。

重複或停止實驗

  1. Firebase 控制台導覽選單的Engage部分中,按一下A/B 測試
  2. 按一下「已完成」或「正在運行」 ,將指標停留在實驗上,按一下上下文功能表 ( ),然後按一下「複製實驗」「停止實驗」

使用者定位

您可以使用以下使用者定位條件來定位要包含在實驗中的使用者。

目標標準操作員筆記
版本包含,
不含,
完全匹配,
包含正規表示式
輸入您想要包含在實驗中的一個或多個應用程式版本的值。

當使用任何包含不包含完全符合運算子時,您可以提供以逗號分隔的值清單。

使用contains 正規表示式運算子時,您可以建立RE2格式的正規表示式。您的正規表示式可以符合全部或部分目標版本字串。您也可以使用^$錨點來匹配目標字串的開頭、結尾或整個。

使用者受眾包括所有,
至少包括以下之一,
不包括全部,
不包括至少一項
選擇一個或多個 Analytics 受眾群體來定位可能包含在您的實驗中的使用者。一些針對 Google Analytics(分析)受眾群體的實驗可能需要幾天的時間來累積數據,因為它們會受到 Analytics(分析)數據處理延遲的影響。新用戶最有可能遇到這種延遲,這些新用戶通常會在創建後 24-48 小時內註冊到合格受眾群體中,或是最近創建的受眾群體
使用者屬性對於文字:
包含,
不含,
完全匹配,
包含正規表示式

對於數字:
<、≤、=、≥、>
Analytics 使用者屬性用於選擇可能包含在實驗中的用戶,並提供一系列用於選擇使用者屬性值的選項。

在用戶端上,您只能設定使用者屬性的字串值。對於使用數位運算子的條件,遠端配置服務會將對應使用者屬性的值轉換為整數/浮點型。
使用contains 正規表示式運算子時,您可以建立RE2格式的正規表示式。您的正規表示式可以符合全部或部分目標版本字串。您也可以使用^$錨點來匹配目標字串的開頭、結尾或整個。
國家/地區不適用用於選擇可能包含在實驗中的使用者的一個或多個國家或地區。
語言不適用用於選擇可能包含在實驗中的使用者的一種或多種語言和區域設定。
首次開放多於
少於
之間
根據使用者第一次開啟應用程式的時間(以天為單位)來定位使用者。
上次應用參與度多於
少於
之間
根據使用者上次與您的應用程式互動的時間(以天為單位)來定位使用者。

A/B 測試指標

建立實驗時,您選擇一個主要指標或目標指標,用於確定獲勝變體。您還應該追蹤其他指標,以幫助您更好地了解每個實驗變體的性能,並追蹤每個變體可能不同的重要趨勢,例如用戶保留率、應用穩定性和應用程式內購買收入。您可以在實驗中追蹤最多五個非目標指標。

例如,假設您已將新的應用程式內購買新增至您的應用程式中,並希望比較兩種不同「推動」訊息的有效性。在這種情況下,您可能決定選擇將購買收入設定為目標指標,因為您希望獲勝變體代表帶來最高應用程式內購買收入的通知。由於您還想追蹤哪個變體帶來了更多的未來轉換並保留了用戶,因此您可以在要追蹤的其他指標中添加以下內容:

  • 估算總收入,了解兩種變體之間的應用程式內購買和廣告總收入有何不同
  • 保留(1 天)保留(2-3 天)保留(4-7 天)來追蹤您的每日/每週用戶保留

下表提供了有關如何計算目標指標和其他指標的詳細資訊。

目標指標

公制描述
無崩潰用戶在實驗期間,Firebase Crashlytics SDK 會偵測到您的應用程式中未遇到錯誤的使用者百分比。
預計廣告收入預估廣告收入。
預計總收入購買價值和估計廣告收入的綜合價值。
採購收入所有purchasein_app_purchase事件的總價值。
保留(1 天)每天返回您的應用程式的用戶數量。
保留(2-3天) 2-3 天內返回您的應用程式的用戶數量。
保留(4-7 天) 4-7 天內返回您的應用程式的用戶數量。
保留(8-14 天) 8-14 天內返回您的應用程式的用戶數量。
保留(15 天以上)在上次使用您的應用程式 15 天或更長時間後返回該應用程式的使用者數量。
首先打開當使用者安裝或重新安裝應用程式後首次開啟應用程式時觸發的 Analytics 事件。用作轉換漏斗的一部分。

其他指標

公制描述
通知關閉當通知編輯器發送的通知被忽略時觸發的 Analytics 事件(僅限 Android)。
通知接收當應用程式在背景時收到通知編輯器發送的通知時觸發的 Analytics 事件(僅限 Android)。
作業系統更新追蹤裝置作業系統何時更新到新版本的 Analytics 事件。要了解更多信息,請參閱自動收集的事件
螢幕視圖追蹤在您的應用程式中查看的螢幕的 Analytics 事件。要了解更多信息,請參閱跟踪螢幕視圖
會話開始對應用程式中的使用者會話進行計數的 Analytics 事件。要了解更多信息,請參閱自動收集的事件

BigQuery 資料匯出

除了在 Firebase 控制台中查看 A/B 測試實驗數據之外,您還可以在 BigQuery 中檢查和分析實驗數據。雖然 A/B 測試沒有單獨的 BigQuery 表,但實驗和變體成員資格儲存在 Analytics 事件表中的每個 Google Analytics 事件中。

包含實驗資訊的使用者屬性的形式為userProperty.key like "firebase_exp_%"userProperty.key = "firebase_exp_01" ,其中01是實驗 ID, userProperty.value.string_value包含實驗的(從零開始的)索引實驗變體。

您可以使用這些實驗使用者屬性來提取實驗數據。這使您能夠以多種不同的方式分割實驗結果並獨立驗證 A/B 測試的結果。

首先,請按照本指南中的說明完成以下操作:

  1. 在 Firebase 控制台中為 Google Analytics 啟用 BigQuery 匯出
  2. 使用 BigQuery 存取 A/B 測試數據
  3. 探索範例查詢

在 Firebase 控制台中為 Google Analytics 啟用 BigQuery 匯出

如果您使用 Spark 套餐,則可以使用BigQuery 沙盒免費存取 BigQuery,但須遵守沙盒限制。有關更多信息,請參閱定價和 BigQuery 沙盒

首先,確保您將 Analytics 資料匯出至 BigQuery:

  1. 開啟「整合」標籤,您可以使用Firebase 控制台中的 > 「專案設定」來存取該標籤。
  2. 如果您已將 BigQuery 與其他 Firebase 服務結合使用,請點選管理。否則,請按一下“連結”
  3. 查看關於將 Firebase 連結到 BigQuery ,然後按一下下一步
  4. 設定整合部分中,啟用Google Analytics開關。
  5. 選擇一個區域並選擇匯出設定。

  6. 點擊連結到 BigQuery

根據您選擇匯出資料的方式,表格可能最多需要一天的時間才能可用。有關將項目資料匯出到 BigQuery 的更多信息,請參閱將項目資料匯出到 BigQuery

在 BigQuery 中存取 A/B 測試數據

在查詢特定實驗的資料之前,您需要取得以下部分或全部資訊以在查詢中使用:

  • 實驗 ID:您可以從實驗概述頁面的 URL 取得該 ID。例如,如果您的 URL 類似https://console.firebase.google.com/project/my_firebase_project/config/experiment/results/25 ,則實驗 ID 為25
  • Google Analytics 媒體資源 ID :這是您的 9 位數 Google Analytics 媒體資源 ID。您可以在 Google Analytics 中找到此資訊;當您展開專案名稱以顯示 Google Analytics 事件表的名稱 ( project_name.analytics_000000000.events ) 時,它也會出現在 BigQuery 中。
  • 實驗日期:要編寫更快、更有效率的查詢,最好將查詢限制為包含實驗資料的 Google Analytics(分析)每日事件表分區(以YYYYMMDD後綴標識的表)。因此,如果您的實驗從 2024 年 2 月 2 日運行到 2024 年 5 月 2 日,您需要_TABLE_SUFFIX between '20240202' AND '20240502' 。有關範例,請參閱選擇特定實驗的值
  • 事件名稱:通常,這些名稱與您在實驗中配置的目標指標相對應。例如, in_app_purchase事件、 ad_impressionuser_retention事件。

收集產生查詢所需的資訊後:

  1. 在 Google Cloud 控制台中開啟BigQuery
  2. 選擇您的項目,然後選擇“建立 SQL 查詢”
  3. 新增您的查詢。有關要執行的範例查詢,請參閱探索範例查詢
  4. 單擊運行

使用 Firebase 控制台自動產生的查詢查詢實驗數據

如果您使用的是 Blaze 計劃,實驗概述頁面將提供一個範例查詢,該查詢會傳回您正在查看的實驗的實驗名稱、變體、事件名稱和事件數。

要取得並執行自動產生的查詢:

  1. 在 Firebase 控制台中,開啟A/B 測試並選擇要查詢的 A/B 測試實驗以開啟實驗概述
  2. 從「選項」功能表中的「BigQuery 整合」下方,選擇「查詢實驗資料」 。這將在 Google Cloud 控制台中的 BigQuery 中開啟您的項目,並提供可用於查詢實驗資料的基本查詢。

以下範例顯示了針對名為「Winterwelcomeexperiment」的具有三個變體(包括基準)的實驗所產生的查詢。它會傳回活動實驗名稱、變體名稱、唯一事件以及每個事件的事件計數。請注意,查詢產生器不會在表格名稱中指定您的專案名稱,因為它直接在您的專案中開啟。

  /*
    This query is auto-generated by Firebase A/B Testing for your
    experiment "Winter welcome experiment".
    It demonstrates how you can get event counts for all Analytics
    events logged by each variant of this experiment's population.
  */
  SELECT
    'Winter welcome experiment' AS experimentName,
    CASE userProperty.value.string_value
      WHEN '0' THEN 'Baseline'
      WHEN '1' THEN 'Welcome message (1)'
      WHEN '2' THEN 'Welcome message (2)'
      END AS experimentVariant,
    event_name AS eventName,
    COUNT(*) AS count
  FROM
    `analytics_000000000.events_*`,
    UNNEST(user_properties) AS userProperty
  WHERE
    (_TABLE_SUFFIX BETWEEN '20240202' AND '20240502')
    AND userProperty.key = 'firebase_exp_25'
  GROUP BY
    experimentVariant, eventName

有關其他查詢範例,請繼續瀏覽範例查詢

探索範例查詢

以下部分提供了可用於從 Google Analytics 事件表中提取 A/B 測試實驗資料的查詢範例。

從所有實驗中提取購買和實驗標準差值

您可以使用實驗結果資料來獨立驗證 Firebase A/B 測試結果。以下 BigQuery SQL 語句提取實驗變體、每個變體中的唯一使用者數、 in_app_purchaseecommerce_purchase事件的總收入以及_TABLE_SUFFIX開始日期和結束日期指定的時間範圍內所有實驗的標準差。您可以將從該查詢中獲得的資料與統計顯著性產生器結合使用進行單尾 t 檢驗,以驗證 Firebase 提供的結果是否與您自己的分析相符。

有關 A/B 測試如何計算推理的更多信息,請參閱解釋測試結果

  /*
    This query returns all experiment variants, number of unique users,
    the average USD spent per user, and the standard deviation for all
    experiments within the date range specified for _TABLE_SUFFIX.
  */
  SELECT
    experimentNumber,
    experimentVariant,
    COUNT(*) AS unique_users,
    AVG(usd_value) AS usd_value_per_user,
    STDDEV(usd_value) AS std_dev
  FROM
    (
      SELECT
        userProperty.key AS experimentNumber,
        userProperty.value.string_value AS experimentVariant,
        user_pseudo_id,
        SUM(
          CASE
            WHEN event_name IN ('in_app_purchase', 'ecommerce_purchase')
              THEN event_value_in_usd
            ELSE 0
            END) AS usd_value
      FROM `PROJECT_NAME.analytics_ANALYTICS_ID.events_*`
      CROSS JOIN UNNEST(user_properties) AS userProperty
      WHERE
        userProperty.key LIKE 'firebase_exp_%'
        AND event_name IN ('in_app_purchase', 'ecommerce_purchase')
        AND (_TABLE_SUFFIX BETWEEN 'YYYYMMDD' AND 'YYYMMDD')
      GROUP BY 1, 2, 3
    )
  GROUP BY 1, 2
  ORDER BY 1, 2;

選擇特定實驗的值

以下範例查詢說明如何取得 BigQuery 中特定實驗的資料。此範例查詢傳回實驗名稱、變體名稱(包括基線)、事件名稱和事件計數。

  SELECT
    'EXPERIMENT_NAME' AS experimentName,
    CASE userProperty.value.string_value
      WHEN '0' THEN 'Baseline'
      WHEN '1' THEN 'VARIANT_1_NAME'
      WHEN '2' THEN 'VARIANT_2_NAME'
      END AS experimentVariant,
    event_name AS eventName,
    COUNT(*) AS count
  FROM
    `analytics_ANALYTICS_PROPERTY.events_*`,
    UNNEST(user_properties) AS userProperty
  WHERE
    (_TABLE_SUFFIX BETWEEN 'YYYMMDD' AND 'YYYMMDD')
    AND userProperty.key = 'firebase_exp_EXPERIMENT_NUMBER'
  GROUP BY
    experimentVariant, eventName