Otimizando investimentos em marketing - O que a matemática pode fazer por mim?

Felipe Sassi
Datarisk.io
Published in
7 min readJun 15, 2021

Encontrar o investimento ótimo em canais de marketing pode ajudar uma empresa a impactar, de maneira mais eficiente, seus possíveis clientes.

Otimização numérica - O que é?

A modelagem matemática nos permite representar numericamente diferentes tipos de situações. Com essa representação em mãos podemos estar interessados em encontrar pontos ótimos de operação para nossos problemas.

A busca por pontos ótimos é auxiliada por métodos de otimização numérica, os quais permitem que diferentes tipos de funções (muitas que não podem ser analisadas analiticamente) sejam analisadas em busca de determinados pontos que maximizem ou minimizem seu valor.

A otimização numérica está no cerne do aprendizado de máquina, visto que vários problemas são resolvidos por meio da minimização de uma função custo (respeitando um conjunto de restrições).

A Figura 1 apresenta um gráfico do que é um ponto de mínimo. Ele apresenta uma função arbitrária e o trajeto de um ponto inicial qualquer até seu ponto mínimo.

Figura 1 — Exemplo de função e seu ponto de mínimo.

Neste artigo vamos entender como a programação linear (um campo da otimização numérica) pode impactar a maneira que investimentos em canais de marketing são realizados.

O que é programação linear?

Programação linear é o nome dado aos métodos para resolução de problemas de otimização em que tanto a função objetivo (o que queremos otimizar) quanto às restrições (barreiras que nossas variáveis precisam respeitar) são lineares.

Características interessantes desse tipo de problema:

É interessante notar que esse tipo de problema não pode ser resolvido de uma forma clássica — derivar e igualar o resultado a zero — já que a derivada de nossas variáveis é uma constante.

Outro ponto interessante é que, devido a natureza linear deste problema, todas as soluções estarão nas fronteiras do nosso conjunto de possíveis resultados.

Aplicações de programação linear:

A programação linear tem diferentes aplicações nas mais variadas áreas. Em análises de portfólios podemos encontrar uma alocação ótima de ações para maximizar nosso retorno ou minimizar nosso risco. Também podemos determinar o número ótimo de peças a serem produzidas por uma indústria dado um conjunto de possíveis peças e restrições (tempo total de produção, quantidade de matéria-prima etc).

Programação linear - Entendendo mais sobre

Como este problema é formulado matematicamente?

Matematicamente, o problema é formulado a partir de uma função objetivo (que representa o que queremos minimizar/maximizar) e um conjunto de restrições. Por exemplo, a equação abaixo representa nossa função objetivo, a qual queremos maximizar:

Nossa função objetivo — O que queremos maximizar.

Nosso conjunto de restrições é dado pelo seguinte conjunto de equações:

As restrições que nossa variáveis têm que respeitar.

O que queremos é encontrar uma combinação das duas variáveis que maximize o valor de z, respeitando as restrições fornecidas.

Como resolver este problema?

Uma das principais formas de se resolver este tipo de problema é com a utilização do método SIMPLEX. Este método resolve a questão de uma maneira mais eficiente que o método de força-bruta. Eu vou deixar alguns links nas referências para uma explicação mais detalhada do método [1], [2].

A solução de um problema de programação linear pode ser obtida por meio da análise da região formada pelo conjunto de restrições. Partindo desta região podemos testar os pontos de fronteira até acharmos um conjunto que maximize (ou minimize) nossa função objetivo. A Figura 2 apresenta a região (em verde) formada pelo conjunto de restrições do problema apresentado acima:

Figura 2 — Região formada pelo conjunto de restrições apresentadas anteriormente.

R1, R2, R3 e R4 indicam as nossas quatro primeiras restrições (as últimas duas equações somente definem que tanto X1 quanto X2 devem ser positivos).

Com a região em mão podemos ir testando diferentes combinações de pontos X1 e X2 até encontrarmos o par que maximize o resultado da nossa função objetivo.

Como podemos resolver este problema com Python?

Em Python os problemas de programação linear podem ser resolvidos com a ajuda de diferentes bibliotecas. Três possibilidades são:

Definindo nosso problema

O problema que precisamos resolver é comum no dia a dia de profissionais que trabalham com marketing e precisam realizar anúncios em diferentes canais.

Descrição do problema

Você tem um orçamento pré-definido para investir em 6 canais para anúncio (vamos chamar esses canais de C1, C2, C3, C4, C5 e C6). O intuito é atingir o maior público possível respeitando o orçamento disponível. Para isso, você precisará alocar certos percentuais de seu orçamento em cada canal. Algumas restrições de negócio são importantes:

  • O orçamento de cada canal não deve exceder 30% do total;
  • O orçamento de cada canal não deve ser menor do que 5% do total;
  • O orçamento total que será investido é de R$1 milhão.

