Reforço: Amostragem, Estimação e Testes de Significância

Revisando e Praticando Conceitos Essenciais para Análise de Dados

Autor

Márcio Nicolau

Data de Publicação

15 de outubro de 2025

Introdução e Objetivos

Chegamos a um ponto crucial em nosso curso: a consolidação dos conhecimentos fundamentais. Ao longo das últimas aulas, mergulhamos em conceitos essenciais como probabilidade condicional, o poderoso Teorema de Bayes, as medidas de tendência central e dispersão da estatística descritiva, e as técnicas visuais e numéricas da Análise Exploratória de Dados (AED). Além disso, exploramos a vital área da Amostragem, compreendemos a Estimação de parâmetros populacionais através de intervalos de confiança, e introduzimos a lógica dos Testes de Significância (ou Testes de Hipóteses).

Estes tópicos formam a espinha dorsal de qualquer projeto de ciência de dados, permitindo-nos compreender a incerteza, resumir informações complexas, descobrir padrões ocultos, generalizar resultados de amostras para populações e tomar decisões baseadas em evidências.

Esta aula de reforço tem como objetivo solidificar seu entendimento desses conceitos, apresentando novos cenários e problemas que exigirão a aplicação integrada dessas ferramentas. A prática constante é a chave para a proficiência, e a habilidade de transitar entre a teoria e a aplicação prática é o que definirá um analista de dados competente.

Objetivos de Aprendizagem

Ao final desta aula de reforço, você será capaz de:

  • Revisar e aplicar a probabilidade condicional e o Teorema de Bayes para atualizar probabilidades com novas evidências.
  • Revisar e distinguir entre população, amostra, parâmetro e estatística, e identificar métodos de amostragem probabilística adequados.
  • Revisar e construir intervalos de confiança para médias e proporções populacionais, interpretando-os corretamente.
  • Revisar e formular hipóteses nula e alternativa, entender o p-valor, o nível de significância e os tipos de erro em testes de hipóteses.
  • Integrar múltiplos conceitos para resolver problemas de análise de dados.

Probabilidade Condicional e Teorema de Bayes

A probabilidade condicional (\(P(A|B)\)) mede a probabilidade de um evento \(A\) ocorrer, dado que outro evento \(B\) já ocorreu. A partir dela, derivamos a Regra da Multiplicação (\(P(A \cap B) = P(A|B)P(B)\)) e definimos eventos independentes (quando \(P(A|B) = P(A)\)). A Lei da Probabilidade Total nos ajuda a calcular a probabilidade marginal de um evento complexo, e o Teorema de Bayes nos permite atualizar nossas crenças (probabilidades a priori) com base em novas evidências, obtendo probabilidades a posteriori. (Bussab; Morettin, 2017, p. 65–74)

Teorema de Bayes: A Lógica da Atualização de Crenças

\(P(A|B) = \frac{P(B|A)P(A)}{P(B)}\)

Onde:

  • \(P(A|B)\): Probabilidade a posteriori de \(A\) dado \(B\).
  • \(P(B|A)\): Verossimilhança de \(B\) dado \(A\).
  • \(P(A)\): Probabilidade a priori de \(A\).
  • \(P(B)\): Probabilidade marginal de \(B\), frequentemente expandida como \(P(B|A)P(A) + P(B|A^c)P(A^c)\) (Lei da Probabilidade Total).

Exemplo Diagnóstico de Falha em Servidor

Um datacenter tem 0.5% de chance de um servidor falhar em um dia (\(P(\text{Falha}) = 0.005\)). Se um servidor falha, um alarme é acionado com 98% de probabilidade (\(P(\text{Alarme}|\text{Falha}) = 0.98\)). No entanto, o alarme também pode acionar por falso positivo (sem falha real) com 3% de probabilidade (\(P(\text{Alarme}|\text{Não Falha}) = 0.03\)).

Se o alarme do servidor acionou, qual a probabilidade de que realmente haja uma falha?

Solução:

Vamos definir os eventos:

  • \(F\): O servidor falhou. \(P(F) = 0.005\).
  • \(\neg F\): O servidor não falhou. \(P(\neg F) = 1 - P(F) = 0.995\).
  • \(A\): O alarme acionou.

Conhecemos:

  • \(P(A|F) = 0.98\) (verossimilhança)
  • \(P(A|\neg F) = 0.03\) (falso positivo)

Queremos \(P(F|A)\). Aplicando o Teorema de Bayes:

\(P(F|A) = \frac{P(A|F)P(F)}{P(A)}\)

Primeiro, calculamos \(P(A)\) usando a Lei da Probabilidade Total:

\(P(A) = P(A|F)P(F) + P(A|\neg F)P(\neg F)\) \(P(A) = (0.98)(0.005) + (0.03)(0.995)\) \(P(A) = 0.0049 + 0.02985 = 0.03475\)

Agora, calculamos \(P(F|A)\):

\(P(F|A) = \frac{(0.98)(0.005)}{0.03475} = \frac{0.0049}{0.03475} \approx 0.1410\)

