3  🧾 Você define a amostra

3.1 👨‍💼 Contexto

Você é o analista do Estúdio Biela e vai iniciar a análise de desempenho da nova campanha digital.

Sua missão é criar uma estrategia de comunicação que aumente a conversão em clientes das campanhas realizadas no site.

3.1.1 📌 Cenário Atual:

*dados ficticios

A campanha atinge uma média de 10.000 usuários por dia. Esse é o seu ponto de partida: o alcance bruto.

Você sabe que:

  • 5% dos usuários clicam no banner — essa é a taxa de clique (CTR).
  • Dos que clicam, 30% realizam uma compra — essa é a taxa de conversão após o clique.
  • Logo: Conversão = Alcance × CTR × Taxa de Conversão
  • Ou seja, no cenário atual temos 10000 x 5% x 30% = 150 usuários por campanha ou 1,5% dos impactados pelo banner

Agora é hora de aplicar a fórmula de conversão para entender o impacto final da campanha:

3.1.2 📊 Resultados Prévios

# Importa bibliotecas
import numpy as np
import pandas as pd
from statsmodels.stats.power import NormalIndPower
from statsmodels.stats.proportion import proportions_ztest, proportion_effectsize
# Parâmetros iniciais conhecidos de mensurações anteriores
alcance_diario = 10000
ctr = 0.05
conversao_banner = 0.30

3.1.3 📈 Conversão

Conversão esperada é de aproximadamente 150 usuários, ou 1,5% da audiência diária (alcance x CTR x taxa de conversão).

# Conversão final diária
conversao_final = alcance_diario * ctr * conversao_banner
conversao_final_taxa = conversao_final / alcance_diario
print(f"Conversão final esperada: {conversao_final:.0f} usuários ({conversao_final_taxa:.2%})")
Conversão final esperada: 150 usuários (1.50%)

3.2 📏 Efeito Mínimo Detectável (EMD):

Umas das primeiras decisões do seu teste é o aumento que você quer na conversão, ou seja:

  • Se a taxa atual é 1,5%, uma melhoria de 10% resultaria em 1,65%.

Vamos olhar de outra forma:

🧃 Suco de Laranja no Recreio

Você vende suco de laranja na escola. Todo dia, 100 amigos passam pela sua barraquinha, mas só 1 ou 2 amigos compram o suco. Aí você pensa:

“E se eu colocar um canudinho colorido no copo, será que mais amigos vão querer comprar?”

Efeito Mínimo Detectável (EMD) é… É o menor aumento nas vendas que você quer perceber com o seu teste.

Por exemplo:

Hoje, só 2 de 100 amigos compram (isso é 2%).

Você quer saber se o canudo colorido aumenta isso para pelo menos 2,5%.

Esse 0,5% de diferença é o efeito mínimo detectável.

Por que isso é importante?

Porque se o canudo colorido só fizer 1 amigo a mais comprar por sorte, você não pode ter certeza se foi o canudo ou o acaso. Então você escolhe:

“Se não aumentar pelo menos um pouquinho visível (tipo 0,5%), nem vale a pena mudar!”

Em resumo:

📏 EMD é como uma régua: Serve para medir se a diferença entre o antigo e o novo é grande o suficiente para ser notada de verdade, e não só sorte.

3.2.1 📏 Cálculo do Efeito Mínimo Detectável (EMD) para 2 grupos

poder_teste = 0.8 #você quer ter uma chance de acertar de 80%
significancia = 0.05

# Supondo que queremos detectar uma melhoria de 10% na taxa de conversão atual
melhoria_esperada = 0.10

conversao_esperada_pos = conversao_final_taxa * (1 + melhoria_esperada)
efeito_minimo_detectavel = conversao_esperada_pos - conversao_final_taxa

# Cálculo do tamanho da amostra necessário
analysis = NormalIndPower()
effect_size = proportion_effectsize(conversao_final_taxa, conversao_esperada_pos)
tamanho_amostra = analysis.solve_power(
    effect_size=effect_size,
    power=poder_teste,
    alpha=significancia,
    ratio=1
)
tamanho_amostra = np.ceil(tamanho_amostra)
tamanho_amostra = np.ceil(tamanho_amostra)

total_amostra = 2 * tamanho_amostra
usuarios_por_grupo_dia = alcance_diario / 2

dias_necessarios = total_amostra / alcance_diario

print(f"\nEfeito mínimo detectável: {efeito_minimo_detectavel:.2%}")
print(f"Tamanho da amostra necessária por grupo: {tamanho_amostra:.0f}")
print(f"Total de usuários necessários (controle + teste): {total_amostra:.0f}")
print(f"Com {alcance_diario} acessos diários, serão necessários aproximadamente {dias_necessarios:.1f} dias de teste.")

Efeito mínimo detectável: 0.15%
Tamanho da amostra necessária por grupo: 108093
Total de usuários necessários (controle + teste): 216186
Com 10000 acessos diários, serão necessários aproximadamente 21.6 dias de teste.

3.2.2 ➕ Um pouco mais de EMD

Pergunta EMD pequeno? EMD grande?
“Tenho muito tráfego?” ✅ Sim ❌ Não
“Mudanças pequenas geram muito lucro?” ✅ Sim ❌ Não
“Preciso de uma resposta rápida?” ❌ Não ✅ Sim

⚖️ Considerações importantes

Tamanho da amostra e EMD: Quanto menor o EMD que você deseja detectar, maior será o tamanho da amostra necessário. Isso ocorre porque detectar diferenças sutis requer mais dados para garantir que os resultados não sejam devidos ao acaso.​

Tempo de execução do teste: Um EMD menor também implica em um tempo de teste mais longo, pois é necessário coletar mais dados para atingir o tamanho de amostra adequado.

Equilíbrio entre precisão e recursos: Definir um EMD muito pequeno pode tornar o teste impraticável devido ao tempo e recursos necessários. Por outro lado, um EMD muito grande pode fazer com que melhorias significativas, mas menores que o EMD definido, passem despercebidas.

3.2.3 🔓 Significância Estatística:

Valor-p menor que 0.05 (ou 5%) indica que o resultado do teste é estatisticamente significativo, ou seja, há evidências suficientes para afirmar que o grupo teste teve desempenho diferente do controle.

3.2.4 📈 Taxa de Conversão:

Comparada antes e após o teste para avaliar a eficácia real da intervenção (no caso, banner ou outra estratégia adotada).

# Simulação dos resultados, aqui você irá usar os resultados obtidos reais
np.random.seed(42)
amostra_controle = np.random.binomial(n=int(tamanho_amostra), p=conversao_final_taxa)
amostra_teste = np.random.binomial(n=int(tamanho_amostra), p=conversao_esperada_pos)

# Teste de hipóteses (Significância estatística)
successes = np.array([amostra_controle, amostra_teste])
nobs = np.array([tamanho_amostra, tamanho_amostra])
stat, pval = proportions_ztest(successes, nobs)

print("\nResultados do teste estatístico:")
print(f"- Conversão grupo controle: {amostra_controle/tamanho_amostra:.2%}")
print(f"- Conversão grupo teste: {amostra_teste/tamanho_amostra:.2%}")
print(f"- Valor de p: {pval:.4f}")

# Interpretação
declaracao = "Estatisticamente significativo" if pval < significancia else "Não significativo"
print(f"Resultado: {declaracao} (alpha = {significancia})")

Resultados do teste estatístico:
- Conversão grupo controle: 1.47%
- Conversão grupo teste: 1.68%
- Valor de p: 0.0001
Resultado: Estatisticamente significativo (alpha = 0.05)