Determinando o Preço com técnicas de Data Science (Teoria e prática)

Roberth Macedo Silva
Data Hackers
Published in
18 min readDec 28, 2023

--

Imagem ilustrativa relacionando os métodos e ferramentas utilizadas

Ao buscar há algum tempo técnicas de precificação e revisitar manuais de microeconomia, não encontrei maneiras práticas e objetivas que realmente me levassem a um resultado esmagador em relação ao que buscava. Por esse motivo, resolvo me aprofundar no tema e escrever este pequeno (talvez não muito rs) artigo, que busca materializar o resultado encontrado e contribuir na divulgação de uma técnica de precificação, abordando aspectos práticos e teóricos.

Como é de se esperar, para a resolução de um problema complexo, a resposta não será trivial, envolvendo microeconomia, algoritmos de classificação, regressão, testes de hipóteses e otimização matemática. Para todos esses campos, obviamente se levou meses, talvez anos, mas a ideia de dominar aqui é auxiliar tanto economistas (que não têm necessariamente todas as técnicas desenvolvidas), Analistas/Cientistas de Dados que não possuem o arcabouço teórico para esquematizar o raciocínio a priori, ou alguém que só precisa de um norte, e assim, em qualquer um dos casos, que os específicos podem chegar a resultados esmagadores de uma maneira mais fácil!

Discussão teórica:

Na teoria econômica, para o mercado de concorrência perfeita, o preço é dado. Portanto, caso você esteja em um mercado totalmente competitivo, você simplesmente precisa de um benchmarking e ajustar a oferta realizada conforme sua curva de custos, atendendo ao máximo o público disponível, até o ponto em que o retorno é igual a zero.

No entanto, em mercados com mark-up e/ou diferenciação de produtos, é necessário determinar o preço que iremos praticar. Em tese, a teoria de aprendizagem de que uma empresa deve produzir em seu ponto de lucro máximo (obrigado, capitão óbvio!), que é determinada por:

Lucro = Receita - Custo

Reescrevendo, temos:

Lucro = (Preço x Quantidade) - (Custo Unitário x Quantidade + Custos Fixos)

Lucro = [Quantidade (Preço - Custo Unitário)] - Custos Fixos

Isolando os custos fixos, encontramos o ponto de equilíbrio para não haver prejuízos:

Ponto de Equilíbrio
[Quantidade (Preço - Custo Unitário)] = Custo Fixo

Já para obtermos lucro, precisamos que o nosso lado esquerdo da busca seja maior que o direito. Assim:

Lucro = [Quantidade (Preço — Custo Unitário)] > Custos Fixos

Aqui partiremos da suposição de que essa relação é verdadeira na operação de interesse (no curto prazo econômico essa aplicação pode não ser verdadeira, mas não entrarei nesse mérito).

Focaremos portanto na parte esquerda da descoberta:

[Quantidade (Preço — Custo Unitário)]

Aqui denominaremos de Margem a relação entre Preço e Custo Unitário . Logo simplificaremos da seguinte forma:

Lucro = Quantidade x Margem

Com isso, podemos ter alguns insights valiosos:

  1. Quanto maior a quantidade ou a margem , maior será nosso lucro. Logo, você sempre buscará ter a maior relação entre Quantidade e Margem possível, isso maximizará seu lucro.
  2. O Preço aqui necessariamente precisa ser maior que o Custo Unitário, caso contrário, a operação perde o sentido de existir, já que teríamos uma margem negativa multiplicada n vezes pela quantidade produzida.

Essa relação entre Preço e Quantidade, por sua vez, será regida pela chamada Curva de Demanda. Afinal, pensamos no maior preço possível, mas isso não significa que alguém estaria disposto a pagar. Por esse motivo, para que determinemos o maior preço pelo qual as pessoas estão dispostas a pagar, precisamos descobrir a chamada curva de demanda, que basicamente é uma busca que descreve a relação entre Preço x Quantidade de cada indivíduo ou grupo, onde a relação com o preço é inversamente proporcional (quanto maior o preço, menor a quantidade demandada):

Gráfico de Preço vs Quantidade (curva descendente da esquerda para a direita)

