Data generation and analysis modules for standardized questionnaire Design-oriented Evaluation of Perceived Usability (Yang, T., Linder, J., & Bolchini, D., 2012).

Made by amat-design.com.

Licence for AttrakDiff2 (free to use): check licencing

Sources for items and calculations: Lallemand, C., & Gronier, G. (2015). Méthodes de design UX: 30 méthodes fondamentales pour concevoir et évaluer les systèmes interactifs. Editions Eyrolles, Yang, T., Linder, J., & Bolchini, D. (2012). DEEP: design-oriented evaluation of perceived usability. International Journal of Human-Computer Interaction, 28(5), 308-346..

Items

Themes :

  1. Contenu perçu (CON),
  2. Strucure perçue et architecture de l’information (STR),
  3. Navigation perçue (NAV),
  4. Effort cognitif perçu (EFF),
  5. Cohérence perçue de la mise en page (COH),
  6. Guidage visuel perçu (GUI).

Scales from 1 (pas du tout d’accord) to 5 (tout à fait d’accord), plus NA :

  1. CON.1 : Le libellé du texte était clair
  2. CON.2 : Le contenu (texte, images, sons, vidéos, etc.) était facile à comprendre
  3. CON.3 : Le texte était utile
  4. CON.4 : Le texte était pertinent.
  5. STR.1 : Je pouvais rapidement connaître la structure du site web en parcourant sa page d’accueil.
  6. STR.2 : L’organisation du site web était claire.
  7. STR.3 : Dans chaque section du site web, les pages étaient bien organisées.
  8. NAV.1 : Il était facile de trouver l’information dont j’avais besoin sur le site web.
  9. NAV.2 : Le site web m’a aidé à trouver ce que je cherchais
  10. NAV.3 : J’ai obtenu ce à quoi je m’attendais quand je cliquais sur les éléments du site web.
  11. EFF.1 : Utiliser ce site web s’est fait sans effort.
  12. EFF.2 (reversed) : Utiliser ce site web m’a fatigué.
  13. EFF.3 : J’ai appris à utiliser ce site web rapidement.
  14. COH.1 : La mise en page à travers tout le site web était cohérente.
  15. COH.2 (reversed) : J’ai remarqué des changements soudains de mise en page à travers le site web.
  16. COH.3 : La mise en page de chaque section du site web était cohérente.
  17. GUI.1 : Les couleurs m’ont aidé à distinguer les diff érentes sections du site web.
  18. GUI.2 : Les zones surlignées d’une page m’ont aidé à repérer l’information dont j’avais besoin.
  19. GUI.3 : J’ai appris à connaître le contenu d’une page en parcourant les zones mises en évidence.

Generate

# set number of participants
n <- 200

# initiate meCUE variable
DEEP <- list()

# initiate theme
theme <- c("CON", "STR", "NAV", "EFF", "COH", "GUI")

# initiate 3 variables per theme, except first which have 4 variables
for (i in 1:length(theme)){
  if (i == 1) {
    for (j in 1:4){
    len <- length(DEEP)
    DEEP[[len+1]] <- numeric(0)
    names(DEEP)[len+1] <- paste(theme[i], j, sep = ".")
  }
  } else {
    for (j in 1:3){
    len <- length(DEEP)
    DEEP[[len+1]] <- numeric(0)
    names(DEEP)[len+1] <- paste(theme[i], j, sep = ".")
  }
  }
}

# populate meCUE variables
for (i in 1:length(DEEP)){
  if (i %in% c(1:4, 8:10, 14, 16)){
      DEEP[[i]] <- sample(1:5, n, replace = T, prob = c(0.1, 0.25, 1, 2, 3)) #CON, NAV, COH
    } else if (i %in% c(5:7, 11, 13, 17:19)){
      DEEP[[i]] <- sample(1:5, n, replace = T, prob = c(3, 1, 1, 0.1, 0.1)) #STR, EFF, GUI
    } else if (i %in% c(12, 15)){
      DEEP[[i]] <- sample(1:5, n, replace = T, prob = c(1, 2, 0.1, 0.05, 0.025)) #reversed items
    }
}

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

