预算优化方案

本文档介绍了固定预算和灵活预算方案,并提供了示例代码,有助于您了解如何自定义预算优化方案。

固定预算:尽可能提高投资回报率或增量 KPI

在这种预算既定的方案中,您可以确定各渠道间的最优分配比例,以及实现投资回报率 (ROI) 最大化的策略。如果将 kpi_type 设置为 non-revenue,且 revenue_per_kpi 未知,则固定预算方案会确定出最优分配比例,以尽可能提高增量 KPI。

此方案是默认设置,如果您调用 BudgetOptimizer 类中的 optimize() 方法而不使用任何其他实参,就会运行此方案。您还可以通过以下方式修改固定预算方案:更改优化时间窗口,输入不同的预算和预先优化的媒体支出分配比例,指明媒体支出的下限和上限。

示例代码

以下代码示例展示了自定义的固定预算方案:

budget_optimizer = optimizer.BudgetOptimizer(meridian)

pct_of_spend = {
    'Channel0': 0.2,
    'Channel1': 0.2,
    'Channel2': 0.2,
    'Channel3': 0.1,
    'Channel4': 0.2,
    'Channel5': 0.1,
}
spend_constraint = {
    'Channel0': 0.3,
    'Channel1': 0.2,
    'Channel2': 0.3,
    'Channel3': 0.3,
    'Channel4': 0.3,
    'Channel5': 0.2,
}

build_channel_args = meridian.input_data.get_paid_channels_argument_builder()

optimization_results = budget_optimizer.optimize(
      selected_times=('2023-01-16', '2024-01-15'),
      budget=70_000_000,
      pct_of_spend=build_channel_args(**pct_of_spend),
      spend_constraint_lower=build_channel_args(**spend_constraint),
      spend_constraint_upper=build_channel_args(**spend_constraint),
)

关键形参

  • selected_times:一个元组,包含要运行优化的时段的开始和结束时间维度。时间维度应与 Meridian 时间维度保持一致。默认情况下,系统会使用所有时间段。

    示例

    修改日期范围:

    budget_optimizer = optimizer.BudgetOptimizer(meridian)
    opt = budget_optimizer.optimize(selected_times=('2023-01-16','2024-01-15')) # date range from week 100 to 200
    
  • budget:表示固定预算方案总预算的数字。默认为历史预算。

    示例

    将预算更改为 70_000_000

    budget_optimizer = optimizer.BudgetOptimizer(meridian)
    opt = budget_optimizer.optimize(budget=70_000_000)
    
  • pct_of_spend:大小为 n_paid_channels 的数字列表,其中包含渠道支出的分配百分比。顺序必须与 (InputData.media + InputData.reach) 一致,值介于 0 到 1 之间,总和为 1。默认情况下,系统会采用既往的分配比例。系统会结合使用预算和分配比例来确定未优化的媒体级支出,该支出用于计算未优化的效果指标(例如投资回报率),并根据支出限制建立可行的媒体级支出范围。

    示例

    指定分配比例:

    budget_optimizer = optimizer.BudgetOptimizer(meridian)
    opt = budget_optimizer.optimize(
        pct_of_spend=build_channel_args(
            Channel0=0.2,
            Channel1=0.2,
            Channel2=0.2,
            Channel4=0.1,
            Channel5=0.2,
            Channel6=0.1,
        ), # non-optimized allocation is 20% to Channel0, 20% to Channel1 etc
    )
    
  • spend_constraint_lower:长度为 n_paid_channels 的数字列表,用于对不同的渠道施加不同的支出限制;也可以使用单个 float 值,以对所有媒体渠道施加相同的支出限制。如果以渠道索引数组的形式提供,则顺序必须与 (InputData.media + InputData.reach) 一致。表示媒体级支出的下限。媒体级支出的下限为 ((1 - spend_constraint_lower) * budget * allocation)。输入的值必须介于 0 到 1 之间。对于固定预算,默认值为 0.3(即媒体支出的 70%);对于灵活预算,默认值为 1(即媒体支出的 0%)。

    示例

    更改支出下限:

    budget_optimizer = optimizer.BudgetOptimizer(meridian)
    build_channel_args = build_channel_args.with_default_value(0.3)
    opt = budget_optimizer.optimize(
        spend_constraint_lower=build_channel_args(
            Channel1=0.2,
            Channel5=0.2,
        ), # change the lower bound to 70%, 80%, 70%, 70%, 70% and 80% of media spends
    )
    
  • spend_constraint_upper:长度为 n_paid_channels 的数字列表,用于对不同的渠道施加不同的支出限制;也可以使用单个 float 值,以对所有媒体渠道施加相同的支出限制。如果以渠道索引数组的形式提供,则顺序必须与 (InputData.media + InputData.reach) 一致。表示媒体级支出的上限。媒体级支出的上限为 (1 + spend_constraint_upper) * budget * allocation)。对于固定预算,默认值为 0.3(即媒体支出的 130%);对于灵活预算,默认值为 1(即媒体支出的 200%)。

    示例

    更改支出上限:

    budget_optimizer = optimizer.BudgetOptimizer(meridian)
    build_channel_args = build_channel_args.with_default_value(0.3)
    opt = budget_optimizer.optimize(
        spend_constraint_upper=build_channel_args(
            Channel1=0.2,
            Channel5=0.2,
        ), # change the upper bound to 130%, 120%, 130%, 130%, 130% and 120% of media spends
    )
    

