Modelo de vendas baseado em agente

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:

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:

  1. Para cada iteração, todos os agentes são chamados uma vez (em sequência aleatória)
  2. Quando um agente é chamado, o agente avalia sua vizinhança
  3. 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)
  4. 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.

You May Also Like

Leave a Reply

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

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