R: Teste de hipóteses em R
Última atualização: 2026-08-26
Na última aula, aprendemos sobre distribuições de probabilidade — a teoria. Nesta aula, vamos nos aprofundar no teste de hipóteses — usando amostras para tirar conclusões sobre a população. Esse é o cerne da estatística: um anúncio que afirma “um aumento de 20% nas vendas” é verdadeiro ou é apenas exagero? A diferença entre dois conjuntos de dados se deve ao acaso ou é inevitável? O R pode responder a isso com apenas 4 linhas de código.
Ao concluir esta aula, você será capaz de usar o R para realizar: testes t (comparação de médias), testes de proporção (comparação de taxas de aprovação), testes do qui-quadrado (independência) e análise de variância (comparação de vários grupos).
1. O que você vai aprender
- Processo de teste de hipóteses em 5 etapas (hipótese nula/hipótese alternativa/estatística de teste/valor p/decisão)
- t.test: Uma amostra, Duas amostras, Emparelhadas
- prop.test Teste de proporcionalidade
- chisq.test Teste do qui-quadrado (independência/adequação do modelo)
- ANOVA (Análise de Variância)
- Teste não paramétrico: wilcox.test
- Como interpretar os valores p e as armadilhas mais comuns
2. Uma história sobre um teste A/B
(1) Desafio: Os anúncios funcionam?
Bob realizou um teste A/B:
- Grupo A (anúncio antigo): 1.000 pessoas, 80 conversões (8%)
- Grupo B (novos anúncios): 1.000 pessoas, 100 conversões (10%)
O gerente perguntou: “Essa diferença de 2% é real ou é só um acaso?”
(2) Solução utilizando R
# Two-Proportion Test
prop.test(c(80, 100), c(1000, 1000))
# 2-sample test for equality of proportions
# X-squared = 2.46, df = 1, p-value = 0.117
# Conclusion: p > 0.05, Differences **Not significant** (It might be a coincidence.)
1 linha de código → valor p → decisão.
3. O processo de 5 etapas para o teste de hipóteses
(1) Processo em 5 etapas
graph TB
A[1. Propose a hypothesis] --> B[2. Calculate the statistic]
B --> C[3. Calculation p-value]
C --> D[4. Decision-making]
D --> E[5. Report]
A --> A1["H0 Null Hypothesis<br/>H1 Alternative Hypothesis"]
B --> B1["t/z/Chi-square/F"]
C --> C1["P Data Visualization H0 An equally extreme probability"]
D --> D1["p < 0.05 → Reject H0"]
E --> E1["Report p-value + Effect size + Confidence Interval"]
style A fill:#fff3cd
style B fill:#cce5ff
style C fill:#d4edda
style D fill:#f8d7da
style E fill:#e1d4ff
(2) Conceitos-chave
| Conceito | Significado |
|---|---|
| H0 (hipótese nula) | Suposição padrão: os dois grupos são indistinguíveis (diferença = acaso) |
| H1 (Hipótese alternativa) | O que realmente queremos provar: que os dois grupos diferem |
| Estatística | Um número que mede “qual é a magnitude da diferença” (t, z, χ², F) |
| valor p | A probabilidade de observar o resultado atual ou um resultado mais extremo, dado que H0 seja verdadeira |
| α (nível de significância) | O limite para o valor de p; geralmente 0,05 |
| Rejeitar H0 | p < 0,05, a diferença é estatisticamente significativa |
| Não rejeitar a hipótese nula H0 | p ≥ 0,05; não é possível concluir que haja uma diferença (≠ ausência de diferença) |
4. t.test(): Comparação de médias
(1) Três tipos de testes t
| Tipo | Cenário | Sintaxe do R |
|---|---|---|
| Amostra única | 1 grupo vs. valor conhecido | t.test(x, mu = 0) |
| Duas amostras independentes | 2 amostras independentes | t.test(x, y) |
| Amostras emparelhadas | Pré-testes e pós-testes para o mesmo sujeito | t.test(x, y, paired = TRUE) |
(2) Teste t de uma amostra
# Example: Product Weight Standard 100g, test 10 products
weights <- c(98, 102, 99, 101, 100, 97, 103, 99, 101, 100)
t.test(weights, mu = 100)
# One Sample t-test
# t = 0, df = 9, p-value = 1
# 95% CI: [98.7, 101.3]
# mean of x = 100
# Conclusion: p = 1, **Don't reject H0**, the mean is equal to 100g
(3) Teste t independente para duas amostras
# Example: A/B Testing the conversion times for two groups
group_a <- c(12, 15, 14, 13, 16, 14, 15, 13, 14, 15)
group_b <- c(10, 11, 12, 13, 11, 10, 12, 11, 13, 12)
t.test(group_a, group_b)
# Welch Two Sample t-test
# t = 5.32, df = 14.6, p-value = 0.0001
# 95% CI: [1.36, 3.24]
# Conclusion: p < 0.05, **Reject H0**, Group A was significantly slower than Group B
(4) Teste t para amostras emparelhadas
# Example: Before medication vs after medication in the same group of patients
before <- c(180, 175, 190, 170, 185)
after <- c(165, 160, 175, 160, 170)
t.test(before, after, paired = TRUE)
# Paired t-test
# t = 8.5, df = 4, p-value = 0.001
# Conclusion: p < 0.05, **Significant decline** (The medication is effective)
(5) Parâmetros principais
| Parâmetro | Significado | Padrão |
|---|---|---|
mu |
Valor conhecido para uma única amostra | 0 |
paired |
Está emparelhado? | FALSE |
var.equal |
Suposição de homocedasticidade | FALSO (Welch) |
alternative |
Direção alternativa | “two.sided” |
conf.level |
Nível de confiança | 0,95 |
# One-sided test (right-tailed)
t.test(x, mu = 100, alternative = "greater")
# One-sided test (left-tailed)
t.test(x, mu = 100, alternative = "less")
5. prop.test(): Teste de proporcionalidade
(1) Teste de uma proporção
# Example: Historical Product Pass Rate 95%, now 92 out of 100 are Qualified
prop.test(92, 100, p = 0.95)
# 1-sample proportions test
# X-squared = 1.27, df = 1, p-value = 0.26
# Conclusion: p > 0.05, Pass Rate **No significant decrease**
(2) Teste de duas proporções (o cerne dos testes A/B)
# Example: Group A 1000 people, 80 conversions; Group B 1000 people, 100 conversions
prop.test(c(80, 100), c(1000, 1000))
# 2-sample test for equality of proportions
# X-squared = 2.46, df = 1, p-value = 0.117
# 95% CI: [-0.046, 0.006]
# Conclusion: p > 0.05, **The difference is not significant** (It might be a coincidence.)
(3) prop.test vs chisq.test
prop.test(c(s1, s2), c(n1, n2))=chisq.test(matrix(c(s1, n1-s1, s2, n2-s2), 2))prop.testCorreção de continuidade adicionada (recomendado)
6. chisq.test(): Teste do qui-quadrado
(1) 2 Principais usos
| Objetivo | Cenário | Fórmula |
|---|---|---|
| Adequação do modelo | Observado x Esperado | chisq.test(observed) |
| Independência | As duas variáveis categóricas estão correlacionadas? | chisq.test(table(x, y)) |
(2) Teste de adequação do modelo
# Example: Dice Fairness Test (toss 60 times)
observed <- c(8, 12, 10, 11, 9, 10) # Number of times each face appears
expected <- rep(10, 6) # Expect uniformity
chisq.test(observed, p = expected / sum(expected))
# Chi-squared test
# X-squared = 1.2, df = 5, p-value = 0.945
# Conclusion: p > 0.05, Dice **is fair** (Do not reject the uniformity assumption)
(3) Teste de independência
# Example: Gender vs Purchasing Behavior
gender <- c("M", "M", "F", "F", "M", "F", "M", "F")
purchase <- c("Buy", "Not buying", "Buy", "Buy", "Not buying", "Buy", "Buy", "Not buying")
tab <- table(gender, purchase)
print(tab)
# Not buying Buy
# M 1 3
# F 1 3
chisq.test(tab)
# X-squared = 0, df = 1, p-value = 1
# Conclusion: p > 0.05, Gender and Purchasing **Independent**
# Note: Any 2x2 Table with Expected Frequencies < 5, use Fisher's Exact Test
fisher.test(tab)
(4) Requisitos de frequência esperada
# Chi-Square Test Requirements: Expected Frequency for Each Cell >= 5
# Use Fisher's Exact Test when not satisfied
result <- chisq.test(tab)
result$expected # View Expected Frequency
7. aov() Análise de Variância (ANOVA)
(1) Cenários aplicáveis
Comparação de médias para 3 ou mais grupos (o teste t é restrito a 2 grupos).
(2) Aplicação prática
# Example: Effect of 3 Fertilizer Types on Crop Yields
fertilizer <- c(rep("A", 10), rep("B", 10), rep("C", 10))
yield <- c(20, 22, 21, 19, 23, 20, 21, 22, 19, 20, # A
25, 26, 24, 27, 25, 26, 27, 25, 24, 26, # B
18, 19, 17, 18, 19, 20, 19, 18, 19, 20) # C
df <- data.frame(fertilizer, yield)
# Single-factor ANOVA
model <- aov(yield ~ fertilizer, data = df)
summary(model)
# Df Sum Sq Mean Sq F value Pr(>F)
# fertilizer 2 220.0 110.0 91.7 <2e-16 ***
# Residuals 27 32.4 1.2
# Conclusion: p < 0.05, 3 Fertilizer Types **Significant difference**
# Post-hoc comparison: Tukey HSD
TukeyHSD(model)
# diff lwr upr p adj
# B-A 5.0 3.91 6.09 0.000
# C-A -1.5 -2.59 -0.41 0.005
# C-B -6.5 -7.59 -5.41 0.000
8. Teste não paramétrico wilcox.test()
(1) Quando deve ser usado?
- Os dados são não normais (portanto, não é possível utilizar o teste t)
- Amostra de pequeno porte (n < 30)
- Existem valores atípicos extremos
- Dados ordinais (como “Excelente/Bom/Médio/Ruim”)
(2) Aplicação prática
# Non-parametric paired test (Wilcoxon signed-rank)
before <- c(180, 175, 190, 170, 185)
after <- c(165, 160, 175, 160, 170)
wilcox.test(before, after, paired = TRUE)
# V = 15, p-value = 0.0625
# Conclusion: p > 0.05 (Not significant), however, the sample size is small
# Independent non-parametric (Mann-Whitney U)
group_a <- c(12, 15, 14, 13, 16)
group_b <- c(10, 11, 12, 13, 11)
wilcox.test(group_a, group_b)
# W = 25, p-value = 0.028
# Conclusion: p < 0.05, the difference is significant
9. Interpretação dos valores p e armadilhas comuns
(1) Compreendendo corretamente os valores p
| Interpretação | Explicação |
|---|---|
| ✅ Correto | A probabilidade de observar o resultado atual ou um resultado mais extremo quando H0 é verdadeira |
| ❌ Erro | “Probabilidade de que H0 seja verdadeira” |
| ❌ Erro | “A diferença se deve ao acaso” |
| ❌ Erro | “Intensidade da diferença” |
(2) 5 armadilhas comuns
graph TB
A[p Value Trap] --> B[p-hacking<br/>After trying it several times p<0.05]
A --> C[Large sample size p Bi Xiao<br/>Depends on the effect size]
A --> D[p<0.05 Does not mean it is useful<br/>Check effect size]
A --> E[Don't refuse ≠ Accept H0]
A --> F[Significance ≠ Practical Significance]
style A fill:#fff3cd
style B fill:#f8d7da
style C fill:#cce5ff
style D fill:#d4edda
style E fill:#e1d4ff
style F fill:#ffe1d4
(3) Tamanho do efeito
Não basta analisar apenas o valor p; é preciso levar em conta o tamanho do efeito — ou seja, qual é a magnitude da diferença:
| Teste | Tamanho do efeito |
|---|---|
| teste t | d de Cohen = (m1 - m2) / s_pooled |
| ANOVA | η² (eta ao quadrado) |
| Qui-quadrado | V de Cramer |
| Correlação | r (coeficiente de correlação) |
# Cohen's d Calculation
cohens_d <- function(x, y) {
n1 <- length(x)
n2 <- length(y)
s_pooled <- sqrt(((n1-1)*var(x) + (n2-1)*var(y)) / (n1 + n2 - 2))
(mean(x) - mean(y)) / s_pooled
}
| d de Cohen | Significado |
|---|---|
| 0,2 | Efeito pequeno |
| 0,5 | Efeito moderado |
| 0,8 | Efeito grande |
10. Exemplo completo: Teste A/B + Comparação entre vários grupos
A seguir, apresentamos um exemplo de um fluxo de trabalho completo que reúne todos os conceitos de teste de hipóteses abordados nesta aula.
▶ Exemplo: Avaliação abrangente do desempenho de uma campanha de marketing
# ============================================
# Comprehensive Evaluation of Marketing Campaign Performance
# Features: t-test / Proportionality Test / ANOVA combined
# ============================================
set.seed(42)
# 1. A/B Test Conversion Time
group_a <- rnorm(50, mean = 15, sd = 3) # Original Page
group_b <- rnorm(50, mean = 13, sd = 3) # New Page
cat("=== A/B Test: Conversion Time ===\n")
cat("A Group Mean:", round(mean(group_a), 2), "s\n")
cat("B Group Mean:", round(mean(group_b), 2), "s\n")
cat("Differences:", round(mean(group_a) - mean(group_b), 2), "s\n\n")
# 2. t-test
t_result <- t.test(group_a, group_b)
print(t_result)
cat("\n")
# 3. Cohen's d
n1 <- length(group_a)
n2 <- length(group_b)
s_pooled <- sqrt(((n1-1)*var(group_a) + (n2-1)*var(group_b)) / (n1+n2-2))
cohens_d <- (mean(group_a) - mean(group_b)) / s_pooled
cat("Cohen's d (Effect size):", round(cohens_d, 3), "\n")
cat("Effect Size:", ifelse(abs(cohens_d) > 0.8, "L",
ifelse(abs(cohens_d) > 0.5, "Mid", "S")), "\n\n")
# 4. A/B Testing Conversion Rates
convert_a <- 80
convert_b <- 100
visitors_a <- 1000
visitors_b <- 1000
cat("=== A/B Test: Conversion Rate ===\n")
cat("A Group Conversion Rate:", round(convert_a / visitors_a * 100, 2), "%\n")
cat("B Group Conversion Rate:", round(convert_b / visitors_b * 100, 2), "%\n\n")
# 5. Proportionality Test
prop_result <- prop.test(c(convert_a, convert_b),
c(visitors_a, visitors_b))
print(prop_result)
cat("\n")
# 6. Comparison of 3 Marketing Strategies (ANOVA)
strategy <- c(rep("Email", 20), rep("Text Message", 20), rep("Push", 20))
sales <- c(rnorm(20, 100, 15),
rnorm(20, 110, 15),
rnorm(20, 105, 15))
df_strategy <- data.frame(strategy, sales)
cat("=== Comparison of 3 Sales Strategies (ANOVA) ===\n")
model <- aov(sales ~ strategy, data = df_strategy)
summary(model)
cat("\nPost-hoc comparison:\n")
print(TukeyHSD(model))
# 7. Gender and Purchasing Behavior (Chi-square)
gender <- sample(c("M", "F"), 200, replace = TRUE)
purchase <- sample(c("Buy", "Not buying"), 200, replace = TRUE,
prob = c(0.3, 0.7))
tab <- table(gender, purchase)
cat("\n=== Gender vs Purchase Chi-Square Test ===\n")
print(tab)
cat("\n")
chisq_result <- chisq.test(tab)
print(chisq_result)
# 8. Comprehensive Report
cat("\n=== Summary of Decisions ===\n")
cat("1. Conversion Time: Group A is", round(cohens_d, 2), "standard deviations slower than Group B",
ifelse(t_result$p.value < 0.05, " (Significant)", " (Not significant)"), "\n", sep = "")
cat("2. Conversion Rate: A vs B Difference",
ifelse(prop_result$p.value < 0.05, "Significant", "Not significant"), "\n")
cat("3. 3 Strategies:",
ifelse(summary(model)[[1]]$`Pr(>F)`[1] < 0.05, "Significant difference", "No difference"), "\n")
Resultado esperado (trecho):
=== A/B Test: Conversion Time ===
A Group Mean: 14.87 s
B Group Mean: 12.94 s
Differences: 1.93 s
Welch Two Sample t-test
t = 3.18, df = 96.3, p-value = 0.002
Cohen's d (Effect size): 0.643
Effect Size: Mid
=== Summary of Decisions ===
1. Conversion Time: Group A is 0.64 standard deviations slower than Group B (Significant)
2. Conversion Rate: A vs B The difference is not significant
3. 3 Strategies: Significant difference
❓ Perguntas Frequentes
P: Unilateral ou bilateral? R: Bilateral por padrão (
alternative = "two.sided"). Use “unilateral” apenas quando houver uma direção clara (por exemplo, para “o novo medicamento é superior ao antigo”, usegreater).
P: Um valor p inferior a 0,05 indica uma diferença grande? R: Não! Um valor p inferior a 0,05 indica apenas que é “improvável que o resultado se deva ao acaso”, mas a magnitude da diferença depende do tamanho do efeito. Mesmo com uma amostra de 1.000.000, um valor p inferior a 0,001 ainda pode indicar uma diferença muito pequena.**
P: Por que usar a ANOVA em vez de testes t múltiplos quando há três ou mais grupos? R: Os testes t múltiplos podem levar a um acúmulo de erros do Tipo I (em que o valor p fica cada vez maior). A ANOVA realiza um único teste, mantendo a taxa de erro em 0,05.
P: Quais são os requisitos para um teste do qui-quadrado? R: A frequência esperada em cada célula deve ser ≥ 5. Se essa condição não for atendida, utilize o teste exato de Fisher.
P: O que devo fazer se p > 0,05? R: Existem três possibilidades: ① Realmente não há diferença; ② O tamanho da amostra é pequeno; ③ O tamanho do efeito é pequeno. Não se pode aceitar diretamente a hipótese nula (H₀); só se pode afirmar que “não há evidência suficiente”.
P: Quando se deve usar o teste de Wilcoxon em vez do teste t? R: Quando os dados não seguem uma distribuição normal, contêm outliers extremos, têm uma amostra pequena (< 30) ou são ordinais. No entanto, o teste de Wilcoxon tem um poder estatístico 5–10% menor do que o teste t.
📖 Resumo
- Teste de hipóteses em 5 etapas: H0/H1 → Estatística de teste → Valor p → Decisão → Relatório
- teste t:
t.test(x, y)Duas amostras /paired = TRUEEmparelhadas /mu =Uma amostra - Testes proporcionais:
prop.test(c(s1, s2), c(n1, n2))Utilizados para testes A/B - Teste do qui-quadrado:
chisq.test(table)Independência /chisq.test(observed)Adequação do modelo - ANOVA:
aov(y ~ group)Comparação de médias entre vários grupos; seguida porTukeyHSD() - valor p ≠ magnitude do efeito — deve ser utilizado em conjunto com o tamanho do efeito (d de Cohen / η²)
- 5 principais armadilhas: manipulação do valor p, amostras grandes que levam a um valor p baixo, p < 0,05 ≠ clinicamente significativo, não rejeitar a hipótese ≠ aceitação e significância estatística ≠ significância prática
- p < 0,05 é o limiar para a significância estatística; a significância prática depende do tamanho do efeito e do contexto empresarial
📝 Exercícios
-
Problema básico: Simule as notas de 30 alunos (média 80, desvio padrão 10) e realize um teste t de uma amostra para determinar se há um desvio significativo em relação a 75 pontos; em seguida, simule as notas de outros 30 alunos (média 78) e realize um teste t de duas amostras. Registre os valores de p.
-
Problema básico: Simule um teste A/B (Grupo A: 1.000 pessoas, 50 conversões; Grupo B: 1.000 pessoas, 80 conversões). Use
prop.testpara verificar se a diferença é estatisticamente significativa. Calcule o tamanho do efeito d de Cohen. -
Exercício básico: Elabore uma tabela de contingência 3x3 (3 canais de publicidade × ocorrência ou não de um clique) e use
chisq.testpara testar se os canais e os cliques são independentes. Verifiqueresult$expected— todas as frequências esperadas são ≥ 5? -
Exercício avançado: Simule as notas dos testes para três métodos de ensino (20 alunos por grupo), realize uma ANOVA usando
aove, em seguida, useTukeyHSDpara determinar quais dois grupos apresentam a maior diferença. -
Desafio: Realize um teste A/B completo — simule o tempo de conversão e a taxa de conversão para duas páginas (1.000 usuários cada). Utilize o teste t, o prop.test e o d de Cohen para uma avaliação abrangente e elabore um relatório de decisão (incluindo o valor p, o tamanho do efeito e recomendações comerciais). Faça uma captura de tela e salve-a.