캠페인 내 실험

캠페인 내 실험은 단일 캠페인 내에서 특정 기능을 테스트하는 데 사용됩니다. 트래픽이 통제 캠페인과 실험 캠페인 간에 분할되는 시스템 관리 실험과 달리 캠페인 내 실험은 기능의 사용 설정 여부에 따라 캠페인 내에서 트래픽을 분할합니다.

이 워크플로는 다음 ExperimentType 값에 지원됩니다.

ADOPT_AI_MAX
AI Max 기능이 검색 캠페인에 미치는 영향을 테스트합니다.
ADOPT_BROAD_MATCH_KEYWORDS
확장검색 키워드가 검색 캠페인에 미치는 영향을 테스트합니다.
PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION
실적 최대화 캠페인 기능(텍스트 맞춤설정 및 최종 URL 확장)을 테스트하는 데 특별히 사용됩니다. Google AI가 관련성 높은 방문 페이지로 트래픽을 전송하고 검색어와 더 일치하는 텍스트 애셋을 생성할 수 있습니다.

설정

  1. Experiment (status가 ENABLED로 설정됨)를 정의하여 실험 유형, 대조군 ExperimentArm, 실험군 ExperimentArm를 제공합니다.
    • ADOPT_AI_MAX 및 ADOPT_BROAD_MATCH_KEYWORDS의 경우 대조 부문과 실험 부문 모두 campaigns의 동일한 캠페인을 참조해야 합니다.
    • PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION의 경우 실험 부문만 campaigns에서 실적 최대화 캠페인을 지정합니다 (대조 부문에서 campaigns를 설정하지 않은 상태로 둠).
  2. ADOPT_AI_MAX의 경우 필드 마스크를 사용하여 CampaignOperation 업데이트를 만들어 ai_max_setting.enable_ai_max를 사용 설정하고 asset_automation_settings를 구성합니다.

  3. 실험 및 실험 부문을 만들고 (ADOPT_AI_MAX의 경우) 캠페인에서 테스트 기능을 사용 설정하는 변형 작업이 포함된 GoogleAdsService.Mutate 요청을 보냅니다.

ADOPT_AI_MAX 및 ADOPT_BROAD_MATCH_KEYWORDS의 경우 트래픽의 50% 가 사용 설정된 기능 (실험 그룹)에 노출되고 50% 는 노출되지 않도록 (대조 그룹) 캠페인 내에서 트래픽을 균등하게 (50/50) 분할해야 합니다. PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION은 합계가 100인 커스텀 트래픽 분할을 지원합니다.

자바

// Create the experiment resource name using a temporary ID.
String experimentResourceName = ResourceNames.experiment(customerId, -1L);

// Create the experiment.
Experiment experiment =
    Experiment.newBuilder()
        .setResourceName(experimentResourceName)
        .setName("ADOPT_AI_MAX Experiment #" + UUID.randomUUID())
        .setType(ExperimentType.ADOPT_AI_MAX)
        .build();
MutateOperation experimentOperation =
    MutateOperation.newBuilder()
        .setExperimentOperation(ExperimentOperation.newBuilder().setCreate(experiment).build())
        .build();

// Create the control arm. Both arms in an intra-campaign experiment reference the same base
// campaign.
ExperimentArm controlArm =
    ExperimentArm.newBuilder()
        .setExperiment(experimentResourceName)
        .setName("Control Arm")
        .setControl(true)
        .setTrafficSplit(50)
        .addCampaigns(ResourceNames.campaign(customerId, campaignId))
        .build();
MutateOperation controlArmOperation =
    MutateOperation.newBuilder()
        .setExperimentArmOperation(
            ExperimentArmOperation.newBuilder().setCreate(controlArm).build())
        .build();

// Create the treatment arm.
ExperimentArm treatmentArm =
    ExperimentArm.newBuilder()
        .setExperiment(experimentResourceName)
        .setName("Treatment Arm")
        .setControl(false)
        .setTrafficSplit(50)
        .addCampaigns(ResourceNames.campaign(customerId, campaignId))
        .build();
MutateOperation treatmentArmOperation =
    MutateOperation.newBuilder()
        .setExperimentArmOperation(
            ExperimentArmOperation.newBuilder().setCreate(treatmentArm).build())
        .build();

