Tutorial: Teste-t para amostras independentes no R
Há três principais tipos de testes-t: o teste-t para uma amostra, o teste-t para duas amostras independentes (ou apenas teste-t independente) e o teste-t para duas amostras pareadas (ou teste-t pareado).
Nesse post, falaremos sobre como fazer o teste-t independente, usando o software R.
Algumas informações importantes:
Se você prefere consumir esse conteúdo na forma de vídeo, você encontra um tutorial muito semelhante no meu canal do YouTube. Esse tutorial assume que você tem alguns conhecimentos básicos de R, como instalação e carregamento de pacotes. Caso queira aprender essa parte básica, incluindo como instalar os softwares R e RStudio, sugiro os primeiros vídeos desta playlist.
Quando usar o teste-t independente? Quais as suas hipóteses?
O teste-t independente é usado para comparar as médias de dois grupos independentes.
O que significa dizer que dois grupos são independentes? Significa que os valores obtidos em um dos grupos não dependem dos valores obtidos no outro. Na prática, dizemos que os grupos são independentes quando são compostos por sujeitos experimentais diferentes. No exemplo que faremos hoje, compararemos as notas de dois grupos de alunos: os alunos que sentam nas primeiras fileiras da sala e os alunos que sentam nos fundos (a galera do fundão). Note que são grupos independentes, uma vez que são compostos por alunos diferentes.
Você pode estar se perguntando: mas, e se eu tiver mais de dois grupos? Bom, aí o teste-t não será o teste adequado a você. Você provavelmente terá que usar um teste chamado ANOVA (Análise de Variância).
Hipóteses nula e alternativa
O teste-t independente é um teste de hipóteses. Isso significa que ele apresenta uma hipótese nula e uma hipótese alternativa, que se contradizem.
Escolhemos a hipótese mais apropriada com base no valor de p do teste, ao comparar esse valor de p com o nível de significância (alfa). O nível de significância mais comumente utilizado (e que usaremos aqui) é o de 5% (0,05).
Caso o valor de p seja superior a 0,05, não rejeitamos a hipótese nula (H0). Caso seja igual ou inferior, rejeitamos a H0 e aceitamos a hipótese alternativa (H1).
Vamos denominar os dois grupos independentes de A e B. As hipóteses por trás de todos os testes-t independente são:
- H0: média do grupo A \(=\) média do grupo B
- H1: média do grupo A \(\neq\) média do grupo B
A pergunta experimental
O banco de dados “Banco de Dados 3.csv” contém informações de 32 alunos da rede pública e privada. Há efeito da posição que o aluno ocupa na sala (se “Frente” ou “Fundo”) sobre as suas notas de Biologia ou História?
Para responder a essa pergunta, usaremos o teste-t independente. Note que queremos comparar as notas (variáveis numéricas) de dois grupos independentes de alunos (Frente x Fundos).
Análise estatística
Passo 1. Instalação + carregamento dos pacotes que serão utilizados
if(!require(dplyr)) install.packages("dplyr")
library(dplyr)
if(!require(rstatix)) install.packages("rstatix")
library(rstatix)
if(!require(car)) install.packages("car")
library(car)
if(!require(ggplot2)) install.packages("ggplot2")
library(ggplot2)
Vamos usar os pacotes dplyr
, rstatix
, car
e ggplot2
. O código acima está instruindo que os pacotes sejam instalados caso ainda não tenham sido e, caso já estejam instalados, que sejam carregados.
Passo 2. Carregamento e visualização do banco de dados
Para esse tutorial, vamos usar o banco de dados chamado “Banco de Dados 3”, que está no formato .csv brasileiro (com vírgulas como separador de decimal e ponto-vírgula como separador de colunas). Todos os dados são fictícios. Para aumentar a reprodutibilidade, hospedei esse banco no meu GitHub, então basta colocar o endereço para que o carregamento aconteça.
dados <- read.csv2("https://raw.githubusercontent.com/fernandaperes/bancosdedados/main/Bancos%20em%20csv/Banco%20de%20Dados%203.csv", stringsAsFactors = TRUE)
A função read.csv2
é a adequada ao formato .csv brasileiro. Atribuímos no código acima a denominação dados
ao nosso banco.
Adicionamos também o atributo stringsAsFactors = TRUE
para estabelecer que os textos do banco de dados correspondem a fatores.
head(dados, 10)
## Sujeito Genero Escola Posicao_Sala Nota_Biol Nota_Fis Nota_Hist
## 1 1 M Privada Fundos 8.1 4.6 2.9
## 2 2 F Privada Fundos 5.3 4.9 6.4
## 3 3 M Publica Fundos 2.9 3.7 3.1
## 4 4 M Publica Fundos 3.7 3.8 4.9
## 5 5 F Publica Fundos 4.4 4.2 4.9
## 6 6 F Publica Fundos 4.7 4.9 5.5
## 7 7 M Privada Frente 5.4 6.4 7.4
## 8 8 M Privada Frente 5.8 6.8 8.1
## 9 9 M Publica Fundos 3.1 4.1 3.3
## 10 10 M Privada Frente 6.0 6.9 8.3
Observe que temos no banco 7 variáveis:
- Sujeito, que corresponde a um ID do aluno
- Gênero, classificado como M ou F
- Escola, classificada como Pública ou Privada
- Posição na sala, classificada como Fundos ou Frente
- Nota de biologia, que varia de 0 a 10
- Nota de história, que varia de 0 a 10
- Nota de física, que varia de 0 a 10
A pergunta experimental é se a posição na sala tem efeito sobre as notas de biologia e história. Logo, usaremos no nosso modelo as variáveis relacionadas a essas notas e a variável “posição na sala”.
Faremos um teste-t para a nota de biologia e um para a nota de história.
Passo 3. Checagem dos pressupostos
O teste-t independente apresenta dois pressupostos:
- Normalidade da variável dependente em cada grupo
- Homogeneidade de variâncias (ou seja, grupos com variâncias homogêneas)
Para checar a normalidade podemos usar o teste de Shapiro-Wilk, aplicado a cada grupo. Usaremos para isso o pacote dplyr
, para separação dos grupos, e o pacote rstatix
para aplicar o teste de Shapiro (função shapiro_test
) a cada grupo e nota.
dados %>% group_by(Posicao_Sala) %>% shapiro_test(Nota_Biol, Nota_Hist)
## # A tibble: 4 × 4
## Posicao_Sala variable statistic p
## <fct> <chr> <dbl> <dbl>
## 1 Frente Nota_Biol 0.985 0.993
## 2 Frente Nota_Hist 0.894 0.0759
## 3 Fundos Nota_Biol 0.900 0.0686
## 4 Fundos Nota_Hist 0.917 0.131
O teste de Shapiro-Wilk tem como hipóteses: H0: os dados seguem a distribuição normal H1: os dados não seguem a distribuição normal
Como todos os valores de p foram superiores a 0,05, não vamos rejeitar a H0 em nenhum dos grupos. Logo, vamos considerar que todos apresentam distribuição normal.
O segundo pressuposto a ser checado é a homogeneidade de variâncias, que pode ser avaliada pelo teste de Levene (pacote car
):
Para a nota de biologia:
leveneTest(Nota_Biol ~ Posicao_Sala, data = dados, center = mean)
## Levene's Test for Homogeneity of Variance (center = mean)
## Df F value Pr(>F)
## group 1 1.0359 0.3169
## 30
Para a nota de história:
leveneTest(Nota_Hist ~ Posicao_Sala, data = dados, center = mean)
## Levene's Test for Homogeneity of Variance (center = mean)
## Df F value Pr(>F)
## group 1 14.292 0.0006954 ***
## 30
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
O teste de Levene tem como hipóteses: H0: os grupos apresentam variâncias homogêneas H1: os grupos não apresentam variâncias homogêneas
Para as notas de biologia, p foi maior que 0,05. Portanto, não rejeitaremos H0 e consideraremos que os grupos apresentam variâncias homogêneas.
Já para as notas de história, p foi menor que 0,05, indicando que devemos rejeitar H0 e, portanto, considerar que o pressuposto da homogeneidade de variâncias foi violado. Nós poderemos seguir com o teste-t, mas deveremos usar um teste-t com correção para essa violação da homogeneidade, a correção de Welch.
Passo 4. Realização do teste-t independente
Para as notas de biologia vamos programar com var.equal=TRUE
, uma vez que o pressuposto da homogeneidade de variâncias foi atendido para essa nota. Para as notas de história, colocaremos var.equal=FALSE
.
Teste-t para a nota de biologia:
t.test(Nota_Biol ~ Posicao_Sala, dados, var.equal=TRUE)
##
## Two Sample t-test
##
## data: Nota_Biol by Posicao_Sala
## t = 4.6027, df = 30, p-value = 7.136e-05
## alternative hypothesis: true difference in means between group Frente and group Fundos is not equal to 0
## 95 percent confidence interval:
## 1.411664 3.663630
## sample estimates:
## mean in group Frente mean in group Fundos
## 6.520000 3.982353
O teste resulta em um valor de t (no caso, t = 4,60) e um valor de p (p-value) que é calculado com base nesse valor de t e nos graus de liberdade (df, do inglês degrees of freedom).
Nesse caso, o valor de p é: 7,136e-05. Isso equivale a: 7,136 x 10-5. Ou seja, p = 0,00007136, um valor inferior ao nível de significância 0,05.
Para interpretá-lo adequadamente, precisamos relembrar as hipóteses nula e alternativa do teste-t independente:
- H0: média do grupo A \(=\) média do grupo B
- H1: média do grupo A \(\neq\) média do grupo B
Adaptando para essa situação, teremos:
- H0: média das notas de biologia do grupo Frente \(=\) média das notas de biologia do grupo Fundos
- H1: média das notas de biologia do grupo Frente \(\neq\) média das notas de biologia do grupo Fundos
Como p < 0,05, vamos rejeitar a H0 e considerar que os dois grupos apresentam notas de biologia que são, em média, estatisticamente diferentes.
Note que o R ainda libera, por escrito, a hipótese alternativa: “a diferença entre as médias é diferente zero”, o que equivale a dizer que os grupos apresentam médias diferentes.
Além disso, o R também libera por padrão o intervalo de confiança 95% (IC 95%) para a diferença entre as médias. Essa é uma informação complementar ao valor de p. Nesse caso, o intervalo de confiança 95% foi de [1,41; 3,66]. Observe que o valor zero não está incluído nesse intervalo, o que - da mesma forma que o valor de p - indica que os grupos são estatisticamente diferentes.
Sabendo que as médias são estatisticamente diferentes, podemos analisar qual dos grupos apresenta notas de biologia que são, em média, maiores. Para isso, basta olharmos as médias. A saída do R mostra que o grupo Frente apresenta uma média de 6,52, enquanto que o grupo Fundos uma média de 3,98. Logo, os alunos do grupo Frente apresentam, em média, um desempenho superior em biologia.
Teste-t para a nota de história:
t.test(Nota_Hist ~ Posicao_Sala, dados, var.equal=FALSE)
##
## Welch Two Sample t-test
##
## data: Nota_Hist by Posicao_Sala
## t = 1.5737, df = 19.909, p-value = 0.1313
## alternative hypothesis: true difference in means between group Frente and group Fundos is not equal to 0
## 95 percent confidence interval:
## -0.3860238 2.7546513
## sample estimates:
## mean in group Frente mean in group Fundos
## 5.466667 4.282353
Aplicaremos exatamente o mesmo raciocínio para as notas de história.
Para as notas de história, o valor de t foi de 1,57, com 19,909 graus de liberdade (não estranhe o valor quebrado, isso se deve à correção de Welch que usamos) e um valor de p de 0,1313. Para esse teste, temos como hipóteses:
- H0: média das notas de história do grupo Frente \(=\) média das notas de história do grupo Fundos
- H1: média das notas de história do grupo Frente \(\neq\) média das notas de história do grupo Fundos
Note que o valor de p é maior que 0,05. Logo, não devemos rejeitar a H0. Isso significa não temos evidências para afirmar que as médias dos grupos Frente e Fundos são estatisticamente diferentes.
De acordo, observe que o IC 95% para a diferença entre médias inclui o zero: [-0,39; 2,76].
Passo 5. Análise descritiva
Para uma análise descritiva mais completa, vamos primeiramente calcular os valores de média e desvio-padrão para os dois grupos.
dados %>% group_by(Posicao_Sala) %>% get_summary_stats(c(Nota_Biol, Nota_Hist), type = "mean_sd")
## # A tibble: 4 × 5
## Posicao_Sala variable n mean sd
## <fct> <chr> <dbl> <dbl> <dbl>
## 1 Frente Nota_Biol 15 6.52 1.70
## 2 Frente Nota_Hist 15 5.47 2.64
## 3 Fundos Nota_Biol 17 3.98 1.42
## 4 Fundos Nota_Hist 17 4.28 1.31
É bem útil também fazermos um gráfico para visualizarmos e representarmos essa diferença.
Gráfico de dispersão (dot-plot) para as notas de biologia
ggplot(data = dados,
mapping = aes(x = Posicao_Sala, y = Nota_Biol)) +
geom_dotplot(binaxis = "y", stackdir = "center",
fill="#D8D8D8", color="#D8D8D8", dotsize = 0.8) +
geom_point(stat = "summary", fun = "mean", size = 2) +
geom_errorbar(stat = "summary", fun.data = "mean_se", width = 0.1) +
ylab("Notas de biologia") +
xlab("Posição na sala") +
scale_y_continuous(limits=c(0,10), expand = c(0,0)) +
theme_classic(base_size=12)
Gráfico de dispersão (dot-plot) para as notas de história
ggplot(data = dados,
mapping = aes(x = Posicao_Sala, y = Nota_Hist)) +
geom_dotplot(binaxis = "y", stackdir = "center",
fill="#D8D8D8", color="#D8D8D8", dotsize = 0.8) +
geom_point(stat = "summary", fun = "mean", size = 2) +
geom_errorbar(stat = "summary", fun.data = "mean_se", width = 0.1) +
ylab("Notas de história") +
xlab("Posição na sala") +
scale_y_continuous(limits=c(0,10), expand = c(0,0)) +
theme_classic(base_size = 12)
Descrevendo os resultados
O teste-t para duas amostras independentes mostrou que há efeito da posição na sala sobre as notas de biologia (t(30) = 4,60; p < 0,001), mas não sobre as de história (t(19,91) = 1,57; p = 0,131). O grupo que senta na frente da sala apresentou, em média, notas de biologia superiores às do grupo que senta nos fundos da sala.
comments powered by Disqus