8.3 One respondent
8.3.1 Estimate part-worths and importance weights
While some software requires you to first create dummy variables representing the attribute levels and then run a regression, Radiant does not require you to do so. You can simply use the attributes (each with multiple levels) as variables. We’ll first carry out a conjoint analysis on the data of one respondent (Individual 1):
<- icecream %>% filter(respondent == "Individual 1")
respondent1
# save the conjoint analysis in an object, because we'll use it as input to summary(), plot(), and predict() later on
<- conjoint(respondent1, rvar = "rating", evar = c("Flavor","Packaging","Light","Organic"))
conjoint_respondent1
summary(conjoint_respondent1)
## Conjoint analysis
## Data : respondent1
## Response variable : rating
## Explanatory variables: Flavor, Packaging, Light, Organic
##
## Conjoint part-worths:
## Attributes Levels PW
## Flavor Chocolate 0.000
## Flavor Mango 5.000
## Flavor Raspberry -1.500
## Flavor Strawberry 5.000
## Flavor Vanilla 3.500
## Packaging Cone 0.000
## Packaging Homemade waffle 0.000
## Packaging Pint -2.000
## Light Low fat 0.000
## Light No low fat -1.000
## Organic Not organic 0.000
## Organic Organic 1.400
## Base utility ~ 3.800
##
## Conjoint importance weights:
## Attributes IW
## Flavor 0.596
## Packaging 0.183
## Light 0.092
## Organic 0.128
##
## Conjoint regression results:
##
## coefficient
## (Intercept) 3.800
## Flavor|Mango 5.000
## Flavor|Raspberry -1.500
## Flavor|Strawberry 5.000
## Flavor|Vanilla 3.500
## Packaging|Homemade waffle 0.000
## Packaging|Pint -2.000
## Light|No low fat -1.000
## Organic|Organic 1.400
The output gives part-worths, importance weights, and regression coefficients. The part-worths and the regression coefficients give the same information: compared to the reference level (the first level of an attribute; you’ll see that the part-worths are always zero for this level), how much does each attribute level increase or decrease the rating of an ice cream? We can plot these results:
plot(conjoint_respondent1)
And then we easily see that this person would enjoy a low fat, organic, mango or strawberry ice cream in a cone or one a homemade waffle the most.
Note that the Conjoint regression results are simply the results of a multiple linear regression:
# Run this regression if you're interested in learning which predictor is significant or what the R-squared of the overall model is.
summary(lm(rating ~ Flavor + Packaging + Light + Organic, data = respondent1))
##
## Call:
## lm(formula = rating ~ Flavor + Packaging + Light + Organic, data = respondent1)
##
## Residuals:
## 1 2 3 4 5 6 7 8 9 10
## -0.3 -0.2 0.3 -0.2 0.2 0.2 -0.3 -0.2 0.2 0.3
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.800e+00 8.426e-01 4.510 0.139
## FlavorMango 5.000e+00 9.747e-01 5.130 0.123
## FlavorRaspberry -1.500e+00 9.747e-01 -1.539 0.367
## FlavorStrawberry 5.000e+00 8.660e-01 5.774 0.109
## FlavorVanilla 3.500e+00 9.747e-01 3.591 0.173
## PackagingHomemade waffle 1.570e-15 8.944e-01 0.000 1.000
## PackagingPint -2.000e+00 8.660e-01 -2.309 0.260
## LightNo low fat -1.000e+00 5.916e-01 -1.690 0.340
## OrganicOrganic 1.400e+00 4.899e-01 2.858 0.214
##
## Residual standard error: 0.7746 on 1 degrees of freedom
## Multiple R-squared: 0.9927, Adjusted R-squared: 0.9345
## F-statistic: 17.06 on 8 and 1 DF, p-value: 0.1852
Finally, the importance weights tell us how strongly each attribute determines the rating of an ice cream. For this respondent, flavor is the most important attribute and light is the least important attribute. This respondent’s rating is determined for 59.6 percent by flavor and for 9.2 percent by light.
8.3.2 Profiles: predicted utilities
Predicting the ratings (utilities) of the different ice creams is very easy in R. First, let’s make sure we have a dataset with the different profiles that were tested:
<- icecream %>%
profiles filter(respondent == "Individual 1") %>%
select(Flavor,Packaging,Light,Organic)
profiles
## # A tibble: 10 x 4
## Flavor Packaging Light Organic
## <fct> <fct> <fct> <fct>
## 1 Raspberry Homemade waffle No low fat Not organic
## 2 Chocolate Cone No low fat Organic
## 3 Raspberry Pint Low fat Organic
## 4 Strawberry Pint No low fat Organic
## 5 Strawberry Cone Low fat Not organic
## 6 Chocolate Homemade waffle No low fat Not organic
## 7 Vanilla Pint Low fat Not organic
## 8 Mango Homemade waffle Low fat Organic
## 9 Mango Pint No low fat Not organic
## 10 Vanilla Homemade waffle No low fat Organic
Then, we ask the predict
function to predict the ratings of the profiles based on the regression function:
predict(conjoint_respondent1, profiles) # predict the ratings for the profiles based on the conjoint analysis
## Conjoint Analysis
## Data : respondent1
## Response variable : rating
## Explanatory variables: Flavor, Packaging, Light, Organic
## Prediction dataset : profiles
##
## Flavor Packaging Light Organic Prediction
## Raspberry Homemade waffle No low fat Not organic 1.300
## Chocolate Cone No low fat Organic 4.200
## Raspberry Pint Low fat Organic 1.700
## Strawberry Pint No low fat Organic 7.200
## Strawberry Cone Low fat Not organic 8.800
## Chocolate Homemade waffle No low fat Not organic 2.800
## Vanilla Pint Low fat Not organic 5.300
## Mango Homemade waffle Low fat Organic 10.200
## Mango Pint No low fat Not organic 5.800
## Vanilla Homemade waffle No low fat Organic 7.700
The predicted rating is highest for low fat, organic, mango ice cream on a homemade waffle. But these are predictions for ice creams that the respondent has actually rated. If we wanted to know which ice cream the respondent liked most, we could have just looked at his/her observed (instead of predicted) ratings. It’s more interesting to get predictions for ice creams that the respondent has not rated. For this, we need the profiles for all possible ice creams. We can create these profiles with the expand.grid
function. The expand.grid
function takes two or more vectors and creates every possible combination of elements of those vectors:
<- c("Raspberry","Chocolate","Mango","Strawberry","Vanilla")
Flavor <- c("Organic","Not organic")
Organic
expand.grid(Flavor, Organic)
## Var1 Var2
## 1 Raspberry Organic
## 2 Chocolate Organic
## 3 Mango Organic
## 4 Strawberry Organic
## 5 Vanilla Organic
## 6 Raspberry Not organic
## 7 Chocolate Not organic
## 8 Mango Not organic
## 9 Strawberry Not organic
## 10 Vanilla Not organic
Let’s do this for all our attribute levels:
# there's an easier way to get attribute levels than creating the vectors manually:
levels(icecream$Flavor) # make sure that Flavor is factorized first!
## [1] "Chocolate" "Mango" "Raspberry" "Strawberry" "Vanilla"
# now create all the profiles
<- expand.grid(levels(icecream$Flavor),levels(icecream$Packaging),levels(icecream$Light),levels(icecream$Organic)) %>%
profiles.all rename("Flavor" = "Var1", "Packaging" = "Var2", "Light" = "Var3", "Organic" = "Var4") # rename the variables created by expand.grid (don't forget this, otherwise predict won't know where to look for each attribute)
# predict the ratings of all profiles
predict(conjoint_respondent1, profiles.all) %>%
arrange(desc(Prediction)) # show the ice creams with the highest predicted rating on top
## Conjoint Analysis
## Data : respondent1
## Response variable : rating
## Explanatory variables: Flavor, Packaging, Light, Organic
## Prediction dataset : profiles.all
## Rows shown : 20 of 60
##
## Flavor Packaging Light Organic Prediction
## Strawberry Homemade waffle Low fat Organic 10.200
## Strawberry Cone Low fat Organic 10.200
## Mango Homemade waffle Low fat Organic 10.200
## Mango Cone Low fat Organic 10.200
## Strawberry Homemade waffle No low fat Organic 9.200
## Strawberry Cone No low fat Organic 9.200
## Mango Homemade waffle No low fat Organic 9.200
## Mango Cone No low fat Organic 9.200
## Strawberry Homemade waffle Low fat Not organic 8.800
## Strawberry Cone Low fat Not organic 8.800
## Mango Homemade waffle Low fat Not organic 8.800
## Mango Cone Low fat Not organic 8.800
## Vanilla Homemade waffle Low fat Organic 8.700
## Vanilla Cone Low fat Organic 8.700
## Strawberry Pint Low fat Organic 8.200
## Mango Pint Low fat Organic 8.200
## Strawberry Homemade waffle No low fat Not organic 7.800
## Strawberry Cone No low fat Not organic 7.800
## Mango Homemade waffle No low fat Not organic 7.800
## Mango Cone No low fat Not organic 7.800
Same conclusion as that from the previous section: this person would enjoy a low fat, organic, mango or strawberry ice cream in a cone or one a homemade waffle the most.