콘솔로 이동

A/B 테스팅으로 메시징 실험 만들기

사용자에게 무엇인가를 홍보하거나 새로운 마케팅 캠페인을 시작할 때는 가장 효과적인 방법을 찾아야 합니다. A/B 테스트는 사용자층을 임의로 나누어 서로 다른 메시지를 테스트함으로써 가장 적절한 문구와 표현 방식을 알아내는 데 도움이 됩니다. 유지율 개선, 프로모션의 전환율 상승 등 목표가 무엇이든 간에 A/B 테스트로 통계 분석을 실시하여 특정 메시지가 원하는 목표를 달성하는 데 대조군보다 뛰어난지 여부를 파악할 수 있습니다.

대조군을 활용해 여러 기능에 A/B 테스트를 하는 방법은 다음과 같습니다.

  1. 실험을 만듭니다.
  2. 테스트 기기에서 실험의 유효성을 검사합니다.
  3. 실험을 관리합니다.

실험 만들기

알림 작성기를 사용한 실험을 통해 알림 메시지의 여러 버전을 평가할 수 있습니다.

  1. Firebase에 로그인하고 데이터 공유 설정을 업데이트한 다음 데이터 공유가 사용 설정되어 있는지 확인합니다. 데이터를 공유하지 않으면 실험에서 애널리틱스 데이터에 액세스할 수 없습니다.
  2. Firebase Console 탐색 메뉴에서 성장을 펼친 후 A/B 테스팅을 클릭합니다.
  3. 실험 만들기를 클릭한 후 실험하려는 서비스를 지정하라는 메시지가 표시되면 알림을 선택합니다.
  4. 실험의 이름설명(선택사항)을 입력하고 다음을 클릭합니다.
  5. 실험을 사용할 앱을 먼저 선택하고 타겟팅 입력란을 작성합니다. 다음 옵션 중 하나 이상을 선택하여 사용자의 일부만 실험에 참여하도록 타겟팅할 수도 있습니다.

    • 버전: 하나 이상의 앱 버전입니다.
    • 잠재 사용자: 실험에 포함될 수 있는 사용자를 타겟팅하는 데 사용되는 애널리틱스 잠재고객입니다.
    • 사용자 속성: 실험에 포함될 수 있는 사용자를 선택하는 하나 이상의 애널리틱스 사용자 속성입니다.
    • 예측: 머신러닝이 특정 동작에 참여할 것으로 예측한 사용자 그룹입니다.
    • 국가/지역: 실험에 포함될 수 있는 사용자를 선택하는 하나 이상의 국가 또는 지역입니다.
    • 기기 언어: 실험에 포함될 수 있는 사용자를 선택하는 데 사용되는 하나 이상의 언어입니다.
  6. 대상 사용자 비율 설정: 대상 사용자에 설정한 기준과 일치하는 앱 사용자층 중에서 대조군 및 하나 이상의 실험 변형 간에 균등하게 나눌 비율을 입력합니다. 0.01%~100% 사이의 백분율을 입력할 수 있습니다. 백분율은 중복 실험을 포함하여 실험마다 사용자에게 무작위로 다시 할당됩니다.

  7. 변형 섹션의 메시지 내용을 입력하세요 입력란에 대조군에 전송할 메시지를 입력합니다. 대조군에 메시지를 보내지 않으려면 이 입력란을 비워 둡니다.

  8. (선택사항) 실험에 하나 이상의 변형을 추가하려면 변형 추가를 클릭합니다. 기본적으로 실험에는 대조군 하나와 변형 하나가 포함됩니다.

  9. (선택사항) 실험의 각 변형에 이름을 입력하여 변형 A, 변형 B 등의 이름을 대체합니다.

  10. 드롭다운 목록에서 원하는 추가 측정항목과 함께 실험 변형을 평가할 때 사용할 실험의 목표 측정항목을 정의합니다. 여기에는 기본 목표(참여도, 구매, 수익, 유지율 등), 애널리틱스 전환 이벤트 및 기타 애널리틱스 이벤트가 포함됩니다.

  11. 메시지 옵션을 선택합니다.

    • 전송 날짜: 지금 보내기를 클릭하여 실험을 즉시 시작하거나 일정 예약을 클릭하여 실험을 시작할 시간을 지정합니다.
    • 고급 옵션: 실험에 포함된 모든 알림에 대한 고급 옵션을 선택하려면 고급 옵션을 펼치고 나열된 메시지 옵션 중 원하는 항목을 변경합니다.
  12. 검토를 클릭하여 실험을 저장합니다.

