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

This notebook is made by Paul Amat, amat-design.com.

About

Name: meCUE

Author(s)-Date: M. Minge, L. Riedel, M. Thüring, 2016

Principal article: Minge, M., Thüring, M., Wagner, I. & Kuhr, C.V. (2016). The meCUE Questionnaire. A Modular Evaluation Tool for Measuring User Experience. In M. Soares, C. Falcão & T.Z. Ahram (Eds.): Advances in Ergonomics Modeling, Usability & Special

Link: https://mecue.de/Homepage%20Content/02%20Links%20&%20Literatur/2016_minge_th%C3%BCring_wagner_kuhr.pdf

Licence: meCUE is freely available as an application and thus not subject to rights of use. https://mecue.de/home/nutzungsbedingungen.html

Items

7-points Likert scales, 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?

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

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.

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

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")

Conclusion

for (i in 1:nrow(meCUE.tr.distrib)) {
  print(
    paste(
      meCUE.tr.distrib[i, "Subscale"], "mean:", round(meCUE.tr.distrib[i, "Mean"], 1)
    )
  )
}
## [1] "F mean: 6"
## [1] "U mean: 6"
## [1] "A mean: 6"
## [1] "S mean: 6"
## [1] "C mean: 6"
## [1] "PA mean: 2.5"
## [1] "PD mean: 4.7"
## [1] "NA mean: 4.8"
## [1] "ND mean: 4.8"
## [1] "IN mean: 6"
## [1] "L mean: 6"
## [1] "overall mean: 2.8"
modules <- levels(as.factor(meCUE.tr.distrib$Module))

for (i in 1:length(modules)) {
  print(
    paste(
      modules[i], "mean:", round(mean(
        meCUE.tr.distrib[which(meCUE.tr.distrib$Module == modules[i]), "Mean"]
      ), 1)
    )
  )
}
## [1] "Consequences mean: 6"
## [1] "Emotions mean: 4.2"
## [1] "Overall mean: 2.8"
## [1] "Product perceptions mean: 6"