Situaciones de optimización del presupuesto

En este documento, se describen situaciones de presupuestos fijos y flexibles, y se incluye código de ejemplo para ayudarte a comprender cómo personalizar la optimización de tu presupuesto.

Presupuesto fijo: maximizar el ROI o un KPI incremental

En esta situación, para un presupuesto determinado, puedes encontrar la asignación óptima para los diferentes canales y tácticas para maximizar el retorno de la inversión (ROI). Si el kpi_type que se configura no está relacionado con los ingresos y revenue_per_kpi es desconocido, la situación de presupuesto fijo encuentra la asignación óptima para maximizar el KPI incremental.

Esta situación representa la configuración predeterminada y se ejecuta si llamas al método optimize() desde la clase BudgetOptimizer sin ningún argumento adicional. También puedes modificar la situación de presupuesto fijo cambiando la ventana de optimización, ingresando un presupuesto específico y las asignaciones de inversión en medios optimizadas previamente, y señalando los límites inferior y superior para la inversión en medios.

Ejemplo de código

En el siguiente ejemplo de código, se muestra una situación de presupuesto fijo personalizado:

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),
)

Parámetros clave

  • selected_times: Es una tupla que contiene las dimensiones temporales de inicio y finalización para el período durante el cual se ejecutará la optimización. Las dimensiones temporales deben alinearse con las dimensiones temporales de Meridian. De forma predeterminada, se utilizan todos los períodos.

    Ejemplo

    Para modificar el período, haz lo siguiente:

    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: Es un número que indica el presupuesto total para la situación de presupuesto fijo. El valor predeterminado es el presupuesto histórico.

    Ejemplo

    Para cambiar el presupuesto a 70_000_000, haz lo siguiente:

    budget_optimizer = optimizer.BudgetOptimizer(meridian)
    opt = budget_optimizer.optimize(budget=70_000_000)
    
  • pct_of_spend: Es una lista numérica de tamaño n_paid_channels que contiene los porcentajes de asignación para la inversión en el canal. El orden debe coincidir con el de (InputData.media + InputData.reach) con valores entre 0 y 1, que sumen 1 en total. De forma predeterminada, se usa la asignación histórica. El presupuesto y la asignación se usan en conjunto para determinar la inversión en medios no optimizada, que, a su vez, se usa para calcular las métricas de rendimiento no optimizadas (por ejemplo, el ROI) y crear el rango factible de inversión en medios teniendo en cuenta las restricciones de inversión.

    Ejemplo

    Para especificar la asignación, haz lo siguiente:

    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: Es una lista numérica de longitud n_paid_channels para usar diferentes restricciones de inversión para diferentes canales o un solo valor float para aplicar la misma restricción de inversión en todos los canales de medios. Si se proporciona como un array indexado por canal, el orden debe coincidir con (InputData.media + InputData.reach). Indica el límite inferior de la inversión a nivel de los medios. El límite inferior de la inversión a nivel de los medios es ((1 - spend_constraint_lower) * budget * allocation). El valor ingresado debe estar entre 0 y 1. El valor predeterminado es 0.3 (es decir, el 70% de la inversión en medios) para un presupuesto fijo y 1 (es decir, el 0% de la inversión en medios) para un presupuesto flexible.

    Ejemplo

    Para cambiar la restricción de inversión más baja, haz lo siguiente:

    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: Es una lista numérica de longitud n_paid_channels para usar diferentes restricciones de inversión para diferentes canales o un solo valor float para aplicar la misma restricción de inversión en todos los canales de medios. Si se proporciona como un array indexado por canal, el orden debe coincidir con (InputData.media + InputData.reach). Indica el límite superior de la inversión a nivel de los medios. El límite superior de la inversión a nivel de los medios es (1 + spend_constraint_upper) * budget * allocation). El valor predeterminado es 0.3 (es decir, el 130% de la inversión en medios) para un presupuesto fijo y 1 (es decir, el 200% de la inversión en medios) para un presupuesto flexible.

    Ejemplo

    Para cambiar la restricción de inversión más alta, haz lo siguiente:

    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
    )
    

