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:
| Vendas | Preço | |
| Segunda | 80 | 20 |
| Terça | 150 | 22 |
| Quarta | 200 | 18 |
| Quinta | 400 | 25 |
| Sexta | 145 | 55 |
| Sábado | 350 | 15 |
| Domingo | 409 | 21 |
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/

Engenheiro industrial com foco no aproveitamento de métodos de otimização e tecnologias de inteligência artificial usando várias linguagens de programação para capacitar uma empresa a atingir seus objetivos!

Leave a Reply