source("./device-setup.R")

measured_runs <- read_device_runs(measured_only=TRUE)

1 Age

age_data <- measured_runs %>%
  filter(!is.na(age)) %>%
  distinct(participant, .keep_all = T) %>%
  select(participant, age, accuracy)

ggplot(
  age_data,
  aes(x = age, fill=accuracy)
) +
  geom_histogram(binwidth = 1)

age_data %>%
  summarize(
    mean_age = mean(age),
    sd_age = sd(age),
    max_age = max(age),
    min_age = min(age)
  )
age_data %>%
  group_by(accuracy) %>%
  summarize(
    mean_age = mean(age),
    sd_age = sd(age),
    max_age = max(age),
    min_age = min(age)
  )

2 Gender

table(measured_runs %>% distinct(participant, .keep_all = T) %>% pull(gender))

Female   Male 
    13     23 
measured_runs %>%
  distinct(participant, .keep_all = T) %>%
  group_by(accuracy, gender) %>%
  summarize(
    n = n(),
    .groups = "drop"
  )

3 Device Use (last 7 days)

ggplot(measured_runs, aes(x = device_use, fill=accuracy)) +
  geom_histogram(stat="count") +
  facet_grid(rows = vars(device)) +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
Warning in geom_histogram(stat = "count"): Ignoring unknown parameters: `binwidth`, `bins`, and `pad`

measured_runs %>%
  group_by(device) %>%
  summarize(
    .groups="drop",
    n_frequent = sum(device_use %in% c("2 to 4 hours", "4 to 8 hours", "more than 8 hours")),
    total = n(),
    ratio = n_frequent / total
  )

4 Typing (last 7 days)

ggplot(measured_runs, aes(x = typing_use, fill=accuracy)) +
  geom_histogram(stat="count") +
  facet_grid(rows = vars(device)) +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
Warning in geom_histogram(stat = "count"): Ignoring unknown parameters: `binwidth`, `bins`, and `pad`

measured_runs %>%
  group_by(device) %>%
  summarize(
    .groups="drop",
    n_frequent = sum(typing_use %in% c("4 to 8 hours", "more than 8 hours")),
    total = n(),
    ratio = n_frequent / total
  )

4.1 One handed typing on phone

typing_handedness_data <- measured_runs %>%
  filter(device == PHONE) %>%
  pivot_longer(
    cols = starts_with("typing_use"),
    names_to = "prop",
    values_to = "use"
  ) %>%
  mutate(
    handedness = case_when(
      prop == "typing_use" ~ "both hands",
      TRUE ~ "dominant"
    )
  )

typing_handedness_data %>%
  ggplot(aes(x = use, fill=accuracy)) +
    geom_histogram(stat="count") +
    facet_grid(rows = vars(handedness)) +
    theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
Warning in geom_histogram(stat = "count"): Ignoring unknown parameters: `binwidth`, `bins`, and `pad`

typing_handedness_data %>%
  filter(handedness == "dominant") %>%
  summarize(
    .groups="drop",
    frequent = sum(use %in% c("1 to 2 hours", "2 to 4 hours", "4 to 8 hours", "more than 8 hours")),
    total = n(),
    ratio = frequent / total
  )

4.2 Swipe typing

ggplot(measured_runs, aes(x=suggestions_use_frequency, fill=accuracy)) +
  geom_histogram(stat="count") +
  facet_grid(rows = vars(device))
Warning in geom_histogram(stat = "count"): Ignoring unknown parameters: `binwidth`, `bins`, and `pad`

5 Suggestions Use (last 24h)

ggplot(measured_runs, aes(x=suggestions_use_frequency, fill=accuracy)) +
  geom_histogram(stat="count") +
  facet_grid(rows = vars(device)) +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
Warning in geom_histogram(stat = "count"): Ignoring unknown parameters: `binwidth`, `bins`, and `pad`

measured_runs %>%
  select(participant, device, suggestions_use_frequency) %>%
  arrange(participant, device) %>%
  group_by(device) %>%
  summarize(
    .groups="drop",
    use_frequently = sum(!suggestions_use_frequency %in% c("10 to 30", "30 to 100", "100 to 300")),
    total = n(),
    ratio = use_frequently / total
  )

