Toy Horse Conjoint Experiment: Case Assignment
Toy Horse Conjoint Experiment: Case Assignment
Toy Horse Conjoint Experiment: Case Assignment
Case Assignment
Age
Gender Segmentation
Market Segmentation
Benefit Segmentation
The optimal product set from two segmentation are mostly consistent.
These products are recommended inputs for the scenarios in Market Simulation.
Market Simulation Market Share
Methodologies
Simulate market share and profitability in 4
scenarios, in which we launch product:
(1) 5 and 13 (current market)
(2) 4, 14 and 16 (ideal products from post-hoc analysis)
(3) 4 and 16 (ideal products from priori segmentation)
(4) 14 and 16
Findings:
In Scenario 2 with product 4, 14 and 16, we yield
the largest market share.
Scenario 3 Scenario 4
Market Simulation
Scenario 1 (current market) Profitability over 10 years
Our Products:
profile 5: 18” Glamorous Rocking Horse at $139.99
profile 13: 18” Racing Rocking Horse at $139.99
Competitor’s Product:
profile 7: 26” Racing Rocking Horse at $139.99
Findings:
Competitor’s Product:
profile 8: 26” Racing Rocking Horse at $119.99
Findings:
Competitor’s Product:
profile 8: 26” Racing Rocking Horse at $119.99
Findings:
Profile 16 accounts for the largest market share(46.5%),
Market Share Annual Margin and the greatest proportion of profit annually, with a total
margin of $102,285.
Market Simulation
Scenario 4: Profitability over 10 years
Our Products:
profile 14: 18” Racing Bouncing Horse at $119.99
profile 16: 18” Glamorous Rocking Horse at $119.99
Competitor’s Product:
profile 8: 26” Racing Rocking Horse at $119.99
Findings:
1. Competitor’s product takes up the largest proportion
Market Share Annual Margin of market share (40.5%).
2. Profile 16 and profile 14 has an annual margin of
$80,288 and $57,953 respectively.
Comparison for Profitability
Scenarios
Setup
rm(list = ls())
require("fpc")
require("factoextra")
require("gridExtra")
library(cluster)
library(fpc)
library(factoextra)
library(gridExtra)
library(reshape)
Part A
1
################################
# PART A #
################################
Part-utilities of the conjoint model at the individual level are stored in the ‘partworths1’. The NAs in the
survey data are replaced by the predictions for missing profiles.
Part B
################################
# PART B #
################################
source("ConjointCode.R")
2
Optimal number of clusters Optimal number of clusters
1000
0.6
Total Within Sum of Square
0.4
500
0.2
250
0.0
1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10
Number of clusters k Number of clusters k
clusts = runClusts(partworths1[,2:6],c(2,3,4,5),print=TRUE,maxClusts=4,
seed=12345,nstart=20,iter.max=100)
3
page 1 of 1
k=2 k=4
1 1 cluster
Dim2 (22.4%)
Dim2 (22.4%)
cluster 1
0 0
1 2
−1 −1
2 3
−2 −2 4
−3 −2 −1 0 1 2 3 −3 −2 −1 0 1 2 3
Dim1 (68.1%) Dim1 (68.1%)
k=3 k=5
cluster
1 1
Dim2 (22.4%)
Dim2 (22.4%)
cluster 1
0 1 0 2
−1 2 −1 3
3 4
−2 −2
5
−3 −2 −1 0 1 2 3 −3 −2 −1 0 1 2 3
Dim1 (68.1%) Dim1 (68.1%)
The optimal number of clusters is 3, where the average silhouette width is the highest, and the customer
can be separated in to 3 non-overlapped groups of people with different preferences.
4
1 = 40%
2 = 26%
3 = 34%
CLUSPLOT( toClust )
Component 2
12058
94
31
41 194
140
71 2 2 150
187
186
168 180
188163
199189
172
16 52
166
42 88
117
127
1214 51
92
76 110
84
96
167
177
74
60178972
105
113
65
111
61 152
162
103
6181
98 85 159
3190
193 195 33 28 165 164
146197
179122192
183
25
124
174
118
148
136 1
191
184
11 185
178198
128 145
126 69
170 46 86
116
155123
157 175 10990 141
182 99
18 133
80 153
119
63 93 139
176
70
107
95
138
154
156 147
142
114 196
78 144
160
81 171
173 50 4169
40 200
134 48
56125
37
132
1073
875
100 158
35
4591
5 108
79
53115
−1
661298727323 22
101 20
38 135
130149 143
13
67 161
49 104 15
68
44 24
39 54
83112
10697
64
121
29 32 77
43 36
55
21
19
62
597
30 110282151
57 131
47
137 34926
−3 −2 −1 0 1 2 3
Component 1
These two components explain 75.88 % of the point variability.
Cluster Means
−10 50
46.1
31.5 40.9 22.5 11.6
8.9 5.3 16.6 10.0 7.0 11.0
−6.6 −9.4 −6.6 0.5
# Cluster means
partworths1_seg = as.data.frame(clusts[[1]][[2]]$centers)
partworths1_seg
In the post-hoc segmentation, we use 3 clusters. The sign and magnitude of attribute coefficients indicate
the preference of consumers within certain attributes, with positive sign meaning consumers prefer that
attribute. We can use this result to support our product line decision.
Ideal product for each segment
Segment 1: prefer lower price, bigger size, bouncing motion and racing style. → Profile 4
Segment 2: preder lower price, smaller size, rocking motion and glamour style. → Profile 14
Segment 3: preder lower price, bigger size, rocking motion and glamour style. → Profile 16
Part C
################################
# PART C #
################################
5
# Create new dataset for part C
seg_data = conjointData
To test whether priori segmentations affect part-utilities, we run regressions with interactions of the segment
dummies with each attribute.
Segmentation 1: By age and gender
6
The interaction coefficients between segmentations and attributes are not entirely significant, so we consider
testing whether gender or age is meaningful for business segmentation.
Segmentation 2: By age
# Segmentation 2 by age
summary(lm(ratings~price+size+motion+style+
price*seg2+size*seg2+
motion*seg2+style*seg2,
data=seg_training))[[4]]
# Segmentation 3 by gender
summary(lm(ratings~price+size+motion+style+
price*seg3+size*seg3+
motion*seg3+style*seg3,
data=seg_training))[[4]]
7
## Segment-level regressions
partworths2_seg = data.frame(cluster = 1:2, intercept = NA, price = NA,
size = NA, motion = NA, style = NA)
for (seg in 1:2){
data.sub = subset(seg_training, seg3 == seg)
lm = lm(ratings~price+size+motion+style, data=data.sub)
partworths2_seg[seg, 2:6] = lm$coefficients
}
partworths2_seg
We’ll only get 2 sets of part-utilities instead of 200. But at least one set of part-utilities for attributes varies
significantly across segments, and can be used for target different optimal products.
Ideal product for each segment
Segment 1: prefer lower price, bigger size, bouncing motion and racing style. → Profile 4
Segment 2: preder lower price, bigger size, rocking motion and glamour style. → Profile 16
Part D
#################################
# PART D #
#################################
Set up scenarios
Our current products’ profile IDs are 5 and 13, and the competitor’s profile ID is 7. We will simulate the
scenarios in which we launch ideal products from part B and part C, considering the competitor’s reponse
by reducing his price.
Senarios:
8
Scenario Our Products Competitor’s Product
1 (Original) 5, 13 7
2 (Part B) 4, 14, 16 7
3 (Part B) 4, 14, 16 8
4 (Part C) 4, 16 7
5 (Part C) 4, 16 8
6 14, 16 7
7 14, 16 8
## Set up scenarios
scens = list()
scens[[1]]=c(5,13,7)
scens[[2]]=c(4,14,16,7)
scens[[3]]=c(4,14,16,8)
scens[[4]]=c(4,16,7)
scens[[5]]=c(4,16,8)
scens[[6]]=c(14,16,7)
scens[[7]]=c(14,16,8)
## Market Share
sapply(scens,simFCSharesTie,data=ratingData, ascend=FALSE)
## [[1]]
## 5 13 7
## 0.22 0.21 0.57
##
## [[2]]
## 4 14 16 7
## 0.40 0.25 0.35 0.00
##
## [[3]]
## 4 14 16 8
## 0.355 0.220 0.340 0.085
##
## [[4]]
## 4 16 7
## 0.405 0.595 0.000
##
## [[5]]
## 4 16 8
## 0.355 0.465 0.180
##
## [[6]]
## 14 16 7
## 0.300 0.695 0.005
##
## [[7]]
## 14 16 8
## 0.230 0.365 0.405
In scenario 2, 4, 6, the competitor’s share decreases tremendously so we assume that he will decrease his price
in response (i.e., changing from profile 7 to profile 8). Hence we remove these scenarios and move forward
9
with scenario 1, 3, 5, 7. After simulating the market share, we will simulate short-term and long-term
profitability.
## Simulate profitability
# Variable cost
variableCost = profilesData
variableCost$varCost[variableCost$size==0 & variableCost$motion==1] = 33 # 18" Rocking
variableCost$varCost[variableCost$size==1 & variableCost$motion==1] = 41 # 26" Rocking
variableCost$varCost[variableCost$size==0 & variableCost$motion==0] = 21 # 18" Bouncing
variableCost$varCost[variableCost$size==1 & variableCost$motion==0] = 29 # 26" Bouncing
quantity = ourMarketShare*4000
price = profilesData$priceLabel[profilesData$profile %in% ourProducts]*100/125
varCost = variableCost$varCost[variableCost$profile %in% ourProducts]
fixCost = 20000*length(ourProducts)*year +
sum(!(ourProducts %in% c(5, 13, 6, 14)))*1/3*20000
margin = (price-varCost)*quantity
profit = sum(margin)*year - fixCost
results = list(profit, margin)
results
}
## [[1]]
## 5 13
## 69512.96 66353.28
##
## [[2]]
## 4 14 16
## 95128.64 55432.96 74789.12
##
## [[3]]
## 4 16
## 95128.64 102285.12
##
## [[4]]
## 14 16
## 57952.64 80288.32
10
Then we look at overall profitability of the company over years.
profitData
Scenario 3 (2nd column), in which we sell profile 4, 14, 16 and the competitor sell profile 8, yields the highest
profit both in short term and long term.
apply(profitData, 1, which.max)
11