Se conversarmos sobre a disposição de pagar de cada indivíduo e pudermos praticar o preço máximo de cada um, obteremos o maior lucro possível, pois não deixaríamos de vender para ninguém que estivesse disposto a pagar o preço mínimo que determinaríamos, ao mesmo tempo em que garantiríamos os maiores valores possíveis de cada indivíduo. A esse nível de diferenciação, damos o nome de discriminação perfeita ou de primeiro grau.

No entanto, são raros os casos em que conseguem obter esse nível de diferenciação, mesmo em leilões onde os consumidores revelam a sua disposição a pagar, é comum que aquele indivíduo ainda tenha alguma disposição para pagar um a mais (o chamado excedente do consumidor) .

Além da discriminação de primeiro grau, ainda temos as discriminações de segundo grau, que basicamente são preços diferenciados para maiores quantidades consumidas e a chamada discriminação de terceiro grau, que distingue o tipo de consumidor. Essa distinção pode ser feita a partir de pequenas diferenciações no produto, em sua embalagem, ou através de técnicas de Ciência de Dados, como aplicamos aqui, utilizando segmentações e testes A/B para entender como diferentes grupos se comportam diante de um determinado preço.

Sobre a solução

A solução aqui proposta se sustenta em 4 pilares:

  1. Desenho Amostral (Estatística Aplicada)

2. Comportamento de cada grupo (Testes A/B)

3. Estimativa da Curva (Regressão)

4. Definição do Preço (Otimização Matemática)

Esmiúçando:

  1. Desenho Amostral: Poderíamos realizar nossa análise aplicando um preço determinado para todos os nossos clientes, ao final de um período verificamos se o lucro aumentou ou adicional. Em partes, excetuando os efeitos sazonais, ou outras externalidades, daria certo, porém uma estratégia errada nos custaria caro… Além de termos que testar apenas uma estratégia por vez. Por esse motivo sempre ganhamos com amostras, assim, podemos saber o comportamento do nosso público como um todo, observando apenas pequenas partes do mesmo. Como ouvi certa vez: “É como provar uma limonada, você não precisa beber tudo para descobrir se está azeda.”
  2. Comportamento (testes A/B): Utilizaremos uma técnica denominada teste A/B (o nome é estranho, mas a técnica é bem simples). Essa técnica serve para que possamos comparar o comportamento/reação de dois (ou mais) grupos. Por exemplo, quando o Facebook quer saber se o número de usuários que clicam nos anúncios é maior quando os anúncios são específicos do lado direito ou no topo da página, basicamente eles dividem os usuários em diferentes grupos (similares estatisticamente), aplicando as mudanças e Apuram houve uma diferença significativa de comportamento entre os grupos testados. Aqui, exatamente isso, no entanto, usaremos preços diferentes dentro de cada perfil escolhido.
  3. Estimativa da Curva (Regressão): Depois, com o resultado do comportamento dos clientes em mãos, vamos verificar as variações de demanda(y) a partir de descontos descontos(x), utilizaremos uma regressão para determinar qual a orientação descrita na relação entre a relação da Demanda a partir da variação dos Preços, descobrindo assim a nossa Curva de Demanda.
  4. Definindo o Preço (Otimização Matemática): Por fim, com a nossa curva de demanda em mãos, vamos determinar qual o preço ótimo para o todo ou para cada grupo (definido no primeiro passo). Basicamente equacionaremos nosso lucro em função de nossas variáveis ​​de custos e curva de demanda, com um Solver encontraremos o ponto de máximo dessa pesquisa.

Mão na massa!

Agora que sabemos tudo o que precisamos/que precisamos fazer, vamos para a parte fácil: aplicar!

Para começar vamos criar uma base para trabalhar, você usará o T-SQL, mas tenha a vontade de usar a linguagem de sua preferência. Aqui vamos criar 36 mil IDs (vou criar sequenciais para facilitar a leitura), além de incluir preços, custos e dados de referência.

/* cria tabela de compras */  

CREATE TABLE tb_compras(id int , dta_ref date , preco float , cst_uni float , compra smallint );

/* cria 36 mil ids sequenciais */

WITH tb_cli
AS (
SELECT 1 AS id

UNION all

SELECT id + 1
FROM tb_cli
WHERE id < 36000
)

/* popula tabela com 36 mil ids sequenciais, dados de referência,
preço, custo e indicador de compra aleatória (0 ou 1). */

INSERT INTO tb_compras (id, dta_ref, preco, cst_uni, compra)