Interpretação: Se o alarme de um servidor aciona, a probabilidade de que realmente haja uma falha é de aproximadamente 14.10%. Embora o alarme seja bastante preciso se houver uma falha real (98%), a baixa probabilidade inicial de falha e a taxa de falsos positivos fazem com que um alarme acionado ainda tenha uma probabilidade relativamente baixa de indicar uma falha real.

Código Diagnóstico de Falha em Servidor

# Probabilidades a priori
p_falha = 0.005
p_nao_falha = 1 - p_falha

# Verossimilhanças
p_alarme_dado_falha = 0.98
p_alarme_dado_nao_falha = 0.03

# Calcular P(Alarme) usando Lei da Probabilidade Total
p_alarme = (p_alarme_dado_falha * p_falha) + \
             (p_alarme_dado_nao_falha * p_nao_falha)
print(f"P(Alarme) (Probabilidade de o alarme acionar): {p_alarme:.5f}")

# Aplicar o Teorema de Bayes
p_falha_dado_alarme = (p_alarme_dado_falha * p_falha) / p_alarme

print(f"P(Falha | Alarme) (Probabilidade de haver falha dado que o alarme acionou): {p_falha_dado_alarme:.4f}")
# Probabilidades a priori
p_falha <- 0.005
p_nao_falha <- 1 - p_falha

# Verossimilhanças
p_alarme_dado_falha <- 0.98
p_alarme_dado_nao_falha <- 0.03

# Calcular P(Alarme) usando Lei da Probabilidade Total
p_alarme <- (p_alarme_dado_falha * p_falha) +
              (p_alarme_dado_nao_falha * p_nao_falha)
cat(sprintf("P(Alarme) (Probabilidade de o alarme acionar): %.5f\n", p_alarme))

# Aplicar o Teorema de Bayes
p_falha_dado_alarme <- (p_alarme_dado_falha * p_falha) / p_alarme

cat(sprintf("P(Falha | Alarme) (Probabilidade de haver falha dado que o alarme acionou): %.4f\n", p_falha_dado_alarme))

Diagrama de Relações do Teorema de Bayes (Revisão)

graph TD
    P_F("P(Falha) - Prior: 0.005") --> P_A_F("P(Alarme|Falha) - Likelihood: 0.98");
    P_A_F --> P_F_A("P(Falha|Alarme) - Posterior: 0.1410");
    P_A("P(Alarme) - Evidence: 0.03475") --> P_F_A;
    P_A -- "Lei da Prob. Total" --> P_A_F_sum("P(Alarme|Falha)P(Falha) + P(Alarme|Não Falha)P(Não Falha)");
    P_A_F_sum --> P_A;

    style P_F fill:#d4edda,stroke:#28a745,stroke-width:2px;
    style P_A_F fill:#ffecb3,stroke:#ffc107,stroke-width:2px;
    style P_A fill:#cfe2f3,stroke:#007bff,stroke-width:2px;
    style P_F_A fill:#dc3545,stroke:#dc3545,stroke-width:2px;
    style P_A_F_sum fill:#cfe2f3,stroke:#007bff,stroke-width:2px;
Figura 1: Diagrama de Relações do Teorema de Bayes (Revisão)

Amostragem e Tipos de Amostras

A amostragem é o processo de selecionar um subconjunto de uma população para inferir características sobre ela. Uma estatística (da amostra) estima um parâmetro (da população). A amostragem probabilística garante que cada elemento tenha uma chance conhecida de ser selecionado, permitindo inferência estatística válida. (Bussab; Morettin, 2017, p. 165–175)

Tipos de Amostragem Probabilística

  • Amostragem Aleatória Simples (AAS): Cada elemento tem igual chance de ser selecionado.
  • Amostragem Estratificada: A população é dividida em estratos homogêneos, e uma AAS é feita em cada estrato para garantir representatividade proporcional.
  • Amostragem Sistemática: Seleciona elementos em intervalos regulares de uma lista ordenada, após um ponto de partida aleatório.
  • Amostragem por Conglomerados: A população é dividida em conglomerados (grupos heterogêneos internamente), e conglomerados inteiros são selecionados aleatoriamente.

Exemplo de Reforço: Amostragem de Opinião

Uma cidade tem 100.000 eleitores. A prefeitura quer realizar uma pesquisa de opinião sobre um novo projeto de infraestrutura, amostrando 500 eleitores. A cidade é dividida em 5 grandes regiões, e sabe-se que a proporção de eleitores em cada região é: Centro (20%), Norte (30%), Sul (25%), Leste (15%), Oeste (10%).

Qual método de amostragem seria mais adequado para garantir que todas as regiões estejam representadas proporcionalmente? Como implementar?

Solução:

A Amostragem Estratificada é a mais adequada, pois queremos garantir que cada região (estrato) seja representada proporcionalmente.

