Agentenbasiertes Verkaufsmodell

Die Schätzung der Produktakzeptanzkurve ist ein Marketingbereich, der von der agentenbasierten Modellierung profitieren kann. Da ich derzeit an einem agentenbasierten Modellierungs-Framework arbeite, wollte ich diesem Blog ein einfaches Produktverkaufsmodell auf Basis von Mundpropaganda hinzufügen . Das Modell kann als einfache Basis für weitere Modifikationen (Customizing) verwendet werden. Ich implementiere dieses Modell in Python. Das von mir angewandte Framework finden Sie hier:

Ich habe bereits zwei weitere Beispiele geteilt, die das obige Framework anwenden. Im ersten Beispiel habe ich ein agentenbasiertes SIR- Modell entwickelt. Solche Modelle können zB verwendet werden, um die Ausbreitung von Krankheiten zu modellieren.

In einem anderen Beispiel habe ich ein soziales Segregationsmodell in Python implementiert.

Ich werde nun kurz auf das Mundpropaganda-Modell eingehen und seine Implementierung in Python zeigen.

Einfaches konzeptionelles Mundpropaganda-Modell

Dieses Beispiel wendet eine Grid-basierte Simulationsumgebung mit einer einzigen Agentenpopulation an. Jeder Agent ist durch eine binäre Variable gekennzeichnet. Die Variable stellt dar, ob der Agent das neue Produkt bereits gekauft hat (Produktakzeptanz) oder nicht.

Dabei wird folgende Logik angewendet:

  1. Für jede Iteration werden alle Agenten einmal aufgerufen (in zufälliger Reihenfolge)
  2. Wenn ein Agent angerufen wird, bewertet der Agent seine Nachbarschaft
  3. Wenn der Agent das neue Produkt bereits gekauft hat, werden Nachbarn durch den Agenten beeinflusst und überzeugt, das neue Produkt mit einer bestimmten Wahrscheinlichkeit zu kaufen. Oder umgekehrt, der Agent wird von jedem Nachbarn überzeugt, der das Produkt bereits gekauft hat (mit gleicher Wahrscheinlichkeit)
  4. Agenten können das Produkt nur einmal kaufen. Sobald sie das Produkt gekauft haben, bleibt ihr Status unverändert

Agentenbasiertes Mundpropaganda-Modell in Python

Der folgende Code wendet das abm_framework an und implementiert das obige Mundpropaganda-Modell.

__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")

Ich diskutiere die Simulationsergebnisse im folgenden Abschnitt.

Ergebnisse von Mundpropaganda-Simulationen

Der untere Linienplot wurde vom abm_framework generiert und zeigt den Gesamtanteil der Kunden, die das Produkt bereits gekauft haben. Mit den gegebenen Modelleinstellungen ist der Markt voll durchdrungen. Die Produktakzeptanz folgt einer etwas S-förmigen Adoptionskurve. Das hätte ich von den Modelleinstellungen erwartet.

Die folgende Animation zeigt außerdem die Produktakzeptanz im gesamten Grid. Diese Simulation begann mit einem einzigen Agenten. Aus diesem Grund breitet sich die Produktakzeptanz von dort aus aus. Das Gitter ist endlos, dh wenn Sie das Gitter zB auf der rechten Seite verlassen, betreten Sie das Gitter auf der linken Seite. Wenn Sie das Raster oben verlassen, betreten Sie das Raster unten. Das Gitter hat keine Grenze.

Die Ergebnisse unterscheiden sich, wenn Sie die Modelleinstellungen und -bedingungen anpassen. Die Ergebnisse werden auch durch zusätzliche Mechanismen im Modell beeinflusst. Mit diesem einfachen, auf Mundpropaganda basierenden Basismodell können Sie Ihr eigenes modifiziertes Produktannahmemodell erstellen.

Abschließende Bemerkungen zum ABM-Modell

In diesem Artikel habe ich eine weitere Anwendung des abm_framework in Python vorgestellt. Das Framework unterstützt kleinere gitterbasierte agentenbasierte Modellierung. Mit dem Modell war ich in der Lage, ein einfaches, auf Mundpropaganda basierendes Basismodell zu implementieren. Das Modell zeigt, wie die Produktakzeptanz einer S-förmigen Kurve folgt und wie der Markt in diesem Fall nach einiger Zeit vollständig durchdrungen ist. Sie können dieses einfache Basismodell verwenden, um Ihre eigene modifizierte Version zu erstellen. Sie könnten beispielsweise ein Modell mit mehreren konkurrierenden Produkten implementieren. Oder Sie implementieren ein Modell mit verschiedenen Kundengruppen und unterschiedlichen Benutzererfahrungen.

You May Also Like

Leave a Reply

Leave a Reply

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.