/* o newid basicamente irá gerar um valor aleatório, com números e caracteres.
Combinado com o checksum, garantimos que seja um número. Em sequência
obtemos o resto da divisão (%). Deste resto tiramos o módulo e depois
tratamos os valores que são menores que 0,6 como 0 e o restante como 1.
Para o resto de 2, sabemos que só há |0 ou 1|, mas quando formos aplicar
outras divisões, afim de obter diferentes probabilidades, isso não será verdade. */

SELECT id
, '2023-01-01' as dta_ref
, 14.00 as preco
, 3.20 as cst_uni
, CASE WHEN ( abs ((checksum(newid())) % 2 )) > 0.6 THEN 1 ELSE 0 END compra
FROM tb_cli
OPÇÃO (recursão máxima 0 )

Após a criação e população da tabela, esperamos um resultado semelhante a esse:

Imprimir a saída após aplicação do código e tabela de dados resumida

Definindo nosso experimento, para definir uma amostra:

De início vou te dar uma dica de ouro para fazer isso bem: faça um desenho experimental bem feito! Isso te poupará muito tempo.

Você pode acreditar que simplesmente pegar dois preços distintos, aplicados em diferentes momentos e comparar os detalhes exigidos para dar um bom resultado, mas isso acontecerá, acredite!

O principal motivo é que na vida real muitas vezes nos deparamos com funções que não são bem comportadas em relação à nossa variável de interesse, ou seja, para um mesmo preço vamos ter quantidades exigidas diferentes.

Isso acontece por diversos motivos, mas em geral acontecerá por fatores externos à nossa variável de interesse. Podemos pensar por exemplo em sorvetes, que terá uma demanda menor no inverno, e o fato do preço ser igual ao do verão, não fará com que o consumo seja semelhante. Ou seja, há um fator externo, além do preço, que influencia na demanda.

Esses fatores podem ser diversos ao longo do tempo, fazendo com que as empresas tenham grandes oscilações ao compararmos períodos distintos, mesmo com preços iguais.

Dito isso, como fazemos então para medir apenas a influência do preço sobre a nossa demanda?

Nós sempre medimos as variações no mesmo período de tempo!

Utilize estatísticas ao seu favor e obtenha grupos semelhantes, retirando amostras representativas de sua população e realizando comparações ao longo do tempo.

Representação de uma amostragem — imagem própria

Aqui, selecionaremos nossos grupos, o de experimento e o controle. Ambos pertencem à nossa população e precisamos garantir que a amostra seja completamente examinada. Além disso, precisamos que o tamanho amostral seja significativo para nossas conclusões.

Lembrando que somos específicos em uma comparação de proporções (vamos comparar as variações de demanda), portanto, seguindo a sugestão deste artigo: “ Cálculo de Tamanho de Amostra: Proporções ” Marilyn Agranonik e Vânia Naomi Hirakata, vamos obter uma amostra que nos permite encontrar no mínimo 40 indivíduos. Isso significa que se não houver público selecionado para o experimento ou controle, esperamos converter apenas 10% em nosso funil, precisamos selecionar uma amostra de no mínimo 400 indivíduos, mas obviamente, quanto maior a amostra, melhor.

É importante ainda frisar que precisamos de 40 indivíduos para cada um dos grupos , logo, se queremos testar 3 preços, por exemplo, necessitaremos de 3 grupos experimentais e 1 um grupo de controle, totalizando 4 amostras ao todo. Para nosso exemplo, onde há uma conversão de 50% no fim do funil, precisaríamos de apenas 320 indivíduos, para 4 grupos.

Aqui deixo 2 adendos:

  1. Caso quiséssemos ir além e verificar o comportamento de diferentes grupos dentro de cada grupo, esse número seria multiplicado pelo número de estratificações, por exemplo, caso quiséssemos distinguir o comportamento entre homens e mulheres, teríamos 2 estratificações, portanto teríamos os 320 que encontramos anteriormente, multiplicado por 2, obtendo 640 indivíduos.
  2. Os grupos não precisam ter tamanhos iguais. Nós apenas definimos os tamanhos mínimos para cada grupo, caso quiséssemos obter um grupo de 20.000 e dois de 5.000, por exemplo, não haveria problema algum.

Agora vamos ver como realizar essa seleção na prática, utilizando SQL:

