产品采用曲线估计是一个可以从基于代理的建模中受益的营销领域。由于我目前正在研究基于代理的建模框架,因此我想在此博客中添加一个基于代理的简单口碑产品销售模型。该模型可用作进一步修改(定制)的简单基线。我正在用 Python 实现这个模型。我应用的框架可以在这里找到:
我已经分享了另外两个应用上述框架的例子。在第一个示例中,我开发了一个基于代理的 SIR模型。这样的模型可以例如用于模拟疾病传播。
在另一个例子中,我用 Python 实现了一个社会隔离模型。
我现在将简要讨论口碑模型并展示它在 Python 中的实现。
简单的概念口碑模型
此示例应用了基于网格的模拟环境,具有单个代理群体。每个代理都由一个二进制变量来表征。该变量表示代理是否已经购买了新产品(产品采用)。
应用以下逻辑:
- 对于每次迭代,所有代理都被调用一次(以随机顺序)
- 当代理被调用时,代理会评估其邻域
- 如果代理已经购买了新产品,则邻居会受到代理的影响,并被说服以指定的概率购买新产品。反之亦然,代理人被任何已经购买该产品的邻居说服(概率相同)
- 代理商只能购买一次产品。一旦他们购买了产品,他们的状态将保持不变
Python中基于代理的口碑模型
下面的代码应用了abm_framework并实现了上述口碑模型。
__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 of customers
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")
我将在下一节讨论模拟结果。
口碑模拟结果
下面的线图由abm_framework生成,显示已购买产品的客户的总份额。有了给定的模型设置,市场就被完全渗透了。产品采用遵循某种 s 形的采用曲线。这是我对模型设置的期望。
下面的动画进一步显示了整个网格中的产品采用情况。该模拟从单个代理开始。这就是产品采用从那里传播的原因。网格是无止境的,这意味着当您从右侧退出网格时,您将在左侧进入网格。退出顶部的网格时,您进入底部的网格。网格没有边界。
当您调整模型设置和条件时,结果会有所不同。结果也将受到模型中任何其他机制的影响。使用这个简单的基于口碑代理的基线模型,您可以创建自己的修改后的产品采用模型。
口碑反导模型总结
在本文中,我介绍了abm_framework在 Python 中的另一个应用程序。该框架支持较小的基于网格的基于代理的建模。使用该模型,我能够实现一个简单的基于口碑代理的基线模型。该模型显示了产品采用如何遵循 s 形曲线,以及在这种情况下,市场如何在一段时间后完全渗透。您可以使用这个简单的基线模型来创建您自己的修改版本。例如,您可以实现具有多个竞争产品的模型。或者,您可以实施具有各种客户群和一系列不同用户体验的模型。
专业领域为优化和仿真的工业工程师(R,Python,SQL,VBA)
Leave a Reply