Passos:

  1. Calcular o tamanho da amostra para cada região (estrato).
    • Centro: \(500 \times 0.20 = 100\) eleitores.
    • Norte: \(500 \times 0.30 = 150\) eleitores.
    • Sul: \(500 \times 0.25 = 125\) eleitores.
    • Leste: \(500 \times 0.15 = 75\) eleitores.
    • Oeste: \(500 \times 0.10 = 50\) eleitores.
  2. Dentro de cada região, selecionar aleatoriamente o número correspondente de eleitores.

Código Amostragem Estratificada

import pandas as pd
import numpy as np

# População simulada (apenas IDs e Regiões)
np.random.seed(42)
num_eleitores_total = 100000
proporcoes_regiao = {'Centro': 0.20, 'Norte': 0.30, 'Sul': 0.25, 'Leste': 0.15, 'Oeste': 0.10}

regioes_pop = np.random.choice(
    list(proporcoes_regiao.keys()),
    size=num_eleitores_total,
    p=list(proporcoes_regiao.values())
)
populacao_df = pd.DataFrame({'ID_Eleitor': range(1, num_eleitores_total + 1), 'Regiao': regioes_pop})

print("Distribuição de regiões na população simulada:")
print(populacao_df['Regiao'].value_counts(normalize=True))

# Definir tamanho da amostra
tamanho_amostra_total = 500

# Calcular tamanhos de amostra por estrato
tamanhos_amostra_estratos = (populacao_df['Regiao'].value_counts(normalize=True) * tamanho_amostra_total).round().astype(int)
print(f"\nTamanhos de amostra por estrato (arredondado):\n{tamanhos_amostra_estratos}")

# Amostragem Estratificada
amostra_estratificada_df = pd.DataFrame()
for regiao, tamanho in tamanhos_amostra_estratos.items():
    sub_amostra = populacao_df[populacao_df['Regiao'] == regiao].sample(n=tamanho, random_state=42)
    amostra_estratificada_df = pd.concat([amostra_estratificada_df, sub_amostra])

print(f"\nAmostra Estratificada (primeiras 5 linhas):\n{amostra_estratificada_df.head()}")
print(f"\nTamanho da amostra estratificada: {len(amostra_estratificada_df)}")
print(f"Distribuição de regiões na amostra estratificada:\n{amostra_estratificada_df['Regiao'].value_counts(normalize=True)}")
library(dplyr)

# População simulada (apenas IDs e Regiões)
set.seed(42)
num_eleitores_total <- 100000
proporcoes_regiao <- c('Centro' = 0.20, 'Norte' = 0.30, 'Sul' = 0.25, 'Leste' = 0.15, 'Oeste' = 0.10)

regioes_pop <- sample(
  names(proporcoes_regiao),
  size = num_eleitores_total,
  replace = TRUE,
  prob = proporcoes_regiao
)
populacao_df <- data.frame(ID_Eleitor = 1:num_eleitores_total, Regiao = regioes_pop)

cat("Distribuição de regiões na população simulada:\n")
print(prop.table(table(populacao_df$Regiao)))

# Definir tamanho da amostra
tamanho_amostra_total <- 500

# Calcular tamanhos de amostra por estrato
proporcoes_estratos_pop <- prop.table(table(populacao_df$Regiao))
tamanhos_amostra_estratos <- round(proporcoes_estratos_pop * tamanho_amostra_total)
cat(sprintf("\nTamanhos de amostra por estrato (arredondado):\n"))
print(tamanhos_amostra_estratos)

# Amostragem Estratificada
amostra_estratificada_df <- populacao_df %>%
  group_by(Regiao) %>%
  sample_n(size = as.numeric(tamanhos_amostra_estratos[cur_group_id()]), replace = FALSE) %>%
  ungroup()

cat(sprintf("\nAmostra Estratificada (primeiras 5 linhas):\n"))
print(head(amostra_estratificada_df, 5))
cat(sprintf("\nTamanho da amostra estratificada: %d\n", nrow(amostra_estratificada_df)))
cat(sprintf("Distribuição de regiões na amostra estratificada:\n"))
print(prop.table(table(amostra_estratificada_df$Regiao)))

Estimação: Ponto e Intervalo de Confiança

A estimação pontual fornece um único valor (estatística amostral) como a melhor estimativa para um parâmetro populacional. A estimação por intervalo fornece uma faixa de valores (intervalo de confiança, IC) dentro do qual o parâmetro populacional provavelmente se encontra, com um nível de confiança associado. (Bussab; Morettin, 2017, p. 195–200)

Fórmulas Chave

  • IC para Média ( \(\sigma\) conhecido): \(IC = \bar{x} \pm Z_{\alpha/2} \frac{\sigma}{\sqrt{n}}\)
  • IC para Média ( \(\sigma\) desconhecido): \(IC = \bar{x} \pm t_{\alpha/2, n-1} \frac{s}{\sqrt{n}}\)
  • IC para Proporção: \(IC = \hat{p} \pm Z_{\alpha/2} \sqrt{\frac{\hat{p}(1-\hat{p})}{n}}\)

Fatores que Afetam a Largura do IC

  1. Nível de Confiança: Maior NC \(\implies\) IC mais amplo.
  2. Tamanho da Amostra (\(n\)): Maior \(n\) \(\implies\) IC mais estreito.
  3. Desvio Padrão (\(\sigma\) ou \(s\)): Maior SD \(\implies\) IC mais amplo.

