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.
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
Licence: meCUE is freely available as an application and thus not subject to rights of use. https://mecue.de/home/nutzungsbedingungen.html
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):
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:
Sources: http://mecue.de/Homepage%20Content/english/meCUE_EV.pdf/
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")
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
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")