Test t di Student con Python: Guida Pratica all’Analisi Statistica Aziendale

Cerca:

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors
come automatizzare il test t di Student con Python

Smettere di usare le tavole statistiche in fondo ai libri di testo è il primo passo per non impazzire quando i dati iniziano a pesare. Se hai passato ore a calcolare gradi di libertà a mano, sai quanto sia facile commettere un errore di distrazione. Ma il vero problema sorge quando passi dai 10 numeri dell’esercizio in aula ai 10.000 righe di un database aziendale: lì la calcolatrice non serve più, serve un processo.

Automatizzare il Test t di Student con Python è la scelta migliore quando passi da semplici esercizi a dataset aziendali con centinaia o migliaia di righe.

La libreria standard di riferimento è scipy.stats, che gestisce tutta la complessità dei calcoli e dei p-value in poche righe di codice.

Ecco come tradurre i gli esercizi visti precedentemente ( Esercizio1 ) in script Python pronti all’uso.

Pubblicità

1. Preparazione dell’ambiente

Per prima cosa, assicurati di avere installato le librerie necessarie:

pip install scipy pandas numpy

2. Automazione del Test t a un campione (Esercizio 1)

Invece di calcolare manualmente il valore t e confrontarlo con le tavole, Python ti restituisce direttamente il p-value. Se il p-value è minore del tuo α (es. 0.05), allora il risultato è significativo.

import numpy as np
from scipy import stats

# Simuliamo i dati o carichiamoli da un CSV
# In questo caso usiamo i parametri dell'esercizio 1
media_attesa = 35
n = 20
media_campione = 32.5
std_campione = 6.8

# Generiamo dati sintetici che riflettono i parametri dell'esercizio
# (In un caso reale, qui caricheresti la colonna del tuo dataset)
dati_farmaco = np.random.normal(media_campione, std_campione, n)

# Esecuzione del Test t (Bilaterale)
t_stat, p_value = stats.ttest_1samp(dati_farmaco, media_attesa)

print(f"Statistica t: {t_stat:.4f}")
print(f"P-value: {p_value:.4f}")

if p_value < 0.05:
    print("Risultato significativo: Rifiutiamo H0")
else:
    print("Risultato NON significativo: Accettiamo H0")

 

Statistica t: -2.4420
P-value: 0.0246
Risultato significativo: Rifiutiamo H0

 

Teoria vs Pratica: La Sensibilità del Campionamento

C’è un dettaglio molto interessante da notare qui! Hai appena sperimentato la “magia” (e il pericolo) della generazione dei dati casuali rispetto ai dati statistici puri.

Se hai lanciato lo script Python, potresti aver ottenuto un risultato significativo ([math]p < 0.05[/math]), mentre nell’esercizio teorico avevamo accettato [math]H_0[/math].

Perché i risultati sono diversi?

Nell’esercizio teorico abbiamo usato i parametri sintetici (media 32.5, deviazione standard 6.8).

Quando Python genera un array di dati con np.random.normal, crea dei valori specifici che “oscillano” attorno a quella media.

Basta che nel campionamento casuale i dati siano leggermente più compatti o più lontani dalla media attesa (35) perché il test passi da “non significativo” a “significativo”.

Questo accade spesso nella realtà: con campioni piccoli ([math]n=20[/math]), il risultato è estremamente sensibile ai singoli valori estratti.

Riflessione Critica: Questa discrepanza ci insegna che la statistica non è solo calcolo, ma comprensione dell’incertezza. Un [math]p-value[/math] di 0.051 e uno di 0.049 raccontano storie matematicamente diverse, ma fisicamente quasi identiche.

Come rendere lo script Python un vero strumento aziendale

Per non dover generare dati casuali ma analizzare dati veri e ottenere risultati pronti per un report, ecco una versione “professionale” dello script. Questo codice include il Test di Shapiro-Wilk (per verificare se puoi usare il Test t) e il Test di Levene (per decidere se usare la varianza pooled o di Welch).

import pandas as pd
from scipy import stats

