Simulate Market

Market Simulation is an Artificial Intelligence (AI) tool that predicts how Customers will make Product Purchase decisions.

An agent-based model is used to run the Market Simulation. Each Virtual Customer acts as an 'Intelligent Agent' and makes Purchase decisions based upon their different Willingness To Pay (WTP) for each Product in the Market. All of the WTP values are found in the 'Input WTP Matrix' while all of the other Product details are found in the 'Input Product Array'.

There are several ways to calculate Willingness To Pay (WTP) and include it in the Market Simulation. One way is through a Conjoint Analysis study. A second way is by calculating WTP based upon Customer Behavior, such as with an upstream 'Clickstream Conjoint' node. A third way is by estimating the 'Horizontal Differentiation' and 'Vertical Differentiation' of each Product Feature using a combination of upstream 'Differentiation Horizontal' nodes and 'Differentiation Vertical' nodes, along with an upstream 'Product Generator' node.

The Simulate Market node will predict the total Quantity of Products sold by first calculating the Consumer Surplus of each individual Customer. Customers will select the Product that gives them the greatest Consumer Surplus, where Consumer Surplus equals WTP minus Price. In addition to calculating Quantity sold, the Simulate Market node will also calculate the Market Share, Revenue, and Profit of each Product in the Market.

The Simulate Market node can be used to tune a Market Simulation so that it can accurately predict a real-world Market. When the Simulate Market node sits between a 'Tuning Loop Start' node and a 'Tuning Loop End' node, a Quantity Error can be calculated. The Tuning Loop can then change the Input Parameters to improve the accuracy of the predictions.

Note that this Market Simulation node offers two ways to handle identical Products. When the option 'Output Detailed Customer Results' is checked (default), then Customers will Purchase identical Products in roughly even proportions. But when the option 'Output Detailed Customer Results' is unchecked, then Customers will select the first identical Product found in the 'Input Product Array'. However, an upstream 'Product Generator' node will automatically add a tiny random tie-breaker to all values in the Output WTP Matrix. This will ensure that Customers Purchase identical Products in roughly even proportions regardless of the 'Output Detailed Customer Results' selection.

More Help: Examples and sample workflows can be found at the Scientific Strategy website: www.scientificstrategy.com.

Options

Standard Options

Output Detailed Customer Results
If checked, additional Product preference details will be generated for the Output Consumer Surplus Matrix and the Output Ranked Products List. These detailed results will include the 'Consumer Surplus', 'Marginal Profit', and 'Value Created' for each Customer. See the 'Output Ranked Products List' below for details. If unchecked, execution time can be faster. Fast execution time may be important if the Simulate Market node is being used inside a Tuning Loop.
Save Randomizing Seed
A Randomizing Seed can be saved to ensure Customer Distributions are always simulated in the same way. When Customers rank their preferred Products, a tiny random tie-breaker is added to all values in the Input WTP Matrix. Setting this Randomizing Seed ensures consistent results can be reproduced. The 'New' button will generate a new Randomized Seed. Disable the CheckBox to generate a new Randomizing Seed each time the node is run. Manually set a new Randomizing Seed if this node is copied to avoid adding bias to the overall model.

Market Size Options

Set Output Market Size
The output Market Size used to scale the Quantity sold, Revenue, and Profitability for each Product in the Market. The options include:
Set to total number of Customers in WTP Matrix (default) the output Market Size is determined by the number of Customers in the Input WTP Matrix.
Set to total number of Customers in Product Array the output Market Size is determined by the total number of Customers listed in the Input Product Array.
Fixed number of Customers (including 'No Sale') the output Market Size is set by the user in the 'Set Fixed Number of Customers' option below. The 'Set Fixed Number of Customers' Market Size includes 'No Sale' customers who didn't purchase any of the Products listed in the Input Product Array.
Fixed number of Customers (excluding 'No Sale') the output Market Size is set by the user in the 'Set Fixed Number of Customers' option below. The 'Set Fixed Number of Customers' Market Size does not include 'No Sale' customers - only customers who made an actual purchase.
Set Fixed Number of Customers
The output Market Size when the user selects the 'Fixed number of Customers' option from the list above.
Then Multiply Market Size by Scaling Factor
After the output Market Size has been determined from the list of options above, and the simulation has been run, the final output Market Size is re-scaled according to this scaling factor. Note that everything in the Market will grow / shrink at the same rate, including 'Capacity' and the number of 'No Sale' Products. If the scaling factor is 1.1 then the final output Market Size is increased by 10%. The final Market Size will be rounded to the nearest integer.