Apesar de precisarmos de uma amostra mínima de 80 indivíduos por grupo, vamos usar aqui um padrão de 4.000, já que temos base mais do que suficiente e não gastaremos nenhum dinheiro na nossa simulação, ao contrário do que acontece muitas vezes na nossa realidade.

/* cria tabelas para armazenar os grupos de interesse */  
CREATE TABLE GRUPO_1 (ID INT );
CRIAR TABELA GRUPO_2 (ID INT );
CRIAR TABELA GRUPO_3 (ID INT );
CRIAR CONTROLE DE TABELA (ID INT );

/* popula a primeira tabela com 4000 clientes aleatórios */

INSERT INTO GRUPO_1 (ID)

SELECT TOP 4000
A.ID
FROM tb_compras A
ORDER BY
NEWID();

/* popular a segunda tabela com 4000 clientes aleatórios,
após excluir clientes selecionados na primeira tabela*/
INSERT INTO GRUPO_2 (ID)

SELECT top 4000
A.ID
FROM tb_compras A
LEFT JOIN GRUPO_1 B
ON A.ID = B.ID
WHERE B. ID É NULO
ORDER BY
NEWID();

/* popular a segunda tabela com 4000 clientes aleatórios,
após excluir clientes selecionados na primeira e segunda tabela*/
INSERT INTO GRUPO_3 (ID)

SELECT TOP 4000
A.ID
FROM tb_compras A
LEFT JOIN GRUPO_1 B
ON A.ID = B.ID
LEFT JOIN GRUPO_2 C
ON A.ID = C.ID
ONDE B.ID É NULO
E C.ID É NULO
ORDER BY
NEWID();


/* popular a segunda tabela com 4000 clientes aleatórios,
após excluir clientes selecionados na primeira e segunda tabela*/
INSERT INTO CONTROLE (ID)

SELECT TOP 4000
A.ID
FROM tb_compras A
LEFT JOIN GRUPO_1 B
ON A.ID = B.ID
LEFT JUNTE-SE AO GRUPO_2 C
EM A.ID = C.ID
À ESQUERDA JUNTE-SE AO GRUPO_3 D
EM A.ID = D.ID
ONDE B.ID É NULO
E C.ID É NULO
ED.ID É NULO
ORDER BY
NEWID();

Em resumo, nós criamos 4 grupos de 4 mil indivíduos, sem intersecção, dentro de uma população de 36 mil indivíduos.

4 Grupos de amostra, sendo 3 grupos de teste + 1 controle

Talvez você se pergunte qual o motivo de selecionarmos um grupo de controle, ao invés de simplesmente observar o restante da população, mas quando há entrada e saída de clientes da base, isso pode se tornar um transtorno, já que você precisará ficar regredindo no tempo para verificar quem fazia parte da sua população no momento da seleção dos grupos.

Aplicando o Experimento: Agora que já temos nossas amostras, vamos utilizá-las!

A minha sugestão aqui é dar cupons de descontos para os grupos selecionados, mas obviamente vai depender do tipo de negócio que você está inserido, o importante é conseguir aplicar algum tipo de redução de preços.

Costumeiramente, diminuir o preço de um determinado grupo é muito mais fácil do que aumentar, pelos atritos causados. Mas na prática, essa diminuição também nos traz insights para podermos aumentar o preço, caso faça sentido.

No nosso caso, vamos aplicar 10%, 20% e 30% respectivamente de descontos, mas aqui é importante você observar aquela regra que incluímos na nossa parte teórica: O Preço necessariamente deve ser maior que o custo unitário!

Logo, se 10%, 20% ou 30% de desconto fizerem com que a sua margem fique negativa, você NÃO deve aplicar um percentual tão grande.

Voltando para o nosso experimento, ele ficará estruturado da seguinte maneira:

Aqui observamos que a nossa conversão atual é de 50% e queremos conhecer qual será a conversão após realizarmos as reduções de preços.

Note que a margem diminui quando diminuímos o preço, no nosso controle temos uma margem de R$ 10,80 contra R$ 6,60 no nosso último grupo. Isso significa no fim do dia que precisamos converter 63,3% a mais para ficar no zero a zero. Logo, aquela conversão de 50% necessita atingir 81,8% para chegarmos no equilíbrio (nada fácil, né?).