def analizza_performance_metodi(file_path, colonna_gruppo, colonna_valore):
    # 1. Caricamento dati
    df = pd.read_csv(file_path)
    
    gruppi = df[colonna_gruppo].unique()
    g1 = df[df[colonna_gruppo] == gruppi[0]][colonna_valore]
    g2 = df[df[colonna_gruppo] == gruppi[1]][colonna_valore]
    
    # 2. Verifica Normalità (Shapiro-Wilk)
    # Se p > 0.05, i dati sono distribuiti normalmente
    norm_g1 = stats.shapiro(g1).pvalue
    norm_g2 = stats.shapiro(g2).pvalue
    
    # 3. Verifica Omogeneità Varianze (Levene)
    # Se p > 0.05, le varianze sono uguali (usiamo Pooled)
    levene_p = stats.levene(g1, g2).pvalue
    usa_pooled = levene_p > 0.05
    
    # 4. Esecuzione Test t
    t_stat, p_val = stats.ttest_ind(g1, g2, equal_var=usa_pooled)
    
    # Report Risultati
    print(f"--- Report Analisi: {gruppi[0]} vs {gruppi[1]} ---")
    print(f"Normalità p-values: {norm_g1:.4f}, {norm_g2:.4f}")
    print(f"Varianze Uguali? {'Sì' if usa_pooled else 'No'} (p={levene_p:.4f})")
    print(f"RISULTATO TEST T: p-value = {p_val:.4f}")
    
    if p_val < 0.05: print(">> Esiste una differenza statisticamente significativa.")
    else:
        print(">> La differenza NON è significativa (rumore statistico).")

# Esempio di utilizzo:
analizza_performance_metodi('dati_produzione.csv', 'Metodo', 'Secondi')
--- Report Analisi: Metodo A vs Metodo B ---
Normalità p-values: 0.0660, 0.7687
Varianze Uguali? Sì (p=0.5239)
RISULTATO TEST T: p-value = 0.0001
>> Esiste una differenza statisticamente significativa.

Cosa abbiamo aggiunto?

  1. Test di Shapiro-Wilk: Se i tuoi dati aziendali non sono “normali” (ad esempio sono molto sbilanciati), il Test t potrebbe mentirti. In quel caso Python ti avvisa che dovresti usare un test non parametrico (come il Mann-Whitney U).

  2. Scelta Automatica (equal_var): Lo script decide da solo se usare la formula dell’Esercizio 3 (Pooled) o quella di Welch, basandosi sul test di Levene.

Forse potrebbe interessarti anche:  False Completeness: Perché non devi fidarti dell'analisi file delle IA (e il codice per fixarlo)

Simulazione del file di input

Per testare lo script di analisi che abbiamo visto, è fondamentale avere un file CSV che simuli uno scenario reale. Se i dati sono troppo “perfetti”, il test t darà sempre risultati scontati; se sono troppo sparsi, non vedrai mai una differenza significativa.

Ecco uno snippet Python per generare un file dati_produzione.csv realistico.

Utilizzeremo numpy per creare due distribuzioni diverse per il Metodo A e il Metodo B.

import pandas as pd
import numpy as np

# Impostiamo un "seed" per rendere i risultati riproducibili
np.random.seed(42)

# Configurazione del dataset
n_A = 12
n_B = 10

# Metodo A: Media 45.2, Deviazione Standard 4.1
dati_A = np.random.normal(loc=45.2, scale=4.1, size=n_A)

# Metodo B: Media 41.5, Deviazione Standard 3.8
dati_B = np.random.normal(loc=41.5, scale=3.8, size=n_B)

# Creazione del DataFrame
df = pd.DataFrame({
    'Metodo': ['Metodo A'] * n_A + ['Metodo B'] * n_B,
    'Secondi': np.concatenate([dati_A, dati_B])
})

# Salvataggio in CSV
df.to_csv('dati_produzione.csv', index=False)

print("File 'dati_produzione.csv' creato con successo!")
print(df.head())

Come abbiamo simulato il CSV dati_produzione.csv :

  1. Varianza Controllata: Abbiamo impostato scale (deviazione standard) in modo che i gruppi siano simili ma non identici, perfetto per testare il Test di Levene (uguaglianza delle varianze).

  2. Verifica della Normalità: Poiché usiamo np.random.normal, il Test di Shapiro-Wilk dovrebbe confermare che i dati sono gaussiani, autorizzandoti a usare il Test t.

  3. Etichette Categoriche: Il file è strutturato come un vero database aziendale, con una colonna qualitativa (Metodo) e una quantitativa (Secondi).

Il tocco finale: Visualizzazione per il Management