Input Ports

Icon
Input Product Array: The set of Products that define the Market. Each row corresponds to a Product that competes for Customers in the Market. The 'Input Product Array' can include the following columns:
  1. Product (string - required): The name of the Product corresponding to a column of the same name in the 'Input WTP Matrix' port. There may also be an additional row with a Product named 'No Sale' - this row is used to track those Customers who are in the Market but have not yet purchased a Product. Including the 'No Sale' here can be useful when specifying the Quantity of Customers in a real-world market who are yet to Purchase a Product. If the 'No Sale' Product does not exist then it will be added automatically. If the 'Product' column is not found then the Row Identification (RowID) column will be used in place of the Product column.
  2. Description (string): The description of the Product or the full name of the Product if the Product field contains an identification number.
  3. Brand (string): The name of the Product Brand. Including information about the Product Brands allows the user to aggregate sales by Brand in downstream nodes.
  4. Store (string): The name of the Product Store. Including information about the Store allows the user to calculate the total Revenue and Profit for each Competitor in downstream nodes.
  5. Location (string): The name of the Product Location. The Location can be a name, or it can be used flexibly to indicate the speed of delivery as 'Overnight Delivery', 'Second Day Delivery', 'Third Day Delivery', etc.
  6. Family (string): The name of the Product Family. Generally used to link together related Products. Several Product SKUs can all be part of the same Family.
  7. Category (string): The name of the Product Category. Several Product Families may be part of the same Category.
  8. Platform (string): The name of the Product Platform. The Platform is a general purpose label that can be used in any way. It can, for example, indicate whether the Product is sold both 'Online' as well as 'Offline'.
  9. Price (double - required): The 'Static Price' of each Product in the Market. This 'Static Price' can be adjusted by the personalized 'Dynamic Price' found in the 'Input WTP Matrix'. Personalized Price = Static Price x PAV + PAF. For example, some Customers may be entitled to the percentage Discount found in the 'Price Adjustment Variable' (PAV) column, or some Customers may need to pay the personalized delivery charges found in the 'Price Adjustment Fixed' (PAF) column. The Static Price of the 'No Sale' Product, if included, should be zero.
  10. Discount (double - optional): A potential Discount offered to individual Customers. If the dynamic 'Price Adjustment Variable' (PAV) has been set in the Input WTP Matrix, then this Discount will override the PAV if-and-only-if the Discount is more generous. Promotions cannot be combined. For example, if a Discount of 0.8 (20% off) is offered but the Customer already gets a special PAV of 0.7 (30% off) then the Discount will be ignored. IMPORTANT: Discount is expressed as a multiple (like PAV). A Discount value of 0.7 indicates Price is reduced by 30%.
  11. Cost (double - optional): The 'Static Cost' of each Product required to calculate the 'Profit' in the 'Output Product Array', as well as the 'Marginal Profit' and 'Value Created' in the 'Output Product Ranking List'. The 'Static Cost' is the per-unit Cost for the Product that doesn't change regardless of how many Products are sold, and should be used by default. It can be contrasted with 'Dynamic Costs' which vary according to the Customers who Purchase the Product. This 'Static Cost' of the Product found in the 'Input Product Array' is added to the optional 'Dynamic Costs' found in the 'Input WTP Matrix'.
  12. Holding Cost (double - optional): At the end of each period, except the last Liquidation Period, unsold Products with residual Inventory Capacity accumulate a Holding Cost that reduces the overall Profitability of the Product. Holding Cost can also be thought of the Opportunity Cost of not having the capital tied up in Inventory available for investment in other projects. Products that do not have a Capacity Constraint will not be penalized a Holding Cost. If this field is missing then a zero Holding Cost is assumed.
  13. Volume (double - optional): The 'Static Volume' of the Product relative to the Volume of other Products in the Market. For example, if a Product were a twin-pack then its Volume would be '2' while the Volume of the original Product would be '1' (default). Other scales could also be used, so that one Product might be 250 (ml) while another 500 (ml). But care with the scale should be taken as the Units are disregarded and the default of '1' will always be used if a Volume is missing. This 'Static Volume' field in the 'Input Product Array' is only important if an accompanying 'Dynamic Volume' field (or _VOL field) is found in the 'Input WTP Matrix'. Otherwise this field is ignored as Virtual Customers do not distinguish Products by the different Volume they require.
  14. Units (string - ignored): The Units of Measurement (UoM) associated with the Product's Volume. For example, the Units could be set to 'ml' when the Products are liquids or beverages. But note that this Units field is ignored and only provided as a convenience. No conversion is provided between different Units. The model will not understand, for instance, that 1 'Litre' contains twice as much Product as 500 'mL'.
  15. Capacity (integer): The Capacity Constraint for the Product. A Product's Capacity may be limited by manufacturing constraints or by inventory levels. If the Capacity level is provided then the Quantity sold for the Product cannot exceed the Capacity limitation. If Capacity is not provided, or Capacity is negative, then the Quantity sold for the Product is not limited. Capacity will be limited relative to the total number of Customers in the 'Market Size' Configuration Dialog.
  16. Quantity (integer): A reference Quantity sold for each Product in the actual (real-world) Market. If the Quantity is provided then an 'Quantity Error' will be returned as part of the results in the Output Product Array. The Quantity is required if the 'Market Size Option' is set to 'Set to total number of Customers in Product Array'. Change the 'Market Size Option' to 'Set to total number of Customers in WTP Matrix' to avoid specifying a Quantity in the 'Input Product Array'.
  17. Transactions (integer): A reference number of Transactions for each Product in the actual (real-world) Market. Transactions are only relevant if Customers purchase by Volume. That is, the 'Input WTP Matrix' must contain either a 'Volume' field or at least one '_VOL' field. Otherwise each Customer will purchase only a single Product, and the number of Transactions will equal the Quantity sold.
  18. Include (boolean): Set to FALSE to exclude a Product from the Market. All Products are included by default.
