Word-of-mouth

Word-of-mouth preview image

3 collaborators

Agnieszka Kowalska-Styczeń (Author)
Tomasz Owczarek (Team member)

Tags

cellular automata 

Tagged by Katarzyna Sznajd-Weron about 1 year ago

social science 

Tagged by Katarzyna Sznajd-Weron about 1 year ago

Visible to everyone | Changeable by the author
Model was written in NetLogo 5.2.1 • Viewed 361 times • Downloaded 25 times • Run 0 times
Download the 'Word-of-mouth' modelDownload this modelEmbed this model

Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)


## WHAT IS IT?

This model was designed to describe consumer’s decision-making process based on social influence (word-of-mouth) in a duopoly market structure (i.e. when only two producers exist in the market) and evaluate how details introduced on the microscopic level influence the macroscopic behavior of the system.

## HOW IT WORKS

The model is a simple two-dimensional cellular automaton. Each cell can be in one of three states: empty (black), occupied by an agent of type A (green, a customer of company A) or occupied by an agent of type B (red, a customer of company B). Each agent can change its state under social influence of the neighborhood or move to the nearest empty cell in one of four randomly chosen directions with probability ‘movement_prob’ in case of uncertainty. Uncertainty is defined as a lack of majority (for the MR rule) or a lack of unanimity (for the UR and ULR rules) in the neighborhood. The ULR rule is based on Latane’s theory that says that the power of social influence increases with the size of the influence group, while the UR rule is independent of the size of the group. All cells in the system are updated synchronously according to the following rules:

1.An occupied cell can change its state due to the social influence of neighbors. For the MR rule an occupied cell takes the state which is represented by the majority of the occupied cells in the neighborhood. For the UR and ULR rules, a cell is influenced only by the unanimous majority.

2.If an occupied cell cannot make a decision on the basis of the neighborhood (in a case of uncertainty), for example, in absence of majority (MR) or unanimity (UR and ULR), it moves to the nearest empty place in a randomly chosen direction (N, E, S or W) with probability ‘movement_prob’.

## HOW TO USE IT

Click the ‘setup’ button to set up the agents. There are approximately equal numbers of green (A) and red (B) agents (‘type_A’=0.5). There is at most one agent in each cell (patch) and some cells are empty (black). The ‘density’ slider controls the occupancy density of the neighborhood (and thus the total number of agents). It takes effect the next time you click SETUP. Click GO to start the simulation. If agents are unconvinced by the neighborhood (no majority for the MR rule or unanimity for the ULR and UR rules), they move to a nearby patch. We use periodic boundary conditions, so that patches on the bottom edge are neighbors of patches on the top, similarly for left and right.

Within this model we are able to test how the following factors influence results:

1.Density of occupied cells (density) varies from 0 (all cells are empty) to 1 (all cells are occupied)

2.The market share of two companies (type_A) – how many of the occupied cells are of type A (green)

3.The range of interactions – we use here von Neumann neighborhood of range r=1,2,3

4.The probability of movement in case of uncertainty

5.The type of social influence – we test here three rules: majority (MR), unanimity (UR) and unanimity Latane rule (ULR)

## THINGS TO NOTICE

When you execute SETUP, the red and green agents are randomly distributed. Due to the rules described in section HOW IT WORKS, agents change colors and move. Eventually the system reaches a fixed state with three types of clusters - green, red and chessboard-like. Click 'go-once' button and notice that the chessboard-like structure periodically changes and thus corresponds to customers without permanent opinion (disloyal).

## THINGS TO TRY

Move slider 'range' to 2 and observe how this influences the stationary state. For r=2 the system is much more segregated. Choose other rules (UR and ULR) and observe that under unanimity rule the relaxation is longer and the system is more segregated. Try to change the number of green customers moving slider 'type_A' and look what happens.

## EXTENDING THE MODEL

There are several possibilities to extend the model including the introduction of the external field (advertisement) or independent agents that are not susceptible to the social influence. Another possibility is to increase the number of possible states, which would allow to study the oligopoly structure.

## RELATED MODELS

See also the following models in the NetLogo Models Library: Rumor Mill, Segregation, Voting and Ising (a physics model).

## CREDITS AND REFERENCES

