입소문 에이전트 기반 판매 모델

제품 채택 곡선 추정은 에이전트 기반 모델링의 이점을 얻을 수 있는 마케팅 영역입니다. 저는 현재 에이전트 기반 모델링 프레임워크를 작업 중이므로 이 블로그 에 간단한 입소문 에이전트 기반 제품 판매 모델을 추가하고 싶었습니다 . 모델은 추가 수정(사용자 지정)을 위한 간단한 기준선으로 사용할 수 있습니다. 이 모델을 Python으로 구현하고 있습니다. 내가 적용한 프레임워크는 다음에서 찾을 수 있습니다.

위의 프레임워크를 적용하는 다른 두 가지 예를 이미 공유했습니다. 첫 번째 예에서는 에이전트 기반 SIR 모델을 개발했습니다. 이러한 모델은 예를 들어 질병 확산을 모델링하는 데 사용할 수 있습니다.

또 다른 예에서 저는 Python에서 사회적 분리 모델을 구현했습니다.

이제 입소문 모델에 대해 간략하게 논의하고 Python으로 구현하는 방법을 보여드리겠습니다.

간단한 개념 입소문 모델

이 예는 단일 에이전트 모집단이 있는 그리드 기반 시뮬레이션 환경을 적용합니다. 각 에이전트는 이진 변수를 특징으로 합니다. 변수는 에이전트가 이미 새 제품을 구매했는지(제품 채택) 여부를 나타냅니다.

다음 논리가 적용됩니다.

  1. 각 반복에 대해 모든 에이전트가 한 번(임의의 순서로) 호출됩니다.
  2. 에이전트가 호출되면 에이전트는 이웃을 평가합니다.
  3. 에이전트가 이미 새 제품을 구매한 경우 이웃은 에이전트의 영향을 받고 지정된 확률로 새 제품을 구매하도록 확신합니다. 또는 그 반대의 경우 에이전트는 이미 제품을 구매한 모든 이웃에 의해 확신됩니다(동일한 확률로)
  4. 에이전트는 제품을 한 번만 구매할 수 있습니다. 일단 제품을 구매하면 상태가 변경되지 않습니다.

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 모델에 대한 결론

이 기사에서는 Python에서 abm_framework 의 또 다른 응용 프로그램을 제시했습니다 . 프레임워크는 더 작은 그리드 기반 에이전트 기반 모델링을 지원합니다. 모델을 사용하여 간단한 기본 입소문 에이전트 기반 모델을 구현할 수 있었습니다. 이 모델은 제품 채택이 S자 곡선을 따르는 방법과 이 경우 시장이 일정 시간 후 완전히 침투하는 방법을 보여줍니다. 이 간단한 기준 모델을 사용하여 수정된 버전을 생성할 수 있습니다. 예를 들어 여러 경쟁 제품으로 모델을 구현할 수 있습니다. 또는 다양한 고객 그룹과 다양한 사용자 경험으로 모델을 구현할 수 있습니다.

You May Also Like

Leave a Reply

Leave a Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.