Uma informação importante (que permite conectar o valor gasto em um canal com o total de usuários atingidos) é o custo por impressão (CPI). Cada canal tem o seguinte CPI:

  • C1: R$1,75;
  • C2: R$1,50;
  • C3: R$0,75;
  • C4: R$2,20;
  • C5: R$3,00;
  • C6: R$5,00.

A ideia do nosso problema é minimizar o CPI global da operação, ou seja, a razão entre o total gasto com marketing e o total de usuários impactados.

Utilizando uma estratégia simples para a solução do problema

Uma forma simples (e que cumpra as restrições) de se resolver esse problema é repartir igualmente o investimento ao longo dos seis canais.

Cada canal receberia R$166.666,666.

Isso impactaria um total de aproximadamente 593 mil usuários.

O CPI global deste investimento é de R$1,69.

Modelando matematicamente o problema:

Como queremos maximizar a quantidade de usuários atingidos, precisamos utilizar o inverso multiplicativo do CPI (para poder analisar quantos usuários conseguimos impactar a cada R$1,00 investido).

A nossa função objetivo fica dá seguinte forma:

Função objetivo que descreve o total de usuários atingidos a partir do investimento em cada canal.

As nossas restrições podem ser escritas da seguinte forma (INV representa o orçamento total que temos disponível):

Restrições impostas ao nosso problema.

A última restrição nos diz que o investimento total deve ser menor do que o orçamento desejado.

Resolvendo o problema com Python

Utilizando a biblioteca PuLP podemos construir a seguinte função para resolver nosso problema: vou deixar nas referências um artigo com outros exemplos de uso dessa biblioteca [3].

A Figura 3 apresenta o trecho de código usado para resolução.

Figura 3— Função que encontra o resultado para nosso problema de otimização. Essa solução é genérica o suficiente para abordar variações do problema apresentado com poucas modificações.

Nesta função necessitamos definir o valor total que deve ser investido (inv_total), o custo por impressão de cada um dos canais (representado pela lista cpi_list) e as restrições. As restrições são representadas como uma lista de três elementos:

O primeiro elemento é uma lista representando a equação que define a restrição. O segundo elemento é a restrição (seu valor numérico) e o terceiro elemento é a operação (menor igual ou maior igual) que a restrição deve respeitar.

Para exemplificar podemos pensar na nossa primeira restrição (investimento no canal C1 deve estar entre 5% e 30% do investimento total). A Figura 4 apresenta como esta restrição seria escrita (ela deve ser escrita como duas equações separadas):

Figura 4— Exemplo de como as restrições devem ser definidas na nossa função.

Resultados obtidos

Na Figura 5 podemos ver como a função declarada acima fica quando invocada com os parâmetros do nosso problema.

O primeiro argumento é o investimento total que temos disponível, o segundo argumento é a lista com o CPI de cada um dos seis canais e o terceiro argumento é lista de restrições do nosso problema.

Figura 5— Invocação da nossa função com os parâmetros do nosso problema.

Os resultados obtidos foram os seguinte:

Total de usuários: aproximadamente 792 mil.

Valor gasto: R$ 1 milhão.

A Figura 6 apresenta a alocação de investimento obtida.

Figura 6— Resultados obtidos de investimento por canal.

Nota-se que os canais com maior CPI tiveram a menor quantidade de orçamento alocado (respeitando as restrições impostas) e o canal com menor CPI teve a maior quantidade de orçamento alocada (também respeitando as restrições impostas).

Em termos de CPI global, nossa alocação ótima gerou um CPI de R$1,26, uma redução de aproximadamente 25% em relação a estratégia simples apresentada anteriormente.

Conclusão

Neste artigo vimos como explorar um problema conhecido (alocação de investimento em canais de marketing) por uma perspectiva de otimização numérica. O problema apresentado é uma simplificação, mas serve de direcionamento para a resolução de problemas práticos.

Como sugestão, indico o estudo de métodos de simulação de Monte Carlo, para deixar os resultados da otimização mais robustos a variações nos parâmetros da nossa função objetivo, como o CPI.

Espero que tenham gostado!

Se quiser saber mais sobre o assunto ou se tiver alguma dúvida entre em contato conosco:

SITE / LINKEDIN / INSTAGRAM / E-MAIL

Referências

[1] https://towardsdatascience.com/introduction-to-linear-programming-b6647d20d5f6

[2] — https://docs.ufpr.br/~volmir/PO_I_05_metodo_simplex.pdf

[3] https://coin-or.github.io/pulp/CaseStudies/a_two_stage_production_planning_problem.html

--

--

Felipe Sassi
Datarisk.io

Senior data scientist passionate about building things