Documentation

Running MaxDiff in the MX8 Labs Research Platform

MaxDiff, short for Maximum Difference Scaling, is a survey technique to measure preferences or the relative importance of different attributes, products, or features. It involves presenting respondents with a series of choice sets, where they are asked to select the most and least preferred options from a list. By analyzing these choices, MaxDiff helps identify the most and least important factors in decision-making, making it a powerful tool for prioritizing options based on customer preferences.

You might use MaxDiff in scenarios where you need to understand what features or attributes are most valued by customers, such as in product development, marketing, or branding. For example, suppose you're developing a new product and want to know which features appeal most to potential buyers. In that case, MaxDiff can provide clear insights into what matters most to your target audience. It's advantageous when you have many attributes to evaluate, as it forces respondents to make trade-offs, providing more discriminating data than traditional rating scales.

Designing the MaxDiff

Respondent experience

If we've got a study where we want to trade off between 14 different items, we only want to show some trade-offs to each user. We typically want to ensure that we mix up the trade-offs shown to each user and that each option is shown uniformly.

The MX8 Labs platform will optimally create a set of trade-offs for each set of items and will display these to the user. For the inference reasons behind balanced exposure and a discussion of how set assignment relates to the least-fill balancing mechanism used elsewhere in the platform, see the methodology page.

In the chat survey experience, this is shown as a series of questions:

26eb36f3 e8ec 41ef 835b f52432580f65

For the traditional survey experience, its shown using a grid, where the trade-offs are more explicit:

39ae43be d0c8 48c4 b3b2 2758ba17ab6b

Choosing the number of items and set size

When running MaxDiff, two design constraints have to hold:

a) All users see the same selection of sets.

b) Each option is asked the same number of times.

If you don't do a), you won't be able to slice your data across demos because different groups will have been asked different questions. If you don't do b), your data will be skewed toward whichever options were offered more often.

To satisfy both, MX8 generates a set of sets sized to a multiple of the number of items and the number of repetitions. With 13 items at two repetitions, you need sets drawn from 26 items; with 14, from 28; and so on.

The available set sizes are determined by the prime factors of that total. For 26, the prime factors are 13 and 2, which means:

  • 13 options per question and two questions
  • 2 options per question and 13 questions

Neither is great from a respondent-experience standpoint. 28 factors as 7 × 2 × 2, which gives:

  • 7 options per question and four questions
  • 4 options per question and seven questions

Both are workable. If you want to test 13 options in MaxDiff, add another item to improve the test. The same logic applies any time the number of items is prime.

Reporting

Cross-tab reporting

We report MaxDiff questions using a simple cross-tabulation of each response.

8385cda7 5dc5 4984 87e2 e306ff2f7b5c

Bayesian reporting

MaxDiff also supports model-based reporting that estimates each respondent's preference for each item from their choices across tasks. In the report's Layout step, set the question's Analysis style to:

  • Utility Scores (discrete_choice_utility_scores) — a score per item showing how strongly it drives preference.
  • Simulated Share (discrete_choice_simulated_share) — the predicted share of respondents who would pick each item.

MaxDiff report Layout step with Simulated Share selected as the Analysis style

The report renders as a cross-tab. With Simulated Share, each row is one MaxDiff item and the bar shows that item's modeled share of preference, with uncertainty whiskers and stat-significance highlighting:

Cross-tab report showing simulated share of preference for QSR brands with confidence whiskers

When both best and worst selections are present, both are used to estimate the scores.

For the estimator, weighted aggregation, exports, and uncertainty methodology, see Utility and simulated share methodology.

Example code

Here is an example for a simple Max Diff study:

from survey import Survey

s = Survey(**globals())

# Introduction
s.note(
    "Welcome! Thank you for participating in our survey. We are conducting this study to understand the preferences and priorities of smartphone users. Your responses will help us improve future smartphone designs and features."
)

# Consent
consent = s.get_consent(
    consent_text="Before we begin, we need your consent to participate in this survey. Your responses will be kept confidential and used only for research purposes."
)

# Screening Questions

# Age
age = s.multi_choice_question(
    question="What is your age?",
    options=["Under 18", "18-24", "25-34", "35-44", "45-54", "55-64", "65 and above"],
)
s.terminate_if(
    age == "Under 18",
    reason="Sorry, but this survey is only for people aged 18 and above.",
)

# Gender
s.multi_choice_question(
    question="What is your gender?",
    options=["Male", "Female", "Prefer not to say"],
)

# Ethnicity
s.multi_select_question(
    question="What is your ethnicity? (Choose all that apply)",
    options=[
        "White",
        "Black or African American",
        "Asian",
        "Other",
    ],
    other_options=["Other (Please specify): __________", "Prefer not to say"],
)

# Hispanic Origin (For USA)
s.multi_choice_question(
    question="Are you of Hispanic, Latino, or Spanish origin?",
    options=["Yes", "No", "Prefer not to say"],
)

# Income
s.multi_choice_question(
    question="What is your annual household income?",
    options=[
        "Less than $25,000",
        "$25,000 - $49,999",
        "$50,000 - $74,999",
        "$75,000 - $99,999",
        "$100,000 - $149,999",
        "$150,000 and above",
        "Prefer not to say",
    ],
)

# Education
s.multi_choice_question(
    question="What is the highest level of education you have completed?",
    options=[
        "Less than high school",
        "High school diploma or equivalent",
        "Some college, no degree",
        "Associate degree",
        "Bachelor's degree",
        "Graduate degree",
        "Prefer not to say",
    ],
)

# Smartphone Ownership
smartphone_ownership = s.multi_choice_question(
    question="Do you own a smartphone?", options=["Yes", "No"]
)
s.terminate_if(
    smartphone_ownership == "No",
    reason="Sorry, but this survey is only for people who own a smartphone.",
)

# Loop through each MaxDiff set and ask the question
s.max_diff_question(
    question="Which feature is MOST important and LEAST important to you?",
    items=[
        "High-Resolution Camera",
        "Long Battery Life",
        "Fast Processor",
        "Water Resistance",
        "Wireless Charging",
        "Large Display",
        "Face Recognition",
        "Ample Storage Space",
        "5G Connectivity",
        "Affordable Price",
        "Durable Build Quality",
        "Wide Range of Apps",
        "Fingerprint sensor",
        "Dual SIM capability",
    ],
    labels=["Least", "Most"],

)

# Conclusion
s.note(
    "Thank you for participating in our survey. Your responses are valuable to us and will help shape the future of smartphone technology. Have a great day!"
)

# Finalize the survey
s.complete()