灵活预算:设置最低投资回报率目标值

在这种灵活预算方案中,您需要输入一个特定的最低投资回报率目标值。通过这种可选方案,您可以确定若没有任何预算限制,在整个营销层面上总体投资回报率达到 X 之前,您可以花费的最高预算是多少。Meridian 会提供建议的最高预算以及各媒体渠道间的最优预算分配比例,以实现该投资回报率目标值。值得注意的是,投资回报率目标值限制适用于总体营销投资回报率层面,而非渠道层面。

示例代码

下面的代码示例展示了一种自定义的灵活预算方案,其中设置了最低投资回报率目标值:

budget_optimizer = optimizer.BudgetOptimizer(meridian)
optimization_results = budget_optimizer.optimize(
      selected_times=('2023-01-16','2024-01-15'),
      fixed_budget=False,
      spend_constraint_lower=0.5,
      spend_constraint_upper=0.5,
      target_roi=1,
)

关键形参

  • fixed_budget:一个布尔值,表示是固定预算优化方案还是灵活预算优化方案。默认为 True,表示固定预算。如果是 False,您还必须指定 target_roitarget_mroi

  • target_roi:表示投资回报率目标值限制的浮点数。仅用于灵活预算方案。当总媒体支出的投资回报率达到 target_roi 时,预算会受到限制。

    示例

    改用灵活预算方案并将投资回报率目标值设置为 1

    budget_optimizer = optimizer.BudgetOptimizer(meridian)
    opt = budget_optimizer.optimize(fixed_budget=False, target_roi=1)
    
  • selected_times:一个元组,包含要运行优化的时段的开始和结束时间维度。时间维度应与 Meridian 时间维度保持一致。默认情况下,系统会使用所有时间段。

  • pct_of_spend:大小为 n_paid_channels 的数字列表,其中包含媒体支出的分配百分比。顺序必须与 (InputData.media + InputData.reach) 一致,值介于 0 到 1 之间,总和为 1。默认情况下,系统会采用既往的分配比例。系统会结合使用预算和分配比例来确定未优化的媒体级支出,该支出用于计算未优化的效果指标(例如投资回报率),并根据支出限制建立可行的媒体级支出范围。

  • spend_constraint_lower:长度为 n_paid_channels 的数字列表,用于对不同的渠道施加不同的支出限制;也可以使用单个 float 值,以对所有媒体渠道施加相同的支出限制。如果以渠道索引数组的形式提供,则顺序必须与 (InputData.media + InputData.reach) 一致。表示媒体级支出的下限。媒体级支出的下限为 ((1 - spend_constraint_lower) * budget * allocation)。输入的值必须介于 0 到 1 之间。对于固定预算,默认值为 0.3(即媒体支出的 70%);对于灵活预算,默认值为 1(即媒体支出的 0%)。

  • spend_constraint_upper:长度为 n_paid_channels 的数字列表,用于对不同的渠道施加不同的支出限制;也可以使用单个 float 值,以对所有媒体渠道施加相同的支出限制。如果以渠道索引数组的形式提供,则顺序必须与 (InputData.media + InputData.reach) 一致。表示媒体级支出的上限。媒体级支出的上限为 (1 + spend_constraint_upper) * budget * allocation)。对于固定预算,默认值为 0.3(即媒体支出的 130%);对于灵活预算,默认值为 1(即媒体支出的 200%)。

