Chutou ou não chutou? O teste t para uma amostra

No post anterior, falei sobre o teste t para duas amostras independentes. Coincidentemente, no dia seguinte apareceu essa dúvida no fórum de matemática do qual sou contribuidor. Não podemos perder essa oportunidade, não é mesmo?

O PROBLEMA

Considere uma questão de múltipla escolha com quatro respostas possíveis. A pergunta foi formulada para ser muito difícil, sendo que nenhuma das quatro respostas são consideradas erradas, mas com apenas uma única resposta correta. Foi feito um teste com 400 alunos. O teste tem objetivo de verificar se mais pessoas respondem à pergunta corretamente do que seria esperado apenas devido ao acaso (ou seja, se todos adivinhassem por pura sorte a resposta correta).

Realize o teste de hipóteses (seguindo os 5 passos), sabendo-se que de 400 alunos, 125 responderam corretamente a questão. Use α = 2%.

Acredito que o maior desafio aqui para os alunos iniciantes seja entender o problema e estruturá-lo de uma forma que possa ser respondido com assertividade. A chave está no seguinte trecho:

do que seria esperado apenas devido ao acaso (ou seja, se todos adivinhassem por pura sorte a resposta correta).

A probabilidade de se escolher a resposta certa dentre 4 opções ao acaso é de 25%. Entretanto, 125 dos 400 alunos acertaram a questão, ou seja, 31.25%. O problema então consiste em inferir se a média de 31.25% é significantemente diferente da média esperada, 25%, dado o tamanho da amostra e sua variância. Isso pode ser alcançado com o teste t para uma amostra.

UM POUCO DE SIMULAÇÃO

Antes de entrarmos no teste em si, sabemos que ele é bem simples de calcular mas nem sempre seu conceito é tão facilmente assimilado. Para auxiliar, vamos simular os dados e tentar colocar de maneira visual o que vamos fazer.

Como são dados binários (acertos ou erros) vamos utilizar 1 para acertos e 0 para erros.

 1# criando amostra
 2data = c(rep(1, 125), rep(0, 275))
 3
 4# para que você chegue nos mesmos números aleatórios do exemplo
 5set.seed(1)
 6
 7# randomizando
 8data = sample(data)
 9
10# checando
11data
##   [1] 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 1 1 1 0 1
##  [38] 0 0 1 0 0 0 1 0 1 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 1 1 0 0 0 1 0 1 0 0 0
##  [75] 1 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 1 0 1 1
## [112] 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0
## [149] 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0
## [186] 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 1 0 0 1 1 1 0 0 1 0
## [223] 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1
## [260] 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 1
## [297] 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1
## [334] 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 1 0 1
## [371] 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 1 0 0 1 0 0 1 1 0

Agora que já temos nosso vetor com os dados aleatórios dos alunos que acertaram e erraram as questões, vamos visualizá-lo:

1# gráfico de barras
2par(mar = c(2, 2, 0, 0))
3barplot(table(data), col = c("lightblue", "salmon"))

A intuição do teste t é dizer se essa diferença entre os acertos e erros ocorre por mero acaso no processo de amostragem ou não. Mas o que isso significa? Neste caso, a média amostral foi de 31.25% com 400 estudantes. As características da distribuição, o desvio padrão e o tamanho da amostra permitem atestar que a diferença entre a média amostral e a média esperada é significante?

Para ilustrar o raciocínio, vamos tomar 10 amostras de 10 estudantes aleatoriamente e observar o comportamento das médias. Essas amostras de 10 estudantes podem ter média de acertos (linha vermelha) muito próxima dos 25% esperados (linha azul) e longe da média dos 400 alunos (linha verde).

 1# garantir reprodutibilidade
 2set.seed(3)
 3
 4# quantidade de amostras
 5n = 10
 6
 7# médias
 8medias = rep(NA, n)
 9
10# tirando amostras e calculando as médias
11for (i in 1:n) {
12  medias[i] = mean(
13    sample(data, size = runif(1, min = 0, max = 10), replace = TRUE))
14}
15
16# visualização
17hist(medias,
18     main = "1ª tiragem: 10 amostras de 10 alunos",
19     xlab = "média",
20     sub = "seed = 3")
21abline(v = mean(medias, na.rm = TRUE), col = "red")
22abline(v = 0.25, col = "blue")
23abline(v = 0.3125, col = "green")
24legend("topright", legend = c(
25  expression(hat(mu)),
26  expression(paste(mu, "= 0.25")),
27  expression(paste(mu, "= 0.3325"))),
28  col = c("red", "blue", "green"),
29  lty = 1)

Mas também é possível realizar outra tiragem de 10 amostras com 10 alunos diferentes e encontrarmos uma média completamente diferente, próxima dos 45%:

 1# garantir reprodutibilidade
 2set.seed(4)
 3
 4# quantidade de amostras
 5n = 10
 6
 7# médias
 8medias = rep(NA, n)
 9