Icon
Input Willingness To Pay Matrix (double): The Willingness To Pay (WTP) Customer Distribution matrix for each Product column in the Market by each Virtual Customer row. The total number of Virtual Available Customers is equal to the number of rows in the WTP Matrix. In addition to each of the Product's WTP Customer Distributions, this 'Input WTP Matrix' can also contain two types of 'Dynamic Price' and two types of 'Dynamic Cost' Distributions that depend upon the Customers who Purchase the Product. These personalized 'Dynamic Prices' and 'Dynamic Costs' adjust the 'Static Price' and 'Static Cost' found in the 'Input Product Array' to calculate the Product's Margin. This 'Input WTP Matrix' may also contain 'Dynamic Volume' fields which allow Virtual Customers to Demand different levels of Quantity of each Product.
  1. Product01, Product02, etc (double): Each of the Products listed in the 'Input Product Array' should have a corresponding column in this 'Input WTP Matrix'. Each row represents a different Virtual Customer, and each value represents the Customer's Willingness To Pay (WTP) for each Product.
  2. Volume (double - optional): The personalized 'Dynamic Volume' of Product demanded by each Virtual Customer. For example, if the 'Input Product Array' contains a list of beverages of Volume 250ml, 330ml, 500ml, 750ml, and 1000ml then a Virtual Customer with a demanded Volume of '1000' could purchase a Quantity of either 4, 3, 2, 1, or 1 of the Products (respectively). If Customers are buying by Volume then they must purchase in whole number integers. For instance, if a Product had a Volume of 250ml but a Customer demanded 300ml then the Customer would only be able to buy 1 of that Product. Note that the excess Volume of 50ml received by the Customer is deemed to be of no value! The Price, WTP, and Consumer Surplus are all re-scaled by the relative Quantity demanded. When Customers buy in Volume then the Output Transactions field will differ from the Output Quantity field - otherwise these two values ought to be the same. Note that the 'Input Product Array' need not also contain a 'Volume' field. If the Product Volume is missing then the Product is presumed to be sold in Volumes of 1 Unit.
  3. _VOL (double - optional): The per-Product 'Dynamic Volume' (VOL) demanded by each Virtual Customer. This per-Product 'VOL' value will override the general 'Volume'. For example, a Virtual Customer buying laundry detergent might generally demand a 'Volume' of 2 (Litres) but might only demand a '_VOL' of 1 (Litre) for the concentrated detergent Product. Negative values will be replaced with a Demand Volume of zero '0'. If both of the 'Dynamic Volume' values ('Volume' and '_VOL') are missing then a default of '1' will be used.
  4. _PAV (double - optional): The Price Adjustment Variable (PAV) is the percentage adjustment to the Price (typically a Discount) a particular Customer would receive when they Purchase the Product. For example, if the Customer is entitled to a 10% Discount then the 'PAV' would be set to 0.90. The 'Price Adjustment Variable' column is identified by the Product's Name followed by a trailing 'PAV'. The 'PAV' designator can be upper-case or lower-case and may-or-may-not be separated by a space, underscore, or other single character. For example, 'Product_01_PAV' or 'Product 02 PAV' or 'Product03pav'.
  5. _PAF (double - optional): The Price Adjustment Fixed (PAF) is the fixed adjustment to the Product's Price. For example, if Customers pay different amounts for Shipping the Product then this could be modeled using the 'PAF' column. If the WTP Matrix contains both 'PAV' and 'PAF' columns, then the Price is first multiplied by the variable 'PAV' before adding the fixed 'PAF'. The 'Price Adjustment Fixed' column is also identified by the Product's Name followed by a trailing 'PAF' in a manner similar to the 'PAV' designator. The 'PAF' is a per-Unit Price. If the Customer purchases more than one Product then the 'PAF' is multiplied by the Customer's Demand.
  6. _CTS (double - optional): The Cost To Serve (CTS) is the additional Cost that must be incurred when a Product is sold to a particular Customer. This is a Dynamic Cost as some Customers are cheaper to serve than others, and is only incurred if the Customer actually Purchases the Product. The 'Cost To Serve' column is identified by the Product's Name followed by a trailing 'CTS'. The 'CTS' designator can be upper-case or lower-case and may-or-may-not be separated by a space, underscore, or other single character. For example, 'Product_01_CTS' or 'Product 02 CTS' or 'Product03cts'. The Customer's 'CTS' remains unchanged regardless of the Quantity of Product Units purchased by the Customer.
  7. _CTM (double - optional): The Cost To Make (CTM) depends not upon the individual Customer but upon the number of Customers who Purchase the Product. This 'Cost To Make' can be used to simulate the Law of Diminishing Returns. Starting from the first row in the column, each 'Cost To Make' row represents the incremental Cost of manufacturing each additional Product. If the Product is sold ten-times, then the total Dynamic Cost is the sum of the first 10 CTM rows. The 'Cost To Make' column is also identified by the Product's Name followed by a trailing 'CTM' in a manner similar to the 'CTS' designator.

