Section outline

  • Primeiramente você precisa ter o Python instalado no seu computador ou então usar online. Confira aqui no curso de Python como fazer isso: Curso Python: onde rodar os programas

    Estes primeiros programas usarão  pacotes estatísticos do Python como numpy, scipy e pandas. Estes já possuem todas as formulas pre programadas e então podemos já pedir o que queremos diretamente. Por exemplo o comando mean manda o numpy calcular a média. O programa apenas tem que calcular e mandar mostrar o resultado na tela (print).

    💻Copie e cole este programa no seu jupyter notebook e rode:

    ============================================================

    import numpy as np
    from scipy import stats
    import pandas as pd

    # Generate a random array of integers

    numeros_aleatorios = [23,56,78,22,1,3,6,1,3,6,8,8,8,9,90]  

    numeros_ordenados = np.sort(numeros_aleatorios)

    # Calculate mean
    mean = np.mean(numeros_aleatorios)

    # Calculate median
    median = np.median(numeros_aleatorios)

    # Calculate mode (using pandas to get all modes if tied)
    mode = pd.Series(numeros_aleatorios).mode().tolist()


    # Print results
    print("Numeros aleatórios:", numeros_aleatorios)
    print("Números ordenados:", numeros_ordenados)
    print(f"Média: {mean}")
    print(f"Mediana: {median}")
    print(f"Moda(s): {mode}")

    ===========================================================

    💻O output será:

    Numeros aleatórios: [23, 56, 78, 22, 1, 3, 6, 1, 3, 6, 8, 8, 8, 9, 90]
    Números ordenados: [ 1  1  3  3  6  6  8  8  8  9 22 23 56 78 90]
    Média: 21.466666666666665
    Mediana: 8.0
    Moda(s): [8]
    =========
    👩‍💻 Perceba que os numeros que foram digitados estavam fora de ordem mas aqui aparecem ordenados para facilitar o calculo da mediana.

    Para nos economizar o trabalho de digitar numeros podemos usar o comando random.randint(1, 111, size=20) que porduz 20 númwros entre 1 e 110. Depois voce pode mudar estes valores.

    💻Feita esta modificação, temos o seguinte programa:
    ===================================================================================

    import numpy as np
    from scipy import stats
    import pandas as pd

    # Generate a random array of integers

    numeros_aleatorios = np.random.randint(1, 111, size=20)  

    numeros_ordenados = np.sort(numeros_aleatorios)

    # Calculate mean
    mean = np.mean(numeros_aleatorios)

    # Calculate median
    median = np.median(numeros_aleatorios)

    # Calculate mode (using pandas to get all modes if tied)
    mode = pd.Series(numeros_aleatorios).mode().tolist()


    # Print results
    print("Numeros aleatórios:", numeros_aleatorios)
    print("Números ordenados:", numeros_ordenados)
    print(f"Média: {mean}")
    print(f"Mediana: {median}")
    print(f"Moda(s): {mode}")

    ===================================================================================

    💻O output será:

    Numeros aleatórios: [ 93 103 89 67 27 21 105 37 99 13 77 32 72 84 34 57 1 89 22 20] Números ordenados: [ 1 13 20 21 22 27 32 34 37 57 67 72 77 84 89 89 93 99 103 105] Média: 57.1 Mediana: 62.0 Moda(s): [89]

    ============================================================

    Programa para estudo de p-hacking

    link para Google Colab notebook

    💻============================================================

    import numpy as np
    from scipy import stats
    import matplotlib.pyplot as plt
    import pandas as pd

    # Configurações iniciais

    n_amostras = 25
    n_testes = 100  # número de testes "exploratórios"

    # Armazenar p-valores
    p_values = []

    # Simular muitos testes sem efeito real
    for i in range(n_testes):
        grupo1 = np.random.normal(loc=0, scale=1, size=n_amostras)
        grupo2 = np.random.normal(loc=0, scale=1, size=n_amostras)
        _, p = stats.ttest_ind(grupo1, grupo2)
        p_values.append(p)
        #print(grupo1)
        #print(grupo2)
       
        # Calculate mean
        mean1 = np.mean(grupo1)
        mean2 = np.mean(grupo2)
        median1 = np.median(grupo1)
        median2 = np.median(grupo2)
        mode1 = pd.Series(grupo1).mode().tolist()
        mode2 = pd.Series(grupo2).mode().tolist()
        print(f"Média1: {mean1,i}")
        print(f"Média2: {mean2,i}")
        print(f"Mediana1: {median1}")
        print(f"Mediana2: {median2}")
        print(f"p: {i,p_values[i]}")
        #print(f"Moda1(s): {mode1}")
        #print(f"Moda2(s): {mode2}")

    # Contar quantos p < 0.05
    falsos_positivos = sum(p < 0.05 for p in p_values)
    a=[p for p in p_values if p < 0.05]

    # Mostrar os p-valores < 0.05 com sua posição original
    print("\033[92mÍndices e p-valores considerados 'significativos':")
    for i, p in enumerate(p_values):
        if p < 0.05:
            print(f"Teste #{i:4d} → p-valor = {p:.4f}")



    # Exibir resultados


    print(f"Total de testes: {n_testes}")
    print(f"\033[1;34mP-valores < 0.05 (falsos positivos): {falsos_positivos}")
    print(f"Proporção: {falsos_positivos / n_testes:.2%}")


    # Gráfico de histograma dos p-valores
    plt.figure(figsize=(10,5))
    plt.hist(p_values, bins=50, color='skyblue', edgecolor='black')
    plt.axvline(0.05, color='red', linestyle='--', label='p = 0.05')
    plt.title('Distribuição de p-valores em 1000 testes sem efeito real')
    plt.xlabel('p-valor')
    plt.ylabel('Frequência')
    plt.legend()
    plt.grid(True)
    plt.show()
     
    💻============================================================

    Este programa gera dois conjuntos de números aleatórios e os compara entre si. O objetivo é testar se ambos pertencem a distribuições puramente aleatórias — nesse caso, espera-se que o valor de p seja maior que 0,05.

    Se um dos conjuntos contiver números sistematicamente mais altos — por exemplo, devido ao efeito de uma droga ou tratamento — então o valor de p deverá ser menor que 0,05, indicando uma diferença estatisticamente significativa.

    No entanto, neste experimento, ambos os conjuntos são aleatórios. Assim, os casos em que p < 0,05 representam falsos positivos: resultados aparentemente significativos que surgem apenas por acaso. Esse fenômeno pode ser explorado indevidamente para publicar pesquisas como se fossem conclusivas, quando na verdade refletem apenas variações aleatórias sem efeito real.