Exemplo Satisfação do Cliente Online

Uma pesquisa com 500 clientes online revelou que 320 deles estão satisfeitos com o serviço.

  1. Qual a estimativa pontual para a proporção de clientes satisfeitos?
  2. Construa um intervalo de confiança de 95% para a proporção populacional de clientes satisfeitos.
  3. Interprete o IC.

Solução:

  1. Estimativa pontual (\(\hat{p}\)) = \(320/500 = 0.64\).

  2. Para IC de 95%, \(Z_{0.025} = 1.96\). Erro Padrão (EP) = \(\sqrt{\frac{0.64(1-0.64)}{500}} = \sqrt{\frac{0.64 \times 0.36}{500}} = \sqrt{\frac{0.2304}{500}} = \sqrt{0.0004608} \approx 0.02146\). Margem de Erro (ME) = \(1.96 \times 0.02146 \approx 0.04206\). \(IC = 0.64 \pm 0.04206 = [0.59794, 0.68206]\).

  3. Com 95% de confiança, a verdadeira proporção de clientes satisfeitos na população está entre 59.79% e 68.21%.

Código IC para Proporção

import numpy as np
from scipy import stats

n_sucessos = 320
n_total = 500
conf_level = 0.95

# a) Estimativa Pontual
p_hat = n_sucessos / n_total
print(f"a) Estimativa pontual (proporção de satisfeitos): {p_hat:.2f}")

# b) IC de 95%
se = np.sqrt((p_hat * (1 - p_hat)) / n_total)
z_critical = stats.norm.ppf(1 - (1 - conf_level) / 2)
margin_error = z_critical * se
ic_lower = p_hat - margin_error
ic_upper = p_hat + margin_error

print(f"b) Intervalo de Confiança ({conf_level*100:.0f}%): [{ic_lower:.4f}, {ic_upper:.4f}]")
n_sucessos <- 320
n_total <- 500
conf_level <- 0.95

# a) Estimativa Pontual
p_hat <- n_sucessos / n_total
cat(sprintf("a) Estimativa pontual (proporção de satisfeitos): %.2f\n", p_hat))

# b) IC de 95%
se <- sqrt((p_hat * (1 - p_hat)) / n_total)
z_critical <- qnorm(1 - (1 - conf_level) / 2)
margin_error <- z_critical * se
ic_lower <- p_hat - margin_error
ic_upper <- p_hat + margin_error

cat(sprintf("b) Intervalo de Confiança (%.0f%%): [%.4f, %.4f]\n", conf_level * 100, ic_lower, ic_upper))

Diagrama: Fatores que Afetam a Largura do Intervalo de Confiança (Revisão)

graph TD
    A["Intervalo de Confiança"] --> B("Nível de Confiança");
    B -- Aumenta --> BW1("Largura Aumenta");
    B -- Diminui --> NW1("Largura Diminui");

    A --> C("Tamanho da Amostra (n)");
    C -- Aumenta --> NW2("Largura Diminui");
    C -- Diminui --> BW2("Largura Aumenta");

    A --> D("Variabilidade (σ/s)");
    D -- Aumenta --> BW3("Largura Aumenta");
    D -- Diminui --> NW3("Largura Diminui");

    style A fill:#a7e9ff,stroke:#3b82f6,stroke-width:2px;
    style B fill:#ffe0b3,stroke:#ffc107;
    style C fill:#ffe0b3,stroke:#ffc107;
    style D fill:#ffe0b3,stroke:#ffc107;
    style BW1 fill:#f8bbd0,stroke:#e91e63;
    style BW2 fill:#f8bbd0,stroke:#e91e63;
    style BW3 fill:#f8bbd0,stroke:#e91e63;
    style NW1 fill:#d4edda,stroke:#28a745;
    style NW2 fill:#d4edda,stroke:#28a745;
    style NW3 fill:#d4edda,stroke:#28a745;
Figura 2: Fatores que Afetam a Largura do Intervalo de Confiança (Revisão)

Introdução aos Testes de Significância

Os Testes de Hipóteses são procedimentos estatísticos para decidir, com base em dados amostrais, se uma afirmação (hipótese) sobre um parâmetro populacional é plausível. Envolvem a formulação de uma Hipótese Nula (\(H_0\)) (nenhum efeito) e uma Hipótese Alternativa (\(H_1\)) (o efeito que queremos provar). A decisão é tomada comparando o p-valor com o nível de significância (\(\alpha\)). (Bussab; Morettin, 2017, p. 209–213)

Erros em Testes de Hipóteses

  • Erro Tipo I (\(\alpha\)): Rejeitar \(H_0\) quando ela é verdadeira (falso positivo). Probabilidade = \(\alpha\).
  • Erro Tipo II (\(\beta\)): Não rejeitar \(H_0\) quando ela é falsa (falso negativo).
  • Poder do Teste (\(1-\beta\)): Rejeitar corretamente \(H_0\) quando ela é falsa.

