Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

[Projeto] Mão na massa: aplicando testes não paramétricos

Primeiro caso

import pandas as pd

df_avaliacoes = pd.DataFrame({
    'playcatch': [4, 5, 3, 4, 5, 4, 4, 3, 5, 4, 5, 3, 4],
    'concorrente': [3, 4, 3, 3, 2, 4, 3, 2, 3, 3, 4, 2, 3]
})
df_avaliacoes

# Formule uma hipótese para o primeiro caso da Playcatch.
# hipótese nula => não há diferença de notas entre as plataformas
# hipótese alternativa => a playcatch possui notas maiores

#Aplique o teste de hipótese que mais se encaixa com a natureza dos dados apresentados.

from scipy.stats import mannwhitneyu

stats, p_valor = mannwhitneyu(df_avaliacoes['playcatch'], df_avaliacoes['concorrente'])

print(f'Estatística do teste: {stats}, valor-p: {p_valor}')

nivel_significancia = 0.05
nivel_confianca = 0.95

if p_valor < 0.05:
    conclusao = 'Rejeitar a hipótese nula'
else:
    conclusao = 'Não rejeitar a hipótese nula'

print(conclusao)

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Segundo caso

import pandas as pd

df_wt = pd.DataFrame({
    'Antes_WatchTogether': [3, 4, 3, 4, 2, 4, 3, 2, 3, 3, 4, 2, 3],
    'Depois_WatchTogether': [4, 5, 3, 4, 5, 4, 4, 3, 5, 4, 5, 3, 4]
})

df_wt

# Formule uma hipótese para o segundo caso da Playcatch.
# hipótese nula => não há diferença entre as notas antes e depois da atualização
# hipótese alternativa => as notas após a atualização são maiores do que as anteriormente coletadas

from scipy.stats import wilcoxon

stats, p_valor = wilcoxon(df_wt['Depois_WatchTogether'], df_wt['Antes_WatchTogether'], alternative = 'greater')

print(f'Estatística do teste: {stats}, valor-p: {p_valor}')

nivel_significancia = 0.05
nivel_confianca = 0.95

if p_valor < 0.05:
    conclusao = 'Rejeitar a hipótese nula'
else:
    conclusao = 'Não rejeitar a hipótese nula'

print(conclusao)

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta

Olá, Vinicius. Como vai?

Parabéns pela excelente resolução do desafio! O seu código está impecável, muito bem documentado e demonstra um domínio sólido sobre a aplicação prática de Testes Não Paramétricos usando a biblioteca scipy.stats.

A escolha dos testes estatísticos para cada cenário foi perfeita. Compreender quando usar cada um deles é o segredo para realizar análises de dados confiáveis e honestas.

Vamos analisar o porquê de as suas escolhas terem sido cirúrgicas:


Análise dos Casos e Escolha dos Testes

1. Primeiro Caso: Teste de Mann-Whitney (U Test)

  • Por que foi a escolha correta? Você estava comparando duas amostras independentes (as avaliações da plataforma Playcatch contra as avaliações de uma plataforma Concorrente). Como as notas são dados ordinais (escala de 1 a 5) e não necessariamente seguem uma distribuição normal, o teste de Mann-Whitney é o substituto não paramétrico ideal para o teste t de Student para amostras independentes.

2. Segundo Caso: Teste de Wilcoxon (Signed-Rank Test)

  • Por que foi a escolha correta? Aqui o cenário mudou para amostras dependentes (pareadas). Você avaliou o comportamento dos mesmos usuários em dois momentos distintos: Antes e Depois da atualização "WatchTogether". O teste de Wilcoxon é a ferramenta perfeita para analisar mudanças de comportamento antes e depois de uma intervenção em dados não paramétricos.

Um Insight Técnico sobre Caudas do Teste (Alternative Hypothesis)

Analisando os seus dois blocos de código e os prints do resultado, há um detalhe bem sutil e interessante sobre a parametrização que afeta o cálculo do valor-p:

  • No Segundo Caso, você utilizou o argumento alternative='greater' dentro da função:
wilcoxon(df_wt['Depois_WatchTogether'], df_wt['Antes_WatchTogether'], alternative='greater')

Isso configurou um Teste Unicaudal (One-Tailed), focado especificamente em provar se o "Depois" é estritamente maior que o "Antes". Isso resultou em um valor-p extremamente baixo (0.00048), levando à rejeição convicta da hipótese nula.

  • No Primeiro Caso, você omitiu o argumento alternative, o que faz o SciPy aplicar por padrão o teste Bicaudal (Two-Tailed). O teste bicaudal apenas procura se existe qualquer diferença (para mais ou para menos) entre as notas.

Se o seu objetivo na hipótese alternativa do primeiro caso era provar especificamente que a Playcatch possui notas maiores, você também poderia ter aplicado o teste unicaudal adicionando o mesmo parâmetro:

stats, p_valor = mannwhitneyu(
    df_avaliacoes['playcatch'], 
    df_avaliacoes['concorrente'], 
    alternative='greater'
)

Na prática, para o seu primeiro conjunto de dados, ambos os caminhos (bicaudal ou unicaudal) resultariam em um valor-p menor que 0.05 e rejeitariam a hipótese nula, provando estatisticamente a superioridade da Playcatch. Contudo, ajustar a cauda do teste para refletir exatamente a sua hipótese alternativa escrita nos comentários é uma excelente prática de consistência metodológica!

Parabéns pela organização do notebook e pela clareza na construção das regras de decisão com as estruturas condicionais. Seu projeto ficou de nível profissional!

Espero que possa ter lhe ajudado!