In azienda, un p-value da solo raramente convince un direttore.

Hanno bisogno di “vedere” la differenza.

Ecco come generare un Boxplot che mostri la distribuzione dei due metodi usando seaborn.

import seaborn as sns
import matplotlib.pyplot as plt

# Carichiamo i dati appena creati
df = pd.read_csv('dati_produzione.csv')

plt.figure(figsize=(8, 6))
sns.boxplot(x='Metodo', y='Secondi', data=df, palette='Set2')
sns.stripplot(x='Metodo', y='Secondi', data=df, color='black', alpha=0.5) # Aggiunge i punti reali

plt.title('Confronto Tempi di Assemblaggio: Metodo A vs Metodo B')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()

Confronto tra tempi di assemblaggio

Interpretazione Grafica dei Risultati

1. Analisi Visiva della Distribuzione (Box Plot)

Il box plot ci offre una fotografia immediata della struttura dei dati:

  • Differenza delle Mediane: La linea nera all’interno dei box (le mediane) mostra chiaramente che il Metodo B è più veloce. La mediana del Metodo B si colloca sotto i 40 secondi, mentre quella del Metodo A è sopra i 45 secondi.
  • Dispersione (IQR): Il “corpo” del box (l’intervallo interquartile) del Metodo A sembra leggermente più compatto rispetto al Metodo B, ma entrambi mostrano una variabilità simile, il che giustifica visivamente l’assunzione di varianze uguali (omoschedasticità) fatta nel calcolo manuale.
  • Intervallo Totale (Whiskers): I baffi del grafico indicano che il Metodo B ha una “coda” inferiore molto interessante (alcuni operai scendono verso i 34-35 secondi), mentre il Metodo A non scende mai sotto i 43 secondi circa.

2. Il valore aggiunto dello “Stripplot” (i punti grigi)

L’aver sovrapposto i singoli punti dati ai box è una scelta eccellente:

  • Numerosità Reale: Si percepisce a occhio che stiamo parlando di un campione piccolo ([math]n_A=12[/math] e [math]n_B=10[/math]). Questa onestà visiva è fondamentale per non sovrainterpretare i dati.
  • Assenza di Outlier estremi: Non vediamo punti isolati molto lontani dai baffi. Questo suggerisce che i dati seguono bene una distribuzione normale, confermando che il Test t di Student è lo strumento corretto da utilizzare.

3. Commento Strategico (Interpretazione Aziendale)

Se dovessi presentare questo grafico a un responsabile di produzione, ecco i punti chiave:

“Il Metodo B non è solo più veloce sulla carta, è più efficiente nella pratica.”

  • Vantaggio Competitivo: Il box arancione (Metodo B) è quasi interamente al di sotto del box verde (Metodo A). Questo significa che il “peggior” 50% degli operai del Metodo B performa comunque meglio della maggior parte degli operai del Metodo A.
  • Affidabilità della decisione: Poiché non c’è una sovrapposizione significativa tra i due box (i quartili centrali non si toccano), il rischio che la differenza sia dovuta al caso è minimo.
  • Potenziale di ottimizzazione: Il Metodo B mostra una punta di eccellenza (i punti più in basso) che suggerisce che, con ulteriore addestramento, i tempi potrebbero scendere ulteriormente.
Forse potrebbe interessarti anche:  Personalizzazione Dinamica Avanzata con Python: Scelta Ottimale dei Cluster (Metodo del Gomito e Analisi della Silhouette) e Dati Google Analytics

Il grafico conferma che la differenza è statisticamente significativa.

Per chiudere il cerchio, potremmo calcolare l’Effect Size (d di Cohen).

Mentre il p-value ci dice se c’è una differenza, il d di Cohen ci dice quanto è grande l’impatto reale. In questo caso, data la separazione netta dei box, mi aspetto un effetto “Large” (> 0.8).

Calcolare l’Effect Size (Dimensione dell’Effetto) è il passo finale per trasformare un’analisi statistica in una decisione di business consapevole.

Mentre il p-value risponde alla domanda “La differenza è dovuta al caso?”, il d di Cohen risponde a “Quanto è grande questa differenza nel mondo reale?”.

Perché calcolare il d di Cohen?

In azienda, potresti avere un risultato statisticamente significativo (p-value < 0.05) semplicemente perché il campione è enorme, ma la differenza pratica potrebbe essere irrilevante (es. risparmiare 0.1 secondi su un processo di un’ora). Il d di Cohen ci aiuta a pesare questa differenza.