This model is described in

[1] Kowalska-Styczeń, K. Sznajd-Weron, Access to information in word of mouth marketing within a cellular automata model, Advances in Complex Systems 15, 1250080 (2012); DOI: 10.1142/S0219525912500804

[2] A. Kowalska-Styczeń, K. Sznajd-Weron, From consumer decision to market share - majority or unanimity?, Preprint (2016)

The work was supported by funds from the National Science Centre (NCN) through grant no. 2014/15/B/HS4/04433 and 2013/11/B/HS4/01061.

Software developer: Tomasz Owczarek, Silesian University Of Technology, Faculty of Organization and Management

## HOW TO CITE

If you mention this model or the NetLogo software in a publication, we ask that you include the citations below.

For the model itself please cite:

[1] Kowalska-Styczeń, K. Sznajd-Weron, Access to information in word of mouth marketing within a cellular automata model, Advances in Complex Systems 15, 1250080 (2012)

Please cite the NetLogo software as:

[2] Wilensky, U. (1999). NetLogo. http://ccl.northwestern.edu/netlogo/. Center for Connected Learning and Computer-Based Modeling, Northwestern University, Evanston, IL.

Comments and Questions

Please start the discussion about this model! (You'll first need to log in.)

Click to Run Model

                                                                                                                                                                                                                                                                                   globals[
  A_no_list            ;; number of type-A agents in each iteration
  B_no_list            ;; number of type-B agents in each iteration
  nb                   ;; type of neighborhood
  latane_denominator   ;; depends on type of nb (4, 12, 24)
  result               ;; "pending" or "stable"; if "stable" model stops
]

turtles-own[
  class                ;; agent's type i.e. A or B
  value                ;; 1 or -1 depending on the class
  action               ;; describes action of the agent ("stay", "change" or "move")
  movement-counter     ;; counts how many times agent tried to move this turn
  patch-2              ;; the patch agent occupied 2 iterations earlier
  patch-1              ;; the patch agent occupied 1 iteration earlier
  class-2              ;; agent's type 2 iterations earlier
  class-1              ;; agent's type 1 iteration earlier
]

to setup
  clear-all
  set-neighbourhood
  set A_no_list []
  set B_no_list []
  ask patches[
    if random-float 1 < density
    [
      let val 1
      if random-float 1 > type_A [set val -1]
      sprout 1
      [
        set-class val
        set shape "square"
        set movement-counter 0
      ]
    ]
  ]
  set result "pending"
  reset-ticks
end 

to go
  if ticks = 1
  [
    ask turtles
    [
      set patch-1 patch-here
      set class-1 class
    ]
  ]
  if ticks > 1
  [ ask turtles
    [
      set patch-2 patch-1
      set patch-1 patch-here
      set class-2 class-1
      set class-1 class
    ]
  ]
  if rule = "MR" [ ask turtles [ MR-rule ] ]
  if rule = "UR" [ ask turtles [ UR-rule ] ]
  if rule = "ULR" [ ask turtles [ ULR-rule ] ]
  ask turtles [ make-action ]
  count-population
  tick
  if ticks > 1 [ check-stop-conditions ]
  if ((result != "pending") or (ticks >= 1000)) [ stop ]
end 

to set-class [ class-value ]
  ifelse class-value = 1
  [
    set class "A"
    set value 1
    set color green
  ]
  [
    set class "B"
    set value -1
    set color red
  ]
end 

to set-neighbourhood
  if range = 1
  [
    set nb [
              [-1 0]
           [0 -1] [0 1]
               [1 0]
           ]
  ]
  if range = 2
  [
    set nb [
                        [-2 0]
                [-1 -1] [-1 0] [-1 1]
           [0 -2] [0 -1]       [0 1] [0 2]
                  [1 -1] [1 0] [1 1]
                         [2 0]
           ]
  ]
  if range = 3
  [
    set nb [
                              [-3 0]
                      [-2 -1] [-2 0] [-2 1]
               [-1 -2] [-1 -1] [-1 0] [-1 1] [-1 2]
          [0 -3] [0 -2] [0 -1]       [0 1]  [0 2] [0 3]
                 [1 -2] [1 -1] [1 0] [1 1]  [1 2]
                        [2 -1] [2 0] [2 1]
                               [3 0]
           ]
  ]
end 

to set-direction
  set heading ((random 4) * 90)
end 

to move
  fd 1
  if any? other turtles-here [ move ]   ;; if patch is occupied - repeat
end 

to moving-procedure
  let p patch-here
  ifelse movement-counter = 0
  [ set-direction ]
  [ set heading heading + 90 ]
  move
  ifelse ((p = patch-here) and (movement-counter < 4))
  [
   ;; if agent ends in the same patch - repeat whole procedure and increase counter
    set movement-counter movement-counter + 1
    moving-procedure
  ]
  [ set movement-counter 0 ]
end 

to MR-rule
  set action "stay"                                     ;; default state
  let nn turtles at-points nb                           ;; take all turtles in neighbourhood
  let influence sum [value] of nn                       ;; sum their values
  ifelse influence = 0                                  ;; infl==0 means that no. of A and B are the same
  [ set action "move" ]
  [ if influence * value < 0 [ set action "change" ] ]  ;; infl*value is < 0 when most neighbours are opposite type
end 

to UR-rule
  set action "stay"                                     ;; default state
  let nn turtles at-points nb                           ;; take all turtles in neighbourhood
  let influence sum [value] of nn                       ;; sum their values
  ifelse count nn = abs influence                       ;; no. of neighbors==abs(infl) means that all nn are the same
  [
    ifelse influence = 0                                ;; in that case influence = 0 means that there are no neighbours
    [ set action "move" ]                               ;; and agent just moves
    [
      if influence * value < 0 [ set action "change" ]  ;; if influence <> 0 then check if neighbours' type is different
    ]                                                   ;; infl*value is < 0 when neighbours are opposite type - change
  ]                                                     ;; if not, nothing changes (default state, i.e. "stay")
  [ set action "move" ]                                 ;; move if not all neighbours are the same
end 

to ULR-rule
  set action "stay"                                     ;; default state
  let nn turtles at-points nb                           ;; take all turtles in neighbourhood
  let influence sum [value] of nn                       ;; sum their values
  ifelse count nn = abs influence                       ;; no. of neighbors==abs(infl) means that all nn are the same
  [
    ifelse influence = 0                                ;; in that case influence = 0 means that there are no neighbours
    [ set action "move" ]                               ;; and agent moves
    [
      if influence * value < 0                          ;; if influence <> 0 then check if neighbours' type is different
      [ set latane_denominator 4                        ;;
        if range = 2 [ set latane_denominator 12 ]      ;; denominator depends on type of neighbourhood
        if range = 3 [ set latane_denominator 24 ]      ;;
        if random-float 1 < sqrt((count nn) / latane_denominator) [ set action "change" ]  ;; change only when
     ]                                                                                     ;; random r < sqrt(k/lat_denom)
    ]
  ]
  [ set action "move" ]
end 

to make-action
  if action = "move" [ if random-float 1 < movement_prob [ moving-procedure ] ]
  if action = "change" [ set-class (-1 * value) ]
end 

to count-population
  set A_no_list lput (count turtles with [class = "A"]) A_no_list
  set B_no_list lput (count turtles with [class = "B"]) B_no_list
end 

to check-stop-conditions
  ifelse (abs (count turtles with [class = "A"] - count turtles with [class = "B"]) = count turtles)
  [ set result "stable" ]    ;; all turtles are the same
  [                          ;;
    let change 0
    ask turtles
    [
      if ((patch-here != patch-2) or (class != class-2))
      [
        set change 1
      ]
    ]
    if change = 0 [ set result "stable" ] ;; oscilating or not changing
  ]
end 


;; not used but now can be useful if greater ranges are considered in the future

to set-latane
 let i 0
 repeat range
 [
   set i (i + 1)
   set latane_denominator latane_denominator + (i * 4)
 ]
end 

There is only one version of this model, created about 1 year ago by Katarzyna Sznajd-Weron.

Attached files

File Type Description Last updated
Word-of-mouth.png preview Preview for 'Word-of-mouth' about 1 year ago, by Katarzyna Sznajd-Weron Download

This model does not have any ancestors.

This model does not have any descendants.