Preços com função de demanda linear usando Gekko em Python

Como podemos decidir sobre o preço de um produto ou serviço usando dados observados ao longo do tempo? Por exemplo, um varejista pode ter alterado o preço de um produto específico em vários intervalos de tempo de uma semana, testado a quantidade demandada (vendas) com base em preços diferentes e agora deseja saber o preço ideal a ser definido para a próxima semana. Notavelmente, o preço ótimo deve maximizar a receita total do varejista. Este artigo descreve como o preço ideal
pode ser determinado usando Gekko em Python. Pode ser um dos casos possíveis em que otimização e aprendizado de máquina podem ser integrados!

Modelando e resolvendo o problema de precificação em Python

No início, codifico o problema de decisão de acordo com as seguintes suposições e os elementos do ambiente de tomada de decisão:

O conjunto de dados:

  • Consiste em observações Quantidade-Preço durante os dias úteis da
    semana anterior.

A função de demanda:

  • É estimado através de regressão linear.

O produto/serviço:

  • Pode ser de qualquer tipo, com qualquer característica.
  • Teve uma quantidade específica de vendas durante a semana anterior.
  • Tem experimentado diferentes níveis de preços durante a semana anterior.

Considere um conjunto de dados da seguinte forma:

VendasPreço
Segunda8020
Terça15022
Quarta20018
Quinta40025
Sexta14555
Sábado35015
Domingo40921

Esse código se ajusta a uma função linear (chamamos de função de demanda linear) e encontra uma inclinação e uma interceptação para minimizar o erro de previsão. Assim, resulta na seguinte saída:

import gekko as op
import itertools as it

#Developer: @KeivanTafakkori, 12 Mar 2022

def model (U,T,a,b,solve="y"):
    m = op.GEKKO(remote=False, name='LinearRegressionProblem') 
    x = {i: m.Var(lb=None, ub=None) for i in U}
    z = m.Var(lb=None, ub=None)
    g = {t: m.Var(lb=None,ub=None) for t in T}    
    n_a = {(t,i): a[t][i] for t,i in it.product(T,U)}
    n_b = {t: b[t] for t in T}  
    objs = {0: (2*len(T))**(-1)*sum((g[t]-n_b[t])**2 for t in T)}
    cons = {0: {t: (g[t] == sum(n_a[(t,i)]*x[i] for i in U) + z) for t in T}}
    m.Minimize(objs[0])
    for keys1 in cons:
        for keys2 in cons[keys1]: m.Equation(cons[keys1][keys2])   
    if solve == "y":
        m.options.SOLVER=1
        m.solve(disp=True)
        for keys in x: 
            x[keys] =  x[keys].value[0]
            print(f"x[{keys}]", x[keys])
        z = z.value[0]
        print("z", z)
    return m,x,z

#     Monday   Tuesday    Wednesday   Thursday   Friday   Saturday   Sunday
a = [   [80],    [150],       [200],    [400],    [145],    [350],    [409]]    #Sales
b = [     20,       22,          18,       25,       55,       15,       21]    #Price
U = range(len(a[0]))  #Set of input features
T = range(len(b))     #Set of the training points

m,x,z = model(U,T,a,b) #Model and solve the problem

Esse código se ajusta a uma função linear (chamamos de função de demanda linear) e encontra uma inclinação e uma interceptação para minimizar o erro de previsão. Assim, resulta na seguinte saída:

x[0] -0.02980603901
z 32.526238806

Em seguida, queremos definir um preço ideal para nosso produto/serviço com uma função de demanda linear prevista disponível para maximizar a receita. Considerando que a receita é gerada pela quantidade de vendas vezes o preço estabelecido, o seguinte modelo de otimização deve ser resolvido para encontrar o preço ótimo:

#Developer: @KeivanTafakkori, 12 March 2022

def model (x,z):
    m = op.GEKKO(remote=False, name='PricingProblem') 
    q = m.Var(lb=0, ub=None)  
    objs = {0: z*q+x*(q**2)}
    m.Maximize(objs[0])
    m.options.SOLVER=2
    m.solve(disp=True)
    print("total revenue: ", z*q.value[0]+x*(q.value[0]**2), "$")
    print("marginal revenue: ", z+2*x*q.value[0], "$")
    print("optimal price (maximum willingness to pay): ", z+x*q.value[0], "$")
    print("optimal sales (consumption level): ", q.value[0] , "units")
    return m

x = x[0]  # inclinação prevista da função de demanda usando regressão linear
z = z # intercepto previsto da função de demanda usando regressão linear

m = model(x,z)  # modele e resolva o problema

Resolvendo os resultados do modelo acima para a seguinte saída:

total revenue:  8873.673305852495 $
marginal revenue:  -5.7734276026621956e-08 $
optimal price (maximum willingness to pay):  16.263119374132863 $
optimal sales (consumption level):  545.63168982 units

Portanto, sugere-se definir o preço em 16,26 $ para gerar o máximo de receita possível (ou seja, 8873,67 $)!

Observações finais

Neste artigo, descrevi como um modelo de aprendizado de máquina pode ser integrado a um modelo de otimização para definir um preço ideal para nosso produto/serviço. Os leitores interessados podem aprender mais sobre aplicações de otimização em aprendizado de máquina, ou solvers e interfaces em Python visitando as referências vinculadas. Se você achar esses conteúdos perspicazes, informe-nos comentando abaixo deste artigo!

Se este artigo for usado em pesquisa ou outros métodos de publicação, você pode citá-lo como Tafakkori (2022) (no texto) e se referir a ele da seguinte forma: Tafakkori, K. (2022). Preços com função de demanda
linear usando Gekko em Python. Análise de Dados da Cadeia de Suprimentos. url:
https://www.supplychaindataanalytics.com/pricing-with-linear-demand-function-using-gekko-in-python/

Leave a Reply

Deixe um comentário

O seu endereço de e-mail não será publicado.

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

Close

Meta