灵活预算:设置边际投资回报率目标值

在这种灵活预算方案中,您需要为增量支出输入边际投资回报率目标值。通过这种方案,您可以确定若没有预算限制,在每个媒体渠道的边际投资回报率达到边际投资回报率目标值之前,您可以花费的最高预算是多少。由于媒体支出的可行范围有限,某些渠道的边际投资回报率仍有可能不等于边际投资回报率目标值。不过,边际投资回报率实际上会趋近于边际投资回报率目标值。值得注意的是,边际投资回报率目标值适用于渠道层面,而不是整个营销层面。

示例代码

下面的代码示例展示了一种自定义的灵活预算方案,其中设置了边际投资回报率目标值:

budget_optimizer = optimizer.BudgetOptimizer(meridian)
optimization_results = budget_optimizer.optimize(
      selected_times=('2023-01-16','2024-01-15'),
      fixed_budget=False,
      spend_constraint_lower=0.5,
      spend_constraint_upper=0.5,
      target_mroi=1,
)

关键形参

  • fixed_budget:一个布尔值,表示是固定预算优化方案还是灵活预算优化方案。默认为 True,表示固定预算。如果是 False,您必须指定 target_roitarget_mroi

  • target_mroi:表示边际投资回报率目标值限制的浮点数。仅用于灵活预算方案。当总媒体支出的边际投资回报率达到 target_mroi 时,预算会受到限制。

    示例

    改用灵活预算方案并将边际投资回报率目标值设置为 1

    budget_optimizer = optimizer.BudgetOptimizer(meridian)
    opt = budget_optimizer.optimize(fixed_budget=False, target_mroi=1)
    
  • selected_times:一个元组,包含要运行优化的时段的开始和结束时间维度。时间维度应与 Meridian 时间维度保持一致。默认情况下,系统会使用所有时间段。

  • pct_of_spend:大小为 n_paid_channels 的数字列表,其中包含媒体支出的分配百分比。顺序必须与 (InputData.media + InputData.reach) 一致,值介于 0 到 1 之间,总和为 1。默认情况下,系统会采用既往的分配比例。系统会结合使用预算和分配比例来确定未优化的媒体级支出,该支出用于计算未优化的效果指标(例如投资回报率),并根据支出限制建立可行的媒体级支出范围。

  • spend_constraint_lower:长度为 n_paid_channels 的数字列表,用于对不同的渠道施加不同的支出限制;也可以使用单个 float 值,以对所有媒体渠道施加相同的支出限制。如果以渠道索引数组的形式提供,则顺序必须与 (InputData.media + InputData.reach) 一致。表示媒体级支出的下限。媒体级支出的下限为 ((1 - spend_constraint_lower) * budget * allocation)。输入的值必须介于 0 到 1 之间。对于固定预算,默认值为 0.3(即媒体支出的 70%);对于灵活预算,默认值为 1(即媒体支出的 0%)。

  • spend_constraint_upper:长度为 n_paid_channels 的数字列表,用于对不同的渠道施加不同的支出限制;也可以使用单个 float 值,以对所有媒体渠道施加相同的支出限制。如果以渠道索引数组的形式提供,则顺序必须与 (InputData.media + InputData.reach) 一致。表示媒体级支出的上限。媒体级支出的上限为 (1 + spend_constraint_upper) * budget * allocation)。对于固定预算,默认值为 0.3(即媒体支出的 130%);对于灵活预算,默认值为 1(即媒体支出的 200%)。