Desempenho em
caça-palavras

Uma análise exploratória de tempo e palavras encontradas
nos caças-palavras animal e pensadores

M.Sc. Renato Barreira; M.Sc. Frederico Thiers
Programa de Pós-Graduação em Informática · UNIRIO

Métodos Quantitativos - Prof. Márcio Barros

DADOS:

Destrinchando dos dados:

16tentativas registradas
8 por tema
15palavras disponíveis
em cada jogo
720 slimite de tempo
12 minutos

RQ1: O tema está associado ao tempo registrado e à frequência de limite atingido?
RQ2: Como o tempo se relaciona com a quantidade de palavras encontradas?

Cada linha representa uma tentativa. As mesmas pessoas jogaram os mesmos dois temas uma vez cada. Oito pessoas/tentativas por tema

Estruturação dos dados

Dados:

library(tibble)
library(dplyr)
library(ggplot2)
dados = tibble(
  caca_palavra = rep(c("animal", "pensadores"), each = 8),
  total_palavra = rep(15, 16),
  encontradas = c(15, 15, 14, 13, 15, 13, 12, 14,
                 13, 15, 14, 15, 15, 15, 15, 11),
  tempo = c(449, 498, 404, 720, 697, 720, 720, 720,
            720, 720, 339, 407, 432, 470, 646, 720)
) |>
  mutate(
    caca_palavra = as.factor(caca_palavra),
    tempo_por_palavra = tempo / encontradas,
    atingiu_limite = ifelse(tempo == 720, "Sim (Timeout)", "Não")
  )
print(dados)

Conforme esta no código, tempo_por_palavra divide os segundos registrados pelas palavras encontradas e põe a saída no banco de dados.

Após Estruturação:

Dados:

Tema Total Encontradas Tempo (s) s / palavra Limite
animal 15 15 449 29,93 Não
animal 15 15 498 33,20 Não
animal 15 14 404 28,86 Não
animal 15 13 720 55,38 Sim (Timeout)
animal 15 15 697 46,47 Não
animal 15 13 720 55,38 Sim (Timeout)
animal 15 12 720 60,00 Sim (Timeout)
animal 15 14 720 51,43 Sim (Timeout)
pensadores 15 13 720 55,38 Sim (Timeout)
pensadores 15 15 720 48,00 Sim (Timeout)
pensadores 15 14 339 24,21 Não
pensadores 15 15 407 27,13 Não
pensadores 15 15 432 28,80 Não
pensadores 15 15 470 31,33 Não
pensadores 15 15 646 43,07 Não
pensadores 15 11 720 65,45 Sim (Timeout)

Valores preservados do script. Cada tema ocupa oito linhas da base.

Análise por tema

Código:

resumo_categoria = dados |>
  group_by(caca_palavra) |>
  summarise(
    jogos = n(),
    tempo_medio = mean(tempo),
    tempo_mediana = median(tempo),
    tempo_desv_pad = sd(tempo),
    palavras_medias = mean(encontradas),
    tempo_seg_por_palavra = mean(tempo_por_palavra),
    taxa_completos = sum(encontradas == 15) / n(),
    .groups = "drop"
  )

print(resumo_categoria)

A taxa de conclusão usa as 15 palavras encontradas. A média de s/palavra é a média das razões individuais.

Pensadores tem menor tempo médio observado

Análise compartiva entre os dois temas:

Indicador Animal Pensadores
Tentativas 8 8
Tempo médio (s) 616,00 556,75
Mediana do tempo (s) 708,50 558,00
Desvio-padrão do tempo (s) 139,68 160,73
Palavras encontradas (média) 13,88 14,12
Segundos por palavra (média) 45,08 40,42
Conclusão das 15 palavras 37,5% 62,5%

Como visto em sala de aula, se correlação não estabelece causalidade, quiçá meras diferenças descritivas.

Comparação dos tempos médios

Teste de Hipótese 1: as médias populacionais de tempo são iguais?

# H0: as médias populacionais de tempo são iguais.
# t.test() usa Welch por padrão (var.equal = FALSE).
teste_t_tempo = t.test(
  tempo ~ caca_palavra,
  data = dados
)

print(teste_t_tempo)

O teste pergunta: “há diferença estatística entre as médias de tempo dos dois temas?”.

A diferença média tem grande incerteza

03 / Saída


    Welch Two Sample t-test

data:  tempo by caca_palavra
t = 0.78697, df = 13.733, p-value = 0.4447
alternative hypothesis: true difference in means between group animal and group pensadores is not equal to 0
95 percent confidence interval:
 -102.5227  221.0227
sample estimates:
    mean in group animal mean in group pensadores 
                  616.00                   556.75 
59,25 s
Animal menos pensadores
IC 95%
-102,52 a 221,02 s

