Example 65.3: Metric Conjoint Analysis of Tire Data
This example, which is more detailed than the previous one,
uses PROC TRANSREG to perform a metric
conjoint analysis
of tire preference data. Conjoint analysis can be used to decompose
preference ratings of products or services into components based on
qualitative product attributes. For each level of each attribute of
interest, a numerical
"part-worth utility" value is computed.
The sum of the part-worth utilities for each product is an estimate of
the utility for that product. The goal is to compute
part-worth utilities such that the product
utilities are as similar as possible to the
original ratings. Metric conjoint analysis, as shown in this example,
fits an ordinary linear model directly to data assumed to be measured
on an interval scale. Nonmetric conjoint analysis, as shown in
Example 65.2, finds an optimal monotonic
transformation of original data before fitting an ordinary linear
model to the transformed data.
This example has three parts. In the first part, an experimental design
is created. In the second part, a DATA step creates descriptions of the
stimuli for the experiment. The third part of the example performs the
conjoint analyses.
The stimuli for the experiment are 18 hypothetical tires. The stimuli
represent different brands (Goodstone, Pirogi, Machismo)*, prices
($69.99, $74.99, $79.99), expected tread life (50,000, 60,000, 70,000),
and road hazard insurance plans (Yes, No).
For a conjoint study such as this, you need to create an
experimental design with 3 three-level factors, 1 two-level factor,
and 18 combinations or runs. While it is easy to get a design
for this situation from ADX software or a table, you can also use the
more general approach of using the OPTEX procedure to find an efficient design.
First, the PLAN procedure is used to construct a full-factorial design consisting
of all possible combinations of the factors. Then, PROC OPTEX is used
to find an efficient design for a main-effects model.
The FACTORS statement in PROC PLAN specifies each of the factors and the
number of levels. The full-factorial design is output to the data
set Candidates, and no displayed output is produced from PROC PLAN.
The OPTEX procedure searches the Candidates data set for an efficient
experimental design. The option CODING=ORTHCAN specifies an orthogonal coding
of the internal design matrix. All factors are designated as CLASS
variables, and a main-effects model (no interactions) is specified.
The GENERATE statement requests a design with N=18 products using the
Modified Federov algorithm. For most conjoint studies, this is the best
algorithm to use. The best experimental design is output to a SAS data
set called sasuser.TireDesign. For this study, PROC OPTEX has no
trouble finding a perfect, 100% efficient experimental design
because a standard, balanced, and orthogonal design exists for this
problem. (It is frequently the case in practice that 100%
efficiency is unobtainable.)
Specifying random number seeds on the design procedures, while not
strictly necessary, helps ensure that the design is reproducible.
However, in examples like this in which PROC OPTEX finds many designs, all
tied with the same efficiency, different but equivalent designs
are sometimes output. When this happens, you get different results
from those shown.
The experimental design is displayed, and the
SUMMARY procedure is used to examine
one-way and two-way frequencies for all of the factors. All frequencies
within each crosstabulation are constant, which is consistent with the
100% efficiency reported by PROC OPTEX. Finally, the tires are sorted
into a random order and stored into a permanant SAS data set. In the
interest of space, only the final design is shown. (The output from PROC
OPTEX and PROC SUMMARY is not displayed.)
title 'Tire Study, Experimental Design';
proc format;
value BrandF
1 = 'Goodstone'
2 = 'Pirogi '
3 = 'Machismo ';
value PriceF
1 = '$69.99'
2 = '$74.99'
3 = '$79.99';
value LifeF
1 = '50,000'
2 = '60,000'
3 = '70,000';
value HazardF
1 = 'Yes'
2 = 'No ';
run;
proc plan seed=070787;
factors Brand=3 Price=3 Life=3 Hazard=2 / noprint;
output out=Candidates;
run;
proc optex data=Candidates coding=orthcan seed=080489;
class Brand Price Life Hazard;
model Brand Price Life Hazard;
generate n=18 method=m_federov;
output out=TireDesign;
format Brand BrandF9. Price PriceF9. Life LifeF6. Hazard HazardF3.;
run;
proc sort;
by Brand Price Life Hazard;
run;
proc print;
run;
proc summary print;
class Brand -- Hazard;
ways 1 2;
run;
data TireDesign2; /* Randomize the order of the tires */
set TireDesign;
r = uniform(7);
run;
proc sort out=sasuser.TireDesign(drop=r);
by r;
run;
Output 65.3.1: Tire Study, Experimental Design
Tire Study, Experimental Design |
Obs |
Brand |
Price |
Life |
Hazard |
1 |
Goodstone |
$69.99 |
50,000 |
No |
2 |
Goodstone |
$69.99 |
50,000 |
No |
3 |
Goodstone |
$74.99 |
60,000 |
Yes |
4 |
Goodstone |
$74.99 |
60,000 |
Yes |
5 |
Goodstone |
$79.99 |
70,000 |
Yes |
6 |
Goodstone |
$79.99 |
70,000 |
No |
7 |
Pirogi |
$69.99 |
60,000 |
Yes |
8 |
Pirogi |
$69.99 |
60,000 |
No |
9 |
Pirogi |
$74.99 |
70,000 |
No |
10 |
Pirogi |
$74.99 |
70,000 |
No |
11 |
Pirogi |
$79.99 |
50,000 |
Yes |
12 |
Pirogi |
$79.99 |
50,000 |
Yes |
13 |
Machismo |
$69.99 |
70,000 |
Yes |
14 |
Machismo |
$69.99 |
70,000 |
Yes |
15 |
Machismo |
$74.99 |
50,000 |
Yes |
16 |
Machismo |
$74.99 |
50,000 |
No |
17 |
Machismo |
$79.99 |
60,000 |
No |
18 |
Machismo |
$79.99 |
60,000 |
No |
|
Next, the questionnaires are printed, and subjects are given
the questionnaires and are asked to rate the tires.
The following statements produce Output 65.3.2. This output
is abbreviated; the statements produce stimuli for all combinations.
data _null_;
title;
set sasuser.TireDesign;
file print;
if mod(_n_,4) eq 1 then do;
put _page_;
put +55 'Subject ________';
end;
length hazardstring $ 7.;
if put(hazard, hazardf3.) = 'Yes'
then hazardstring = 'with';
else hazardstring = 'without';
s = 3 + (_n_ >= 10);
put // _n_ +(-1) ') For your next tire purchase, '
'how likely are you to buy this product?'
// +s Brand 'brand tires at ' Price +(-1) ','
/ +s 'with a ' Life 'tread life guarantee, '
/ +s 'and ' hazardstring 'road hazard insurance.'
// +s 'Definitely Would Definitely Would'
/ +s 'Not Purchase Purchase'
// +s '1 2 3 4 5 6 7 8 9 ';
run;
Output 65.3.2: Conjoint Analysis, Stimuli Descriptions
Subject ________
1) For your next tire purchase, how likely are you to buy this product?
Machismo brand tires at $74.99,
with a 50,000 tread life guarantee,
and without road hazard insurance.
Definitely Would Definitely Would
Not Purchase Purchase
1 2 3 4 5 6 7 8 9
2) For your next tire purchase, how likely are you to buy this product?
Goodstone brand tires at $69.99,
with a 50,000 tread life guarantee,
and without road hazard insurance.
Definitely Would Definitely Would
Not Purchase Purchase
1 2 3 4 5 6 7 8 9
3) For your next tire purchase, how likely are you to buy this product?
Pirogi brand tires at $74.99,
with a 70,000 tread life guarantee,
and without road hazard insurance.
Definitely Would Definitely Would
Not Purchase Purchase
1 2 3 4 5 6 7 8 9
4) For your next tire purchase, how likely are you to buy this product?
Goodstone brand tires at $79.99,
with a 70,000 tread life guarantee,
and with road hazard insurance.
Definitely Would Definitely Would
Not Purchase Purchase
1 2 3 4 5 6 7 8 9
|
|
The third part of the example performs the conjoint analyses.
The DATA step reads the data. Only the ratings are entered,
one row per subject. Real conjoint studies have many more subjects than
five. The TRANSPOSE procedure transposes this (5 ×18) data set into an
(18 ×5) data set that can be merged with the factor level data set
sasuser.TireDesign. The next DATA step does the merge.
The PRINT procedure displays the input data set.
PROC TRANSREG fits the five individual conjoint models, one for each
subject. The UTILITIES a-option displays the conjoint analysis results.
The SHORT a-option suppresses the iteration histories,
OUTTEST=Utils creates an
output data set with all of the conjoint results, and the SEPARATORS=
option requests that the labels constructed for each category contain two
blanks between the variable name and the level value. The ODS select
statement is used to limit the displayed output. The MODEL statement
specifies IDENTITY for the ratings, which specifies a metric conjoint
analysis -the ratings are not transformed. The variables Brand,
Price, Life, and Hazard are designated as CLASS
variables, and the part-worth utilities are constrained to sum to zero
within each factor.
The following statements produce Output 65.3.3:
title 'Tire Study, Data Entry, Preprocessing';
data Results;
input (c1-c18) (1.);
datalines;
366479338236695228
583448157149666228
127799316264575448
335869145193567449
366379238246685229
;
*---Create an Object by Subject Data Matrix---;
proc transpose data=Results out=Results(drop=_name_) prefix=Subj;
run;
*---Merge the Factor Levels With the Data Matrix---;
data Both;
merge sasuser.TireDesign Results;
run;
*---Print Input Data Set---;
proc print;
title2 'Data Set for Conjoint Analysis';
run;
*---Fit Each Subject Individually---;
proc transreg data=Both utilities short outtest=Utils separators=' ';
ods select FitStatistics Utilities;
title2 'Individual Conjoint Analyses';
model identity(Subj1-Subj5) =
class(Brand Price Life Hazard / zero=sum);
run;
The output contains two tables per subject, one with overall fit
statistics and one with the conjoint analysis results.
Output 65.3.3: Conjoint Analysis
Tire Study, Data Entry, Preprocessing |
Data Set for Conjoint Analysis |
Obs |
Brand |
Price |
Life |
Hazard |
Subj1 |
Subj2 |
Subj3 |
Subj4 |
Subj5 |
1 |
Machismo |
$74.99 |
50,000 |
No |
3 |
5 |
1 |
3 |
3 |
2 |
Goodstone |
$69.99 |
50,000 |
No |
6 |
8 |
2 |
3 |
6 |
3 |
Pirogi |
$74.99 |
70,000 |
No |
6 |
3 |
7 |
5 |
6 |
4 |
Goodstone |
$79.99 |
70,000 |
Yes |
4 |
4 |
7 |
8 |
3 |
5 |
Pirogi |
$74.99 |
70,000 |
No |
7 |
4 |
9 |
6 |
7 |
6 |
Machismo |
$69.99 |
70,000 |
Yes |
9 |
8 |
9 |
9 |
9 |
7 |
Pirogi |
$79.99 |
50,000 |
Yes |
3 |
1 |
3 |
1 |
2 |
8 |
Machismo |
$74.99 |
50,000 |
Yes |
3 |
5 |
1 |
4 |
3 |
9 |
Pirogi |
$69.99 |
60,000 |
No |
8 |
7 |
6 |
5 |
8 |
10 |
Pirogi |
$79.99 |
50,000 |
Yes |
2 |
1 |
2 |
1 |
2 |
11 |
Goodstone |
$79.99 |
70,000 |
No |
3 |
4 |
6 |
9 |
4 |
12 |
Goodstone |
$69.99 |
50,000 |
No |
6 |
9 |
4 |
3 |
6 |
13 |
Goodstone |
$74.99 |
60,000 |
Yes |
6 |
6 |
5 |
5 |
6 |
14 |
Pirogi |
$69.99 |
60,000 |
Yes |
9 |
6 |
7 |
6 |
8 |
15 |
Goodstone |
$74.99 |
60,000 |
Yes |
5 |
6 |
5 |
7 |
5 |
16 |
Machismo |
$79.99 |
60,000 |
No |
2 |
2 |
4 |
4 |
2 |
17 |
Machismo |
$79.99 |
60,000 |
No |
2 |
2 |
4 |
4 |
2 |
18 |
Machismo |
$69.99 |
70,000 |
Yes |
8 |
8 |
8 |
9 |
9 |
|
Tire Study, Data Entry, Preprocessing |
Individual Conjoint Analyses |
The TRANSREG Procedure Hypothesis Tests for Identity(Subj1) |
Root MSE |
0.49441 |
R-Square |
0.9760 |
Dependent Mean |
5.11111 |
Adj R-Sq |
0.9592 |
Coeff Var |
9.67330 |
|
|
Utilities Table Based on the Usual Degrees of Freedom |
Label |
Utility |
Standard Error |
Importance (% Utility Range) |
Variable |
Intercept |
5.1111 |
0.11653 |
|
Intercept |
Brand Goodstone |
-0.1111 |
0.16480 |
14.286 |
Class.BrandGoodstone |
Brand Pirogi |
0.7222 |
0.16480 |
|
Class.BrandPirogi |
Brand Machismo |
-0.6111 |
0.16480 |
|
Class.BrandMachismo |
Price $69.99 |
2.5556 |
0.16480 |
53.571 |
Class.Price_69_99 |
Price $74.99 |
-0.1111 |
0.16480 |
|
Class.Price_74_99 |
Price $79.99 |
-2.4444 |
0.16480 |
|
Class.Price_79_99 |
Life 50,000 |
-1.2778 |
0.16480 |
25.000 |
Class.Life50_000 |
Life 60,000 |
0.2222 |
0.16480 |
|
Class.Life60_000 |
Life 70,000 |
1.0556 |
0.16480 |
|
Class.Life70_000 |
Hazard Yes |
0.3333 |
0.11653 |
7.143 |
Class.HazardYes |
Hazard No |
-0.3333 |
0.11653 |
|
Class.HazardNo |
Tire Study, Data Entry, Preprocessing |
Individual Conjoint Analyses |
The TRANSREG Procedure Hypothesis Tests for Identity(Subj2) |
Root MSE |
0.47140 |
R-Square |
0.9792 |
Dependent Mean |
4.94444 |
Adj R-Sq |
0.9647 |
Coeff Var |
9.53402 |
|
|
Utilities Table Based on the Usual Degrees of Freedom |
Label |
Utility |
Standard Error |
Importance (% Utility Range) |
Variable |
Intercept |
4.9444 |
0.11111 |
|
Intercept |
Brand Goodstone |
1.2222 |
0.15713 |
30.201 |
Class.BrandGoodstone |
Brand Pirogi |
-1.2778 |
0.15713 |
|
Class.BrandPirogi |
Brand Machismo |
0.0556 |
0.15713 |
|
Class.BrandMachismo |
Price $69.99 |
2.7222 |
0.15713 |
64.430 |
Class.Price_69_99 |
Price $74.99 |
-0.1111 |
0.15713 |
|
Class.Price_74_99 |
Price $79.99 |
-2.6111 |
0.15713 |
|
Class.Price_79_99 |
Life 50,000 |
-0.1111 |
0.15713 |
4.027 |
Class.Life50_000 |
Life 60,000 |
-0.1111 |
0.15713 |
|
Class.Life60_000 |
Life 70,000 |
0.2222 |
0.15713 |
|
Class.Life70_000 |
Hazard Yes |
0.0556 |
0.11111 |
1.342 |
Class.HazardYes |
Hazard No |
-0.0556 |
0.11111 |
|
Class.HazardNo |
Tire Study, Data Entry, Preprocessing |
Individual Conjoint Analyses |
The TRANSREG Procedure Hypothesis Tests for Identity(Subj3) |
Root MSE |
0.80277 |
R-Square |
0.9425 |
Dependent Mean |
5.00000 |
Adj R-Sq |
0.9022 |
Coeff Var |
16.05546 |
|
|
Utilities Table Based on the Usual Degrees of Freedom |
Label |
Utility |
Standard Error |
Importance (% Utility Range) |
Variable |
Intercept |
5.0000 |
0.18922 |
|
Intercept |
Brand Goodstone |
-0.1667 |
0.26759 |
13.291 |
Class.BrandGoodstone |
Brand Pirogi |
0.6667 |
0.26759 |
|
Class.BrandPirogi |
Brand Machismo |
-0.5000 |
0.26759 |
|
Class.BrandMachismo |
Price $69.99 |
1.0000 |
0.26759 |
18.987 |
Class.Price_69_99 |
Price $74.99 |
-0.3333 |
0.26759 |
|
Class.Price_74_99 |
Price $79.99 |
-0.6667 |
0.26759 |
|
Class.Price_79_99 |
Life 50,000 |
-2.8333 |
0.26759 |
62.658 |
Class.Life50_000 |
Life 60,000 |
0.1667 |
0.26759 |
|
Class.Life60_000 |
Life 70,000 |
2.6667 |
0.26759 |
|
Class.Life70_000 |
Hazard Yes |
0.2222 |
0.18922 |
5.063 |
Class.HazardYes |
Hazard No |
-0.2222 |
0.18922 |
|
Class.HazardNo |
Tire Study, Data Entry, Preprocessing |
Individual Conjoint Analyses |
The TRANSREG Procedure Hypothesis Tests for Identity(Subj4) |
Root MSE |
0.96032 |
R-Square |
0.9160 |
Dependent Mean |
5.11111 |
Adj R-Sq |
0.8572 |
Coeff Var |
18.78895 |
|
|
Utilities Table Based on the Usual Degrees of Freedom |
Label |
Utility |
Standard Error |
Importance (% Utility Range) |
Variable |
Intercept |
5.1111 |
0.22635 |
|
Intercept |
Brand Goodstone |
0.7222 |
0.32011 |
19.880 |
Class.BrandGoodstone |
Brand Pirogi |
-1.1111 |
0.32011 |
|
Class.BrandPirogi |
Brand Machismo |
0.3889 |
0.32011 |
|
Class.BrandMachismo |
Price $69.99 |
0.7222 |
0.32011 |
14.458 |
Class.Price_69_99 |
Price $74.99 |
-0.1111 |
0.32011 |
|
Class.Price_74_99 |
Price $79.99 |
-0.6111 |
0.32011 |
|
Class.Price_79_99 |
Life 50,000 |
-2.6111 |
0.32011 |
56.024 |
Class.Life50_000 |
Life 60,000 |
0.0556 |
0.32011 |
|
Class.Life60_000 |
Life 70,000 |
2.5556 |
0.32011 |
|
Class.Life70_000 |
Hazard Yes |
0.4444 |
0.22635 |
9.639 |
Class.HazardYes |
Hazard No |
-0.4444 |
0.22635 |
|
Class.HazardNo |
Tire Study, Data Entry, Preprocessing |
Individual Conjoint Analyses |
The TRANSREG Procedure Hypothesis Tests for Identity(Subj5) |
Root MSE |
0.52705 |
R-Square |
0.9740 |
Dependent Mean |
5.05556 |
Adj R-Sq |
0.9558 |
Coeff Var |
10.42509 |
|
|
Utilities Table Based on the Usual Degrees of Freedom |
Label |
Utility |
Standard Error |
Importance (% Utility Range) |
Variable |
Intercept |
5.0556 |
0.12423 |
|
Intercept |
Brand Goodstone |
-0.0556 |
0.17568 |
9.259 |
Class.BrandGoodstone |
Brand Pirogi |
0.4444 |
0.17568 |
|
Class.BrandPirogi |
Brand Machismo |
-0.3889 |
0.17568 |
|
Class.BrandMachismo |
Price $69.99 |
2.6111 |
0.17568 |
57.407 |
Class.Price_69_99 |
Price $74.99 |
-0.0556 |
0.17568 |
|
Class.Price_74_99 |
Price $79.99 |
-2.5556 |
0.17568 |
|
Class.Price_79_99 |
Life 50,000 |
-1.3889 |
0.17568 |
29.630 |
Class.Life50_000 |
Life 60,000 |
0.1111 |
0.17568 |
|
Class.Life60_000 |
Life 70,000 |
1.2778 |
0.17568 |
|
Class.Life70_000 |
Hazard Yes |
0.1667 |
0.12423 |
3.704 |
Class.HazardYes |
Hazard No |
-0.1667 |
0.12423 |
|
Class.HazardNo |
|
These following statements summarize the results. Three tables are
displayed: all of the importance values, the average importance,
and the part-worth utilities. The first DATA step selects the
importance information from the Utils data set. The final
assignment statement stores just the variable name from the label
relying on the fact that the separator is two blanks. PROC TRANSPOSE
creates the data set of importances, one row per subject, and PROC PRINT
displays the results. The MEANS procedure displays the average importance of
each attribute across the subjects. The next DATA step selects the
part-worth utilities information from the Utils data set.
PROC TRANSPOSE creates the data set of utilities, one row per subject,
and PROC PRINT displays the results.
*---Gather the Importance Values---;
data Importance;
set Utils(keep=_depvar_ Importance Label);
if n(Importance);
label = substr(label, 1, index(label, ' '));
run;
proc transpose out=Importance2(drop=_:);
by _depvar_;
id Label;
run;
proc print;
title2 'Importance Values';
run;
proc means;
title2 'Average Importance';
run;
*---Gather the Part-Worth Utilites---;
data Utilities;
set Utils(keep=_depvar_ Coefficient Label);
if n(Coefficient);
run;
proc transpose out=Utilities2(drop=_:);
by _depvar_;
id Label;
idlabel Label;
run;
proc print label;
title2 'Utilities';
run;
Output 65.3.4: Summary of Conjoint Analysis Results
Tire Study, Data Entry, Preprocessing |
Importance Values |
Obs |
Brand |
Price |
Life |
Hazard |
1 |
14.2857 |
53.5714 |
25.0000 |
7.14286 |
2 |
30.2013 |
64.4295 |
4.0268 |
1.34228 |
3 |
13.2911 |
18.9873 |
62.6582 |
5.06329 |
4 |
19.8795 |
14.4578 |
56.0241 |
9.63855 |
5 |
9.2593 |
57.4074 |
29.6296 |
3.70370 |
|
Tire Study, Data Entry, Preprocessing |
Average Importance |
Variable |
N |
Mean |
Std Dev |
Minimum |
Maximum |
Brand
Price
Life
Hazard |
5
5
5
5 |
17.3833946
41.7707079
35.4677599
5.3781376 |
8.1066973
23.2500570
23.9482430
3.1802662 |
9.2592593
14.4578313
4.0268456
1.3422819 |
30.2013423
64.4295302
62.6582278
9.6385542 |
|
Tire Study, Data Entry, Preprocessing |
Utilities |
Obs |
Intercept |
Brand Goodstone |
Brand Pirogi |
Brand Machismo |
Price $69.99 |
Price $74.99 |
Price $79.99 |
Life 50,000 |
Life 60,000 |
Life 70,000 |
Hazard Yes |
Hazard No |
1 |
5.11111 |
-0.11111 |
0.72222 |
-0.61111 |
2.55556 |
-0.11111 |
-2.44444 |
-1.27778 |
0.22222 |
1.05556 |
0.33333 |
-0.33333 |
2 |
4.94444 |
1.22222 |
-1.27778 |
0.05556 |
2.72222 |
-0.11111 |
-2.61111 |
-0.11111 |
-0.11111 |
0.22222 |
0.05556 |
-0.05556 |
3 |
5.00000 |
-0.16667 |
0.66667 |
-0.50000 |
1.00000 |
-0.33333 |
-0.66667 |
-2.83333 |
0.16667 |
2.66667 |
0.22222 |
-0.22222 |
4 |
5.11111 |
0.72222 |
-1.11111 |
0.38889 |
0.72222 |
-0.11111 |
-0.61111 |
-2.61111 |
0.05556 |
2.55556 |
0.44444 |
-0.44444 |
5 |
5.05556 |
-0.05556 |
0.44444 |
-0.38889 |
2.61111 |
-0.05556 |
-2.55556 |
-1.38889 |
0.11111 |
1.27778 |
0.16667 |
-0.16667 |
|
Based on the importance values,
price is the most important attribute for some of the respondents,
but expected tread life is most important for others. On the average,
price is most important followed closely by expected tread life.
Brand and road hazard insurance are less important. Both Goodstone
and Pirogi are the most preferred brands by some of the respondents.
All respondents preferred a lower price over a higher price, a longer
tread life, and road hazard insurance.
Copyright © 1999 by SAS Institute Inc., Cary, NC, USA. All rights reserved.