Vamos criar um guia completo sobre teste de hipótese e desenvolver uma aplicação interativa usando Python e Streamlit.
📊 O que é Teste de Hipótese?
Teste de hipótese é um procedimento estatístico que nos permite tomar decisões sobre populações com base em dados amostrais. É como um “julgamento científico” onde avaliamos evidências para decidir se uma afirmação sobre uma população é plausível ou não.
🔍 Componentes Principais
1. Hipóteses
- H₀ (Hipótese Nula): Afirmação que queremos testar (status quo)
- H₁ (Hipótese Alternativa): O que acreditamos ser verdadeiro
2. Nível de Significância (α)
- Probabilidade de rejeitar H₀ quando ela é verdadeira (erro Tipo I)
- Comumente usa-se α = 0.05 (5%)
3. Valor-p
- Probabilidade de obter resultados tão extremos quanto os observados, assumindo que H₀ é verdadeira
4. Estatística de Teste
- Valor calculado a partir dos dados para tomar a decisão
🐍 Implementação em Python + Streamlit
Vamos criar uma aplicação interativa para testar se há diferença entre dois grupos!
python
import streamlit as st
import numpy as np
import pandas as pd
import scipy.stats as stats
import matplotlib.pyplot as plt
import seaborn as sns
# Configuração da página
st.set_page_config(
page_title="Teste de Hipótese Interativo",
page_icon="📊",
layout="wide"
)
# Título e introdução
st.title("🧪 Teste de Hipótese - Aplicação Interativa")
st.markdown("""
Esta aplicação demonstra como funcionam os testes de hipótese através de um exemplo prático
com comparação entre dois grupos.
""")
# Sidebar para controles
st.sidebar.header("🎛️ Configurações do Experimento")
# Exemplo: Teste se um novo método de ensino é melhor
st.header("📚 Exemplo: Método de Ensino Tradicional vs. Novo Método")
# Parâmetros configuráveis
col1, col2 = st.columns(2)
with col1:
st.subheader("Grupo Controle (Método Tradicional)")
media_controle = st.slider("Média do grupo controle", 60.0, 100.0, 75.0, 1.0)
std_controle = st.slider("Desvio padrão controle", 5.0, 20.0, 10.0, 0.5)
n_controle = st.slider("Tamanho amostral controle", 10, 200, 50)
with col2:
st.subheader("Grupo Tratamento (Novo Método)")
media_tratamento = st.slider("Média do grupo tratamento", 60.0, 100.0, 80.0, 1.0)
std_tratamento = st.slider("Desvio padrão tratamento", 5.0, 20.0, 10.0, 0.5)
n_tratamento = st.slider("Tamanho amostral tratamento", 10, 200, 50)
# Nível de significância
alpha = st.sidebar.select_slider(
"Nível de significância (α)",
options=[0.01, 0.05, 0.10],
value=0.05
)
# Gerar dados sintéticos
np.random.seed(42)
dados_controle = np.random.normal(media_controle, std_controle, n_controle)
dados_tratamento = np.random.normal(media_tratamento, std_tratamento, n_tratamento)
# Criar DataFrame
df_controle = pd.DataFrame({
'Grupo': 'Controle',
'Nota': dados_controle
})
df_tratamento = pd.DataFrame({
'Grupo': 'Tratamento',
'Nota': dados_tratamento
})
df_completo = pd.concat([df_controle, df_tratamento], ignore_index=True)
# Realizar teste t
t_stat, p_value = stats.ttest_ind(dados_tratamento, dados_controle, equal_var=False)
# Hipóteses
st.header("🎯 Definição das Hipóteses")
col1, col2 = st.columns(2)
with col1:
st.info("""
**H₀ (Hipótese Nula)**
Não há diferença entre os métodos de ensino
μ_tratamento = μ_controle
""")
with col2:
st.success("""
**H₁ (Hipótese Alternativa)**
Há diferença entre os métodos de ensino
μ_tratamento ≠ μ_controle
""")
# Visualização dos dados
st.header("📈 Visualização dos Dados")
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))
# Boxplot
sns.boxplot(data=df_completo, x='Grupo', y='Nota', ax=ax1, palette=['skyblue', 'lightcoral'])
ax1.set_title('Distribuição das Notas por Grupo')
ax1.set_ylabel('Nota')
ax1.set_xlabel('Grupo')
# Histograma
sns.histplot(data=df_controle, x='Nota', label='Controle', alpha=0.7, ax=ax2, color='skyblue')
sns.histplot(data=df_tratamento, x='Nota', label='Tratamento', alpha=0.7, ax=ax2, color='lightcoral')
ax2.set_title('Distribuição das Notas - Histograma')
ax2.set_xlabel('Nota')
ax2.legend()
st.pyplot(fig)
# Estatísticas descritivas
st.header("📊 Estatísticas Descritivas")
col1, col2, col3, col4 = st.columns(4)
with col1:
st.metric("Média Controle", f"{dados_controle.mean():.2f}")
with col2:
st.metric("Média Tratamento", f"{dados_tratamento.mean():.2f}")
with col3:
st.metric("Diferença", f"{(dados_tratamento.mean() - dados_controle.mean()):.2f}")
with col4:
st.metric("Tamanho Efeito", f"{(dados_tratamento.mean() - dados_controle.mean())/np.sqrt((std_controle**2 + std_tratamento**2)/2):.3f}")
# Resultado do teste
st.header("🔬 Resultado do Teste de Hipótese")
col1, col2, col3 = st.columns(3)
with col1:
st.metric("Estatística t", f"{t_stat:.4f}")
with col2:
st.metric("Valor-p", f"{p_value:.6f}")
with col3:
st.metric("α", f"{alpha}")
# Interpretação
st.header("🎓 Interpretação do Resultado")
# Decisão
if p_value < alpha:
st.error(f"**Decisão: Rejeitamos H₀**")
st.markdown(f"""
Como o valor-p ({p_value:.6f}) é menor que α ({alpha}), temos evidências estatísticas
suficientes para rejeitar a hipótese nula. Isso sugere que **há uma diferença
estatisticamente significativa** entre os dois métodos de ensino.
""")
else:
st.success(f"**Decisão: Não rejeitamos H₀**")
st.markdown(f"""
Como o valor-p ({p_value:.6f}) é maior que α ({alpha}), não temos evidências
estatísticas suficientes para rejeitar a hipótese nula. Isso **não significa**
que H₀ é verdadeira, apenas que não encontramos evidências fortes o suficiente
contra ela nos dados atuais.
""")
# Explicação adicional
with st.expander("📖 Entendendo os Conceitos"):
st.markdown("""
### 🔍 O que é Valor-p?
- É a probabilidade de observar resultados tão extremos quanto os obtidos, assumindo que H₀ é verdadeira
- Valor-p pequeno: evidência forte contra H₀
- Valor-p grande: pouca evidência contra H₀
### ⚠️ Erros Possíveis:
- **Erro Tipo I**: Rejeitar H₀ quando ela é verdadeira (falso positivo)
- **Erro Tipo II**: Não rejeitar H₀ quando ela é falsa (falso negativo)
### 📈 Poder do Teste:
- Probabilidade de corretamente rejeitar H₀ quando ela é falsa
- Aumenta com tamanho amostral maior e efeito maior
""")
# Código do teste
with st.expander("👨💻 Código Python do Teste"):
st.code("""
# Importar bibliotecas
import scipy.stats as stats
import numpy as np
# Gerar dados (ou carregar seus dados reais)
dados_controle = np.random.normal(75, 10, 50)
dados_tratamento = np.random.normal(80, 10, 50)
# Realizar teste t para amostras independentes
t_stat, p_value = stats.ttest_ind(dados_tratamento, dados_controle, equal_var=False)
# Tomar decisão
alpha = 0.05
if p_value < alpha:
print("Rejeitar H₀ - Há diferença significativa")
else:
print("Não rejeitar H₀ - Não há evidência de diferença")
""")
# Rodapé
st.markdown("---")
st.markdown("""
*Desenvolvido para demonstrar conceitos de teste de hipótese estatística*
*Use os controles na barra lateral para explorar diferentes cenários!*
""")
🚀 Como Executar a Aplicação
1 Criar o ambiente virtual com python
# 1. Entre no Diretório do app e rode:
python -m venv ambiente_env
# 2. Ativar ambiente (Linux/Mac)
source ambiente_env/bin/activate
# 3. Ativar ambiente (Windows)
ambiente_env\Scripts\activate
# 4. Instalar dependências
pip install streamlit scipy numpy pandas matplotlib seaborn
# 5. Executar aplicação
streamlit run teste_hipotese_app.py
2 Acesse no navegador
http://localhost:8501

🎯 Principais Conceitos Demonstrados
1. Interatividade
- Sliders para ajustar parâmetros
- Visualização em tempo real
- Feedback imediato dos resultados
2. Visualização
- Boxplots para comparação de distribuições
- Histogramas para entender a forma das distribuições
- Métricas claras e interpretáveis
3. Interpretação
- Explicação em linguagem natural
- Decisão baseada em evidências estatísticas
- Contextualização dos resultados
💡 Aplicações Práticas
Os testes de hipótese são usados em:
- Pesquisa científica: Validar teorias
- Negócios: Testar eficácia de campanhas
- Medicina: Avaliar tratamentos
- Qualidade: Controlar processos industriais
Esta aplicação fornece uma base sólida para entender e aplicar testes de hipótese em projetos reais de ciência de dados!

