• No results found

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)