Modelo de ventos basado en agentes

La estimación de la curva de adopción de productos es un dominio de marketing que puede beneficiarse del modelado basado en agentes. Como actualmente estoy trabajando en un marco de modelado basado en agentes, quería agregar a este blog un modelo simple de ventas de productos basado en agentes de boca en boca . El modelo se puede usar como una línea de base simple para modificaciones adicionales (personalización). Estoy implementando este modelo en Python. El marco aplicado por mí se puede encontrar aquí:

Ya he compartido otros dos ejemplos aplicando el marco anterior. En el primer ejemplo, desarrollé un modelo SIR basado en agentes . Dichos modelos se pueden utilizar, por ejemplo, para modelar la propagación de enfermedades.

En otro ejemplo, implementé un modelo de segregación social en Python.

Ahora discutiré brevemente el modelo de boca en boca y mostraré su implementación en Python.

Modelo de boca en boca conceptual simple

Este ejemplo aplica un entorno de simulación basado en cuadrículas con una sola población de agentes. Cada agente se caracteriza por una variable binaria. La variable representa si el agente ya compró el nuevo producto (adopción del producto) o no.

Se aplica la siguiente lógica:

  1. Para cada iteración, todos los agentes se llaman una vez (en secuencia aleatoria)
  2. Cuando se llama a un agente, el agente evalúa su vecindario
  3. Si el agente ya ha comprado el nuevo producto, el agente influye en los vecinos y los convence de comprar el nuevo producto con una probabilidad especificada. O viceversa, el agente es convencido por cualquier vecino que ya haya comprado el producto (con la misma probabilidad)
  4. Los agentes solo pueden comprar el producto una vez. Una vez que han comprado el producto, su estado permanece sin cambios.

Modelo de boca en boca basado en agentes en Python

El siguiente código aplica abm_framework e implementa el modelo de boca en boca anterior.

__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
    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 los resultados de la simulación en la siguiente sección.

Resultados de la simulación de boca en boca

El diagrama de línea inferior fue generado por abm_framework y muestra la proporción total de clientes que ya compraron el producto. Con la configuración del modelo dado, el mercado está completamente penetrado. La adopción del producto sigue una curva de adopción en forma de S. Esto es lo que hubiera esperado de la configuración del modelo.

La siguiente animación muestra además la adopción del producto en toda la cuadrícula. Esta simulación comenzó con un solo agente. Esta es la razón por la que la adopción del producto se extiende desde allí. La cuadrícula es interminable, lo que significa que al salir de la cuadrícula, por ejemplo, por el lado derecho, ingresa a la cuadrícula por el lado izquierdo. Al salir de la cuadrícula en la parte superior, ingresa a la cuadrícula en la parte inferior. La cuadrícula no tiene límite.

Los resultados diferirán cuando ajuste la configuración y las condiciones del modelo. Los resultados también se verán afectados por cualquier mecanismo adicional en el modelo. Con este sencillo modelo básico basado en el boca a boca de los agentes, puede crear su propio modelo de adopción de productos modificado.

Observaciones finales sobre el modelo ABM de boca en boca

En este artículo presenté otra aplicación de abm_framework en Python. El marco admite el modelado basado en agentes basado en cuadrículas más pequeñas. Usando el modelo, pude implementar un modelo básico simple basado en el boca a boca basado en agentes. El modelo muestra cómo la adopción del producto sigue una curva en forma de S y cómo el mercado, en este caso, se penetra por completo después de un tiempo. Puede usar este modelo de línea de base simple para crear su propia versión modificada. Por ejemplo, podría implementar un modelo con varios productos de la competencia. O podría implementar un modelo con varios grupos de clientes y una variedad de experiencias de usuario diferentes.

You May Also Like

Leave a Reply

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.