Nota: Caso o seu negócio trabalhe com grandes margens, pode ser que descontos maiores façam mais sentido, neste caso, recomendo adicionar mais grupos, o que te proporcionará conhecer mais pontos ao longo da sua curva de demanda.

Partindo para a prática:

Adicionaremos agora em nossa base tb_compras o segundo período, com a redução de preços descrita e os respectivos consumos após a redução.

INSERT INTO tb_compras (id, dta_ref, preco, cst_uni, compra)

/* popula grupo 1 */
SELECT a.id
, '2023-02-01' as dta_ref
, 12.6 as preco
, 3.20 as cst_uni
, CASE WHEN (abs((checksum(newid())) % 3)) > 0.6 THEN 1 ELSE 0 END compra
FROM tb_compras A
INNER JOIN GRUPO_1 B
ON A.ID = B.ID

UNION ALL

/* popula grupo 2 */

SELECT a.id
, '2023-02-01' as dta_ref
, 11.2 as preco
, 3.20 as cst_uni
, CASE WHEN (abs((checksum(newid())) % 4)) > 0.6 THEN 1 ELSE 0 END compra
FROM tb_compras A
INNER JOIN GRUPO_2 B
ON A.ID = B.ID

UNION ALL

/* popula grupo 3 */

SELECT a.id
, '2023-02-01' as dta_ref
, 9.8 as preco
, 3.20 as cst_uni
, CASE WHEN (abs((checksum(newid())) % 5)) > 0.6 THEN 1 ELSE 0 END compra
FROM tb_compras A
INNER JOIN GRUPO_3 B
ON A.ID = B.ID

UNION ALL
/* popula grupo 3 */

SELECT a.id
, '2023-02-01' as dta_ref
, 14.00 as preco
, 3.20 as cst_uni
, CASE WHEN (abs((checksum(newid())) % 2)) > 0.6 THEN 1 ELSE 0 END compra
FROM tb_compras A
LEFT JOIN GRUPO_1 B
ON A.ID = B.ID
LEFT JOIN GRUPO_2 C
ON A.ID = C.ID
LEFT JOIN GRUPO_3 D
ON A.ID = D.ID
WHERE B.ID IS NULL
AND C.ID IS NULL
AND D.ID IS NULL

Após a execução do nosso código, temos agora dois períodos distintos, sendo que no segundo há clientes com 4 diferentes preços ofertados:

Agora, para começar a entender o que aconteceu, vamos construir uma visualização com nossas amostras e suas respectivas variações:

 /* agrupando as amostras em uma só tabela e criando um campo para facilitar a identificação de cada grupo */ 
WITH tb_grupo
AS (SELECT ID
, 'G1' AMOSTRA
FROM GRUPO_1

UNION ALL
SELECT ID
, 'G2' AMOSTRA
FROM GRUPO_2

UNION ALL
SELECT ID
, 'G3' AMOSTRA
FROM GRUPO_3

UNION ALL
SELECT ID
, 'CONTROLE' AMOSTRA
FROM CONTROLE
)

/* agrupando os resultados por grupo e data */

SELECT dta_ref
, ISNULL(AMOSTRA, 'POPULACAO') amostra
, COUNT(*) qtd_cli
, sum(compra) qtd_compras
, max(preco) preco_uni
, max(cst_uni) cst_uni
, sum(compra * preco) receita
, sum(compra * cst_uni) custo_total
, sum(compra * (preco - cst_uni)) lucro
FROM tb_compras A
LEFT JOIN tb_grupo B
ON A.ID = B.ID
GROUP BY
dta_ref
, amostra

Daqui temos as variações de preço e conversões em fev/23, quando reduzimos nossos preços em comparação a jan/23:

Obtendo nossa curva de Demanda com Python:

Finalmente podemos respirar aliviados e focar na relação que estamos interessados desde o início: Preço vs Quantidade (ou Conversão).

Essa relação nos dá a tão aclamada curva de demanda, bastando que realizemos uma regressão utilizando um pouco de python:

# importando as bibliotecas
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# importando as variacoes de preçoes que encontramos a partir dos testes A/B e criando um data frame
data = [[1, 14, 0.508], [2, 12.6,0.6768], [3, 11.2,0.7518], [4, 9.8,0.8015]]
datas = pd.DataFrame(data, columns=['n', 'preco','conversao'])

# visualizando o dataframe
print(datas)

