From c217589fc49e32a4142fc8e824bd8c762033091b Mon Sep 17 00:00:00 2001 From: lukasadrion Date: Wed, 4 Feb 2026 00:40:14 +0100 Subject: [PATCH] add r code for new descriptive statistics --- doc/report.Rnw | 168 +++++++++++++++++++++++++++++++------- figures/nasa_boxplots.pdf | Bin 0 -> 6819 bytes figures/ter_plot.pdf | Bin 0 -> 4674 bytes figures/wpm_plot.pdf | Bin 0 -> 4647 bytes 4 files changed, 140 insertions(+), 28 deletions(-) create mode 100644 figures/nasa_boxplots.pdf create mode 100644 figures/ter_plot.pdf create mode 100644 figures/wpm_plot.pdf diff --git a/doc/report.Rnw b/doc/report.Rnw index 3d43460..cfc5b16 100644 --- a/doc/report.Rnw +++ b/doc/report.Rnw @@ -1,6 +1,10 @@ \documentclass[conference,a4paper]{IEEEtran} +\usepackage{graphicx} % for including figures +\usepackage{booktabs} % for nicer tables + \begin{document} + \section{Abstract}\label{abstract} \section{Introduction}\label{introduction} @@ -19,37 +23,145 @@ \subsection{Descriptive Statistics}\label{descriptive-statistics} -<>= -library(knitr) -results <- read.csv("../data/results.csv", sep=",", header=TRUE) -ter <- summary(results[, c("qwerty_ter", "dvorak_ter", "circle_ter")]) -wpm <- summary(results[, c("qwerty_wpm", "dvorak_wpm", "circle_wpm")]) -kable(ter, format = "latex") -kable(wpm, format = "latex") -@ - -<>= -boxplot(results$qwerty_ter, - results$dvorak_ter, - results$circle_ter, - names = c("QWERTY", "DVORAK", "CIRCLE"), - ylab = "Total Error Rate (TER)", - main = "Layout of onscreen keyboard") -@ - -<>= -boxplot(results$qwerty_wpm, - results$dvorak_wpm, - results$circle_wpm, - names = c("QWERTY", "DVORAK", "CIRCLE"), - ylab = "Words per minute (WPM)", - main = "Layout of onscreen keyboard") -@ - \subsubsection{Objective Measures}\label{objective-measures} +<>= +library(knitr) + +# Read the results CSV +results <- read.csv("../data/results.csv", sep=",", header=TRUE) + +# Summarize TER and WPM +ter <- summary(results[, c("qwerty_ter", "dvorak_ter", "circle_ter")]) +wpm <- summary(results[, c("qwerty_wpm", "dvorak_wpm", "circle_wpm")]) +@ + +% TER table +\begin{table}[h] +\centering +\scriptsize +<>= +kable(ter, format="latex", booktabs=TRUE) +@ +\caption{Summary of Total Error Rate (TER)} +\end{table} + +% WPM table +\begin{table}[h] +\centering +\scriptsize +<>= +kable(wpm, format="latex", booktabs=TRUE) +@ +\caption{Summary of Words per Minute (WPM)} +\end{table} + +<>= +# Create figures directory if it doesn't exist +dir.create("../figures", showWarnings=FALSE) + +# Helper functions for standard deviation and confidence intervals +mean_sd <- function(x) { + m <- mean(x) + s <- sd(x) + c(mean=m, lower=m-s, upper=m+s) +} + +mean_ci <- function(x) { + m <- mean(x) + se <- sd(x)/sqrt(length(x)) + ci <- qt(0.975, df=length(x)-1)*se + c(mean=m, lower=m-ci, upper=m+ci) +} + +# TER stats +ter_stats <- rbind( + mean_ci(results$qwerty_ter), + mean_ci(results$dvorak_ter), + mean_ci(results$circle_ter) +) + +# Save TER barplot as PDF using LaTeX-compatible fonts +pdf("../figures/ter_plot.pdf") +bar_pos <- barplot( + ter_stats[,"mean"], + names.arg=c("QWERTY","DVORAK","CIRCLE"), + ylab="Total Error Rate (TER)", + main="TER of layouts", + ylim=c(0, max(ter_stats[,"upper"])*1.1) +) +# Add confidence intervals +arrows( + x0=bar_pos, y0=ter_stats[,"lower"], + x1=bar_pos, y1=ter_stats[,"upper"], + angle=90, code=3, length=0.05 +) +dev.off() + +# WPM stats +wpm_stats <- rbind( + mean_sd(results$qwerty_wpm), + mean_sd(results$dvorak_wpm), + mean_sd(results$circle_wpm) +) + +# Save WPM barplot as PDF using LaTeX-compatible fonts +pdf("../figures/wpm_plot.pdf") +bar_pos <- barplot( + wpm_stats[,"mean"], + names.arg=c("QWERTY","DVORAK","CIRCLE"), + ylab="Words per minute (WPM)", + main="WPM of layouts", + ylim=c(0, max(wpm_stats[,"upper"])*1.1) +) +arrows( + x0=bar_pos, y0=wpm_stats[,"lower"], + x1=bar_pos, y1=wpm_stats[,"upper"], + angle=90, code=3, length=0.05 +) +dev.off() +@ + +% Include TER plot +\begin{figure}[h] +\centering +\includegraphics[width=\columnwidth]{../figures/ter_plot.pdf} +\caption{Total Error Rate (TER) by Keyboard Layout} +\end{figure} + +% Include WPM plot +\begin{figure}[h] +\centering +\includegraphics[width=\columnwidth]{../figures/wpm_plot.pdf} +\caption{Words per Minute (WPM) by Keyboard Layout} +\end{figure} + \subsubsection{Subjective Measures}\label{subjective-measures} +<>= +# Read NASA-TLX data +nasa <- read.csv("../data/nasaTLX.csv") +nasa$layout <- factor(nasa$layout) + +# Save boxplots as PDF using LaTeX-compatible fonts +pdf("../figures/nasa_boxplots.pdf") +par(mfrow=c(2,3)) # Arrange plots in 2 rows x 3 columns +boxplot(mental_demand ~ layout, data=nasa, main="Mental Demand") +boxplot(physical_demand ~ layout, data=nasa, main="Physical Demand") +boxplot(performance ~ layout, data=nasa, main="Performance") +boxplot(effort ~ layout, data=nasa, main="Effort") +boxplot(frustration ~ layout, data=nasa, main="Frustration") +par(mfrow=c(1,1)) +dev.off() +@ + +% Include NASA-TLX boxplots +\begin{figure}[h] +\centering +\includegraphics[width=\columnwidth]{../figures/nasa_boxplots.pdf} +\caption{NASA-TLX Scores by Keyboard Layout} +\end{figure} + \subsection{Inferential Statistics}\label{inferential-statistics} \subsubsection{Objective Measures}\label{objective-measures-1} @@ -58,4 +170,4 @@ boxplot(results$qwerty_wpm, \section{Discussion}\label{discussion} -\end{document} \ No newline at end of file +\end{document} diff --git a/figures/nasa_boxplots.pdf b/figures/nasa_boxplots.pdf new file mode 100644 index 0000000000000000000000000000000000000000..87c1cc5df660850072b7b9fd5404e5f94f2e797e GIT binary patch literal 6819 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 Jq@KAx>_2co#^3+| literal 0 HcmV?d00001