// Create a campaign operation with an update mask to enable AI Max and configure asset
// automation settings.
// Note: For intra-campaign experiments, these settings are applied to the base campaign but are
// only active for the treatment traffic split.
Campaign campaign =
    Campaign.newBuilder()
        .setResourceName(ResourceNames.campaign(customerId, campaignId))
        .setAiMaxSetting(AiMaxSetting.newBuilder().setEnableAiMax(true).build())
        .addAssetAutomationSettings(
            AssetAutomationSetting.newBuilder()
                .setAssetAutomationType(AssetAutomationType.TEXT_ASSET_AUTOMATION)
                .setAssetAutomationStatus(AssetAutomationStatus.OPTED_IN)
                .build())
        .addAssetAutomationSettings(
            AssetAutomationSetting.newBuilder()
                .setAssetAutomationType(
                    AssetAutomationType.FINAL_URL_EXPANSION_TEXT_ASSET_AUTOMATION)
                .setAssetAutomationStatus(AssetAutomationStatus.OPTED_IN)
                .build())
        .build();

CampaignOperation campaignOp =
    CampaignOperation.newBuilder()
        .setUpdate(campaign)
        .setUpdateMask(FieldMasks.allSetFieldsOf(campaign))
        .build();
MutateOperation campaignMutateOperation =
    MutateOperation.newBuilder().setCampaignOperation(campaignOp).build();

// Send all mutate operations in a single Mutate request.
List<MutateOperation> mutateOperations =
    ImmutableList.of(
        experimentOperation,
        controlArmOperation,
        treatmentArmOperation,
        campaignMutateOperation);