# divindo o conjunto de dados em X e y para treinar o modelo
X = X = datas.iloc[:, 1:2].values
y = datas.iloc[:, 2].values

# importando a biblitoteca e treinando uma regressão lienar
from sklearn.linear_model import LinearRegression
lin = LinearRegression()
lin.fit(X, y)

# importando a biblioteca para regressão polinomial e definindo o grau
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree = 2)
X_poly = poly.fit_transform(X)
poly.fit(X_poly, y)

# treinando nossa regressão do segundo grau
lin2 = LinearRegression()
lin2.fit(X_poly, y)


# visualizando a nossa curva de demanda
plt.scatter(X, y, color = 'blue')

plt.plot(X, lin2.predict(poly.fit_transform(X)), color = 'red')
plt.title('Polynomial Regression')
plt.xlabel('Temperature')
plt.ylabel('Pressure')
plt.show()

# coeficientes e intercepto da equação -> a equação que estamos procuranndo
print('Coeficientes: ', lin2.coef_)
print('Intercept: ', lin2.intercept_)

Caso quiséssemos realizar detalhes para novos consumidores aplicados, que passamos além do nosso intervalo definido, o ideal seria dividir a base em treino e teste, para que o modelo pudesse ser devidamente ajustado e sua acurácia apurada para valores ainda desconhecidos.

No entanto, aqui mesmo com um grande overfiting, somos específicos na questão que melhor descreve a relação entre nossos preços e detalhes.

Assim, traçando a nossa curva de demanda, temos:

curva de demanda da esquerda para a direita, descendente.

Agora, juntando nossos coeficientes e nosso intercepto, a nossa pesquisa:

Equação: y = -0,0152X² + 0,293x — 0,6156
Equação de Demanda: Y = -0,0152X² + 0,293X — 0,6156

Obs: caso não tenha a menor ideia de como fazer uma regressão, vou deixar como recomendação o artigo mais conciso de regressão polinomial que encontrei, no entanto, quando tiver mais tempo, recomendo que se aprofunde no tópico, não é tão difícil quanto parece e será muito mais útil do que você possa imaginar!

Com a análise em mãos, vamos medir quanto a variação do preço interfere na quantidade demandada neste nosso exercício: Essa análise é chamada de especificidade do preço da demanda e basicamente tem como finalidade medir quanto 1% na variação do nosso preço provoca a variação na nossa demanda .

É importante frisar que a elasticidade normalmente não é igual ao longo da curva, caso isso aconteça dizemos que essa curva é isoelástica, mas na maioria dos casos não é verdade. Logo, o que faremos é medir a elasticidade em um ponto de interesse, aqui medimos em P = 12. Assim:

Ep = (%ΔQ / %ΔP) = (-1,24%/ 1%) = |-1,24|

Isso significa que nesse ponto da curva, com uma redução no preço de 10%, esperamos aumentar a demanda em 12,4%, um aumento proporcionalmente maior na demanda do que no preço, o que significa dizer que temos uma demanda de metalúrgico .

Por fim, vamos ao que mais nos interessa: Definir o Preço (Aleluia!)!

Com a curva de demanda em mãos é bem simples definir o preço, basta entender e equacionar a nossa função lucro em torno de nossas variáveis, afinal toda a discussão se iniciou em torno dele, né?

Recapitulando, temos que:

Lucro = (Preço — Custo Unitário) x Quantidade

no entanto, sabemos que a quantidade pode ser compensada pela curva de demanda que encontramos logo acima (em função do preço), logo:

Lucro (p) = (Preço — Custo Unitário) x (-0,0152 x Preço² + 0,293 x Preço — 0,6156)

Para finalizar, precisamos encontrar o Preço que nos retornará o maior lucro possível. Como temos toda a nossa solução escrita em função de apenas uma variável (Preço) , basta usarmos um Solver, que de maneira simples testará vários preços em uma espécie de loop e nos retornará o preço associado ao maior lucro possível.

Abaixo mostro como devemos parametrizar o Solver, que nos exige montar a segurança, determinar um propósito e incluir as restrições:

Configurações do Solver para obtermos o nosso ponto de máximo

Aqui tenho um custo pré-determinado, mas caso o seu custo varie de acordo com as quantidades vendidas, basta equacioná-lo dentro da sua função lucro, em função da sua quantidade ou preço .

Feito isso, basta mandar processar e em questão de segundos terá o seu resultado.