Presupuesto flexible: ROI mínimo objetivo

En esta situación, para un presupuesto flexible, debes ingresar un objetivo de ROI mínimo específico. Esta opción te permite saber cuál es el presupuesto máximo que puedes invertir sin ningún límite presupuestario hasta que el ROI general alcance un valor X en todas las actividades de marketing. Meridian proporciona un presupuesto máximo recomendado, así como una asignación óptima del presupuesto en todos los canales de medios, para alcanzar ese objetivo de ROI. En particular, la restricción del ROI objetivo se aplica a nivel del ROI de todas las actividades de marketing, y no a nivel del canal.

Ejemplo de código

En el siguiente ejemplo de código, se muestra una situación de presupuesto flexible personalizado con un ROI mínimo objetivo:

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,
)

Parámetros clave

  • fixed_budget: Es un valor booleano que indica si se trata de una optimización de presupuesto fijo o flexible. El valor predeterminado es True, que indica un presupuesto fijo. Si el valor es False, también debes especificar target_roi o target_mroi.

  • target_roi: Es un número de punto flotante que indica la restricción del ROI objetivo. Solo se usa para situaciones de presupuesto flexible. El presupuesto se restringe hasta que el ROI de la inversión total en medios alcance target_roi.

    Ejemplo

    Para cambiar a una situación de presupuesto flexible y establecer el ROI objetivo en 1, haz lo siguiente:

    budget_optimizer = optimizer.BudgetOptimizer(meridian)
    opt = budget_optimizer.optimize(fixed_budget=False, target_roi=1)
    
  • selected_times: Es una tupla que contiene las dimensiones temporales de inicio y finalización para el período durante el cual se ejecutará la optimización. Las dimensiones temporales deben alinearse con las dimensiones temporales de Meridian. De forma predeterminada, se utilizan todos los períodos.

  • pct_of_spend: Es una lista numérica de tamaño n_paid_channels que contiene los porcentajes de la asignación para la inversión en medios. El orden debe coincidir con el de (InputData.media + InputData.reach) con valores entre 0 y 1, que sumen 1 en total. De forma predeterminada, se usa la asignación histórica. El presupuesto y la asignación se usan en conjunto para determinar la inversión en medios no optimizada, que, a su vez, se usa para calcular las métricas de rendimiento no optimizadas (por ejemplo, el ROI) y crear el rango factible de inversión en medios teniendo en cuenta las restricciones de inversión.

  • spend_constraint_lower: Es una lista numérica de longitud n_paid_channels para usar diferentes restricciones de inversión para diferentes canales o un solo valor float para aplicar la misma restricción de inversión en todos los canales de medios. Si se proporciona como un array indexado por canal, el orden debe coincidir con (InputData.media + InputData.reach). Indica el límite inferior de la inversión a nivel de los medios. El límite inferior de la inversión a nivel de los medios es ((1 - spend_constraint_lower) * budget * allocation). El valor ingresado debe estar entre 0 y 1. El valor predeterminado es 0.3 (es decir, el 70% de la inversión en medios) para un presupuesto fijo y 1 (es decir, el 0% de la inversión en medios) para un presupuesto flexible.

  • spend_constraint_upper: Es una lista numérica de longitud n_paid_channels para usar diferentes restricciones de inversión para diferentes canales o un solo valor float para aplicar la misma restricción de inversión en todos los canales de medios. Si se proporciona como un array indexado por canal, el orden debe coincidir con (InputData.media + InputData.reach). Indica el límite superior de la inversión a nivel de los medios. El límite superior de la inversión a nivel de los medios es (1 + spend_constraint_upper) * budget * allocation). El valor predeterminado es 0.3 (es decir, el 130% de la inversión en medios) para un presupuesto fijo y 1 (es decir, el 200% de la inversión en medios) para un presupuesto flexible.

