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



2. Uma história sobre um teste A/B

(1) Desafio: Os anúncios funcionam?

Bob realizou um teste A/B:

O gerente perguntou: “Essa diferença de 2% é real ou é só um acaso?

(2) Solução utilizando R

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

100%
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)
⚠️ Ponto-chave: “Não rejeitar a hipótese nula (H0) ≠ aceitar a hipótese nula (H0).” Um valor p maior que 0,05 indica simplesmente “evidência insuficiente”; isso não significa que “os dois grupos sejam realmente iguais”.



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

R
# 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

R
# 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

R
# 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
R
# 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

R
# 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)

R
# 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



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

R
# 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

R
# 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

R
# 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

R
# 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?

(2) Aplicação prática

R
# 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

100%
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)
R
# 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

R 📖 Somente leitura
# ============================================
# 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")
54 linhas de lógica (limite de 40, somente leitura)

Resultado esperado (trecho):

TEXT 📖 Somente leitura
=== 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”, use greater).

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


📝 Exercícios

  1. 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.

  2. 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.test para verificar se a diferença é estatisticamente significativa. Calcule o tamanho do efeito d de Cohen.

  3. 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.test para testar se os canais e os cliques são independentes. Verifique result$expected — todas as frequências esperadas são ≥ 5?

  4. Exercício avançado: Simule as notas dos testes para três métodos de ensino (20 alunos por grupo), realize uma ANOVA usando aov e, em seguida, use TukeyHSD para determinar quais dois grupos apresentam a maior diferença.

  5. 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.

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%