Com p = 0,445, não rejeitamos HO (a igualdade das médias).

CONTUDO, é importante destacar que ausência de significância TAMBÉM não demonstra que há equivalência entre os temas.

Palavras encontradas e tempo

C O R R E L A Ç Ã O D E P E A R S O N

# H0: a correlação linear populacional é igual a zero.
teste_cor = cor.test(
  dados$encontradas,
  dados$tempo,
  method = "pearson"
)

print(teste_cor)

A correlação reúne as 16 tentativas e mede a associação linear entre as variáveis.

Mais palavras se associam a menor tempo

C O R R E L A Ç Ã O D E P E A R S O N


    Pearson's product-moment correlation

data:  dados$encontradas and dados$tempo
t = -2.2237, df = 14, p-value = 0.04313
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.8031925 -0.0203487
sample estimates:
       cor 
-0.5109006 
-0,511
Correlação de Pearson
IC 95%
-0,803 a -0,020

A associação é negativa, com p = 0,043.

Obviamente esse teste é uma extrapolação (rsrs).

Tema e limite de tempo

Código

tabela_contingencia = table(
  Tema = dados$caca_palavra,
  Limite = dados$atingiu_limite
)

print(tabela_contingencia)

Só pra relembrar: o indicador classifica como “Sim (Timeout)” toda tentativa com tempo == 720.

Sete tentativas atingiram 720 segundos

Saída (Kable é o pacote q se usa pra fazer essas tabelas)

Não atingiu Sim (Timeout)
animal 4 4
pensadores 5 3

O limite aparece em 4 de 8 tentativas de animal e em 3 de 8 de pensadores.

A apresentação tá longa já né, vcs querem q acabe logo?.

Distribuição dos tempos por tema

BOXPLOT

theme_set(theme_minimal(base_size = 17))
cores = c(animal = "#087CAB", pensadores = "#CC158A")
g1 = ggplot(dados, aes(caca_palavra, tempo, fill = caca_palavra)) +
  geom_hline(yintercept = 720, linetype = "dashed", color = "gray55") +
  geom_boxplot(alpha = 0.25, width = 0.45, outlier.shape = NA) +
  geom_point(position = position_jitter(width = 0.10, height = 0,
                                      seed = 42), size = 3, alpha = 0.8) +
  stat_summary(fun = mean, geom = "point", shape = 18,
               size = 5, color = "#15324B") +
  scale_fill_manual(values = cores) +
  scale_x_discrete(labels = c("Animal", "Pensadores")) +
  scale_y_continuous(breaks = c(360, 480, 600, 720)) +
  coord_cartesian(ylim = c(300, 760)) +
  labs(x = NULL, y = "Tempo registrado (s)") +
  theme(legend.position = "none", panel.grid.minor = element_blank(),
        panel.grid.major.x = element_blank())
print(g1)

Boxplot por tema separa pontos sobrepostos e preserva os tempos. (fica melho do que o scatter plot, como veremos a seguir)

Os tempos se sobrepõem entre os temas

Boxplot

Boxplots de tempo por tema com todas as tentativas e losangos nas médias de 616 e 556,75 segundos. Quatro tentativas de animal e três de pensadores atingem 720 segundos.

Os losangos mostram as médias. A linha tracejada marca 720 s, onde se acumulam 7 das 16 tentativas.

Pontos representam tentativas individuais. O teto ajuda a interpretar a concentração dos tempos.

Relação entre palavras e tempo

Gráfico de Dispersão

g2 = ggplot(dados, aes(encontradas, tempo, color = caca_palavra)) +
  geom_hline(yintercept = 720, linetype = "dashed", color = "gray65") +
  geom_point(position = position_jitter(width = 0.06, height = 0,
                                      seed = 42), size = 3.5, alpha = 0.8) +
  geom_smooth(aes(group = 1), method = "lm", se = TRUE,
              color = "#15324B", fill = "#BCCFDD", linetype = "dashed") +
  scale_color_manual(values = cores, labels = c("Animal", "Pensadores")) +
  scale_x_continuous(breaks = 11:15) +
  scale_y_continuous(breaks = c(360, 480, 600, 720)) +
  labs(x = "Palavras encontradas (de 15)", y = "Tempo registrado (s)",
       color = NULL) +
  theme(legend.position = "top", panel.grid.minor = element_blank())
print(g2)

group = 1 explicita uma única reta para a amostra. A faixa representa o IC de 95% da média ajustada.

A tendência linear é negativa

Gráfico de Dispersão

Dispersão de palavras encontradas e tempo por tema. A reta geral é descendente e há sobreposição entre temas, com vários registros em 720 segundos.

A reta desenha a suposta associação da amostra.

FIM