try (GoogleAdsServiceClient googleAdsServiceClient =
    googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) {

  MutateGoogleAdsRequest request =
      MutateGoogleAdsRequest.newBuilder()
          .setCustomerId(Long.toString(customerId))
          .addAllMutateOperations(mutateOperations)
          .build();

  MutateGoogleAdsResponse response = googleAdsServiceClient.mutate(request);
      

C#

// Create the experiment resource name using a temporary ID.
string experimentResourceName = ResourceNames.Experiment(customerId, -1);

// Create the experiment.
MutateOperation experimentOperation = new MutateOperation()
{
    ExperimentOperation = new ExperimentOperation()
    {
        Create = new Experiment()
        {
            ResourceName = experimentResourceName,
            Name = $"ADOPT_AI_MAX Experiment #{ExampleUtilities.GetRandomString()}",
            Type = ExperimentType.AdoptAiMax
        }
    }
};

// Create the control arm. Both arms in an intra-campaign experiment
// reference the same base campaign.
MutateOperation controlArmOperation = new MutateOperation()
{
    ExperimentArmOperation = new ExperimentArmOperation()
    {
        Create = new ExperimentArm()
        {
            Experiment = experimentResourceName,
            Name = "Control Arm",
            Control = true,
            TrafficSplit = 50,
            Campaigns = { ResourceNames.Campaign(customerId, campaignId) }
        }
    }
};

// Create the treatment arm.
MutateOperation treatmentArmOperation = new MutateOperation()
{
    ExperimentArmOperation = new ExperimentArmOperation()
    {
        Create = new ExperimentArm()
        {
            Experiment = experimentResourceName,
            Name = "Treatment Arm",
            Control = false,
            TrafficSplit = 50,
            Campaigns = { ResourceNames.Campaign(customerId, campaignId) }
        }
    }
};

// Create a campaign operation with an update mask to enable AI Max and
// configure asset automation settings.
// Note: For intra-campaign experiments, these settings are applied to the
// base campaign but are only active for the treatment traffic split.
Campaign campaign = new Campaign()
{
    ResourceName = ResourceNames.Campaign(customerId, campaignId),
    AiMaxSetting = new Campaign.Types.AiMaxSetting { EnableAiMax = true }
};

campaign.AssetAutomationSettings.Add(new Campaign.Types.AssetAutomationSetting
{
    AssetAutomationType = AssetAutomationType.TextAssetAutomation,
    AssetAutomationStatus = AssetAutomationStatus.OptedIn
});

campaign.AssetAutomationSettings.Add(new Campaign.Types.AssetAutomationSetting
{
    AssetAutomationType = AssetAutomationType.FinalUrlExpansionTextAssetAutomation,
    AssetAutomationStatus = AssetAutomationStatus.OptedIn
});

MutateOperation campaignOperation = new MutateOperation()
{
    CampaignOperation = new CampaignOperation()
    {
        Update = campaign,
        UpdateMask = FieldMasks.AllSetFieldsOf(campaign)
    }
};

// Send all mutate operations in a single Mutate request.
List<MutateOperation> mutateOperations = new List<MutateOperation>
{
    experimentOperation,
    controlArmOperation,
    treatmentArmOperation,
    campaignOperation
};

MutateGoogleAdsResponse response = googleAdsService.Mutate(
    customerId.ToString(), mutateOperations);
      

PHP

This example is not yet available in PHP; you can take a look at the other languages.
    

Python

# Create the experiment resource name using a temporary ID.
experiment_resource_name = googleads_service.experiment_path(
    customer_id, "-1"
)

# Create the experiment.
experiment_operation = client.get_type("MutateOperation")
experiment = experiment_operation.experiment_operation.create
experiment.resource_name = experiment_resource_name
experiment.name = f"ADOPT_AI_MAX Experiment #{uuid4()}"
experiment.type_ = client.enums.ExperimentTypeEnum.ADOPT_AI_MAX

# Create the control arm. Both arms in an intra-campaign experiment
# reference the same base campaign.
control_arm_operation = client.get_type("MutateOperation")
control_arm = control_arm_operation.experiment_arm_operation.create
control_arm.experiment = experiment_resource_name
control_arm.name = "Control Arm"
control_arm.control = True
control_arm.traffic_split = 50
control_arm.campaigns.append(
    googleads_service.campaign_path(customer_id, campaign_id)
)

# Create the treatment arm.
treatment_arm_operation = client.get_type("MutateOperation")
treatment_arm = treatment_arm_operation.experiment_arm_operation.create
treatment_arm.experiment = experiment_resource_name
treatment_arm.name = "Treatment Arm"
treatment_arm.control = False
treatment_arm.traffic_split = 50
treatment_arm.campaigns.append(
    googleads_service.campaign_path(customer_id, campaign_id)
)

# Create a campaign operation with an update mask to enable AI Max and
# configure asset automation settings.
# Note: For intra-campaign experiments, these settings are applied to the
# base campaign but are only active for the treatment traffic split.
campaign_operation = client.get_type("MutateOperation")
campaign = campaign_operation.campaign_operation.update
campaign.resource_name = googleads_service.campaign_path(
    customer_id, campaign_id
)
campaign.ai_max_setting.enable_ai_max = True

for asset_automation_type_enum in [
    client.enums.AssetAutomationTypeEnum.TEXT_ASSET_AUTOMATION,
    client.enums.AssetAutomationTypeEnum.FINAL_URL_EXPANSION_TEXT_ASSET_AUTOMATION,
]:
    asset_automation_setting = client.get_type(
        "Campaign"
    ).AssetAutomationSetting()
    asset_automation_setting.asset_automation_type = (
        asset_automation_type_enum
    )
    asset_automation_setting.asset_automation_status = (
        client.enums.AssetAutomationStatusEnum.OPTED_IN
    )
    campaign.asset_automation_settings.append(asset_automation_setting)

client.copy_from(
    campaign_operation.campaign_operation.update_mask,
    protobuf_helpers.field_mask(None, campaign._pb),
)

# Send all mutate operations in a single Mutate request.
mutate_operations = [
    experiment_operation,
    control_arm_operation,
    treatment_arm_operation,
    campaign_operation,
]

response = googleads_service.mutate(
    customer_id=customer_id,
    mutate_operations=mutate_operations,
)
      

Ruby

# Create the experiment resource name using a temporary ID.
experiment_resource_name = client.path.experiment(customer_id, "-1")

# Create the experiment.
experiment_operation = client.operation.mutate do |m|
  m.experiment_operation = client.operation.create_resource.experiment do |e|
    e.resource_name = experiment_resource_name
    e.name = "ADOPT_AI_MAX Experiment #{(Time.new.to_f * 1000).to_i}"
    e.type = :ADOPT_AI_MAX
  end
end

# Create the control arm. Both arms in an intra-campaign experiment
# reference the same base campaign.
campaign_resource_name = client.path.campaign(customer_id, campaign_id)
control_arm_operation = client.operation.mutate do |m|
  m.experiment_arm_operation = client.operation.create_resource.experiment_arm do |arm|
    arm.experiment = experiment_resource_name
    arm.name = "Control Arm"
    arm.control = true
    arm.traffic_split = 50
    arm.campaigns << campaign_resource_name
  end
end

# Create the treatment arm.
treatment_arm_operation = client.operation.mutate do |m|
  m.experiment_arm_operation = client.operation.create_resource.experiment_arm do |arm|
    arm.experiment = experiment_resource_name
    arm.name = "Treatment Arm"
    arm.control = false
    arm.traffic_split = 50
    arm.campaigns << campaign_resource_name
  end
end

# Create a campaign operation with an update mask to enable AI Max and
# configure asset automation settings.
# Note: For intra-campaign experiments, these settings are applied to the
# base campaign but are only active for the treatment traffic split.
campaign_operation = client.operation.mutate do |m|
  m.campaign_operation = client.operation.update_resource.campaign(campaign_resource_name) do |c|
    c.ai_max_setting = client.resource.ai_max_setting do |aims|
      aims.enable_ai_max = true
    end

    [:TEXT_ASSET_AUTOMATION, :FINAL_URL_EXPANSION_TEXT_ASSET_AUTOMATION].each do |type|
      c.asset_automation_settings << client.resource.asset_automation_setting do |setting|
        setting.asset_automation_type = type
        setting.asset_automation_status = :OPTED_IN
      end
    end
  end
end

# Send all mutate operations in a single Mutate request.
mutate_operations = [
  experiment_operation,
  control_arm_operation,
  treatment_arm_operation,
  campaign_operation,
]

response = client.service.google_ads.mutate(
  customer_id: customer_id,
  mutate_operations: mutate_operations,
)
      

Perl

This example is not yet available in Perl; you can take a look at the other languages.
    

curl

실험 보고서

통제 그룹과 실험 그룹 트래픽이 단일 캠페인 내에서 혼합되므로 직접 실험 보고를 사용하여 통제 그룹과 실험 그룹 간의 측정항목을 비교해야 합니다. 표준 캠페인 수준 보고서에는 전체 캠페인의 집계된 측정항목만 표시되며 두 그룹을 구분할 수 없습니다.

다음 GAQL 쿼리는 지난 30일 동안의 ADOPT_AI_MAX 캠페인 내 실험에 대한 클릭 통계를 검색합니다.

SELECT
  experiment.resource_name,
  experiment.name,
  metrics.clicks,
  metrics.control_clicks,
  metrics.clicks_point_estimate,
  metrics.clicks_p_value
FROM experiment
WHERE segments.date DURING LAST_30_DAYS
  AND experiment.type = 'ADOPT_AI_MAX'

실험 승격, 종료 또는 완료

결과를 평가한 후 ExperimentService를 사용하여 실험을 완료할 수 있습니다.

  • 종료: 결과에 만족하지 않으면 EndExperiment를 사용합니다. 기능이 사용 중지되고 캠페인이 실험 기능 없이 모든 트래픽을 게재하는 상태로 되돌아갑니다. 이는 동기식 작업입니다.
  • 승격 (ADOPT_AI_MAX 및 ADOPT_BROAD_MATCH_KEYWORDS): 검색 캠페인 내 실험 결과에 만족하는 경우 PromoteExperiment를 사용합니다. 이렇게 하면 실험 변경사항이 캠페인의 새로운 영구 상태로 적용됩니다. 이는 비동기식 작업입니다. 자세한 내용은 비동기 오류를 참조하세요.
  • Graduate (PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION): PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION에는 PromoteExperiment가 지원되지 않습니다. 대신 GraduateExperiment를 사용하여 실험 부문의 텍스트 맞춤설정 및 최종 URL 확장 설정을 기존 실적 최대화 캠페인에 바로 적용합니다. campaign_budget_mappings에 실험 부문의 캠페인(experiment_campaign)과 예산 (campaign_budget)을 지정하는 CampaignBudgetMapping 항목을 포함합니다. 이는 동기식 작업입니다. (ADOPT_AI_MAX 또는 ADOPT_BROAD_MATCH_KEYWORDS에는 GraduateExperiment가 지원되지 않습니다. 종료할 별도의 실험 캠페인이 없기 때문입니다.)