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