Exemplo: Campanha de Marketing Digital

Uma empresa de marketing digital garante que suas campanhas aumentam a taxa de conversão em mais de 10% (historicamente). Uma nova campanha foi lançada, e 80 conversões foram observadas em uma amostra de 700 visitantes. A taxa de conversão histórica é de 10%. O gerente de marketing quer saber se a nova campanha realmente aumentou a taxa de conversão para mais de 10%.

  1. Formule \(H_0\) e \(H_1\). Qual o tipo de teste?
  2. Se o p-valor obtido foi de 0.038 e o nível de significância é \(\alpha = 0.05\), qual a decisão?
  3. E se \(\alpha = 0.01\)?

Solução:

  1. Hipóteses:

    • \(H_0: P \le 0.10\) (A taxa de conversão não aumentou ou é a mesma/menor que 10%).
    • \(H_1: P > 0.10\) (A taxa de conversão aumentou, é maior que 10%).
    • Tipo de Teste: Unilateral à direita (interessado especificamente em um aumento).
  2. Decisão com \(\alpha = 0.05\):

    • P-valor = 0.038.
    • Como \(0.038 \le 0.05\), rejeitamos \(H_0\).
    • Interpretação: Há evidências estatisticamente significativas, no nível de 5%, de que a nova campanha realmente aumentou a taxa de conversão para mais de 10%.
  3. Decisão com \(\alpha = 0.01\):

    • P-valor = 0.038.
    • Como \(0.038 > 0.01\), não rejeitamos \(H_0\).
    • Interpretação: No nível de significância de 1%, não há evidências estatisticamente significativas para concluir que a nova campanha aumentou a taxa de conversão.

Código Teste de Proporção

import numpy as np
from scipy import stats
import statsmodels.stats.api as sm

# Dados
n_conversoes = 80
n_visitantes = 700
p_historico = 0.10 # P sob H0
alpha_1 = 0.05
alpha_2 = 0.01

# a) Estatística de teste e p-valor (usando statsmodels para conveniência)
# Teste unilateral à direita, então alt='larger'
# Retorna (stat, pvalue)
stat, p_value = sm.proportions_ztest(count=n_conversoes, nobs=n_visitantes, value=p_historico, alternative='larger')

print(f"Estatística Z: {stat:.3f}")
print(f"P-valor (unilateral à direita): {p_value:.3f}")

# b) Decisão com alpha = 0.05
print(f"\nb) Decisão com α = {alpha_1}:")
if p_value <= alpha_1:
    print(f"Como p-valor ({p_value:.3f}) <= α ({alpha_1}), rejeitamos H0.")
    print("Há evidência de que a taxa de conversão aumentou.")
else:
    print(f"Como p-valor ({p_value:.3f}) > α ({alpha_1}), não rejeitamos H0.")
    print("Não há evidência de que a taxa de conversão aumentou.")

# c) Decisão com alpha = 0.01
print(f"\nc) Decisão com α = {alpha_2}:")
if p_value <= alpha_2:
    print(f"Como p-valor ({p_value:.3f}) <= α ({alpha_2}), rejeitamos H0.")
    print("Há evidência de que a taxa de conversão aumentou.")
else:
    print(f"Como p-valor ({p_value:.3f}) > α ({alpha_2}), não rejeitamos H0.")
    print("Não há evidência de que a taxa de conversão aumentou.")
# Dados
n_conversoes <- 80
n_visitantes <- 700
p_historico <- 0.10 # P sob H0
alpha_1 <- 0.05
alpha_2 <- 0.01

# a) Estatística de teste e p-valor (usando prop.test para conveniência)
# Note: prop.test retorna um p-valor bilateral por padrão. Para unilateral, dividimos por 2 ou ajustamos.
# Ou, podemos usar a estatística Z e calcular o p-valor manualmente para garantir a direcionalidade.

# Cálculo manual da estatística Z
p_hat <- n_conversoes / n_visitantes
se_h0 <- sqrt(p_historico * (1 - p_historico) / n_visitantes)
z_stat <- (p_hat - p_historico) / se_h0
p_value_manual <- 1 - pnorm(z_stat) # p-valor para unilateral à direita

cat(sprintf("Estatística Z: %.3f\n", z_stat))
cat(sprintf("P-valor (unilateral à direita): %.3f\n", p_value_manual))

# b) Decisão com alpha = 0.05
cat(sprintf("\nb) Decisão com α = %.2f:\n", alpha_1))
if (p_value_manual <= alpha_1) {
    cat(sprintf("Como p-valor (%.3f) <= α (%.2f), rejeitamos H0.\n", p_value_manual, alpha_1))
    cat("Há evidência de que a taxa de conversão aumentou.\n")
} else {
    cat(sprintf("Como p-valor (%.3f) > α (%.2f), não rejeitamos H0.\n", p_value_manual, alpha_1))
    cat("Não há evidência de que a taxa de conversão aumentou.\n")
}

