予算の最適化シナリオ

このドキュメントでは、予算が固定のシナリオと柔軟なシナリオについて説明し、予算の最適化をカスタマイズする方法を理解するためのコード例も示します。

固定予算: ROI を最大化する、または KPI の増分を最大化する

このシナリオでは、特定の予算で投資収益率(ROI)を最大化するために、各種チャネルと戦略に割り当てるべき最適な予算配分を把握できます。kpi_type が収益以外のタイプで 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 になる必要があります。デフォルトでは、過去の配分が使用されます。予算と配分は、最適化されていないメディアレベルの費用を決めるために併用されます。決定された費用は、最適化されていないパフォーマンス指標(ROI など)の計算と、費用の制約を踏まえた実現可能なメディアレベルの費用範囲の割り出しに使われます。

    配分を指定するには:

    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
    )
    

柔軟な予算: 目標最小 ROI

この柔軟な予算のシナリオでは、具体的な最小 ROI の目標値を入力します。このシナリオでは、総合的なマーケティング レベルで全体的な ROI が X に達するまで、予算の制約なしで使える最大予算額を把握できます。Meridian は、ROI の目標値を達成するための最大推奨予算と、メディア チャネル全体での最適な予算配分を提示します。なお、目標 ROI の制約は、チャネルレベルではなく、総合的なマーケティング レベルで適用されます。

コード例

次のコード例は、目標 ROI の最小値を指定してカスタマイズされた柔軟な予算のシナリオを示しています。

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: 目標 ROI の制約を示す浮動小数点値。柔軟な予算のシナリオだけで使われます。合計メディア費用の ROI が target_roi に達した時点で、予算が制約されます。

    柔軟な予算のシナリオに切り替えて、目標 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 になる必要があります。デフォルトでは、過去の配分が使用されます。予算と配分は、最適化されていないメディアレベルの費用を決めるために併用されます。決定された費用は、最適化されていないパフォーマンス指標(ROI など)の計算と、費用の制約を踏まえた実現可能なメディアレベルの費用範囲の割り出しに使われます。

  • 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%)です。

柔軟な予算: 目標限界 ROI

この柔軟な予算のシナリオでは、増分費用に関する限界 ROI の目標値を入力します。このシナリオでは、各メディア チャネルの限界 ROI が目標限界 ROI に達するまで、予算の制約なしで使える最大予算額を把握できます。その場合も、メディア費用の実現可能な範囲が原因で、一部のチャネルの限界 ROI が目標限界 ROI と同じにならない可能性があります。ただし、限界 ROI は目標限界 ROI に向かって実質的に縮小していきます。なお、目標限界 ROI は、総合的なマーケティング レベルではなく、チャネルレベルで適用されます。

コード例

次のコード例は、目標限界 ROI を指定してカスタマイズされた柔軟な予算のシナリオを示しています。

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: 目標限界 ROI の制約を示す浮動小数点値。柔軟な予算のシナリオだけで使われます。合計メディア費用の限界 ROI が target_mroi に達した時点で、予算が制約されます。

    柔軟な予算のシナリオに切り替えて、目標限界 ROI を 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 になる必要があります。デフォルトでは、過去の配分が使用されます。予算と配分は、最適化されていないメディアレベルの費用を決めるために併用されます。決定された費用は、最適化されていないパフォーマンス指標(ROI など)の計算と、費用の制約を踏まえた実現可能なメディアレベルの費用範囲の割り出しに使われます。

  • 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%)です。