테스트 기기에서 실험 유효성 검사

Firebase 앱을 설치하면 인스턴스 ID 토큰 또는 등록 토큰이 앱에 연결됩니다. 이 토큰을 사용하면 앱이 설치된 테스트 기기에서 특정 실험 변형을 테스트 할 수 있습니다. 테스트 기기에서 실험의 유효성을 검사하는 방법은 다음과 같습니다.

  1. 다음과 같이 인스턴스 ID 토큰을 가져옵니다.

    Swift

    InstanceID.instanceID().instanceID { (result, error) in
      if let error = error {
        print("Error fetching remote instance ID: \(error)")
      } else if let result = result {
        print("Remote instance ID token: \(result.token)")
        self.instanceIDTokenMessage.text  = "Remote InstanceID token: \(result.token)"
      }
    }

    Objective-C

    [[FIRInstanceID instanceID] instanceIDWithHandler:^(FIRInstanceIDResult * _Nullable result,
                                                        NSError * _Nullable error) {
      if (error != nil) {
        NSLog(@"Error fetching remote instance ID: %@", error);
      } else {
        NSLog(@"Remote instance ID token: %@", result.token);
        NSString* message =
          [NSString stringWithFormat:@"Remote InstanceID token: %@", result.token];
        self.instanceIDTokenMessage.text = message;
      }
    }];

    자바

    FirebaseInstanceId.getInstance().getInstanceId()
            .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
                @Override
                public void onComplete(@NonNull Task<InstanceIdResult> task) {
                    Log.d("IID_TOKEN", task.getResult().getToken());
                }
            });

    Kotlin

    FirebaseInstanceId.getInstance().instanceId
            .addOnSuccessListener { result ->
                Log.d("IID_TOKEN", result.token)
            }

    C++

    firebase::InitResult init_result;
    auto* instance_id_object = firebase::instance_id::InstanceId::GetInstanceId(
        firebase::App::GetInstance(), &init_result);
    instance_id_object->GetToken().OnCompletion(
        [](const firebase::Future<std::string>& future) {
          if (future.status() == kFutureStatusComplete &&
              future.error() == firebase::instance_id::kErrorNone) {
            printf("Instance ID Token %s\n", future.result()->c_str());
          }
        });
    

    Unity

    Firebase.InstanceId.FirebaseInstanceId.DefaultInstance.GetTokenAsync().ContinueWith(
      task => {
        if (!(task.IsCanceled || task.IsFaulted) && task.IsCompleted) {
          UnityEngine.Debug.Log(System.String.Format("Instance ID Token {0}", task.Result));
        }
      });
    
  2. Firebase Console 탐색 메뉴에서 원격 구성 또는 알림을 클릭한 다음 A/B 테스팅을 클릭합니다.
  3. 초안을 클릭하고 실험 제목을 클릭합니다.
  4. 테스트 기기 관리를 클릭한 다음 테스트 기기의 인스턴스 ID 토큰을 입력하고 테스트 기기로 전송할 실험 변형을 선택합니다.
  5. 앱을 실행하고 선택한 변형이 테스트 기기에 수신되는지 확인합니다.

인스턴스 ID 토큰에 대한 자세한 내용은 FIRInstanceID(iOS) 또는 FirebaseInstanceId(Android)를 참조하세요.

실험 관리

원격 구성 또는 알림 작성기 중 무엇으로 실험을 만드는지에 관계없이 실험의 유효성을 검사한 후 시작하고, 진행 중인 실험을 모니터링하고, 진행 중인 실험에 포함되는 사용자 수를 늘릴 수 있습니다.

실험이 끝나면 우수한 변형에 사용된 설정을 기록해 두고 이후에 모든 사용자에게 이 설정을 적용하거나 다른 실험을 진행할 수 있습니다.