Output Ports

Icon
Output Product Array: The 'Output Product Array' corresponds to the 'Input Product Array' but is updated to reflect the results from the Market Simulation. The Product Array will contain these columns:
  1. Product: The name of the Product corresponding to the Input Product Array.
  2. Brand: The name of the Product Brand or a missing value if the Brand has not been defined.
  3. Store: The name of the Product Store or a missing value if the Store has not been defined.
  4. Location: The name of the Product Location or a missing value if the Location has not been defined.
  5. Family: The name of the Product Family or a missing value if the Product Family has not been defined.
  6. Category: The name of the Product Category or a missing value if the Category has not been defined.
  7. Platform: The name of the Product Platform or a missing value if the Platform has not been defined.
  8. Price: The 'Static Price' of each Product from the 'Input Product Array'. The 'Dynamic Price' from the 'Input WTP Matrix' is NOT included in this output 'Price' field so as to allow multiple Market Simulation nodes to be chained together. Instead the 'Dynamic Price' is accounted for in the output 'Margin' field. Products with missing Prices are deemed to be Out-of-Stock.
  9. Cost: The 'Static Cost' of each Product from the 'Input Product Array' or a missing value if the Cost has not been defined. The 'Dynamic Cost' from the 'Input WTP Matrix' is NOT included in this output 'Cost' field so as to allow multiple Market Simulation nodes to be chained together. Instead the 'Dynamic Cost' is accounted for in the output 'Margin' field.
  10. Margin: The average Profit Margin of each Product, where: Profit Margin = Personalized Price - Static Cost - Average Dynamic Cost. The Personalized Price is the 'Static Price' adjusted by the two types of 'Dynamic Price'. The 'Dynamic Cost' depends upon the Customers who Purchase the Product and is averaged across the total Quantity Sold.
  11. Volume: The given 'Static Volume' of the Product relative to the Volume of other Products in the Market or '1' if the Volume has not been defined in the input.
  12. Units: The given Units of Measurement (UoM) associated with the Product's Volume.
  13. Capacity: The Capacity Constraint of each Product or a missing value if the Capacity has not been defined. When the 'Holding Cost' for the Product has been set, Capacity will be treated as Inventory and the Residual Capacity after Quantity sold will be returned.
  14. Quantity: The simulated number of Customers who selected each Product, including those who selected the 'No Sale' option.
  15. Error: The absolute value of the difference between the actual input 'Quantity' and the simulated output 'Quantity'. The Error can be weighed and summed by downstream nodes to determine the 'Total Error' has part of the Tuning Loop to tune the Market Model. Note that the Quantity Error for the 'No Sale' Product is not calculated unless the user explicitly includes the 'No Sale' Product in the Input Product Array and sets a target Quantity to be greater than zero.
  16. Transactions: The simulated number of Transactions for each Product. By default, each Customer will purchase only a single Product, and the number of Transactions will equal the Quantity sold. Transactions and Quantity will only vary if Customers are purchasing by Volume. That is, the 'Input WTP Matrix' must contain either a 'Volume' field or at least one '_VOL' field so that Virtual Customers demand different Product Quantity.
  17. Share: The simulated Market Share as a percentage (%) of each Product based upon the 'Quantity' column but not including those Customers who selected the 'No Sale' option.
  18. COGS: The Cost of Goods Sold (COGS) for the Product is calculated as the Product's 'Cost' and final 'Quantity'. COGS is only calculated if the Product's 'Cost' was provided in the 'Input Product Array'. Both the Static Costs and Dynamic Costs are included in the COGS.
  19. COGH: The Cost of Goods Held (COGH) for the Product is calculated from the Product's 'Holding Cost' and residual 'Capacity' (after selling 'Quantity'). COGH is only calculated if both the Product's 'Holding Cost' and 'Capacity' are provided in the 'Input Product Array'.
  20. Revenue: The Product's Revenue is calculated as the Product's 'Price' and final 'Quantity'.
  21. Profit: The Product's Profitability is only calculated if the Product's 'Cost' was provided in the 'Input Product Array'. Both Static and Dynamic Prices and Costs are included in the Profit. In addition, if both the Product's 'Holding Cost' and 'Capacity' were provided, then the COGH is also calculated and subtracted from the Profit.