# display 6 first rows
head(DEEP)
##   CON.1 CON.2 CON.3 CON.4 STR.1 STR.2 STR.3 NAV.1 NAV.2 NAV.3 EFF.1 EFF.2 EFF.3
## 1     5     4     5     2     1     1     1     5     5     4     2     2     2
## 2     4     5     4     4     3     1     1     4     1     1     3     1     1
## 3     5     3     4     4     2     2     1     3     5     5     1     4     1
## 4     5     3     5     4     1     1     1     5     4     1     1     1     1
## 5     4     3     4     4     3     2     3     5     5     4     1     1     1
## 6     5     5     5     5     3     1     1     4     5     2     1     1     3
##   COH.1 COH.2 COH.3 GUI.1 GUI.2 GUI.3
## 1     5     2     4     2     1     2
## 2     4     1     4     3     1     1
## 3     4     1     5     5     3     2
## 4     5     2     5     1     1     1
## 5     5     1     5     1     1     1
## 6     4     2     5     3     1     1

Transform

  1. Recalculez les items inversés !
  2. Pour chaque utilisateur, calculez la moyenne des scores pour les items de chaque dimension.
  3. Calculer les moyennes globales de chaque thème.
# list inverted items by name
inverted <- c("EFF.2", "COH.2")

rev <- 5:1

# compute reversed items
for (i in 1:length(inverted)) {
  for (j in 1:length(DEEP[, inverted[i]])) {
    DEEP[j, inverted[i]] <- which(rev == DEEP[j, inverted[i]])
  }
}

# display 6 first rows
head(DEEP[, inverted])
##   EFF.2 COH.2
## 1     4     4
## 2     5     5
## 3     2     5
## 4     5     4
## 5     5     5
## 6     5     4
# create data frame for transformed data
DEEP.tr <- DEEP

DEEP.tr.margins <- data.frame()

for (i in 1:length(theme)) {
  for (j in 1:nrow(DEEP.tr)) {
    DEEP.tr.margins[j, paste("mean", theme[i], sep = ".")] <- mean(
    as.numeric(
      DEEP.tr[j, grepl(theme[i], names(DEEP.tr))]
      )
    )
  }
}

# display 6 first rows
head(DEEP.tr.margins)
##   mean.CON mean.STR mean.NAV mean.EFF mean.COH mean.GUI
## 1     4.00 1.000000 4.666667 2.666667 4.333333 1.666667
## 2     4.25 1.666667 2.000000 3.000000 4.333333 1.666667
## 3     4.00 1.666667 4.333333 1.333333 4.666667 3.333333
## 4     4.25 1.000000 3.333333 2.333333 4.666667 1.000000
## 5     3.75 2.666667 4.666667 2.333333 5.000000 1.000000
## 6     5.00 1.666667 3.666667 3.000000 4.333333 1.666667

Infere

Visualize

if (!require(fmsb)) install.packages("fmsb")
## Loading required package: fmsb
library(fmsb)

viz <- list()

theme.full <- c("Contenu", "Structure", "Navigation", "Effort cognitif", "Cohérence", "Guidage visuel")

#https://www.statology.org/radar-chart-in-r/

for (i in 1:ncol(DEEP.tr.margins)) {
  viz[[i]] <- c(5, 1, mean(as.numeric(DEEP.tr.margins[, i])))
  names(viz)[i] <- theme.full[i]
}

viz <- as.data.frame(viz)

radarchart(viz,
    axistype = 0, 
    pcol = 'pink',
    pfcol = rgb(0.9,0.2,0.5,0.3),
    plwd = 1, 
    cglcol = 'grey',
    cglty = 1,
    axislabcol = 'grey',
    cglwd = 0.6,
    vlcex = 1.1,
    title = 'DEEP themes')

Conclusion

for (i in 1:ncol(DEEP.tr.margins)) {
  print(paste(
    "Mean for theme",
    theme.full[i],
    ":",
    round(mean(as.numeric(DEEP.tr.margins[, i])), 1)
  ))
}
## [1] "Mean for theme Contenu : 4.2"
## [1] "Mean for theme Structure : 1.7"
## [1] "Mean for theme Navigation : 4.1"
## [1] "Mean for theme Effort cognitif : 2.6"
## [1] "Mean for theme Cohérence : 4.2"
## [1] "Mean for theme Guidage visuel : 1.7"
for (i in 1:ncol(DEEP.tr.margins)) {
  x <- mean(as.numeric(DEEP.tr.margins[, i]))
  if(x <= 3) {
    print(paste(
    "Theme",
    theme.full[i],
    "must be improved (mean :",
    round(mean(as.numeric(DEEP.tr.margins[, i])), 1),
    ")"
  ))
  }
}
## [1] "Theme Structure must be improved (mean : 1.7 )"
## [1] "Theme Effort cognitif must be improved (mean : 2.6 )"
## [1] "Theme Guidage visuel must be improved (mean : 1.7 )"