Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Projeto] Automatizando cálculo do valor P e impressão do resultado e uma pequena dúvida

Tentei deixar o cálculo do valor P e a impressão do resultado mais automatizada, de uma maneira que fosse possível uma impressão do resultado dos testes de uma maneira mais completa, sem ser necessário mais trabalho do usuário/analista.

# Grupo_A e Grupo_B serão os grupos sobre os quais será realizado o teste
# Hipotese_Nula e Hipotese_Alternativa serão as hipóteses definidas para cada teste
def teste_da_hipotese(grupo_A, grupo_B, Hipotese_Nula, Hipotese_Alternativa):
  r = ranksums(grupo_A, grupo_B)

  def valorP_significativo():
    print('É rejeitada a hipótese nula')
    print(Hipotese_Alternativa)

# Caso o valor de P < 0.05 E seja muito pequeno imprime o valor completo
  if((r.pvalue < 0.05) & (r.pvalue < 0.0001)):
    print('O valor do p-value {}'.format(r.pvalue))
    valorP_significativo()
# Caso o valor de P < 0.05 E seja maior que 4 casas decimais imprime o valor arrendodado 
  elif((r.pvalue < 0.05) & (r.pvalue >= 0.0001)):
    print('O valor do p-value {}'.format(r.pvalue.round(4)))
    valorP_significativo()
  else:
    print('É aceita a hipótese nula')
    print(Hipotese_Nula)

Para que o código rode corretamente é necessário apenas definir as hipóteses, como por exemplo:

hipotese_nula1 = 'A distribuição é a mesma nos dois grupos'
hipotese_alternativa1 = 'A distribuição não é a mesma nos dois grupos'

Definir os grupos que serão testados:

sobremesa = gorjetas.query("sobremesa == 'Sim'").porcentagem
sem_sobremesa = gorjetas.query("sobremesa == 'Não'").porcentagem

E adicionar os parâmetros corretamente na função:

teste_da_hipotese(sobremesa, sem_sobremesa, hipotese_nula1, hipotese_alternativa1)

Minha duvida em relação a esse código é somente se ele segue as convenções dos usuários de Python, pois achei meio estranho e não sei se está correto utilizar funções dentro de funções como utilizei ali.

1 resposta
solução!

Oi, Tiago! Tudo bem por aí?

Desculpe a demora em te responder.

Seu código está bem estruturado e é uma excelente ideia de automatização, parabéns! :)

Sobre sua dúvida: sim, é possível e válido definir funções dentro de outras funções em Python. Isso se chama "função aninhada". Essa prática pode ser útil quando temos um bloco de código que se repete dentro de uma função, mas não é usado em nenhum outro lugar do seu código, como podemos observar em valorP_significativo().

Caso queira deixar a sua automatização ainda mais "pythônica", tenho algumas dicas legais para te apresentar:

  • Substituir a função valorP_significativo() por uma que recebe informações sobre a hipótese a ser considerada e, a partir disso, formata todas os dados pertinentes para compreender o resultado da análise:

    def mostrar_resultado(rejeitada, hipotese):
        print(f'O valor do p-value é {r.pvalue:.4f}' if r.pvalue >= 0.0001 else f'O valor do p-value é {r.pvalue}')
        if rejeitada:
            print('É rejeitada a hipótese nula')
        else:
            print('É aceita a hipótese nula')
        print(hipotese)
    

    Com ela, conseguimos remover vários trechos do código que estavam repetidos, adicionando como parâmetro se a hipótese nula deve ser rejeitada, bem como qual a hipótese (H0 ou H1) iremos levar em conta. Além disso, observe como ficou estruturado o primeiro print. Dentro dele, personalizamos a apresentação do p-value utilizando IF e ELSE!

  • Dentro da função teste_de_hipotese(), podemos simplificar o bloco condicional, deixando-o assim:

    if r.pvalue < 0.05:
        mostrar_resultado(True, hipotese_alternativa)
    else:
        mostrar_resultado(False, hipotese_nula)
    

    Caso pvalue seja inferior a 0.05, indicamos em mostrar_resultado() que a hipótese nula deve ser rejeitada (True) e que iremos considerar a alternativa. Caso contrário, invertemos a lógica.

Tiago, sua ideia é muito interessante. Espero que minhas sugestões agreguem em seu aprendizado!

Um abraço.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!