# Setting up attribute descriptions for easier reference in report
library(Dict)
room_types <- c("small suite" = "a small suite which contains a bedroom and separate sitting area with a couch, tv, and coffee table",
"large room" = "a large standard room containing two queen-sized beds",
"room office" = "a room that contains a full-sized desk with swivel chair, and single queen-size bed")
business_amenities <- c("internet" = "an in-room computer with access to the internet at a low hourly rate",
"speaker phone" = "an in-room speaker phone for conference calls",
"fax machine" = "an in-room fax machine with a private temporary number")
leisure_amenities <- c("exercise" = "access to a large exercise room, equipped with a variety of cardio machines, free weights and a sauna",
"pool" = "access to a standard indoor lap pool",
"exercise+pool" = "access to both a small exercise room and a small pool")
extras <- c("shoe shine" = "a complimentary shoe shine every night",
"tape library" = "complimentary access to a large collection of videotapes",
"fruit cheese bowl" = "a complimentary fruit and gourmet cheese bowl",
"newspaper" = "a complimentary newspaper delivered every morning")
rest_delivery <- c("yes" = "complimentary delivery service for nearby restaurants",
"no" = "no restaurant delivery service")
I have been hired by Forte Hotels to provide analysis for their entry into the United States market with a new hotel chain, Forte Executive Innes, that will appeal to business travelers.
Forte Hotels wishes to target both European business travelers in the US, who will already be familiar with their brand, as well as to target US business travelers, who might be won over with amenities not typically found among other popular US hotels, but will still expect American functionality and convenience.
To help position themselves within this market, Forte Hotels seeks to know which combination of hotel amenities are the most desired by business travelers.
And to provide this analysis, I will utilize a questionnaire of consumer responses to develop a conjoint analysis that will provide insight into traveler preferences, based on five attribute categories and varying levels of options within each attribute.
The categories & levels are:
To significantly improve the ease and efficiency of data collection, the design of this study uses 16 bundles (pre-selected with fractional factorial design) in order to estimate the preferences of business travelers for all 216 possible combinations of hotel rooms and amenities.
The following questionnaire was distributed to a group of 40 respondents who rated their estimated satisfaction with each bundle option (on a 0-100 scale):
library(plotly)
survey_data <- read.csv("forte_questionnaire.csv", header=TRUE)
survey_data[,3] <- ""
fig <- plot_ly(
type = 'table',
columnwidth = c(280, 45),
columnorder = c(0, 1),
height = 500,
header = list(
values = c("<b>Please rate how satisfied you would be with each of the following hotel amenity bundles when you are travelling for business:</b>","<b> Rating<br>(0 - 100)</b>"),
align = c("Left", "center"),
line = list(width = 1, color = 'black'),
fill = list(color = c("grey", "grey")),
font = list(family = "Arial", size = 14, color = "white")
),
cells = list(
values = rbind(paste(survey_data[,1], "\n", survey_data[,2], sep=""), survey_data[,3]),
align = c("left", "center"),
line = list(color = "black", width = 1),
font = list(family = "Arial", size = 12, color = c("black"))
))
fig
Table 1: Business Traveler Questionnaire
To complete the conjoint analysis, first the attribute profiles for each of the 16 bundles were encoded to integer values, to represent each separate level within each attribute.
The data is then loaded into R from .csv files.
library(conjoint)
# Declare research variables
# Include levels of attributes
hotel<-expand.grid(room=c("Small Suite","Large Room","Room Office"),
bus_amenities=c("Internet access","Speaker phone", "Room fax"),
leisure=c("Exercise room", "Pool", "Exercise Room + Pool"),
extras= c("Shoe shine", "Tape library", "Fruit and cheese", "Newspaper"),
rest_delivery = c("Yes", "No"))
###########################
# data loading
# comma separated data: using read.csv
# using parameter: fileEncoding="UTF-8-BOM", because otherwise it appends "ï.." to the beginning of the first column name
preferences=read.csv("forte_preferences.csv", header=TRUE, fileEncoding="UTF-8-BOM")
profiles=read.csv("forte_profiles.csv", header=TRUE, fileEncoding="UTF-8-BOM")
levelnames=read.csv("forte_levels.csv", header=TRUE, fileEncoding="UTF-8-BOM")
simulations1=read.csv("forte_simulation1.csv", header=TRUE, fileEncoding="UTF-8-BOM")
simulations2=read.csv("forte_simulation2.csv", header=TRUE, fileEncoding="UTF-8-BOM")
Preferences data dimension: 40 rows x 16 columns
Profiles data dimension: 16 rows x 5 columns
Levels data dimension: 15 rows x 1 column
Simulations 1 data dimension: 5 rows x 5 columns
Simulations 2 data dimension: 4 rows x 5 columns
Calculating the part worth of each level for each attribute allows for estimating the values that a customer places on each attribute when making choices. The part worth is calculated by encoding each attribute as an explanatory variable into a linear model, with the preference rating as the response variable. Doing this also allows for measuring the relative importance of each category of attributes.
As an example, here are the part worth utilities for respondent 10, as well as the ideal hotel profile that can be determined from the part worth utilities:
Part worth utilities for respondent 10:
# Measurement of part-worths utilities (all respondents):
partutilities=caPartUtilities(y=preferences,x=profiles,z=levelnames)
print(partutilities[10,]) # print part-worth utility for respondent 10
## intercept Small Suite Large Room
## 47.708 0.708 8.583
## Room Office Internet access Speaker phone
## -9.292 -0.250 -8.250
## Room fax Exercise room Pool
## 8.500 -1.292 -13.417
## Exercise room + Pool Shoe shine Tape library
## 14.708 -3.688 -7.688
## Fruit and cheese Newspaper Yes
## 8.312 3.063 4.938
## No
## -4.938
Importance of attributes for respondent 10:
# Determining the relative importance of features (for the respondent No.10):
importance=caImportance(y=preferences[10,],x=profiles)
print(importance)
## [1] 20.17 18.90 31.73 18.05 11.14
Based on the part-worth utility for respondent 10, their ideal hotel would be:
For this respondent, the Leisure Amenities attribute is the most important, therefore they would likely first narrow their selection of potential hotels based on the availability of both an exercise room and a pool. Next in importance for this respondent are Room Type, followed closely by Business Amenities and Extras. So this person’s selection of a hotel to stay in would most likely be determined in order by those attributes.
Total utilities for all respondents (first six respondents):
# Measurement of total utilities (all respondents):
totalutilities=caTotalUtilities(y=preferences,x=profiles)
print(head(totalutilities))
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 56.125 48.125 30.875 46.875 24.000 69.00 34.000 22.000 28.000 29.750
## [2,] 25.000 57.875 49.000 71.125 58.125 62.75 37.875 36.250 34.000 51.625
## [3,] 66.875 2.000 53.250 15.875 66.875 46.25 39.000 33.875 43.000 31.375
## [4,] 38.000 63.875 49.875 69.250 50.125 49.00 57.000 26.875 29.125 22.000
## [5,] 63.875 47.500 83.000 51.625 73.375 21.00 65.750 16.875 65.875 43.250
## [6,] 43.000 50.000 32.000 36.000 56.000 32.25 46.000 19.750 84.125 5.125
## [,11] [,12] [,13] [,14] [,15] [,16]
## [1,] 76.000 36.250 26.875 16.125 29.125 57.875
## [2,] 38.000 80.375 48.875 73.750 13.125 58.250
## [3,] 48.875 37.750 55.250 60.875 34.875 53.000
## [4,] 58.000 32.875 69.750 24.125 71.125 30.000
## [5,] 57.250 56.625 68.875 47.250 52.000 33.875
## [6,] 45.875 17.875 72.875 17.125 36.125 30.875
Calculating the total utilities for each respondent and questionnaire profile yields roughly the same values as the preference data from respondents.
# Using the Conjoint function for all respondents
Conjoint(y=preferences,x=profiles,z=levelnames)
##
## Call:
## lm(formula = frml)
##
## Residuals:
## Min 1Q Median 3Q Max
## -44,737 -12,733 -0,142 12,666 50,906
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 43,688542 0,812918 53,743 < 2e-16 ***
## factor(x$Room)1 3,000000 1,100696 2,726 0,006598 **
## factor(x$Room)2 -3,243750 0,938677 -3,456 0,000586 ***
## factor(x$Bus.Amenities)1 -1,468750 1,100696 -1,334 0,182561
## factor(x$Bus.Amenities)2 0,906250 0,938677 0,965 0,334688
## factor(x$Leisure)1 -0,997917 1,100696 -0,907 0,364953
## factor(x$Leisure)2 0,389583 0,938677 0,415 0,678258
## factor(x$Extras)1 0,104688 1,219377 0,086 0,931610
## factor(x$Extras)2 -1,264063 1,219377 -1,037 0,300299
## factor(x$Extras)3 0,885937 1,219377 0,727 0,467772
## factor(x$Rest.Delivery)1 0,007812 0,704008 0,011 0,991149
## ---
## Signif. codes: 0 '***' 0,001 '**' 0,01 '*' 0,05 '.' 0,1 ' ' 1
##
## Residual standard error: 17,81 on 629 degrees of freedom
## Multiple R-squared: 0,02767, Adjusted R-squared: 0,01221
## F-statistic: 1,79 on 10 and 629 DF, p-value: 0,05914
## [1] "Part worths (utilities) of levels (model parameters for whole sample):"
## levnms utls
## 1 intercept 43,6885
## 2 Small Suite 3
## 3 Large Room -3,2438
## 4 Room Office 0,2438
## 5 Internet access -1,4687
## 6 Speaker phone 0,9063
## 7 Room fax 0,5625
## 8 Exercise room -0,9979
## 9 Pool 0,3896
## 10 Exercise room + Pool 0,6083
## 11 Shoe shine 0,1047
## 12 Tape library -1,2641
## 13 Fruit and cheese 0,8859
## 14 Newspaper 0,2734
## 15 Yes 0,0078
## 16 No -0,0078
## [1] "Average importance of factors (attributes):"
## [1] 29,20 21,32 19,74 15,94 13,80
## [1] Sum of average importance: 100
## [1] "Chart of average factors importance"
For all respondents, the conjoint analysis indicates that the preferred hotel room profile is:
The most important attribute by far among all respondents is Room Type at 29.2%, followed by Business Amenities and Leisure Amenities at 21.32% and 19.74% respectively.
# Using the Conjoint function for the respondent No. 26
Conjoint(preferences[26,],profiles,levelnames)
##
## Call:
## lm(formula = frml)
##
## Residuals:
## 1 2 3 4 5 6 7
## -1,250e-01 3,018e-15 -3,691e-15 1,250e-01 2,500e-01 -1,250e-01 -1,250e-01
## 8 9 10 11 12 13 14
## 1,006e-15 -1,749e-15 1,250e-01 1,250e-01 -2,500e-01 -1,250e-01 4,441e-15
## 15 16
## -1,409e-15 1,250e-01
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 43,16667 0,06455 668,735 1,42e-13 ***
## factor(x$Room)1 -9,91667 0,08740 -113,462 1,01e-09 ***
## factor(x$Room)2 2,58333 0,07454 34,659 3,76e-07 ***
## factor(x$Bus.Amenities)1 -3,08333 0,08740 -35,278 3,44e-07 ***
## factor(x$Bus.Amenities)2 -7,08333 0,07454 -95,033 2,45e-09 ***
## factor(x$Leisure)1 4,70833 0,08740 53,871 4,17e-08 ***
## factor(x$Leisure)2 0,08333 0,07454 1,118 0,314
## factor(x$Extras)1 10,18750 0,09682 105,216 1,47e-09 ***
## factor(x$Extras)2 -2,56250 0,09682 -26,465 1,44e-06 ***
## factor(x$Extras)3 -8,56250 0,09682 -88,433 3,50e-09 ***
## factor(x$Rest.Delivery)1 -7,93750 0,05590 -141,990 3,29e-10 ***
## ---
## Signif. codes: 0 '***' 0,001 '**' 0,01 '*' 0,05 '.' 0,1 ' ' 1
##
## Residual standard error: 0,2236 on 5 degrees of freedom
## Multiple R-squared: 0,9999, Adjusted R-squared: 0,9998
## F-statistic: 6769 on 10 and 5 DF, p-value: 1,1e-09
## [1] "Part worths (utilities) of levels (model parameters for whole sample):"
## levnms utls
## 1 intercept 43,1667
## 2 Small Suite -9,9167
## 3 Large Room 2,5833
## 4 Room Office 7,3333
## 5 Internet access -3,0833
## 6 Speaker phone -7,0833
## 7 Room fax 10,1667
## 8 Exercise room 4,7083
## 9 Pool 0,0833
## 10 Exercise room + Pool -4,7917
## 11 Shoe shine 10,1875
## 12 Tape library -2,5625
## 13 Fruit and cheese -8,5625
## 14 Newspaper 0,9375
## 15 Yes -7,9375
## 16 No 7,9375
## [1] "Average importance of factors (attributes):"
## [1] 21,94 21,94 12,08 23,85 20,19
## [1] Sum of average importance: 100
## [1] "Chart of average factors importance"
For Nissa (respondent no. 26), the conjoint analysis indicates that their preferred hotel room is:
The most important attribute for Nissa is Extras at 23.85%, but Room Type, Business Amenities, and Restaurant Delivery follow very closely in importance, at 21.94%, 21.94%, and 20.19% respectively.
To identify separate groups within the respondents, I utilized K-means clustering to segment the preference data. This clustering method utilizes the preferences and according attributes for each respondent to calculate cluster means, and assign individuals to either cluster based on the graph-distance similarity. Unfortunately, the K-means method can not determine the optimum number of clusters, so another method is necessary in addition to K-means clustering. To determine the optimum number, I utilized a scree plot to display the total inter-cluster sum of squares values for each number of clusters from one through twenty, which is shown below.
With this plot, and some careful interpretation, I was able to determine an ideal number of segments to utilize for further analysis.
# Scree Plot to determine ideal number of segments
seg_i <- list()
for (i in 1:20) seg_i[i] <- caSegmentation(preferences,profiles,c=i)$segm$tot.withinss
#seg_i <- as.numeric(unlist(seg_i))
plot(1:20, seg_i, type="b", xlab="Number of Clusters", ylab="Within groups sum of squares")
Figure 1: Scree Plot for Survey Respondent Segmentation, displaying the total within group sum of squares for each number of clusters
Looking at the scree plot, it appears that two would be an ideal number of segments for this data. That is because there is a significant reduction in the total within group sum of squares when segments are increased from one to two, but the addition of further segments does not result in such a significant relative reduction in the total sum of squares. Utilizing more than two segments would reduce the level of differences within each segment, but at the cost of making it more difficult to clearly differentiate between the different segments.
### ---------------------------
### Segmentation of respondents
### ---------------------------
### Segmentation using k-means method - division into 2 segments:
segments<-caSegmentation(preferences,profiles,c=2)
# calculate each cluster's relative size
cluster_size <- c(segments$segm$size[1]/sum(segments$segm$size), segments$segm$size[2]/sum(segments$segm$size))
## Saving segmentation results - append to preference ratings and save to .csv
updated_preferences <- preferences
updated_preferences$segment <- segments$segm$cluster
write.csv(updated_preferences,"preferences_with_segment.csv", row.names=FALSE)
# Print clustering information
print(segments$seg)
## K-means clustering with 2 clusters of sizes 28, 12
##
## Cluster means:
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
## 1 41.85268 36.81250 47.54911 36.00000 45.17857 32.04911 46.81250 31.88839
## 2 50.12500 54.29167 39.04167 55.45833 50.34375 52.19792 38.07292 54.71875
## [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16]
## 1 50.75893 32.70982 48.41071 35.22768 48.88839 34.12500 47.19196 32.58036
## 2 44.02083 61.16667 32.81250 59.91667 46.76042 59.30208 36.90625 56.86458
##
## Clustering vector:
## [1] 1 2 1 1 1 1 1 1 1 2 2 1 1 2 2 2 1 1 1 1 2 1 2 1 1 1 2 1 1 1 1 2 1 1 1 1 1 1
## [39] 2 2
##
## Within cluster sum of squares by cluster:
## [1] 105093.4 53274.4
## (between_SS / total_SS = 20.6 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
## Visualization of the division into 2 segments:
require(fpc)
require(broom)
require(ggplot2)
dcf<-discrcoord(segments$util,segments$sclu)
assignments<-augment(segments$segm,dcf$proj[,1:2])
ggplot(assignments)+geom_point(aes(x=X1,y=X2,color= .cluster))+labs(color="Cluster Assignment",title="K-Means Clustering Results")
Figure 2: Respondent Segmentation Plot
Looking at the plot of segment assignments, it appears that the K-means method worked well to separate the respondents into disjoint groups. Cluster 1 is the largest and contains 28 individuals (70%), while Cluster 2 only contained 12 individuals (30%).
The segment number that was calculated for each respondent was appended to the original preferences data, and saved as a .csv for potential future analysis.
With this segmentation information, I think it is valuable to re-visit conjoint analysis, to better determine the preferences of each cluster, and to be able to fine-tune the attributes of the Forte Executive Innes to the preferences of the target customer.
segm1_pref <- updated_preferences[updated_preferences$segment==1,1:16]
# Using the Conjoint function for segment 1 (28 respondents - 70%)
Conjoint(segm1_pref,profiles,levelnames)
##
## Call:
## lm(formula = frml)
##
## Residuals:
## Min 1Q Median 3Q Max
## -46,549 -11,192 -0,645 10,772 37,290
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 42,35268 0,84606 50,059 < 2e-16 ***
## factor(x$Room)1 3,97470 1,14557 3,470 0,000573 ***
## factor(x$Room)2 -8,77083 0,97694 -8,978 < 2e-16 ***
## factor(x$Bus.Amenities)1 -1,57887 1,14557 -1,378 0,168833
## factor(x$Bus.Amenities)2 0,80060 0,97694 0,819 0,412953
## factor(x$Leisure)1 -1,94940 1,14557 -1,702 0,089524 .
## factor(x$Leisure)2 0,56845 0,97694 0,582 0,560955
## factor(x$Extras)1 0,05134 1,26908 0,040 0,967750
## factor(x$Extras)2 -1,52009 1,26908 -1,198 0,231650
## factor(x$Extras)3 1,27455 1,26908 1,004 0,315785
## factor(x$Rest.Delivery)1 -0,99777 0,73271 -1,362 0,173976
## ---
## Signif. codes: 0 '***' 0,001 '**' 0,01 '*' 0,05 '.' 0,1 ' ' 1
##
## Residual standard error: 15,51 on 437 degrees of freedom
## Multiple R-squared: 0,1698, Adjusted R-squared: 0,1508
## F-statistic: 8,935 on 10 and 437 DF, p-value: 2,008e-13
## [1] "Part worths (utilities) of levels (model parameters for whole sample):"
## levnms utls
## 1 intercept 42,3527
## 2 Small Suite 3,9747
## 3 Large Room -8,7708
## 4 Room Office 4,7961
## 5 Internet access -1,5789
## 6 Speaker phone 0,8006
## 7 Room fax 0,7783
## 8 Exercise room -1,9494
## 9 Pool 0,5685
## 10 Exercise room + Pool 1,381
## 11 Shoe shine 0,0513
## 12 Tape library -1,5201
## 13 Fruit and cheese 1,2746
## 14 Newspaper 0,1942
## 15 Yes -0,9978
## 16 No 0,9978
## [1] "Average importance of factors (attributes):"
## [1] 28,07 23,77 16,03 17,66 14,46
## [1] Sum of average importance: 99,99
## [1] "Chart of average factors importance"
The most three most-important attributes for Segment 1 are Room Type (28.07%), then Business Amenities (23.77%), then Extras (17.66%).
From these preferences, it seems that the individuals in Segment 1 prefer to have a space where they can work efficiently. Because they prefer a room-office, they want to be prepared to accomplish any task that they may encounter on their business trip, and especially be able to conference with others (though having an in-room fax machine is also highly ranked for this group). They like to have choices in how they relax, whether it’s using the gym or pool, and they enjoy being pampered with indulgent amenities like a fruit and gourmet cheese bowl. However, restaurant delivery is not important to this group.
segm2_pref <- updated_preferences[updated_preferences$segment==2,1:16]
# Using the Conjoint function for segment 2 (12 respondents - 30%)
Conjoint(segm2_pref,profiles,levelnames)
##
## Call:
## lm(formula = frml)
##
## Residuals:
## Min 1Q Median 3Q Max
## -40,021 -11,474 -0,839 10,820 52,958
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 46,80556 1,42974 32,737 < 2e-16 ***
## factor(x$Room)1 0,72569 1,93588 0,375 0,7082
## factor(x$Room)2 9,65278 1,65093 5,847 2,29e-08 ***
## factor(x$Bus.Amenities)1 -1,21181 1,93588 -0,626 0,5321
## factor(x$Bus.Amenities)2 1,15278 1,65093 0,698 0,4859
## factor(x$Leisure)1 1,22222 1,93588 0,631 0,5286
## factor(x$Leisure)2 -0,02778 1,65093 -0,017 0,9866
## factor(x$Extras)1 0,22917 2,14462 0,107 0,9150
## factor(x$Extras)2 -0,66667 2,14462 -0,311 0,7563
## factor(x$Extras)3 -0,02083 2,14462 -0,010 0,9923
## factor(x$Rest.Delivery)1 2,35417 1,23819 1,901 0,0589 .
## ---
## Signif. codes: 0 '***' 0,001 '**' 0,01 '*' 0,05 '.' 0,1 ' ' 1
##
## Residual standard error: 17,16 on 181 degrees of freedom
## Multiple R-squared: 0,2133, Adjusted R-squared: 0,1698
## F-statistic: 4,907 on 10 and 181 DF, p-value: 2,847e-06
## [1] "Part worths (utilities) of levels (model parameters for whole sample):"
## levnms utls
## 1 intercept 46,8056
## 2 Small Suite 0,7257
## 3 Large Room 9,6528
## 4 Room Office -10,3785
## 5 Internet access -1,2118
## 6 Speaker phone 1,1528
## 7 Room fax 0,059
## 8 Exercise room 1,2222
## 9 Pool -0,0278
## 10 Exercise room + Pool -1,1944
## 11 Shoe shine 0,2292
## 12 Tape library -0,6667
## 13 Fruit and cheese -0,0208
## 14 Newspaper 0,4583
## 15 Yes 2,3542
## 16 No -2,3542
## [1] "Average importance of factors (attributes):"
## [1] 31,85 15,61 28,38 11,92 12,25
## [1] Sum of average importance: 100,01
## [1] "Chart of average factors importance"
The top three most-important attributes for Segment 2 are Room Type (31.85%), then Leisure Amenities (28.38%), then Business Amenities (15.61%).
From these preferences it seems that the individuals in Segment 2 are business travelers who are primarily looking for a place to relax, rather than get work done. They prefer a standard room with two-beds, but they do still value having an in-room speaker phone for conferences when it’s necessary. However more than a speaker phone, this group more-highly values leisure amenities, especially a well-equipped gym so that they may stay in shape. This group enjoys practical extras like a daily newspaper, and free restaurant delivery; however both of these things are relatively unimportant for this group overall.
The attributes of five competitor hotel brands that Forte Hotel expects to compete with are:
Note: in cell [2,1] the text “Room Type” isn’t rendering for me when viewed with Firefox, but it seems to work with Chrome or Edge
library(plotly)
competitor <- read.csv("forte_existing.csv", header=TRUE)
fig <- plot_ly(,
type = 'table',
columnwidth = c(80, 80, 80, 80, 80, 80),
columnorder = c(0, 1, 2, 3, 4, 5),
height = 385,
header = list(
values = c("<b>Attribute / Competitor Hotel Profiles</b>", "<b>Courtyard by Mariott</b>", "<b>Nittany Lion Inn</b>", "<b>Atherton Hilton</b>", "<b>Tofftrees</b>", "<b>Scanticon</b>"),
align = c("center", "center"),
line = list(width = 1, color = 'black'),
fill = list(color = c("grey")),
font = list(family = "Arial", size = 14, color = "white")
),
cells = list(
values = rbind(c("<b>Room Type</b>", "<b>Business Amenities</b>", "<b>Leisure Amenities</b>", "<b>Extras</b>", "<b>Restaurant Delivery</b>"), competitor[,2], competitor[,3], competitor[,4], competitor[,5], competitor[,6]),
align = c("left", "left"),
line = list(color = "black", width = 1),
fill = list(color = c("grey", "white")),
font = list(family = "Arial", size = 13, color = c("white", "black")),
height=40
))
fig
Table 2: Profiles of Competitor Hotels
And the profile attributes of the new hotel options are:
library(plotly)
new_options <- read.csv("forte_newoptions.csv", header=TRUE)
fig <- plot_ly(,
type = 'table',
columnwidth = c(80, 80, 80, 80, 80),
columnorder = c(0, 1, 2, 3, 4),
height=350,
header = list(
values = c("<b>Attribute / New Hotel Profiles</b>", "<b>Professional 1</b>", "<b>Professional 2</b>", "<b>Tourist</b>", "<b>Deluxe</b>"),
align = c("center", "center"),
line = list(width = 1, color = 'black'),
fill = list(color = c("grey")),
font = list(family = "Arial", size = 14, color = "white")
),
cells = list(
values = rbind(c("<b>Room Type</b>", "<b>Business Amenities</b>", "<b>Leisure Amenities</b>", "<b>Extras</b>", "<b>Restaurant Delivery</b>"), new_options[,2], new_options[,3], new_options[,4], new_options[,5]),
align = c("left", "left"),
line = list(color = "black", width = 1),
fill = list(color = c("grey", "white")),
font = list(family = "Arial", size = 13, color = c("white", "black")),
height=40
))
fig
Table 3: New Hotel Profile Options
Unfortunately the R ‘Conjoint’ package’s simulation functions aren’t working for this data set. So I will complete a market share analysis by manually reasoning from the conjoint analysis data instead.
#Using maximum utility model, BTL probability model (Bradley-Terry-Luce Model) and logit model:
#ShowAllSimulations(sym=simulations1,y=preferences,x=profiles)
Competitor Analysis:
For Segment 1’s estimated choice of competitor hotel chains would first be based on the room type. Since this segment prefers a room containing a full-sized desk, they would then choose the Scanticon because it is the only option that provides that choice.
For Segment 2’s estimated choice of competitor hotels, they would first choose based on the room type, seeking a large standard room. This would narrow the options to the Nittany Lion Inn or the Atherton Hilton. Segment 2 individuals would then look at leisure amenities and business amenities, but because those are the same for both options, they would make the choice based on the next factor in importance: restaurant delivery, seeking a hotel that offers the service. So, Segment 2 individuals would then choose the Nittany Lion Inn, which in addition to restaurant delivery, also provides a daily newspaper, though it is their least important factor.
New Hotel Profile Analysis:
For Segment 1’s estimated choice of new hotel profiles, they would again first assess the options based on the room type. The Professional 1 room would therefore be chosen by Segment 1 individuals because that is the only option with a desk in-room.
For Segment 2’s estimated choice of new hotel profiles, they would choose first based on the room type, and would limit the options to the Tourist or Deluxe rooms because those options feature large standard rooms. Next, Segment 2 individuals would choose based on leisure amenities, but both available options are identical (though they don’t meet the preference of a exercise room only). So this Segment would ultimately decide based on the business amenities, and choose the Tourist room profile because it provides an in-room speaker phone.
library(plotly)
fig <- plot_ly(,
type = 'table',
columnwidth = c(20, 20, 20),
columnorder = c(0, 1, 2),
height=180,
header = list(
values = c("","<b>Segment 1</b>", "<b>Segment 2</b>"),
align = c("center"),
line = list(width = 1, color = 'black'),
fill = list(color = c("grey")),
font = list(family = "Arial", size = 14, color = "white")
),
cells = list(
values = rbind(c("<b>Strongest Competitor</b>", "<b>Preferred New Profile</b>"),
c("Scanticon", "Professional 1"),
c("Nittany Lion Inn", "Tourist")),
align = c("left", "center"),
line = list(color = "black", width = 1),
fill = list(color = c("grey", "white")),
font = list(family = "Arial", size = 13, color = c("white", "black")),
height=40
))
fig
Table 4: Competitor Analysis and New Profile Analysis Results
Based on the presence of two clear segments, who are both part of the Forte Hotel target market, I suggest that the new Forte Executive Innes design account for the preference of both of these segments proportionally. Therefore, 70% of rooms in the new hotel design should fit the preferences of Segment 1, and 30% of the new hotel rooms should accommodate the preferences of Segment 2.
Using the new room profiles identified in Table 4, this means that the Forte Executive Innes design should include 70% of its rooms with the Professional I profile, and 30% of its rooms with the Tourist profile. For the Leisure amenity, because it would make sense to have only one option for the entire hotel, I would suggest accommodating the preferences of Segment 1 and having an exercise room + pool.
Now that we have identified the preferences of the different segments of target customers for Forte Hotels, further analysis could be done to identify what the drivers are of consumer choice of the Forte Executive Innes versus the closest competitors identified from conjoint analysis (Scanticon for Segment 1 and Nittany Lion Inn for Segment 2). This future analysis could be completed by developing a binary logit model.