실험 시작

  1. Firebase Console 탐색 메뉴에서 성장을 펼친 후 A/B 테스팅을 클릭합니다.
  2. 초안을 클릭하고 실험 제목을 클릭합니다.
  3. 실험에 포함될 사용자가 앱에 있는지 검증하려면 타겟팅 및 분포 섹션에서 0%보다 큰 숫자가 있는지 확인합니다. (예: 기준과 일치하는 사용자 1%)
  4. 실험을 변경하려면 수정을 클릭합니다.
  5. 실험을 시작하려면 실험 시작을 클릭합니다. 한 번에 프로젝트당 최대 24개의 실험을 실행할 수 있습니다.

실험 모니터링

실험이 일정 시간 진행되면 실험의 진행 상황을 확인하고 지금까지 실험에 참여한 사용자의 결과가 어떤지 살펴볼 수 있습니다.

  1. Firebase Console 탐색 메뉴에서 성장을 클릭한 후 A/B 테스팅을 클릭합니다.
  2. 실행 중을 클릭하고 실험 제목을 클릭합니다. 이 페이지에서 목표 측정항목 및 기타 측정항목을 포함하여 진행 중인 실험에 대한 다양한 통계를 확인할 수 있습니다. 측정항목마다 다음 정보를 볼 수 있습니다.

    • 개선: 특정 변형에서 기준 또는 통제그룹과 비교하여 측정항목의 개선도를 측정한 값입니다. 변형의 값 범위를 기준의 값 범위와 비교하여 계산합니다.
    • 기준을 초과할 확률: 특정 변형이 선택한 측정항목의 기준을 초과할 것으로 예측되는 확률입니다.
    • 최적의 변형이 될 확률: 선택한 측정항목을 기준으로 특정 변형이 다른 변형을 모두 능가할 것으로 예측되는 확률입니다.
    • 사용자당 값: 실험 결과를 기준으로 측정항목 값이 장기적으로 속할 것으로 예상되는 범위입니다.
    • 전체 값: 통제그룹 또는 변형에서 관찰된 누적 값입니다. 이 값은 각 실험 변형의 실적을 측정하고 개선, 값 범위, 기준을 초과할 확률, 최적의 변형이 될 확률을 계산하는 데 사용됩니다. 대상 측정항목에 따라 이 열에 '사용자당 기간', '유지율', '전환율' 등의 라벨이 지정될 수 있습니다.
  3. 실험에 포함되는 사용자 수를 늘리려면 분포 증가를 클릭하고 비율을 높여 자격 있는 사용자를 실험 대상으로 더 추가합니다.

  4. 일정 시간(최소 24시간) 실험이 진행된 후, 가장 우수한 변형이 있다면 이 페이지의 데이터를 통해 확인할 수 있습니다. 일부 측정항목에는 데이터를 시각적으로 표현하는 막대 그래프가 포함될 수 있습니다.

모든 사용자에게 실험 적용

목표 측정항목을 기준으로 실적이 가장 좋은 변형이 판명될 때까지 실험이 충분히 진행되었으면 사용자 전체에 실험을 적용할 수 있습니다. 이렇게 하여 앞으로 모든 사용자에게 원격 구성으로 게시할 값을 선택할 수 있습니다. 실험을 통해 우열이 명확히 가려지지 않은 경우에도 변형 중 하나를 모든 사용자에게 적용할 수 있습니다.

  1. Firebase Console 탐색 메뉴에서 성장을 클릭한 후 A/B 테스팅을 클릭합니다.
  2. 완료됨 또는 실행 중을 클릭하고 모든 사용자에게 적용할 실험을 클릭한 다음 컨텍스트 메뉴(more_vert)를 클릭하고 변형 적용을 클릭합니다.
  3. 다음 중 하나를 수행하여 실험을 모든 사용자에게 적용합니다.

    • 실험에서 알림 작성기를 사용하는 경우 메시지 전파 대화상자를 사용하여 이전에 실험에 참여하지 않았던 나머지 타겟팅 사용자에게 메시지를 보냅니다.
    • 원격 구성 실험의 경우 표시되는 대화상자를 사용하여 모든 사용자에게서 변경할 원격 구성 매개변수 값을 결정합니다.

실험 확장

