Data generation and analysis modules for standardized questionnaire modular evaluation of key Components of User Experience (M. Minge, L. Riedel, M. Thüring, 2016).

Made by amat-design.com.

Licence (free to use): check licencing

Source: http://mecue.de/Homepage%20Content/english/meCUE_EV.pdf/

Items

Scales from 1 to 7 with labels, respectively: Strongly disagree, Disagree, Somewhat disagree, Neither agree nor disagree, Somewhat agree, Agree, Strongly agree. Final question is a scale from -5 to 5 with intervals of 0.5, from “as bad” to “as good”.

Dimensions by modules (by pages):

  • Product perceptions (module I):
    • Instrumental:
      • Usefulness (F),
      • Usability (U).
    • Non-instrumental:
      • Visual aesthetics (A),
      • Status (S),
      • Commitment (C).
  • Emotions (module II):
    • Positive emotions (PA, PD),
    • Negative emotions (NA, ND).
  • Consequences (module III):
    • Intention to use (IN),
    • Product loyalty (L).
  • Overall (module IV):
    • Overall evaluation (overall).

Note: in the original paper the coding of items differs in the introduction and in the items list. Kept the introduction coding.

Items in default passation order:

  1. U.1: The product is easy to use.
  2. F.1: The functions of the product are exactly right for my goals.
  3. U.2: It is quickly apparent how to use the product.
  4. F.2: I consider the product extremely useful.
  5. U.3: The operating procedures of the product are simple to understand.
  6. F.3: With the help of this product I will achieve my goals.
  7. A.1: The product is creatively designed.
  8. S.1: The product would enhance my standing among peers.
  9. C.1: I could not live without this product.
  10. A.2: The design looks attractive.
  11. S.2: By using the product, I would be perceived differently.
  12. C.2: The product is like a friend to me.
  13. A.3: The product is stylish.
  14. C.3: If I ever lost the product, I would be devastated.
  15. S.3: I would not mind if my friends envied me for this product.
  16. PA.1: The product exhilarates me.
  17. ND.1: The product makes me tired.
  18. NA.1: The product annoys me.
  19. PD.1: The product relaxes me.
  20. ND.2: When using this product I feel exhausted.
  21. PD.2: The product makes me feel happy.
  22. NA.2: The product frustrates me.
  23. PA.2: The product makes me feel euphoric.
  24. ND.3: The product makes me feel passive.
  25. PD.3: The product calms me.
  26. PA.3: When using this product, I feel cheerful.
  27. NA.3: The product angers me.
  28. IN.1: If I could, I would use the product daily.
  29. L.1: I would not swap this product for any other.
  30. IN.2: I can hardly wait to use the product again.
  31. L.2: In comparison to this product, no others come close.
  32. L.3: I would get exactly this product for myself (again) at anytime.
  33. IN.3: When using the product, I lose track of time.
  34. overall: How do you experience the product as a whole?

Generate

set.seed(1)

# set number of participants
n <- 200

# initiate meCUE variable
meCUE <- list()

# initiate subscale
subscale <- c("F", "U", "A", "S", "C", "PA", "PD", "NA", "ND", "IN", "L")

# initiate 3 variables per subscale
for (i in 1:length(subscale)){
  for (j in 1:3){
    len <- length(meCUE)
    meCUE[[len+1]] <- numeric(0)
    names(meCUE)[len+1] <- paste(subscale[i], j, sep = ".")
  }
}

# populate meCUE variables
for (i in 1:length(meCUE)){
  if (i %in% c(1:15, 19, 21, 23:26, 28:33)){
      meCUE[[i]] <- sample(1:7, n, replace = T, prob = c(0, 0, 0, 0.5, 2, 5, 3))
    } else if (i %in% c(16:18, 20, 22, 27)){
      meCUE[[i]] <- sample(1:7, n, replace = T, prob = c(1, 3, 1, 0.5, 0.5, 0, 0))
    }
}