# c) Decisão com alpha = 0.01
cat(sprintf("\nc) Decisão com α = %.2f:\n", alpha_2))
if (p_value_manual <= alpha_2) {
    cat(sprintf("Como p-valor (%.3f) <= α (%.2f), rejeitamos H0.\n", p_value_manual, alpha_2))
    cat("Há evidência de que a taxa de conversão aumentou.\n")
} else {
    cat(sprintf("Como p-valor (%.3f) > α (%.2f), não rejeitamos H0.\n", p_value_manual, alpha_2))
    cat("Não há evidência de que a taxa de conversão aumentou.\n")
}

Diagrama: Erros em Testes de Hipóteses (Revisão)

graph TD
    A["Decisão do Teste"] --> B{"H0 é Verdadeira?"};
    B -- Sim --> C("Não Rejeitar H0");
    B -- Sim --> D("Rejeitar H0");
    B -- Não --> E("Não Rejeitar H0");
    B -- Não --> F("Rejeitar H0");

    C -- Correta --> G("Decisão Correta");
    D -- Incorreta --> H("Erro Tipo I (α)");
    E -- Incorreta --> I("Erro Tipo II (β)");
    F -- Correta --> J("Poder do Teste (1-β)");

    classDef aNode fill:#a7e9ff,stroke:#3b82f6,stroke-width:2px;
    classDef bNode fill:#ffe0b3,stroke:#ffc107;
    classDef cfNode fill:#d4edda,stroke:#28a745;
    classDef deNode fill:#f8bbd0,stroke:#e91e63;
    classDef gjNode fill:#c8e6c9,stroke:#4caf50,font-weight:bold;
    classDef hiNode fill:#dc3545,stroke:#dc3545,font-weight:bold;
    class A aNode;
    class B bNode;
    class C,F cfNode;
    class D,E deNode;
    class G,J gjNode;
    class H,I hiNode;
Figura 3: Tipos de Erros em Testes de Hipóteses (Revisão)

Verificação de Aprendizagem

Resolva os problemas abaixo, integrando os conceitos de Probabilidade Condicional, Teorema de Bayes, Amostragem, Estimação e Testes de Hipóteses.

  1. Problema 1 (Segurança de Rede - Teorema de Bayes):

    Um sistema de detecção de intrusão de rede tem uma taxa de falsos alarmes de 1% (probabilidade de acionar um alarme quando não há intrusão). A probabilidade de uma intrusão real ocorrer em um dia é de 0.1%. Se uma intrusão real ocorre, o sistema a detecta com 99% de probabilidade.

    1. Se o alarme do sistema é acionado, qual a probabilidade de que realmente haja uma intrusão?
    2. Interprete este resultado e discuta suas implicações para um analista de segurança.
  2. Problema 2 (Pesquisa de Opinião - Amostragem e Estimação):

    Uma universidade possui 20.000 alunos, sendo 60% do curso de Computação e 40% de outros cursos. A reitoria deseja estimar a proporção de alunos que são a favor de aulas remotas, usando uma amostra de 400 alunos.

    1. Que tipo de amostragem você recomendaria para garantir a representatividade das duas categorias de cursos? Justifique.
    2. Considere que, na amostra de 400 alunos (selecionada conforme sua recomendação em ‘a’), 220 alunos de Computação e 100 alunos de outros cursos se declararam a favor de aulas remotas. Qual é a estimativa pontual para a proporção total de alunos da universidade a favor de aulas remotas? (Considere a proporção na amostra da população como a proporção populacional).
    3. Construa um intervalo de confiança de 90% para a proporção populacional de alunos a favor de aulas remotas.
    4. Interprete o intervalo de confiança.
  3. Problema 3 (Eficiência de Processo - Teste de Hipóteses):

    Um processo industrial tem um tempo médio de execução de 10 minutos por item, com um desvio padrão histórico de 1.5 minutos (populacional, \(\sigma\) conhecido). Uma modificação no processo foi implementada e, para avaliar seu impacto, uma amostra de 50 itens processados com a nova modificação foi cronometrada, resultando em um tempo médio amostral de 9.5 minutos. A gerência quer saber se a modificação reduziu o tempo médio de execução.

    1. Formule as hipóteses nula (\(H_0\)) e alternativa (\(H_1\)). Qual o tipo de teste?
    2. Calcule a estatística de teste (Z-score) e o p-valor.
    3. Com um nível de significância de \(\alpha = 0.05\), qual é a decisão em relação a \(H_0\)?
    4. Interprete a decisão no contexto do problema.