10# tirando amostras e calculando as médias
11for (i in 1:n) {
12  medias[i] = mean(
13    sample(data, size = runif(1, min = 0, max = 10), replace = TRUE))
14}
15
16# visualização
17hist(medias,
18     main = "2ª tiragem: 10 amostras de 10 alunos",
19     xlab = "média",
20     sub = "seed = 4")
21abline(v = mean(medias, na.rm = TRUE), col = "red")
22abline(v = 0.25, col = "blue")
23abline(v = 0.3125, col = "green")
24legend("topright", legend = c(
25  expression(hat(mu)),
26  expression(paste(mu, "= 0.25")),
27  expression(paste(mu, "= 0.3325"))),
28  col = c("red", "blue", "green"),
29  lty = 1)

Conforme vamos aumentando a quantidade de amostras, o desvio padrão se estabiliza e a média amostral vai se aproximando da média populacional. Veja as médias de 50 amostras de 10 alunos, cada:

 1# garantir reprodutibilidade
 2set.seed(3)
 3
 4# quantidade de amostras
 5n = 50
 6
 7# médias
 8medias = rep(NA, n)
 9
10# tirando amostras e calculando as médias
11for (i in 1:n) {
12  medias[i] = mean(
13    sample(data, size = runif(1, min = 0, max = 10), replace = TRUE))
14}
15
16# separando o grid em 2 colunas
17par(mfrow = c(1, 2))
18
19# visualização 1ª tiragem
20hist(medias,
21     main = "1ª tiragem: 50 amostras de 10 alunos",
22     xlab = "média",
23     sub = "seed = 3")
24abline(v = mean(medias, na.rm = TRUE), col = "red")
25abline(v = 0.25, col = "blue")
26abline(v = 0.3125, col = "green")
27
28################################################################################
29
30# garantir reprodutibilidade
31set.seed(4)
32
33# quantidade de amostras
34n = 50
35
36# médias
37medias = rep(NA, n)
38
39# tirando amostras e calculando as médias
40for (i in 1:n) {
41  medias[i] = mean(
42    sample(data, size = runif(1, min = 0, max = n), replace = TRUE))
43}
44
45# visualização 2ª tiragem
46hist(medias,
47     main = "2ª tiragem: 50 amostras de 10 alunos",
48     xlab = "média",
49     sub = "seed = 4")
50abline(v = mean(medias, na.rm = TRUE), col = "red")
51abline(v = 0.25, col = "blue")
52abline(v = 0.3125, col = "green")
53legend("topright", legend = c(
54  expression(hat(mu)),
55  expression(paste(mu, "= 0.25")),
56  expression(paste(mu, "= 0.3325"))),
57  col = c("red", "blue", "green"),
58  lty = 1,
59  cex = .7)

Pode-se observar que tomando duas tiragens de 50 amostras de 10 alunos aleatoriamente cada, as médias começam a convergir para a média observada no total dos 400 alunos.

E se aumentarmos para 100 amostras de 10 alunos?

 1# garantir reprodutibilidade
 2set.seed(3)
 3
 4# quantidade de amostras
 5n = 100
 6
 7# médias
 8medias = rep(NA, n)
 9
10# tirando amostras e calculando as médias
11for (i in 1:n) {
12  medias[i] = mean(
13    sample(data, size = runif(1, min = 0, max = 10), replace = TRUE))
14}
15
16# separando o grid em 2 colunas
17par(mfrow = c(1, 2))
18
19# visualização 1ª tiragem
20hist(medias,
21     main = "1ª tiragem: 100 amostras de 10 alunos",
22     xlab = "média",
23     sub = "seed = 3")
24abline(v = mean(medias, na.rm = TRUE), col = "red")
25abline(v = 0.25, col = "blue")
26abline(v = 0.3125, col = "green")
27
28################################################################################
29
30# garantir reprodutibilidade
31set.seed(4)
32
33# médias
34medias = rep(NA, n)
35
36# tirando amostras e calculando as médias
37for (i in 1:n) {
38  medias[i] = mean(
39    sample(data, size = runif(1, min = 0, max = 10), replace = TRUE))
40}
41
42# visualização 2ª tiragem
43hist(medias,
44     main = "2ª tiragem: 100 amostras de 10 alunos",
45     xlab = "média",
46     sub = "seed = 4")
47abline(v = mean(medias, na.rm = TRUE), col = "red")
48abline(v = 0.25, col = "blue")
49abline(v = 0.3125, col = "green")
50legend("topright", legend = c(
51  expression(hat(mu)),
52  expression(paste(mu, "= 0.25")),
53  expression(paste(mu, "= 0.3325"))),
54  col = c("red", "blue", "green"),
55  lty = 1,
56  cex = .7)