# initiate and populate final question
meCUE$overall <- sample(seq(from = -5, to = 5, by = 0.5), n, replace = T, 
                        prob = c(rep(0, 10), rep(1, 3), rep(3, 4), rep(2, 4))
                        )

# make it a data frame
meCUE <- data.frame(meCUE)

# reorder columns as the default passation order
meCUE <- meCUE[ , c(
  "U.1", "F.1", "U.2", "F.2", "U.3", "F.3", "A.1", "S.1", "C.1", "A.2", "S.2", "C.2", "A.3", "C.3", "S.3", "PA.1", "ND.1", "NA.1", "PD.1", "ND.2", "PD.2", "NA.2", "PA.2", "ND.3", "PD.3", "PA.3", "NA.3", "IN.1", "L.1", "IN.2", "L.2", "L.3", "IN.3", "overall"
  )]

# display 6 first rows
head(meCUE)
##   U.1 F.1 U.2 F.2 U.3 F.3 A.1 S.1 C.1 A.2 S.2 C.2 A.3 C.3 S.3 PA.1 ND.1 NA.1
## 1   5   6   5   6   7   7   6   6   6   6   5   7   6   5   7    3    6    2
## 2   5   6   6   6   7   6   7   6   6   7   4   6   6   7   5    2    6    2
## 3   6   7   4   7   6   4   5   7   4   4   5   5   6   7   6    2    5    2
## 4   7   5   7   6   4   5   7   7   5   6   6   7   5   6   7    2    6    3
## 5   4   6   6   6   6   5   7   7   6   6   6   6   5   6   5    3    7    4
## 6   4   5   7   7   6   7   5   7   7   5   6   7   6   4   6    4    7    2
##   PD.1 ND.2 PD.2 NA.2 PA.2 ND.3 PD.3 PA.3 NA.3 IN.1 L.1 IN.2 L.2 L.3 IN.3
## 1    5    6    2    5    1    3    6    4    6    6   5    6   7   6    5
## 2    7    6    3    6    4    5    7    2    5    7   7    6   6   5    7
## 3    7    6    1    5    1    3    6    2    7    4   7    6   7   5    7
## 4    6    5    1    5    4    1    7    3    7    7   6    5   6   6    7
## 5    6    6    5    6    2    1    5    2    6    7   5    5   5   6    7
## 6    7    6    2    7    2    5    6    3    7    5   6    6   6   5    7
##   overall
## 1     2.0
## 2     2.5
## 3     2.5
## 4     5.0
## 5     5.0
## 6     2.0
subscale <- c(subscale, "overall")

Transform

For each dimension, simply compute median, mean, standard deviation, min and max.

meCUE.tr <- meCUE

# mean by subscale

mecue.score <- c()
mecue.subscale <- c()
mecue.submodule <- c()
mecue.module <- c()

setmodule <- function(x) {
  if (x %in% c(1:5)) {
     return("Product perceptions")
   } else if (x %in% c(6:9)){
     return("Emotions")
   } else if (x %in% c(10:11)) {
     return("Consequences")
   } else {
     return("Overall")
   }
}

setsubmodule <- function(x) {
  if (x %in% 1:2) {
    return("Instrumental")
  } else if (x %in% 3:5) {
    return("Non-instrumental")
  } else {
    return(NA)
  }
}

for (i in 1:length(subscale)) {
    mecue.score <- c(mecue.score, mean(as.matrix(
      meCUE.tr[, grepl(paste("^", subscale[i], sep = ""), names(meCUE.tr))]
    )))
    mecue.subscale <- c(mecue.subscale, subscale[i])
    mecue.module <- c(mecue.module, setmodule(i))
    mecue.submodule <- c(mecue.submodule, setsubmodule(i))
}

(meCUE.tr.distrib <- data.frame(
  "Module" = mecue.module, 
  "Submodule" = mecue.submodule, 
  "Subscale" = mecue.subscale, 
  "Mean" = mecue.score
  ))