Codice Python per il d di Cohen

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

def calcola_statistiche_produzione(file_csv, colonna_gruppo, colonna_valore):
    # 1. Caricamento del file CSV
    try:
        df = pd.read_csv(file_csv)
    except FileNotFoundError:
        print("Errore: File non trovato. Verifica il percorso.")
        return

    # 2. Separazione dei gruppi 
    nomi_gruppi = df[colonna_gruppo].unique()
    if len(nomi_gruppi) < 2:
        print("Errore: Sono necessari almeno due gruppi diversi.")
        return
    
    g1 = df[df[colonna_gruppo] == nomi_gruppi[0]][colonna_valore]
    g2 = df[df[colonna_gruppo] == nomi_gruppi[1]][colonna_valore]

    # 3. Funzione per il d di Cohen
    def cohen_d(x, y):
        nx, ny = len(x), len(y)
        dof = nx + ny - 2
        pool_std = np.sqrt(((nx - 1) * np.std(x, ddof=1)**2 + (ny - 1) * np.std(y, ddof=1)**2) / dof)
        return (np.mean(x) - np.mean(y)) / pool_std

    # 4. Calcolo delle metriche
    d_value = cohen_d(g1, g2)
    t_stat, p_val = stats.ttest_ind(g1, g2, equal_var=True)
    
    # Calcolo Intervallo di Confidenza (95%) per la differenza tra medie
    diff = np.mean(g1) - np.mean(g2)
    se = np.sqrt(np.std(g1, ddof=1)**2/len(g1) + np.std(g2, ddof=1)**2/len(g2))
    ci_low, ci_high = stats.t.interval(0.95, len(g1)+len(g2)-2, loc=diff, scale=se)

    # 5. Output formattato
    print(f"--- ANALISI PRODUZIONE: {file_csv} ---")
    print(f"Gruppi: {nomi_gruppi[0]} vs {nomi_gruppi[1]}")
    print("-" * 50)
    print(f"Differenza Medie: {diff:.2f} sec")
    print(f"Intervallo di Confidenza (95%): [{ci_low:.2f}, {ci_high:.2f}]")
    print(f"P-value: {p_val:.4f} ({'SIGNIFICATIVO' if p_val < 0.05 else 'NON SIGNIFICATIVO'})") print(f"d di Cohen: {d_value:.4f}") # Interpretazione della magnitudo interpret = "GRANDE" if abs(d_value) >= 0.8 else "Medio" if abs(d_value) >= 0.5 else "Piccolo"
    print(f"Impatto Pratico: {interpret}")
    print("-" * 50)

# ESECUZIONE
calcola_statistiche_produzione('dati_produzione.csv', colonna_gruppo='Metodo', colonna_valore='Secondi')

 

--- ANALISI PRODUZIONE: dati_produzione.csv ---
Gruppi: Metodo A vs Metodo B
--------------------------------------------------
Differenza Medie: 7.09 sec
Intervallo di Confidenza (95%): [3.89, 10.30]
P-value: 0.0001 (SIGNIFICATIVO)
d di Cohen: 2.0275
Impatto Pratico: GRANDE
--------------------------------------------------

Come interpretare il risultato

Secondo le soglie standard di Cohen, possiamo classificare l’impatto del nuovo metodo come segue:

Valore d Magnitudo dell’effetto Significato aziendale
0.2 Piccolo Effetto trascurabile, probabilmente non vale l’investimento.
0.5 Medio Differenza visibile, utile per ottimizzazioni incrementali.
0.8+ Grande Cambiamento radicale. Il nuovo metodo offre un vantaggio competitivo netto.

🏆 Analisi dei Risultati: Un Successo Indiscutibile

I risultati finali sono eccellenti e confermano che l’ottimizzazione del processo è un successo straordinario. Un [math]p\text{-value}[/math] di 0.0001 unito a un [math]d[/math] di Cohen di 2.02 non è solo una vittoria statistica, ma un cambiamento operativo di enorme portata.