Icon
Output Willingness To Pay Matrix: The 'Output WTP Matrix' made up of the Customer Distributions for each Product in the Market. The Output WTP Matrix is equivalent to the 'Input WTP Matrix' and has been provided as a convenience to further calculations by downstream nodes. The Output WTP Matrix will contain these additional columns:
  1. Purchased: The name of the Product Purchased by the Customer. If the Customer didn't Purchase any Product then this will be set to 'No Sale'.
  2. WTP: The WTP of the purchased Product scaled by the Demand Quantity.
  3. Price: The Price of the purchased Product scaled by the Demand Quantity.
  4. Cost: The Cost to supply the purchased Product scaled by the Demand Quantity.
  5. Quantity: The Quantity of Product Purchased by the Customer. This Quantity will be set to '1' unless Customers are purchasing by Volume.
Icon
Output Consumer Surplus Matrix: The 'Output Consumer Surplus Matrix' matches to the 'Input WTP Matrix' but is updated to reflect the Consumer Surplus each Customer would have enjoyed had they Purchased the Product. Consumer Surplus equals WTP minus Price. These results will not be generated if the user selects not to 'Output Detailed Customer Results' in the Configuration Dialog.
Icon
Output Ranked Products List: The Output Ranked Products List contains a detailed list of all Customer Product preferences. Customer Preferences can then be further filtered and analyzed by downstream nodes. These results will not be generated if the user selects not to 'Output Detailed Customer Results' in the Configuration Dialog. The Output Ranked Products List will contain these columns:
  1. Customer: The Customer ID from the Input Willingness To Pay Matrix (Input WTP Matrix). Each Customer will Rank each Product and provide details of their WTP, Consumer Surplus, and Value Created.
  2. Product: The Product found in the Input Product Array and the Input WTP Matrix. An additional Product for 'No Sale' is added to the list to indicate that the Customer preferred not to buy any Product from the Market.
  3. Ranking: The Rank Order the Customer gave to the Product based upon their Consumer Surplus, where Consumer Surplus equals WTP minus Price.
  4. WTP: The Customer's Willingness To Pay (WTP) for the Product. The aggregated WTP is the sum of all part-worth values the Customer has for each of the Features and Benefits of the Product. The WTP is the maximum a Customer would pay for the Product if no other Competitive Products were available.
  5. Price: The Personalized Price the Customer paid for the Purchased Product comprising of both the Static Price (from the Input Product Array) and the Dynamic Price (from the Input WTP Matrix). If Customers are purchasing by Volume then Price will be scaled by Quantity. Personalized Price = Quantity x ( Static Price x Price Adjustment Variable (PAV) + Price Adjustment Fixed (PAF) ).
  6. PAV: The calculated Price Adjustment Variable (PAF) or monetary Discount the Customer received if they Purchased the Product.
  7. PAF: The individual Price Adjustment Fixed (PAF) paid by the Customer if they Purchased the Product.
  8. Cost: The Cost of the Product comprising of both the Static Cost (from the Input Product Array) and the Dynamic Cost (from the Input WTP Matrix). If Customers are purchasing by Volume then Cost will be scaled by Quantity. Cost = Static Cost + Average Cost To Make (CTM) + Individual Cost To Serve (CTS).
  9. CTS: The individual Cost To Serve (CTS) the Customer if they Purchased the Product.
  10. CTM: The average Cost To Make (CTM) the Product across all Customers who Purchased the Product.
  11. Volume: The personalized Volume of Product demanded by each Virtual Customer. If Customers are purchasing by Volume then this value will vary. Otherwise the Customer demanded Volume will be set to '1'.
  12. Demand: The Quantity of Product demanded by each individual Customer. Customers can only purchase Product in rounded whole number integers. For example, if a Product listed in the Input Product Array is sold in 2kg Volume packs, and a Customer has a demanded total Volume of 7kg, then their Demand Quantity will be rounded down to 2 units (for a total of 6kg).
  13. Quantity: The Quantity of Product Purchased by the Customer. This Quantity will be set to '1' unless Customers are purchasing by Volume.
  14. Consumer Surplus: The Consumer Surplus, or net value, the Customer would have enjoyed if they had Purchased the Product. If Customers are purchasing by Volume then Consumer Surplus will be scaled by Quantity. Consumer Surplus is always calculated as if the Customer Purchased. To calculate the sum of the Consumer Surplus actually enjoyed, the list results must first be filtered by the 'Purchased' field.
  15. Marginal Profit: The Marginal Profit the Store received from the Customer as if they had Purchased the Product. If Customers are purchasing by Volume then Marginal Profit will be scaled by Quantity. Marginal Profit is always calculated as if the Customer Purchased. To calculate the sum of Marginal Profit as Total Profit, the list results must first be filtered by the 'Purchased' field. This calculation should match the Profit in the Output Product Array.
  16. Value Created: The Value Created by the Store if the Customer had Purchased the Product. Value Created equals WTP minus Cost. Value Created measures how much net WTP value the Store was able to to generate after subtracting the input Costs required to generate that value. Value Created is always calculated as if the Customer Purchased. To calculate the total sum of actual Value Created, the list results must first be filtered by the 'Purchased' field.
  17. Purchased: Set to TRUE if the Customer Purchased the Product, or FALSE if the Customer did not Purchase the Product. If the Customer did not select any Product to buy then the Purchase field for all Products will be set to FALSE as the 'No Sale' Product is not included in the 'Output Ranked Products List'.

Views

This node has no views

Workflows

Links

Developers

You want to see the source code for this node? Click the following button and we’ll use our super-powers to find it for you.