##                 Module        Submodule Subscale     Mean
## 1  Product perceptions     Instrumental        F 5.996667
## 2  Product perceptions     Instrumental        U 5.975000
## 3  Product perceptions Non-instrumental        A 5.963333
## 4  Product perceptions Non-instrumental        S 5.960000
## 5  Product perceptions Non-instrumental        C 5.978333
## 6             Emotions             <NA>       PA 2.491667
## 7             Emotions             <NA>       PD 4.698333
## 8             Emotions             <NA>       NA 4.835000
## 9             Emotions             <NA>       ND 4.786667
## 10        Consequences             <NA>       IN 6.013333
## 11        Consequences             <NA>        L 5.973333
## 12             Overall             <NA>  overall 2.790000

Infere

Visualize

if (!require(ggplot2)) install.packages("ggplot2")
## Loading required package: ggplot2
library(ggplot2)
limits <- c(1, 7)

ggplot(meCUE.tr.distrib, aes(Mean, subscale, fill = Module)) +
  geom_col(alpha = 0.2) +
  geom_dotplot(binaxis = "y", stackdir = "center", binwidth = 0.5, color = "white") +
  coord_cartesian(xlim = limits) +
  scale_fill_brewer(palette = "Set2") +
  geom_vline(aes(xintercept = 4), linetype = "dotted", colour = "firebrick") +
  labs(title ="meCUE mean scores", subtitle = "by subscales and modules", x = "Means", y = "Subscales")

submodules <- levels(as.factor(meCUE.tr.distrib$Submodule))
submod.mean <- c()

for (i in 1:length(submodules)) {
  submod.mean <- c(submod.mean, mean(meCUE.tr.distrib[which(meCUE.tr.distrib$Submodule == submodules[i]), "Mean"]))
}

meCUE.tr.submod <- data.frame("Submodule" = submodules, "Mean" = submod.mean)

ggplot(meCUE.tr.submod, aes(Mean, Submodule, fill = Submodule)) +
  geom_col(alpha = 0.2, width = 0.5) +
  geom_dotplot(binaxis = "y", stackdir = "center", binwidth = 0.2, color = "white") +
  coord_cartesian(xlim = limits) +
  scale_fill_brewer(palette = "Set2") +
  geom_vline(aes(xintercept = 4), linetype = "dotted", colour = "firebrick") +
  labs(title ="meCUE mean scores", subtitle = "by submodules", x = "Means", y = "Submodules")

# Dimensions by modules (by pages):
# 
# -   Product perceptions (module I):
#     -   Instrumental:
#         -   Usefulness (F),
#         -   Usability (U).
#     -   Non-instrumental:
#         -   Visual aesthetics (A),
#         -   Status (S),
#         -   Commitment (C).
# -   Emotions (module II):
#     -   Positive emotions (PA, PD),
#     -   Negative emotions (NA, ND).
# -   Consequences (module III):
#     -   Intention to use (IN),
#     -   Product loyalty (L).
# -   Overall (module IV):
#     -   Overall evaluation (overall).

meCUE.tr.distrib$Subscale.full <- c("Usefulness", "Usability", "Visual aest.", "Status", "Commitment", "Pos. emotions (A)", "Pos. emotions (D)", "Neg. emotions (A)", "Neg. emotions (D)", "Intention to use", "Product loyalty", "Overall evaluation")

ggplot(meCUE.tr.distrib, aes(Mean, Subscale.full, fill = Mean)) +
  geom_vline(aes(xintercept = 4), colour = "orange", linetype = "dashed", alpha = 0.5) +
  geom_col() +
  scale_fill_continuous(low = "red", high = "green", limits = limits) +
  coord_cartesian(xlim = limits) +
  theme_minimal() +
  facet_wrap(vars(Module)) +
  labs(title ="meCUE mean scores", subtitle = "by subscales and modules", x = "Means", y = "Subscales")