A estimativa da curva de adoção do produto é um domínio de marketing que pode se beneficiar da modelagem baseada em agente. Como estou trabalhando atualmente em uma estrutura de modelagem baseada em agente, eu queria adicionar um modelo simples de vendas de produtos baseado em agente de boca a boca a este blog . O modelo pode ser usado como uma linha de base simples para modificações adicionais (customização). Estou implementando este modelo em Python. O framework aplicado por mim pode ser encontrado aqui:
- Link : abm_framework
Eu já compartilhei dois outros exemplos aplicando a estrutura acima. No primeiro exemplo, desenvolvi um modelo SIR baseado em agente . Esses modelos podem, por exemplo, ser usados para modelar a disseminação de doenças.
Em outro exemplo, implementei um modelo de segregação social em Python.
Agora discutirei brevemente o modelo boca a boca e mostrarei sua implementação em Python.
Modelo conceitual simples de boca a boca
Este exemplo aplica um ambiente de simulação baseado em grade com uma única população de agente. Cada agente é caracterizado por uma variável binária. A variável representa se o agente já comprou o novo produto (adoção do produto) ou não.
A seguinte lógica é aplicada:
- Para cada iteração, todos os agentes são chamados uma vez (em sequência aleatória)
- Quando um agente é chamado, o agente avalia sua vizinhança
- Se o agente já comprou o novo produto, os vizinhos são influenciados pelo agente e convencidos a comprar o novo produto com uma probabilidade especificada. Ou vice-versa, o agente é convencido por qualquer vizinho que já comprou o produto (com a mesma probabilidade)
- Os agentes só podem comprar o produto uma vez. Depois de comprar o produto, seu status permanece inalterado
Modelo boca a boca baseado em agente em Python
O código abaixo aplica o abm_framework e implementa o modelo boca a boca acima.
__author__ = "Linnart Felkl"
__email__ = "LinnartSF@gmail.com"
if __name__ == "__main__":
print("demo starts")
import sys
from pathlib import Path
file = Path(__file__).resolve()
parent, root = file.parent, file.parents[1]
sys.path.append(str(root))
# remove the current file's directory from sys.path, unless already removed
try:
sys.path.remove(str(parent))
except ValueError:
pass
import data
import stats
import config
import framework
import random
import animation
# setup database manager and connection
db = data.Database("sqlite3", config.path_databasefile)
db_manager = data.Manager(db)
# create an empty environment
env = framework.Environment(1, True, 20, 20, db_manager)
# create initial population of healthy humans
attrs = ["purchased"]
datatypes = ["INTEGER"]
pops = framework.Populations(amount = 1, env = env, db_manager = db_manager, attributes = attrs, datatypes = datatypes)
pops.add_population(name = "customers",
size = 100,
attributes = attrs,
datatypes = datatypes,
initialvals = [0]
)
# model specific global settings (parameter values)
_prob_recommend = 0.03
_impactarea = 2
_initialclients = 1
# setup simulation
sim = framework.Simulation(200)
# make sure that environment and agents tables in database are ready
pops.write_env_to_db(sim.Iteration)
pops.write_agents_to_db(sim.Iteration)
agents = pops.get_agents()
# set initial purchases
for _ in range(_initialclients):
agent = random.choice(agents)
agent.set_attr_value("purchased", 1)
# execute simulation run; with centralized simulation control
while sim.run():
# select one random agent after the other
random.shuffle(agents)
for agent in agents:
# get that agents neighbourhood
neighbours = env.get_neighbourhood(agent, mode = "moore", radius = _impactarea)
for neighbour in neighbours:
if agent.get_attr_value("purchased") == 1 and neighbour.get_attr_value("purchased") == 0 and random.uniform(0,1) < _prob_recommend: neighbour.set_attr_value("purchased", 1)
if agent.get_attr_value("purchased") == 0 and neighbour.get_attr_value("purchased") == 1 and random.uniform(0,1) < _prob_recommend:
agent.set_attr_value("purchased", 1)
break
# update results in database, for agents and for environment
pops.write_agents_to_db(sim.Iteration)
pops.write_density_to_db(sim.Iteration)
# get dataframes with simulation results
agents_df = db_manager.get_agentsdf()
density_df = db_manager.get_densitydf()
# visualize simulation data
stats.set_fontsizes(8,10,12)
stats.plot_avgattr_lines(["purchased"], agents_df)
stats.save_plot("avgpurchasingshare")
animation.animate_density(
df = density_df,
filename = "purchasinganimation",
attr = "purchased",
defaultsize = 50,
color = "blue",
tpf = 0.05
)
# end program
db.close()
print("demo ends")
Discuto os resultados da simulação na seção seguinte.
Resultados da simulação boca a boca
O gráfico abaixo da linha foi gerado pelo abm_framework e mostra a participação total de clientes que já adquiriram o produto. Com as configurações de modelo fornecidas, o mercado é totalmente penetrado. A adoção do produto segue uma curva de adoção um pouco em forma de s. Isso é o que eu esperava das configurações do modelo.
A animação abaixo também mostra a adoção do produto em toda a grade. Esta simulação começou com um único agente. É por isso que a adoção do produto se espalha a partir daí. A grade é infinita, o que significa que ao sair da grade, por exemplo, do lado direito, você entra na grade do lado esquerdo. Ao sair da grade na parte superior, você entra na grade na parte inferior. A grade não tem limite.
Os resultados serão diferentes quando você ajustar as configurações e condições do modelo. Os resultados também serão afetados por quaisquer mecanismos adicionais no modelo. Usando este modelo simples baseado em agente boca a boca, você pode criar seu próprio modelo de adoção de produto modificado.
Considerações finais sobre o modelo ABM boca a boca
Neste artigo apresentei outra aplicação do abm_framework em Python. A estrutura suporta modelagem baseada em agente baseada em grade menor. Usando o modelo, consegui implementar um modelo simples baseado em agente boca a boca. O modelo mostra como a adoção do produto segue uma curva em forma de s, e como o mercado, neste caso, é totalmente penetrado após algum tempo. Você pode usar este modelo de linha de base simples para criar sua própria versão modificada. Por exemplo, você pode implementar um modelo com vários produtos concorrentes. Ou você pode implementar um modelo com vários grupos de clientes e uma variedade de experiências de usuário diferentes.
Cientista de dados com foco em simulação, otimização e modelagem em R, SQL, VBA e Python
Leave a Reply