No nosso caso, o preço retornado pelo Solver foi de R$ 12,19. Logo, esse é o preço que maximiza o nosso lucro e deveríamos praticar para toda a nossa base.

Gráfico da função lucro, formando uma parábola em que o ponto de máximo está no centro do gráfico.

Planejando valores de preço em nossa oportunidade de lucro, conseguimos facilmente visualizar aquilo que o Solver nos entregou… Mas o mais interessante a se observar aqui é o formato da curva de lucro, que comumente é uma oportunidade do segundo grau, e portanto terá um ponto de máximo bem definido, com certa distância dos preços extremos.

Acaba? Quase…

Se você chegou até aqui, parabéns por me aguentar! Em troca vou deixar um bônus que pode melhorar ainda mais seus resultados em termos de lucro.

Vamos falar um pouco mais sobre a descrição anterior do terceiro grau e como podemos combiná-la com o nosso modelo desenvolvido até aqui.

Basicamente, a ideia da discriminação de terceiro grau é dividir os consumidores em dois ou mais grupos. Podemos oferecer o mesmo produto, porém em embalagens diferentes, oferecer passagens de 1ª ou 2ª classe, ou aplicar melhores preços para estudantes… Enfim, há algumas maneiras de criarmos diferentes grupos dentro do nosso negócio, para cada grupo criado ter uma curva de demanda uma parte. Portanto, caso você opte por incluir uma discriminação do terceiro grau, saiba que o número de curvas de demanda será multiplicado pelo número de grupos que definimos. Caso tivéssemos 3 grupos, teríamos algo assim:

Diferentes Curvas de demanda para preços iguais

Mas como podemos definir esses grupos utilizando nossos conhecimentos de dados?

Sabe aquela segmentação de clientes que quase sempre encontramos nas empresas que surgiram? Eu começaria por aí… Verificando se os clientes dessas diferentes segmentações possuem uma curva de demanda semelhante.

Mas, e se não tivermos nenhuma segmentação pré-definida?

Neste caso a minha sugestão é de um algoritmo de clusterização, como k-prototypes. Essa é uma classe de algoritmos não supervisionados, o que significa que você simplesmente precisa indicar quais são as características de interesse, para que o mesmo te devolva os sonhados clusters…

Caso vá seguir essa linha, mas não faz ideia por onde começar, fique aqui a minha sugestão de leitura: Clustering — Conceitos básicos, principais algoritmos e aplicações , Felipe Azank e Gustavo Corrêa

Quantos clusters?

A quantidade pode ser definida através de outro algoritmo, ou simplesmente pode ser definida por você. Aqui eu iria na segunda opção, definiria algo como 2 ou 3 grupos, porque a quantidade de clusters será multiplicada pela quantidade de grupos que temos em nosso teste A/B, logo, muitos clusters deixarão nossos testes extremamente complexos, além de nos exigidos amostras muito maiores, observe apenas como ficaria a nossa matriz de testes caso resolvêssemos aplicá-lo para os 3 clusters:

Novos grupos de amostra, agora com 12 grupos, em vez de 4.

Agora ao invés de 4 grupos, temos 12, nossa amostra de 16 mil clientes passaria para 48 mil (no nosso exemplo, com uma população de 36 mil, precisaríamos reduzir os grupos). Imagina aplicarmos isso para 5 clusters ou 10… No mínimo, complicado! Então, fica a dica, mantenha 2 ou 3 grupos e se for o caso teste outros posteriormente, afinal, não precisa fazer tudo hoje, deixa um dia pra amanhã...

Referências:

  1. PINDYCK , RS ; RUBINFELD , DL Microeconomia . 8. ed. São Paulo: Pearson Prentice
  2. AGRANONIK, M.; HIRAKATA , VN Cálculo de tamanho de amostra: proporções. Revista HCPA. 2011;31(3):382–388
  3. STOJILJKOVIĆ , M. _ Programação linear prática: otimização com Python
  4. VIANA, J. Como Gerar Números Aleatórios no SQL Server
  5. AZANK, F; CORRÊA, G; Clustering — Conceitos básicos, principais algoritmos e aplicações

--

--

Roberth Macedo Silva
Data Hackers

As vezes sobre economia ou demografia, as vezes sobre estatística ou tecnologia... Mas sempre sobre dados.