Menu
CoddyTech

I p-value

Fa parte della sezione Statistica per il machine learning del percorso Machine Learning di Coddy. Lezione 44 di 64.

Il valore p trasforma gli rimescolamenti in un unico numero: la proporzione di differenze fittizie almeno grandi quanto quella reale, in entrambe le direzioni.

Le 1000 differenze rimescolate dello studio sui caratteri tipografici, rappresentate come istogramma. Le barre a 6.6 secondi o oltre su entrambi i lati sono rosse, 39 rimescolamenti, e un'etichetta riporta p = 39 / 1000 = 0.039

Nel codice, per lo studio dei font:

real = sans.mean() - serif.mean()
rng = np.random.default_rng(4)
diffs = shuffled_diffs(serif, sans, 1000, rng)  # il ciclo della lezione precedente
p_value = (np.abs(diffs) >= np.abs(real)).mean()
print(p_value)

Questo stampa 0.039. np.abs considera uno scarto di -7 grande quanto uno di 7: la domanda è se i caratteri differiscono affatto.

Al di sotto del livello di significatività, spesso 0.05, il caso è una spiegazione poco plausibile, per il guadagno di un carattere tipografico o di un modello. Non è una prova: 4 rimescolamenti su 100 ci sono comunque riusciti.

challenge icon

Sfida

Medio

Una fattoria annaffia le fragole al mattino o alla sera. Il codice iniziale divide strawberries.csv in morning e evening, elenca columns, legge level e definisce shuffled_diffs.

  1. Per ogni colonna, calcola la differenza reale (media serale meno media mattutina), le differenze mescolate (prima il mattino) e il valore p.
  2. Stampa una riga per colonna come sotto (differenza con 2 decimali, p con 3): differs quando p è inferiore a level.
  3. Conta quelle che differiscono.

Un'altra fattoria, livello 0.05:

berries: difference -5.4, p = 0.009, differs
weight_g: difference 0.2, p = 1.0, could be chance
sweetness_brix: difference 0.46, p = 0.022, differs
leaf_spots: difference 0.6, p = 0.397, could be chance
Columns that differ: 2 of 4

Provalo tu

import numpy as np
import pandas as pd


# Restituisce le differenze rimescolate di un test di permutazione (il ciclo della lezione 43): media simulata di b meno media simulata di a
def shuffled_diffs(a, b, shuffles, rng):
    pooled = np.concatenate([a, b])
    diffs = []
    for i in range(shuffles):
        shuffled = rng.permutation(pooled)
        diffs.append(shuffled[len(a):].mean() - shuffled[:len(a)].mean())
    return np.array(diffs)


beds = pd.read_csv("strawberries.csv")
morning = beds[beds["watering"] == "morning"]
evening = beds[beds["watering"] == "evening"]
columns = ["berries", "weight_g", "sweetness_brix", "leaf_spots"]
level = float(input())
# Non modificare le righe qui sotto
rng = np.random.default_rng(21)
shuffles = 1000

# Scrivi il tuo codice qui sotto
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Statistica per il machine learning

Esercitati da solo: Compilatore Python online