The customer segmentation model, the product lifetime uptake model, the CLV model, and the goodwill firm value model were coded in the language R (CRAN R software, R language reference, version 3.1, available at http://cran.r-project.org). The code to build the above-mentioned models in R is listed below, together with guidelines for application. Figure 42 illustrates the steps of the stochastic simulation and forecasting model within the integrated value proposition design framework.
Figure 42: Integrated value proposition design framework modelling steps
The execution of the stochastic simulation and forecasting model is conducted in five steps. The first step clusters the customers into segments. Thereafter the input parameters are determined and stated. The third step is to model the uptake of the product throughout the product lifecycle. Subsequently the CLV for a customer purchasing the product is determined. Lastly, the product lifetime uptake model, in combination with the CLV model, delivers a goodwill firm value.
5.7.1 Customer segmentation modelling
Customer segmentation is an exercise unique to each organisation and product offering, as mentioned in the literature review (Chapter 2, Section 2.5). The most often-used approach to grouping the customer segments is to make use of a clustering tool. Various types of customer data can be grouped together to define customer segments.
The framework uses the CRAN ‘kohonen’ package for customer segment clustering. Kohonen is an easy-to-use package, built on Teuvo Kohonen’s method for SOM, which returns different clusters according to the data provided. The data clusters are the centre points of a specified typology. The size of the topology determines the number of customer segment clusters. The code used for SOM within the ‘kohonen’ package is given below (Wehrens & Buydens, 2007:5; Lynn, 2014):
90
library("kohonen") # Open the kohonen package in R
data <- read.csv(file.choose()) # Load the data file
data$Gender <- as.numeric(data$Gender) # Convert any non-numeric entries
as numeric
# At this point the data sets used for clustering the customer are converted to numeric entries
data.input <- data$Revenue # For the purpose of this excersie
only cluster the arpu
# Specify the size and type of topology either hexagonal or circular – the size of the topology equals to the amount of customer segment clusters
somgrid <- somgrid(, , "hexagonal")
data.som <- som(data = data.input, grid = somgrid) plot(data.som, main = "Customer Segmentation")
data.clusters <- data.som$codes
data.clusters # Clusters, Customer segment mean
# Count the number of entries between the clusters clusters <- sort(data.clusters)
segment_size <- c()
for (i in 2:length(clusters)) {
segment_size[1] <- sum(data.input < clusters[1])
segment_size[i] <- sum(data.input < clusters[i] & data.input > clusters[i-1]) }
segment_size # Amount of entries between
clusters
The customer segmentation model returns various clusters of related customer information. These clusters are the customer segments. The customer segmentation model is linked to the customer segmentation functional tasks inside the framework, as discussed in Chapter 4, Section 4.2.
5.7.2 Customer segmentation parameters
The product lifetime uptake model, the CLV model, and the goodwill firm value model are calculated by a set of parameters that are unique to each customer segment. The code for calculating and stating the parameters for the rest of the model is given below:
91
## PARAMETER ESTIMATION AND ESTABLISHMENT
# Determine the Bass Model parameters with a non-linear least square built in function
Uptake <- c() # Product uptake data per time period, either define
the data in a list, or import the data from a csv file
Time <- 1:length(Uptake) # Vector with equal length to the uptake data
Bass.nls <- nls(Uptake ~ M * (((P+Q)^2 / P) * exp(-(P+Q) * Time))/(1+(Q/P)*exp(- (P+Q)*Time))^2,
start = list(M=, P=, Q=)) summary(Bass.nls)
# Customer Segmentat parameters Bcoef <- coef(Bass.nls)
m <- Bcoef[1] # Market size parameter m
p <- Bcoef[2] # Innovator rate of diffusion
q <- Bcoef[3] # Imitator rate of diffusion
Alpha <- # Price Elasticity
Betha <- # Advertising elasticity
Price <- c() # Forecasted product price over the time period
Advert <- c() # Forecasted advertising spend over the time period
churn <- # The customer segment churn rate
t <- c(1:24) # Subscription time period
Subscription_Fee <- c() # Subscription fee over the time period - this entry
is the price entry at the point where the customer adapts to the product
Cost <- c() # Product cost
Revenue <- Subscription_Fee - Cost
AC <- # Acquisition cost per customer at time t = 0
t_final <- tail(t, n=1) # Last time period of the subscription contract
c <- (churn/12) # The organisation's churn rate per year divided by
the time period breakdown, monthly = 12, quarterly = 4 # Product parameters
E <- c() # Fixed Expenses per time period of the product
lifecycle or product being active
Product_AC <- # Initial product acquisition cost at time 0
Product_OC <- # Product Overhead costs
Period <- # Product lifetime length under observation
n <- 1:Period # Product lifetime length in time periods, depending
on when the organisation decides to replace product # Organisation parameters
d <- # The organisation's discounted rate per year
5.7.3 The product lifetime uptake model
The first step in the product lifetime uptake model is to calculate the Bass model, without any extensions, from the parameters estimated in step 1. The normal Bass model is coded as follows:
92
## NORMAL BASS MODEL
Uptake <- c() # Create empty entries for the for-loop
CumUptake <- c()
Uptake[1] <- p*m # Define the uptake at time t = 1
CumUptake[1] <- 0 # Define the cumulative uptake at time t = 1
for (i in 2:Period) {
Uptake[i] = (p + (q*CumUptake[i-1])/m)*(m - CumUptake[i-1]) CumUptake = cumsum(Uptake)
}
# Convert vectors into time series
Uptakeseries <- ts(Uptake, start = c(2014, 1), frequency = 12) CumUptakeseries <- ts(CumUptake, start = c(2014, 1), frequency = 12) # Plot the product uptake and cumulative uptake
plot(Uptakeseries, main="Bass Model", xlim = c(), ylim = c(), xlab="Years", ylab="Adaptions")
plot(CumUptakeseries, main="Bass Model", xlim = c(), ylim = c(), xlab="Years", ylab="Cumulative Adaptions")
The second step in the product lifetime uptake model is to extend the Bass model towards a generalised Bass model.
## GENERALISED BASS MODEL
# Convert Marketing Mix into time series
PriceSeries <- ts(Price, start = c(2014, 1), frequency = 12) AdvSeries <- ts(Advert, start = c(2014, 1), frequency = 12)
# Calculate the difference in price and advertising between time periods DeltaPrice <- diff(PriceSeries, lag=1, difference=1)
DeltaAdv <- diff(AdvSeries, lag=1, difference=1)
DeltaAdv[DeltaAdv<0] <- 0 #Only account for a positive change in advertising spend
# Calculate the Generalised Bass model factor for incorporating Marketing Mix MarketingFactor <- 1 + Alpha*(DeltaPrice/PriceSeries) + Betha*(DeltaAdv/AdvSeries) GeneralisedBass <- MarketingFactor*Uptakeseries
# Plot Generalised Bass model
plot(GeneralisedBass, col="red", xlim=c(), ylim=c(), xlab = “Years”, ylab = "Uptake", main = "Generalised Bass Model")
The third and last step in the product lifetime uptake model is to generate a Monte Carlo simulation. A Monte Carlo simulation from the generalised Bass model is coded as follows:
93
## MONTE CARLO SIMULATION DensityFunc <- c() Uptake <- c() CumUptake <- c() p_mean <- p q_mean <- q m_mean <- m
p_sd <- # Predefine the standard deviation of the innovator parameter
q_sd <- # Predefine the standard deviation of the imitator parameter
m_sd <- # Predefine the standard deviation of the market size parameter
runs <- # Number of Monte Carlo Simulation runs
output <- matrix(NA, Period, runs) #Storage matrix
plot(0, col="grey", xlim=c(2014,2018), ylim=c(0, 1000), xlab = "Years", ylab = "Uptake", main = "Product Lifetime Uptake model")
for(run in 1:runs) {
p <- rnorm(n = 1, mean = p_mean, sd = p_sd) # coefficient of innovation
q <- rnorm(n = 1, mean = q_mean, sd = q_sd) # coefficient of imitation
m <- rnorm(n = 1, mean = m_mean, sd = m_sd) # the number of eventual adaptors
Uptake <- c() # Create empty entries for variables
CumUptake <- c() Uptake[1] <- p*m CumUptake[1] <- 0 for (i in 2:Period) {
Uptake[i] = (p + (q*CumUptake[i-1])/m)*(m - CumUptake[i-1]) CumUptake = cumsum(Uptake)
}
output[, run] = Uptake
Uptakeseries <- ts(Uptake, start = c(2013, 1), frequency = 12) par(new=T)
plot(Uptakeseries, xlim=c(2014,2018), ylim=c(0, 1000), xlab = "Years", ylab = "Uptake", main = "Product Lifetime Uptake model")
} #Summary Statistics min(output) mean(output) max(output) 5.7.4 CLV modelling
CLV modelling was conducted on the assumptions mentioned in Section 5.2.2. The code for CLV modelling for a subscription customer is as follows:
94
# CLV PER SUBSCRIPTION PRODUCT CUSTOMER
# Probability of a customer being active at time t r <- c() r[1] <- 1 for (i in 2:t_final) { r[i] = r[i-1]*(1-c) } CLV <- sum((Revenue*r)/((1+(d/12))^t)) – AC CLV
5.7.5 The goodwill firm value
The goodwill firm value is the sum of the organisation’s NPV product portfolio. The NPV of a product is coded as follows:
## PRODUCT NPV
Product_NPV <- sum((Uptakeseries*CLV - E)/((1+(d/12))^n)) – (Product_AC + Product_OC)
From which the Goodwill Firm Value for an organisation’s product portfolio are then coded as follows:
## GOODWILL FIRM VALUE
n = time estimation of product 1 from the present m = time estimation of product 2 from the present z = time estimation of product 3 from the present
Goodwill_Firm_Value <- Product_1_NPV/(1+(d/12))^n) + Product_2_NPV/(1+(d/12))^m) + Product_3_NPV/(1+(d/12))^z)