Perceba que com 100 amostras aleatórias, as médias já ficam muito próximas dos 33.25% observados em ambas tiragens. Isso acontece porque conforme o número de observações aumenta, o desvio padrão tende a se estabilizar e a incerteza diminui. Seria muito difícil de os primeiros 4001 alunos terem uma determinada média de acertos e os próximos 50 alunos todos acertassem ou errassem de forma a gerar mudanças no desvio padrão e afetar a média significativamente. É por isso que, em último caso, o teste t é um teste de tamanho de amostra. A pergunta por trás de tudo é: minha amostra é grande o suficiente para que a diferença seja significativa?

Agora, com a intuição do teste em mente, vamos formalizá-lo.

O TESTE

Para tornar o processo bem transparente e fixar bem os conceitos, é sempre recomendável utilizar o framework das 5 etapas do teste de hipótese, que são:

DECLARAR AS HIPÓTESES NULA E ALTERNATIVA

\[\begin{cases} H_0: \mu = 0.25 \\ H_1: \mu \neq 0.25 \\ \end{cases}\]

A hipótese nula é que não se pode afirmar que a média de acerto observada é significativamente diferente da média esperada. Já a hipótese alternativa é que elas são significativamente distintas.

DECLARAR O NÍVEL DE SIGNIFICÂNCIA

\[\alpha = 0.02\] O \(\alpha = 0.02\) é o que dá sentido ao termo significantemente diferente. É a probabilidade de se cometer o erro do tipo II, ou seja, rejeitar a hipótese nula quando não deveria ser rejeitada. Quanto menor o \(\alpha\), maior deverá ser a diferença entre as médias para que ela seja considerada significante.

CALCULAR A ESTATÍSTICA DO TESTE

\[z = \frac{\bar{x} - \mu_0}{\frac{\sigma}{\sqrt{n}}}\] Note que: \[\lim_{n \to \infty}z(n) = \infty\] Podemos rejeitar a hipótese nula se \(z\) crítico for maior que o \(z\) tabelado. Conforme \(n\) aumenta, eventualmente a diferença será significativa, demonstrando matematicamente o que verificamos intuitivamente.

CALCULAR O VALOR CRÍTICO

\[z = \frac{0.3125 - 0.25}{\frac{0.464}{\sqrt{400}}} = 2.693\]

DECIDIR SE REJEITAMOS A HIPÓTESE NULA

Como o valor de 2.693 excede o valor de \(z\) a 98% de significância (2.33), pode-se rejeitar a hipótese nula. A diferença é significativa e não pode ser atribuída ao acaso de amostragem.

OK, MAS E NO R?

No R, o teste não poderia ser mais simples:

1t.test(data, mu = 0.25, conf.level = 0.98)
## 
##  One Sample t-test
## 
## data:  data
## t = 2.6934, df = 399, p-value = 0.00737
## alternative hypothesis: true mean is not equal to 0.25
## 98 percent confidence interval:
##  0.2583002 0.3666998
## sample estimates:
## mean of x 
##    0.3125

Note que 0.25 não está no intervalo de confiança, de forma que podemos rejeitar \(H_o\). Como ilustração, para que não pudessemos rejeitar a hipótese nula, teríamos de aumentar o nível de significância para 1 - p-valor, ou seja, para 99.263%:

1t.test(data, mu = 0.25, conf.level = 0.99263)
## 
##  One Sample t-test
## 
## data:  data
## t = 2.6934, df = 399, p-value = 0.00737
## alternative hypothesis: true mean is not equal to 0.25
## 99.263 percent confidence interval:
##  0.2499995 0.3750005
## sample estimates:
## mean of x 
##    0.3125

Ou aumentar a média para 25.83%:

1t.test(data, mu = 0.2583, conf.level = 0.98)
## 
##  One Sample t-test
## 
## data:  data
## t = 2.3357, df = 399, p-value = 0.02
## alternative hypothesis: true mean is not equal to 0.2583
## 98 percent confidence interval:
##  0.2583002 0.3666998
## sample estimates:
## mean of x 
##    0.3125

Bem mais fácil do que fazer na mão, não é mesmo?

CONCLUSÃO

Agora que temos todo o instrumental, podemos responder a pergunta do rapaz do fórum. O professor, sim, pode ficar orgulhoso, pois podemos rejeitar a hipótese de que a média de acerto de seus alunos foi mero chute. Parabéns à turma! :p


  1. Ou mil, 10 mil, 100 mil… Quanto maior for \(n\), mais difícil será causar mudanças no desvio padrão, de forma que a incerteza é cada vez menor.↩︎

Postagens nesta série

comments powered by Disqus