1. La Certezza del Dato

  • [math]p\text{-value}[/math] (0.0001): La probabilità che questa differenza di 7 secondi sia dovuta al puro caso è di 1 su 10.000. In azienda, questo significa che il risultato è estremamente solido e replicabile.
  • Intervallo di Confidenza [3.89, 10.30]: Anche nello scenario più pessimistico, il Metodo B garantisce un risparmio di almeno 3.89 secondi per ogni assemblaggio. Nel migliore dei casi, si superano i 10 secondi.
Forse potrebbe interessarti anche:  Python: la libreria Pandas. Un'introduzione alle serie storiche

2. La Magnitudo dell’Impatto

Un [math]d[/math] di Cohen di 2.02 è classificato come un effetto “Massiccio”.

  • In termini di distribuzione, questo valore indica che la performance media del Metodo B è superiore a quella del 97% circa degli operatori che utilizzano il Metodo A.
  • C’è una separazione quasi totale tra i due gruppi: non stiamo solo migliorando un processo, lo stiamo trasformando qualitativamente.

💡 Conclusione Strategica

L’intervallo di confidenza permette al management di fare previsioni di budget realistiche e cautelative. La distanza tra le due distribuzioni è così marcata che l’implementazione del Metodo B non è più un’opzione, ma una necessità competitiva.

L’Approccio Senior

Perché questo specifico workflow è fondamentale per un professionista? Non si tratta solo di calcoli, ma di costruire un’architettura decisionale robusta. Ecco i pilastri che elevano questa analisi.

1. Il “Trappolone” della Normalità

Spesso si applica il Test [math]t[/math] a occhi chiusi. L’inserimento del test di Shapiro-Wilk è la vera peculiarità “senior” di questo esercizio. In azienda, i dati sono spesso sporchi o sbilanciati; ignorare il requisito della normalità porta a conclusioni errate.

2. L’automazione della scelta: Pooled vs Welch

Il codice non si limita a calcolare un valore, ma “ragiona” tramite il test di Levene. Questa è la differenza tra uno studente che applica una formula e un analista che costruisce un algoritmo robusto, capace di decidere autonomamente se le varianze sono omogenee.

3. La Sensibilità del Campionamento

L’esercizio mette in luce un fenomeno fondamentale: con campioni piccoli ([math]n[/math]), la variabilità casuale può ribaltare un risultato. Mostrare che il codice può dare un esito diverso dalla teoria (a causa di np.random.normal) educa l’utente a non trattare il [math]p\text{-value}[/math] come un dogma assoluto, ma come un segnale legato alla qualità del campionamento.

4. Dalla Significatività alla Rilevanza

L’inclusione del [math]d[/math] di Cohen eleva l’esercizio. In un contesto industriale, risparmiare 7 secondi è utile solo se la deviazione standard è contenuta. Il valore di 2.02 indica che il cambiamento è così radicale che le due campane (Metodo A e B) sono quasi completamente separate.

Perché la Triade?

Un’analisi completa deve sempre rispondere a tre domande sequenziali:

Domanda Strumento Matematico Valore per il Business
I dati sono affidabili? Shapiro-Wilk & Levene Riduzione del rischio di falsi positivi.
La differenza è reale? Test [math]t[/math] ([math]p\text{-value}[/math]) Certezza che il miglioramento non sia casuale.
Vale la pena investire? [math]d[/math] di Cohen (Effect Size) Quantificazione del ritorno operativo (ROI).

In sintesi: Questo workflow trasforma un semplice output numerico in una raccomandazione strategica pronta per il Board aziendale.

Articoli consigliati su Test t di Student

Questi articoli sono tutti correlati al tema dei Test t (di Student, t appaiato, t di Welch, ecc.) perché affrontano:

✅ le varianti teoriche del Test t per confrontare medie
✅ esercizi risolti passo-passo e confronti pratici
✅ casi d’uso reali per l’analisi statistica di dati aziendali
✅ esempi di codice Python/Scipy per implementazione reale

👉 Distribuzione t di Student: guida completa con test t bilaterale e unilaterale

👉 Il Test t per dati appaiati

👉 Test t appaiato: guida pratica con esempio, calcoli e codice Python/Scipy

👉 Guida Pratica: Quale Test Statistico Usare? Dalla Teoria al Codice Python

👉 Statistica inferenziale: 8 esercizi progressivi (Z-test, t, p-value e potenza)

👉Test t di Welch: quando usarlo, formula ed esempi pratici

👉 Guida pratica al t-test di Welch: esercizi e soluzioni passo-passo

Pubblicità