6 Typing speed as a function of familiarity

data_fam <- measured_runs |>
  mutate(exp_typing_use = ifelse(
    is.na(typing_use_one_hand),
    as.character(typing_use),
    as.character(typing_use_one_hand)
  ) |>
    factor(levels = levels(measured_runs$typing_use)))

ggplot(data_fam, aes(x = exp_typing_use, y = avg_wpm, fill = device)) +
  geom_boxplot(show.legend = FALSE) +
  facet_wrap(vars(device)) +
  xlab("Typing usage in the experiment's condition") +
  theme(axis.text.x = element_text(
    angle = 90,
    vjust = 0.5,
    hjust = 1
  ))

LS0tCnRpdGxlOiAiV29yZC1TdWdnZXN0aW9uczogRGV2aWNlIERlbW9ncmFwaGljIFJlc3VsdHMiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRoZW1lOiBsdW1lbgogICAgaGlnaGxpZ2h0OiBkZWZhdWx0CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIG51bWJlcl9zZWN0aW9uczogVFJVRQotLS0KCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpzb3VyY2UoIi4vZGV2aWNlLXNldHVwLlIiKQoKbWVhc3VyZWRfcnVucyA8LSByZWFkX2RldmljZV9ydW5zKG1lYXN1cmVkX29ubHk9VFJVRSkKYGBgCgoKIyBBZ2UKCmBgYHtyfQphZ2VfZGF0YSA8LSBtZWFzdXJlZF9ydW5zICU+JQogIGZpbHRlcighaXMubmEoYWdlKSkgJT4lCiAgZGlzdGluY3QocGFydGljaXBhbnQsIC5rZWVwX2FsbCA9IFQpICU+JQogIHNlbGVjdChwYXJ0aWNpcGFudCwgYWdlLCBhY2N1cmFjeSkKCmdncGxvdCgKICBhZ2VfZGF0YSwKICBhZXMoeCA9IGFnZSwgZmlsbD1hY2N1cmFjeSkKKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKQpgYGAKCgpgYGB7cn0KYWdlX2RhdGEgJT4lCiAgc3VtbWFyaXplKAogICAgbWVhbl9hZ2UgPSBtZWFuKGFnZSksCiAgICBzZF9hZ2UgPSBzZChhZ2UpLAogICAgbWF4X2FnZSA9IG1heChhZ2UpLAogICAgbWluX2FnZSA9IG1pbihhZ2UpCiAgKQpgYGAKCmBgYHtyfQphZ2VfZGF0YSAlPiUKICBncm91cF9ieShhY2N1cmFjeSkgJT4lCiAgc3VtbWFyaXplKAogICAgbWVhbl9hZ2UgPSBtZWFuKGFnZSksCiAgICBzZF9hZ2UgPSBzZChhZ2UpLAogICAgbWF4X2FnZSA9IG1heChhZ2UpLAogICAgbWluX2FnZSA9IG1pbihhZ2UpCiAgKQpgYGAKCgoKIyBHZW5kZXIKCmBgYHtyfQp0YWJsZShtZWFzdXJlZF9ydW5zICU+JSBkaXN0aW5jdChwYXJ0aWNpcGFudCwgLmtlZXBfYWxsID0gVCkgJT4lIHB1bGwoZ2VuZGVyKSkKYGBgCgoKYGBge3J9Cm1lYXN1cmVkX3J1bnMgJT4lCiAgZGlzdGluY3QocGFydGljaXBhbnQsIC5rZWVwX2FsbCA9IFQpICU+JQogIGdyb3VwX2J5KGFjY3VyYWN5LCBnZW5kZXIpICU+JQogIHN1bW1hcml6ZSgKICAgIG4gPSBuKCksCiAgICAuZ3JvdXBzID0gImRyb3AiCiAgKQpgYGAKCgojIERldmljZSBVc2UgKGxhc3QgNyBkYXlzKQoKYGBge3J9CmdncGxvdChtZWFzdXJlZF9ydW5zLCBhZXMoeCA9IGRldmljZV91c2UsIGZpbGw9YWNjdXJhY3kpKSArCiAgZ2VvbV9oaXN0b2dyYW0oc3RhdD0iY291bnQiKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhkZXZpY2UpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQpgYGAKCmBgYHtyfQptZWFzdXJlZF9ydW5zICU+JQogIGdyb3VwX2J5KGRldmljZSkgJT4lCiAgc3VtbWFyaXplKAogICAgLmdyb3Vwcz0iZHJvcCIsCiAgICBuX2ZyZXF1ZW50ID0gc3VtKGRldmljZV91c2UgJWluJSBjKCIyIHRvIDQgaG91cnMiLCAiNCB0byA4IGhvdXJzIiwgIm1vcmUgdGhhbiA4IGhvdXJzIikpLAogICAgdG90YWwgPSBuKCksCiAgICByYXRpbyA9IG5fZnJlcXVlbnQgLyB0b3RhbAogICkKYGBgCgoKIyBUeXBpbmcgKGxhc3QgNyBkYXlzKQoKYGBge3J9CmdncGxvdChtZWFzdXJlZF9ydW5zLCBhZXMoeCA9IHR5cGluZ191c2UsIGZpbGw9YWNjdXJhY3kpKSArCiAgZ2VvbV9oaXN0b2dyYW0oc3RhdD0iY291bnQiKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhkZXZpY2UpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQpgYGAKCmBgYHtyfQptZWFzdXJlZF9ydW5zICU+JQogIGdyb3VwX2J5KGRldmljZSkgJT4lCiAgc3VtbWFyaXplKAogICAgLmdyb3Vwcz0iZHJvcCIsCiAgICBuX2ZyZXF1ZW50ID0gc3VtKHR5cGluZ191c2UgJWluJSBjKCI0IHRvIDggaG91cnMiLCAibW9yZSB0aGFuIDggaG91cnMiKSksCiAgICB0b3RhbCA9IG4oKSwKICAgIHJhdGlvID0gbl9mcmVxdWVudCAvIHRvdGFsCiAgKQpgYGAKCiMjIE9uZSBoYW5kZWQgdHlwaW5nIG9uIHBob25lCgpgYGB7cn0KdHlwaW5nX2hhbmRlZG5lc3NfZGF0YSA8LSBtZWFzdXJlZF9ydW5zICU+JQogIGZpbHRlcihkZXZpY2UgPT0gUEhPTkUpICU+JQogIHBpdm90X2xvbmdlcigKICAgIGNvbHMgPSBzdGFydHNfd2l0aCgidHlwaW5nX3VzZSIpLAogICAgbmFtZXNfdG8gPSAicHJvcCIsCiAgICB2YWx1ZXNfdG8gPSAidXNlIgogICkgJT4lCiAgbXV0YXRlKAogICAgaGFuZGVkbmVzcyA9IGNhc2Vfd2hlbigKICAgICAgcHJvcCA9PSAidHlwaW5nX3VzZSIgfiAiYm90aCBoYW5kcyIsCiAgICAgIFRSVUUgfiAiZG9taW5hbnQiCiAgICApCiAgKQoKdHlwaW5nX2hhbmRlZG5lc3NfZGF0YSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB1c2UsIGZpbGw9YWNjdXJhY3kpKSArCiAgICBnZW9tX2hpc3RvZ3JhbShzdGF0PSJjb3VudCIpICsKICAgIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoaGFuZGVkbmVzcykpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKYGBgCgpgYGB7cn0KdHlwaW5nX2hhbmRlZG5lc3NfZGF0YSAlPiUKICBmaWx0ZXIoaGFuZGVkbmVzcyA9PSAiZG9taW5hbnQiKSAlPiUKICBzdW1tYXJpemUoCiAgICAuZ3JvdXBzPSJkcm9wIiwKICAgIGZyZXF1ZW50ID0gc3VtKHVzZSAlaW4lIGMoIjEgdG8gMiBob3VycyIsICIyIHRvIDQgaG91cnMiLCAiNCB0byA4IGhvdXJzIiwgIm1vcmUgdGhhbiA4IGhvdXJzIikpLAogICAgdG90YWwgPSBuKCksCiAgICByYXRpbyA9IGZyZXF1ZW50IC8gdG90YWwKICApCmBgYAoKCiMjIFN3aXBlIHR5cGluZwoKYGBge3J9CmdncGxvdChtZWFzdXJlZF9ydW5zLCBhZXMoeD1zdWdnZXN0aW9uc191c2VfZnJlcXVlbmN5LCBmaWxsPWFjY3VyYWN5KSkgKwogIGdlb21faGlzdG9ncmFtKHN0YXQ9ImNvdW50IikgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZGV2aWNlKSkKYGBgCgoKIyBTdWdnZXN0aW9ucyBVc2UgKGxhc3QgMjRoKQoKYGBge3J9CmdncGxvdChtZWFzdXJlZF9ydW5zLCBhZXMoeD1zdWdnZXN0aW9uc191c2VfZnJlcXVlbmN5LCBmaWxsPWFjY3VyYWN5KSkgKwogIGdlb21faGlzdG9ncmFtKHN0YXQ9ImNvdW50IikgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZGV2aWNlKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKYGBgCgoKYGBge3J9Cm1lYXN1cmVkX3J1bnMgJT4lCiAgc2VsZWN0KHBhcnRpY2lwYW50LCBkZXZpY2UsIHN1Z2dlc3Rpb25zX3VzZV9mcmVxdWVuY3kpICU+JQogIGFycmFuZ2UocGFydGljaXBhbnQsIGRldmljZSkgJT4lCiAgZ3JvdXBfYnkoZGV2aWNlKSAlPiUKICBzdW1tYXJpemUoCiAgICAuZ3JvdXBzPSJkcm9wIiwKICAgIHVzZV9mcmVxdWVudGx5ID0gc3VtKCFzdWdnZXN0aW9uc191c2VfZnJlcXVlbmN5ICVpbiUgYygiMTAgdG8gMzAiLCAiMzAgdG8gMTAwIiwgIjEwMCB0byAzMDAiKSksCiAgICB0b3RhbCA9IG4oKSwKICAgIHJhdGlvID0gdXNlX2ZyZXF1ZW50bHkgLyB0b3RhbAogICkKYGBgCgojIFR5cGluZyBzcGVlZCBhcyBhIGZ1bmN0aW9uIG9mIGZhbWlsaWFyaXR5CgpgYGB7cn0KZGF0YV9mYW0gPC0gbWVhc3VyZWRfcnVucyB8PgogIG11dGF0ZShleHBfdHlwaW5nX3VzZSA9IGlmZWxzZSgKICAgIGlzLm5hKHR5cGluZ191c2Vfb25lX2hhbmQpLAogICAgYXMuY2hhcmFjdGVyKHR5cGluZ191c2UpLAogICAgYXMuY2hhcmFjdGVyKHR5cGluZ191c2Vfb25lX2hhbmQpCiAgKSB8PgogICAgZmFjdG9yKGxldmVscyA9IGxldmVscyhtZWFzdXJlZF9ydW5zJHR5cGluZ191c2UpKSkKCmdncGxvdChkYXRhX2ZhbSwgYWVzKHggPSBleHBfdHlwaW5nX3VzZSwgeSA9IGF2Z193cG0sIGZpbGwgPSBkZXZpY2UpKSArCiAgZ2VvbV9ib3hwbG90KHNob3cubGVnZW5kID0gRkFMU0UpICsKICBmYWNldF93cmFwKHZhcnMoZGV2aWNlKSkgKwogIHhsYWIoIlR5cGluZyB1c2FnZSBpbiB0aGUgZXhwZXJpbWVudCdzIGNvbmRpdGlvbiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgKICAgIGFuZ2xlID0gOTAsCiAgICB2anVzdCA9IDAuNSwKICAgIGhqdXN0ID0gMQogICkpCmBgYA==