A/B 테스트에서 실험에 참여하는 사용자 수가 부족하여 우열을 가릴 수 없는 경우 실험의 분포를 늘려 실험 참여자가 앱 사용자층에서 차지하는 비중을 높일 수 있습니다.

  1. Firebase Console 탐색 메뉴에서 성장을 클릭한 후 A/B 테스팅을 클릭합니다.
  2. 실행 중을 클릭하고 실험 위로 마우스를 가져간 다음 컨텍스트 메뉴(more_vert)를 클릭한 후 분포 증가를 클릭합니다.
  3. 콘솔에 표시되는 대화상자의 옵션을 사용하여 현재 진행 중인 실험에 참여하는 사용자의 비율을 높일 수 있습니다. 현재 백분율보다 큰 숫자를 입력하고 보내기를 클릭합니다. 그러면 지정한 비율의 사용자에게 실험이 적용됩니다.

실험 복제 또는 중지

  1. Firebase Console 탐색 메뉴에서 성장을 클릭한 후 A/B 테스팅을 클릭합니다.
  2. 완료됨 또는 실행 중을 클릭하고 실험 위로 마우스를 가져간 다음 컨텍스트 메뉴(more_vert)를 클릭한 후 복제 또는 중지를 클릭합니다.

사용자 타겟팅

다음과 같은 사용자 타겟팅 기준을 사용하여 실험에 포함할 사용자를 타겟팅할 수 있습니다.

타겟팅 기준 연산자    참고사항
버전 포함,
제외,
정확히 일치함,
정규 표현식 포함
실험에 포함할 하나 이상의 앱 버전 값을 입력합니다.

포함, 제외 또는 정확히 일치함 연산자를 사용하는 경우 쉼표로 구분된 값 목록을 제공할 수 있습니다.

정규식 포함 연산자를 사용하면 RE2 형식의 정규 표현식을 만들 수 있습니다. 정규 표현식은 타겟 버전 문자열의 일부 또는 전부와 일치할 수 있습니다. ^$ 앵커를 사용하여 대상 문자열의 시작, 끝 또는 전체를 나타낼 수도 있습니다.

잠재 사용자 다음을 모두 포함,
다음 중 1개 이상 포함,
다음을 모두 포함하지 않음,
다음 중 1개 이상을 포함하지 않음
실험에 포함될 수 있는 사용자를 타겟팅하는 애널리틱스 잠재고객을 하나 이상 선택합니다.  
사용자 속성 텍스트:
포함,
제외,
정확히 일치,
정규 표현식 포함

숫자:
<, ≤, =, ≥, >
실험에 포함될 수 있는 사용자를 선택하는 데 사용되는 애널리틱스 사용자 속성으로서, 다양한 옵션으로 사용자 속성 값을 선택할 수 있습니다.

클라이언트에서는 사용자 속성에 문자열 값만 설정할 수 있습니다. 숫자 연산자를 사용하는 조건의 경우 원격 구성 서비스는 해당 사용자 속성의 값을 정수/부동 소수로 변환합니다.
정규식 포함 연산자를 사용하면 RE2 형식의 정규 표현식을 만들 수 있습니다. 정규 표현식은 타겟 버전 문자열의 일부 또는 전부와 일치할 수 있습니다. ^$ 앵커를 사용하여 대상 문자열의 시작, 끝 또는 전체를 나타낼 수도 있습니다.
예측 해당 없음 Firebase 예측에서 정의한 대상 사용자 그룹입니다. 예를 들어 앱 사용 중지가 예상되는 사용자 또는 인앱 구매를 할 가능성이 높은 사용자입니다. Firebase 예측 도구에 정의된 값 중 하나를 선택합니다. 사용 가능한 옵션이 없으면 Firebase 콘솔의 예측 섹션으로 이동하여 Firebase 예측을 사용하도록 선택해야 할 수 있습니다.  
기기 국가 해당 없음 실험에 포함될 수 있는 사용자를 선택하는 데 사용되는 하나 이상의 국가 또는 지역입니다.  
기기 언어 해당 없음 실험에 포함될 수 있는 사용자를 선택하는 데 사용되는 하나 이상의 언어입니다. 이 타겟팅 기준은 원격 구성에서만 사용할 수 있습니다.

A/B 테스트 측정항목

실험을 만들 때는 실험 변형을 서로 비교하는 데 사용되는 측정 항목을 선택하며, 이외에도 각 실험 변형을 보다 정확히 이해하고 앱 다운과 같은 중요한 부작용을 탐지하는 데 도움이 되는 기타 측정항목을 선택할 수 있습니다. 다음 표에서는 목표 측정항목과 기타 측정항목이 계산되는 상세한 방식을 확인할 수 있습니다.