1. Problema 1 (Segurança de Rede - Teorema de Bayes):

  • Eventos:

    • \(I\): Intrusão real. \(P(I) = 0.001\).
    • \(\neg I\): Nenhuma intrusão. \(P(\neg I) = 1 - P(I) = 0.999\).
    • \(A\): Alarme acionado.
  • Conhecemos: \(P(A|\neg I) = 0.01\) (falso alarme) e \(P(A|I) = 0.99\) (detecção correta).

  • Queremos calcular \(P(I|A)\).

  1. Se o alarme do sistema é acionado, qual a probabilidade de que realmente haja uma intrusão? (\(P(I|A)\))

    Primeiro, calculamos \(P(A)\) (probabilidade total de o alarme acionar):

    \(P(A) = P(A|I)P(I) + P(A|\neg I)P(\neg I)\) \(P(A) = (0.99)(0.001) + (0.01)(0.999)\) \(P(A) = 0.00099 + 0.00999 = 0.01098\)

    Agora, aplicamos o Teorema de Bayes:

    \(P(I|A) = \frac{P(A|I)P(I)}{P(A)} = \frac{(0.99)(0.001)}{0.01098} = \frac{0.00099}{0.01098} \approx 0.09016\)

p_intrusao = 0.001
p_nao_intrusao = 1 - p_intrusao
p_alarme_dado_intrusao = 0.99
p_alarme_dado_nao_intrusao = 0.01

p_alarme = (p_alarme_dado_intrusao * p_intrusao) + \
                (p_alarme_dado_nao_intrusao * p_nao_intrusao)
print(f"P(Alarme) = {p_alarme:.5f}")

p_intrusao_dado_alarme = (p_alarme_dado_intrusao * p_intrusao) / p_alarme
print(f"a) P(Intrusão | Alarme) = {p_intrusao_dado_alarme:.4f}")
p_intrusao <- 0.001
p_nao_intrusao <- 1 - p_intrusao
p_alarme_dado_intrusao <- 0.99
p_alarme_dado_nao_intrusao <- 0.01

p_alarme <- (p_alarme_dado_intrusao * p_intrusao) +
                (p_alarme_dado_nao_intrusao * p_nao_intrusao)
cat(sprintf("P(Alarme) = %.5f\n", p_alarme))

p_intrusao_dado_alarme <- (p_alarme_dado_intrusao * p_intrusao) / p_alarme
cat(sprintf("a) P(Intrusão | Alarme) = %.4f\n", p_intrusao_dado_alarme))
  1. Interpretação: Mesmo que o sistema seja muito bom em detectar intrusões (99%) e tenha uma taxa de falsos alarmes relativamente baixa (1%), a baixa probabilidade de uma intrusão real (0.1%) faz com que, se o alarme acionar, a chance de ser uma intrusão real seja de apenas cerca de 9.02%. Isso implica que um analista de segurança não deve reagir a cada alarme como se fosse uma intrusão confirmada, mas sim investigar. A maioria dos alarmes (cerca de 91%) será um falso positivo.

2. Problema 2 (Pesquisa de Opinião - Amostragem e Estimação):

  • Total de alunos = 20.000.
  • Computação (Comp): 60% \(\implies\) 12.000 alunos.
  • Outros Cursos (Outros): 40% \(\implies\) 8.000 alunos.
  • Tamanho da amostra = 400.
  1. Tipo de amostragem recomendado:

    Amostragem Estratificada Proporcional. Justificativa: Como a universidade deseja estimar a proporção de alunos favoráveis às aulas remotas e sabe-se que existem dois grandes estratos (Computação e Outros Cursos) que podem ter opiniões diferentes, a amostragem estratificada garante que cada estrato esteja representado na amostra na proporção correta de sua ocorrência na população. Isso minimiza o erro amostral e permite que as inferências sobre a proporção total sejam mais precisas.

  2. Estimativa pontual para a proporção total de alunos a favor:

    Primeiro, calculamos o número de alunos amostrados em cada estrato para ser proporcional:

    • Computação: \(400 \times 0.60 = 240\) alunos.
    • Outros Cursos: \(400 \times 0.40 = 160\) alunos. Na amostra, 220 de Comp e 100 de Outros são a favor. Número total de alunos a favor na amostra = \(220 + 100 = 320\). Estimativa pontual (\(\hat{p}\)) = \(\frac{\text{Total a favor na amostra}}{\text{Tamanho total da amostra}} = \frac{320}{400} = \textbf{0.80}\).
  3. Intervalo de Confiança de 90% para a proporção populacional:

    • Nível de confiança = 90%, então \(Z_{\alpha/2} = Z_{0.05} = 1.645\).
    • \(\hat{p} = 0.80\), \(n = 400\).
    • Erro Padrão (EP) = \(\sqrt{\frac{\hat{p}(1-\hat{p})}{n}} = \sqrt{\frac{0.80(1-0.80)}{400}} = \sqrt{\frac{0.80 \times 0.20}{400}} = \sqrt{\frac{0.16}{400}} = \sqrt{0.0004} = 0.02\).
    • Margem de Erro (ME) = \(Z_{\alpha/2} \times EP = 1.645 \times 0.02 = 0.0329\).
    • \(IC = \hat{p} \pm ME = 0.80 \pm 0.0329\).
    • \(\textbf{IC = [0.7671, 0.8329]}\).
import numpy as np
from scipy import stats

# a) Amostragem Estratificada (Justificativa no texto)

# b) Estimativa Pontual
num_alunos_comp = 20000 * 0.60
num_alunos_outros = 20000 * 0.40
total_amostra = 400