Presupuesto flexible: ROI marginal objetivo

En esta situación, para un presupuesto flexible, debes ingresar un objetivo de ROI marginal para la inversión incremental. Esta opción te permite saber cuál es el presupuesto máximo que puedes invertir sin ningún límite presupuestario hasta que el ROI marginal de cada canal de medios alcance el ROI marginal objetivo. Es posible que el ROI marginal de algunos canales no sea igual al ROI marginal objetivo debido al rango factible de inversión en medios. Sin embargo, el ROI marginal se ajustará de manera efectiva para acercarse al ROI marginal objetivo. En particular, el ROI marginal objetivo se aplica a nivel del canal y no a nivel de todas las actividades de marketing.

Ejemplo de código

En los siguientes ejemplos de código, se muestra una situación de presupuesto flexible personalizado con un ROI marginal objetivo:

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,
)

Parámetros clave

  • fixed_budget: Es un valor booleano que indica si se trata de una optimización de presupuesto fijo o flexible. El valor predeterminado es True, que indica un presupuesto fijo. Si el valor es False, debes especificar target_roi o target_mroi.

  • target_mroi: Es un número de punto flotante que indica la restricción del ROI marginal objetivo. Solo se usa para situaciones de presupuesto flexible. El presupuesto se restringe hasta que el ROI marginal de la inversión total en medios alcance target_mroi.

    Ejemplo

    Para cambiar a una situación de presupuesto flexible y establecer el ROI marginal objetivo en 1, haz lo siguiente:

    budget_optimizer = optimizer.BudgetOptimizer(meridian)
    opt = budget_optimizer.optimize(fixed_budget=False, target_mroi=1)
    
  • selected_times: Es una tupla que contiene las dimensiones temporales de inicio y finalización para el período durante el cual se ejecutará la optimización. Las dimensiones temporales deben alinearse con las dimensiones temporales de Meridian. De forma predeterminada, se utilizan todos los períodos.

  • pct_of_spend: Es una lista numérica de tamaño n_paid_channels que contiene los porcentajes de la asignación para la inversión en medios. El orden debe coincidir con el de (InputData.media + InputData.reach) con valores entre 0 y 1, que sumen 1 en total. De forma predeterminada, se usa la asignación histórica. El presupuesto y la asignación se usan en conjunto para determinar la inversión en medios no optimizada, que, a su vez, se usa para calcular las métricas de rendimiento no optimizadas (por ejemplo, el ROI) y crear el rango factible de inversión en medios teniendo en cuenta las restricciones de inversión.

  • spend_constraint_lower: Es una lista numérica de longitud n_paid_channels para usar diferentes restricciones de inversión para diferentes canales o un solo valor float para aplicar la misma restricción de inversión en todos los canales de medios. Si se proporciona como un array indexado por canal, el orden debe coincidir con (InputData.media + InputData.reach). Indica el límite inferior de la inversión a nivel de los medios. El límite inferior de la inversión a nivel de los medios es ((1 - spend_constraint_lower) * budget * allocation). El valor ingresado debe estar entre 0 y 1. El valor predeterminado es 0.3 (es decir, el 70% de la inversión en medios) para un presupuesto fijo y 1 (es decir, el 0% de la inversión en medios) para un presupuesto flexible.

  • spend_constraint_upper: Es una lista numérica de longitud n_paid_channels para usar diferentes restricciones de inversión para diferentes canales o un solo valor float para aplicar la misma restricción de inversión en todos los canales de medios. Si se proporciona como un array indexado por canal, el orden debe coincidir con (InputData.media + InputData.reach). Indica el límite superior de la inversión a nivel de los medios. El límite superior de la inversión a nivel de los medios es (1 + spend_constraint_upper) * budget * allocation). El valor predeterminado es 0.3 (es decir, el 130% de la inversión en medios) para un presupuesto fijo y 1 (es decir, el 200% de la inversión en medios) para un presupuesto flexible.