목표 측정항목

측정항목 설명
일일 사용자 참여도 user_engagement 애널리틱스 이벤트가 트리거될 정도로 오랫동안 앱을 포그라운드 상태로 둔 일별 사용자 수입니다.
유지(1일) 앱을 매일 다시 사용하는 사용자 수입니다.
유지(2~3일) 2~3일 이내에 앱을 다시 사용하는 사용자 수입니다.
유지(4~7일) 4~7일 이내에 앱을 다시 사용하는 사용자 수입니다.
유지(8~14일) 8~14일 이내에 앱을 다시 사용하는 사용자 수입니다.
유지(15일 이상) 앱을 마지막으로 사용하고 15일 이상 경과한 후에 앱을 다시 사용하는 사용자 수입니다.
알림 수신 확인 알림 작성기에서 보낸 알림을 사용자가 열었는지 여부를 추적합니다.
구매 수익 모든 ecommerce_purchasein_app_purchase 이벤트의 합산 값입니다.
AdMob 추정 수익 AdMob의 예상 수입입니다.
총 추정 수익 구매 및 AdMob 추정 수익의 합산 값입니다.
first_open 사용자가 앱을 설치 또는 재설치한 후 처음으로 실행할 때 트리거되는 애널리틱스 이벤트입니다. 전환 유입경로의 일부로 사용됩니다.
notification_open 알림 작성기에서 보낸 알림을 사용자가 열 때 트리거되는 애널리틱스 이벤트입니다. 전환 유입경로의 일부로 사용됩니다.

기타 측정항목

측정항목 설명
비정상 종료가 발생하지 않은 사용자 실험 중에 앱에서 Firebase 오류 보고 SDK가 탐지한 오류를 경험하지 않은 사용자의 백분율입니다. 자세한 내용은 비정상 종료가 발생하지 않은 사용자 측정항목을 참조하세요.
notification_dismiss 알림 작성기에서 보낸 알림을 닫을 때 트리거되는 애널리틱스 이벤트입니다(Android 전용).
notification_receive 알림 작성기에서 보낸 알림이 백그라운드 앱에 수신될 때 트리거되는 애널리틱스 이벤트입니다(Android 전용).
os_update 기기 운영체제가 새로운 버전으로 업데이트되는 시점을 추적하는 애널리틱스 이벤트입니다.자세한 내용은 자동으로 수집되는 이벤트를 참조하세요.
screen_view 앱의 화면 조회를 추적하는 애널리틱스 이벤트입니다. 자세한 내용은 화면 조회수 추적을 참조하세요.
session_start 앱의 사용자 세션 수를 계산하는 애널리틱스 이벤트입니다. 자세한 내용은 자동으로 수집되는 이벤트를 참조하세요.
user_engagement 앱이 포그라운드 상태일 때 주기적으로 트리거되는 애널리틱스 이벤트입니다. 자세한 내용은 자동으로 수집되는 이벤트를 참조하세요.

BigQuery 데이터 내보내기

BigQuery에서 A/B 테스트와 관련된 모든 애널리틱스 데이터에 액세스할 수 있습니다. BigQuery를 사용하면 BigQuery SQL로 데이터를 분석하여 다른 클라우드 제공업체로 내보내거나, 맞춤 ML 모델에 데이터를 사용할 수 있습니다. 자세한 내용은 Firebase에 BigQuery 연결을 참조하세요.

시작하려면 Firebase 프로젝트가 BigQuery에 연결되어 있어야 합니다. 왼쪽 탐색 메뉴에서 설정 > 프로젝트 설정을 선택한 후 통합 > BigQuery > 연결을 선택합니다. 이 페이지에는 프로젝트에 포함된 모든 앱에 대해 BiqQuery 애널리틱스 데이터 내보내기를 수행할 수 있는 옵션이 표시됩니다.

실험 환경에서 애널리틱스 데이터를 쿼리하려면 실험 결과 페이지를 열고 BigQuery에서 보기를 선택합니다 그러면 실험 데이터의 쿼리 예가 미리 로드된 BigQuery 콘솔의 쿼리 작성기가 열립니다. BigQuery의 Firebase 데이터는 매일 한 번만 업데이트되기 때문에 실험 페이지에 제공되는 데이터가 BigQuery 콘솔에 제공되는 데이터보다 최신일 수 있습니다.