# Amostra proporcional:
amostra_comp = int(total_amostra * 0.60) # 240
amostra_outros = int(total_amostra * 0.40) # 160

favor_comp = 220
favor_outros = 100
total_favor_amostra = favor_comp + favor_outros

p_hat = total_favor_amostra / total_amostra
print(f"b) Estimativa pontual para a proporção total de alunos a favor: {p_hat:.2f}")

# c) IC de 90%
conf_level = 0.90
se = np.sqrt((p_hat * (1 - p_hat)) / total_amostra)
z_critical = stats.norm.ppf(1 - (1 - conf_level) / 2)
margin_error = z_critical * se
ic_lower = p_hat - margin_error
ic_upper = p_hat + margin_error
print(f"c) Intervalo de Confiança ({conf_level*100:.0f}%): [{ic_lower:.4f}, {ic_upper:.4f}]")
# a) Amostragem Estratificada (Justificativa no texto)

# b) Estimativa Pontual
num_alunos_comp <- 20000 * 0.60
num_alunos_outros <- 20000 * 0.40
total_amostra <- 400

# Amostra proporcional:
amostra_comp <- as.integer(total_amostra * 0.60) # 240
amostra_outros <- as.integer(total_amostra * 0.40) # 160

favor_comp <- 220
favor_outros <- 100
total_favor_amostra <- favor_comp + favor_outros

p_hat <- total_favor_amostra / total_amostra
cat(sprintf("b) Estimativa pontual para a proporção total de alunos a favor: %.2f\n", p_hat))

# c) IC de 90%
conf_level <- 0.90
se <- sqrt((p_hat * (1 - p_hat)) / total_amostra)
z_critical <- qnorm(1 - (1 - conf_level) / 2)
margin_error <- z_critical * se
ic_lower <- p_hat - margin_error
ic_upper <- p_hat + margin_error
cat(sprintf("c) Intervalo de Confiança (%.0f%%): [%.4f, %.4f]\n", conf_level * 100, ic_lower, ic_upper))
  1. Interpretação do IC:

    Com 90% de confiança, a verdadeira proporção de todos os alunos da universidade que são a favor das aulas remotas está entre 76.71% e 83.29%.

3. Problema 3 (Eficiência de Processo - Teste de Hipóteses):

  • \(\mu_0 = 10\) minutos, \(\sigma = 1.5\) minutos (conhecido).
  • \(n = 50\), \(\bar{x} = 9.5\) minutos.
  • Gerência quer saber se o tempo reduziu (unilateral à esquerda).
  1. Hipóteses e Tipo de Teste:

    • \(H_0: \mu \ge 10\) minutos (O tempo médio de execução não reduziu ou é o mesmo/maior que 10 minutos).
    • \(H_1: \mu < 10\) minutos (O tempo médio de execução reduziu, é menor que 10 minutos).
    • Tipo de Teste: Unilateral à esquerda.
  2. Estatística de teste (Z-score) e p-valor:

    • Erro Padrão (EP) = \(\frac{\sigma}{\sqrt{n}} = \frac{1.5}{\sqrt{50}} \approx \frac{1.5}{7.071} \approx 0.212\).
    • Estatística Z = \(\frac{\bar{x} - \mu_0}{EP} = \frac{9.5 - 10}{0.212} = \frac{-0.5}{0.212} \approx -2.358\).
    • P-valor (para teste unilateral à esquerda) = \(P(Z < -2.358) \approx 0.00918\).
from scipy import stats

mu_0 = 10
sigma = 1.5
n = 50
x_bar = 9.5

# Erro Padrão
se = sigma / np.sqrt(n)
print(f"Erro Padrão: {se:.3f}")

# Estatística Z
z_stat = (x_bar - mu_0) / se
print(f"b) Estatística Z: {z_stat:.3f}")

# P-valor (unilateral à esquerda)
p_value = stats.norm.cdf(z_stat)
print(f"P-valor: {p_value:.5f}")
mu_0 <- 10
sigma <- 1.5
n <- 50
x_bar <- 9.5

# Erro Padrão
se <- sigma / sqrt(n)
cat(sprintf("Erro Padrão: %.3f\n", se))

# Estatística Z
z_stat <- (x_bar - mu_0) / se
cat(sprintf("b) Estatística Z: %.3f\n", z_stat))

# P-valor (unilateral à esquerda)
p_value <- pnorm(z_stat)
cat(sprintf("P-valor: %.5f\n", p_value))
  1. Decisão com \(\alpha = 0.05\):

    • P-valor = 0.00918.
    • Como \(0.00918 \le 0.05\), rejeitamos a hipótese nula (\(H_0\)).
  2. Interpretação da decisão:

    Há evidências estatisticamente significativas, no nível de 5%, para concluir que a modificação no processo reduziu o tempo médio de execução por item. A redução observada de 0.5 minutos (30 segundos) não é considerada mero acaso, mas sim um efeito real da modificação.

Referências Bibliográficas

BUSSAB, Luiz O. de M.; MORETTIN, Pedro A. Estatı́stica Básica. 9. ed. São Paulo: Saraiva, 2017.