Il Test del Chi-Quadro – La Chiave per Analizzare i Tuoi Dati Categoriali
Comprendere le relazioni e le distribuzioni dei dati è fondamentale per prendere decisioni informate.
Tra gli strumenti più potenti e versatili a disposizione c’è il Test del Chi-Quadro (spesso scritto anche Chi-Quadrato). Questo test statistico non parametrico è un vero jolly, utilizzato principalmente per due scopi cruciali:
- Verificare l’Adattamento (Goodness-of-Fit): Ti permette di capire se un set di dati osservati segue una distribuzione teorica specifica. Ad esempio, è il tuo dado davvero equilibrato? O le preferenze dei tuoi clienti si distribuiscono come previsto?
- Analizzare l’Indipendenza: Ti aiuta a scoprire se esiste un’associazione significativa tra due variabili categoriali. C’è un legame tra l’abitudine al fumo e lo sviluppo di una certa malattia? O il genere influenza la preferenza per un determinato prodotto?
Che tu sia uno studente, un ricercatore o un professionista dei dati, padroneggiare il Test del Chi-Quadro è un’abilità indispensabile. In questo tutorial completo, esploreremo a fondo entrambi gli usi, partendo dai concetti base fino ad arrivare a esempi pratici dettagliati e all’implementazione in Python.
1. Concetti Base del Chi-Quadro
1.1 Formula Generale
La statistica del chi-quadro ([math]\chi^2[/math]) si calcola come:
[math]\displaystyle \chi^2 = \sum \frac{(O_i – E_i)^2}{E_i}[/math]
Dove:
- [math]O_i[/math] = Frequenza osservata
- [math]E_i[/math] = Frequenza attesa
Se il valore calcolato supera un certo valore critico (dalla tabella chi-quadro), rifiutiamo l’ipotesi nulla.
1.2 Gradi di Libertà (df)
-
- Goodness-of-fit: [math]\text{df} = k – 1 – p[/math]
Dove:
-
-
- [math]k[/math] = numero di categorie
- [math]p[/math] = parametri stimati
- Test di indipendenza: [math]\text{df} = (r – 1)(c – 1)[/math]
-
Dove:
-
- [math]r[/math] = righe
- [math]c[/math] = colonne
—
2. Test di Adattamento (Goodness-of-Fit)
Verifica se un campione segue una distribuzione teorica (es. uniforme, binomiale, normale).
Esempio: Lancio di un Dado (Uniforme)
Ipotesi:
- [math]H_0[/math]: Il dado è equilibrato (probabilità uniforme).
- [math]H_1[/math]: Il dado è truccato.
Dati osservati (60 lanci):
| Faccia | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| Frequenza | 8 | 12 | 9 | 11 | 10 | 10 |
Frequenze attese: [math]60/6=10[/math] per ogni faccia.
Calcolo del [math]\chi^2[/math]:
[math]\displaystyle
\begin{aligned}
\chi^2 &= \sum \frac{(O_i – E_i)^2}{E_i} \\
&= \frac{(8-10)^2}{10} + \frac{(12-10)^2}{10} + \frac{(9-10)^2}{10} + {} \\
&+ \frac{(11-10)^2}{10} + \frac{(10-10)^2}{10} + \frac{(10-10)^2}{10} = 1.0
\end{aligned}
[/math]
Confronto con [math]\chi^2[/math] critico ([math]\alpha=0.05[/math], [math]\text{df}=5[/math]):
Valore critico [math]\approx 11.07[/math]
Poiché [math]1.0 < 11.07[/math], accettiamo [math]H_0[/math]: il dado è equilibrato.
—
3. Test di Indipendenza
Verifica se due variabili categoriali sono indipendenti.
Esempio: Studio su Fumo e Tumore
Tabella di contingenza osservata:
| Tumore | No Tumore | Totale | |
|---|---|---|---|
| Fumatori | 30 | 70 | 100 |
| Non-fumatori | 10 | 90 | 100 |
| Totale | 40 | 160 | 200 |
Ipotesi:
- [math]H_0[/math]: Fumo e tumore sono indipendenti.
- [math]H_1[/math]: Esiste un’associazione.
Calcolo delle frequenze attese:
[math]\displaystyle E_{ij} = \frac{(\text{Totale riga}) \times (\text{Totale colonna})}{\text{Totale generale}}[/math]
Esempio:
- [math]E_{\text{Fumatori, Tumore}} = \frac{100 \times 40}{200} = 20[/math]
- [math]E_{\text{Non-fumatori, No Tumore}} = \frac{100 \times 160}{200} = 80[/math]
Tabella attesa:
| Tumore | No Tumore | |
|---|---|---|
| Fumatori | 20 | 80 |
| Non-fumatori | 20 | 80 |
Calcolo del [math]\chi^2[/math]:
[math]\displaystyle \chi^2 = \frac{(30-20)^2}{20} + \frac{(70-80)^2}{80} + \frac{(10-20)^2}{20} + \frac{(90-80)^2}{80} = 12.5[/math]
Gradi di libertà:
[math]\text{df} = (2-1)(2-1) = 1[/math]
Valore critico ([math]\alpha=0.05[/math], [math]\text{df}=1[/math]):
[math]3.84[/math]
Poiché [math]12.5 > 3.84[/math], rifiutiamo [math]H_0[/math]: fumo e tumore sono associati.
—
4. Condizioni di Applicabilità
- Dati categoriali (nominali o ordinali).
- Campione sufficientemente grande:
- Tutte le frequenze attese [math]E_i \ge 5[/math].
- Se violato, usare correzione di Yates o test esatto di Fisher.
—
5. Interpretazione e Reporting
- Se [math]\chi^2 \text{ calcolato} > \chi^2 \text{ critico}[/math] → Rifiuto [math]H_0[/math].
- Se [math]p\text{-value} < \alpha[/math] → Rifiuto [math]H_0[/math].
Esempio di report:
“Il test del chi-quadro ha rivelato un’associazione significativa tra fumo e tumore, [math]\chi^2(1) = 12.5[/math], [math]p < 0.05[/math].”
—
6. Implementazione in Python (con scipy)
from scipy.stats import chi2_contingency
# Test di indipendenza
observed = [[30, 70], [10, 90]]
chi2, p, dof, expected = chi2_contingency(observed)
print(f"Chi-quadro: {chi2}, p-value: {p}, Gradi di libertà: {dof}")
—
Conclusione
Il test del chi-quadro è uno strumento essenziale per:
- ✅ Verificare l’adattamento a una distribuzione teorica.
- ✅ Analizzare l’indipendenza tra variabili categoriali.
Ricordare sempre di controllare le condizioni di applicabilità e interpretare correttamente i risultati.
Esercizio 1 (Uniforme – Test di Adattamento)
Testo:
Un dado viene lanciato 60 volte. Si osservano le seguenti frequenze:
| Faccia | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| Frequenza | 8 | 12 | 9 | 11 | 10 | 10 |
Verificare se il dado è equilibrato ([math]\alpha=0.05[/math]).
Soluzione Manuale:
Ipotesi:
- [math]H_0[/math]: Il dado è equilibrato ([math]p_i = \frac{1}{6}[/math]).
- [math]H_1[/math]: Il dado non è equilibrato.
Frequenze attese:
[math]E_i = 60 \times \frac{1}{6} = 10[/math] per ogni faccia.
Calcolo del [math]\chi^2[/math]:
[math]\displaystyle \chi^2 = \sum \frac{(O_i – E_i)^2}{E_i} = \frac{(8-10)^2}{10} + \frac{(12-10)^2}{10} + \frac{(9-10)^2}{10} + \frac{(11-10)^2}{10} + \frac{(10-10)^2}{10} + \frac{(10-10)^2}{10} = 1.0[/math]
Gradi di libertà:
[math]\text{df} = 6 – 1 = 5[/math].
Decisione:
Valore critico ([math]\alpha=0.05[/math], [math]\text{df}=5[/math]) = [math]11.07[/math].
Poiché [math]1.0 < 11.07[/math], non rifiutiamo [math]H_0[/math].
Verifica Python:
from scipy.stats import chisquare
observed = [8, 12, 9, 11, 10, 10]
expected = [10] * 6
chi2, p = chisquare(observed, expected)
print(f"Chi-quadro: {chi2:.2f}, p-value: {p:.4f}") # Output: Chi-quadro: 1.00, p-value: 0.9626
Rilevanza Applicativa:
Questo esercizio, sebbene semplice, modella scenari comuni in settori come il controllo qualità o la sicurezza informatica. Immagina di voler verificare se i numeri generati da un algoritmo per la crittografia sono distribuiti in modo veramente casuale (uniforme), o se un processo produttivo sta producendo difetti in modo imprevedibile su diverse linee (idealmente uniforme). Se i risultati non fossero uniformi, indicherebbe un bias o un malfunzionamento, richiedendo un’indagine approfondita. È la base per assicurare equità e imparzialità in processi che dovrebbero essere casuali.
Esercizio 2 (Binomiale – Test di Adattamento)
Testo:
Un test a 10 domande V/F viene somministrato a 200 studenti. Frequenze osservate:
| Corrette | 0-2 | 3-5 | 6-8 | 9-10 |
|---|---|---|---|---|
| Frequenza | 15 | 50 | 100 | 35 |
Verificare se i dati seguono una Binomiale(10, 0.5) ([math]\alpha=0.05[/math]).
Soluzione Manuale:
Ipotesi:
- [math]H_0[/math]: I dati seguono Binomiale(10, 0.5).
- [math]H_1[/math]: Non seguono la distribuzione.
Probabilità attese:
- [math]P(0 \le X \le 2) = 0.0547[/math]
- [math]P(3 \le X \le 5) = 0.5684[/math]
- [math]P(6 \le X \le 8) = 0.3662[/math]
- [math]P(X \ge 9) = 0.0108[/math]
Frequenze attese:
[math]\displaystyle E_i = 200 \times [0.0547, 0.5684, 0.3662, 0.0108] = [10.94, 113.68, 73.24, 2.16][/math].
Raggruppamento:
[math]E_4 < 5[/math] → Unisci ultime due categorie.
Calcolo [math]\chi^2[/math]:
[math]\displaystyle \chi^2 = \frac{(15 – 10.94)^2}{10.94} + \frac{(50 – 113.68)^2}{113.68} + \frac{(135 – 75.4)^2}{75.4} = 131.18[/math]
[math]\text{df}=2[/math], Valore critico = [math]5.99[/math] → Rifiuto [math]H_0[/math].
Verifica Python:
from scipy.stats import binom
observed = [15, 50, 100, 35]
p0_2 = binom.cdf(2, n=10, p=0.5)
p3_5 = binom.cdf(5, 10, 0.5) - p0_2
p6_8 = binom.cdf(8, 10, 0.5) - binom.cdf(5, 10, 0.5)
p9_10 = 1 - binom.cdf(8, 10, 0.5)
expected = [200*p for p in [p0_2, p3_5, p6_8, p9_10]]
# Raggruppa ultime due categorie
chi2, p = chisquare([15, 50, 135], [expected[0], expected[1], expected[2] + expected[3]])
print(f"Chi-quadro: {chi2:.2f}, p-value: {p:.4e}") # Output: Chi-quadro: 131.18, p-value: 6.6059e-29
Rilevanza Applicativa:
Questo tipo di analisi è fondamentale in educazione, ricerca medica e marketing.
- Educazione: Permette di valutare se le risposte a un test a scelta multipla (con risposte V/F, è un caso particolare di binomiale) si distribuiscono come ci si aspetterebbe da un’ipotesi specifica (es. risposte date a caso con probabilità del 50%).
- Ricerca Medica: Potrebbe essere usato per verificare se la frequenza di successo di un trattamento su pazienti segue una certa probabilità attesa (es. 50% di guarigioni per un farmaco sperimentale).
- Controllo Qualità: Si potrebbe testare se la proporzione di articoli difettosi in un lotto segue la distribuzione binomiale attesa basata su standard passati. Rilevare una deviazione significa che il processo non si comporta come previsto.
Esercizio 3 (Poisson – Test di Adattamento)
Testo:
Numero di chiamate in 100 intervalli:
| Chiamate (X) | 0 | 1 | 2 | 3 | [math]\ge4[/math] |
|---|---|---|---|---|---|
| Frequenza | 10 | 30 | 35 | 15 | 10 |
Verificare se [math]X \sim \text{Poisson}(1.5)[/math] ([math]\alpha=0.05[/math]).
Soluzione Manuale:
Ipotesi:
- [math]H_0[/math]: [math]X \sim \text{Poisson}(1.5)[/math].
- [math]H_1[/math]: Non è Poisson.
Probabilità attese:
- [math]P(X=0) = e^{-1.5} \approx 0.2231[/math]
- [math]P(X=1) = 1.5 \times e^{-1.5} \approx 0.3347[/math]
- [math]P(X=2) = \frac{1.5^2}{2} \times e^{-1.5} \approx 0.2510[/math]
- [math]P(X \ge 3) = 1 – \sum_{k=0}^{2} P(X=k) \approx 0.1912[/math]
Frequenze attese:
[math]\displaystyle E_i = 100 \times [0.2231, 0.3347, 0.2510, 0.1912] = [22.3, 33.5, 25.1, 19.2][/math].
Calcolo [math]\chi^2[/math]:
[math]\displaystyle \chi^2 = \frac{(10 – 22.3)^2}{22.3} + \frac{(30 – 33.5)^2}{33.5} + \frac{(35 – 25.1)^2}{25.1} + \frac{(25 – 19.2)^2}{19.2} = 12.8[/math]
[math]\text{df}=3[/math], Valore critico = [math]7.81[/math] → Rifiuto [math]H_0[/math].
Verifica Python:
from scipy.stats import poisson
lambd = 1.5
probs = [poisson.pmf(k, lambd) for k in [0,1,2]]
probs.append(1 - sum(probs)) # P(X≥3)
expected = [100*p for p in probs]
observed = [10, 30, 35, 25] # Raggruppato X≥3
chi2, p = chisquare(observed, expected)
print(f"Chi-quadro: {chi2:.2f}, p-value: {p:.4f}") # Output: Chi-quadro: 12.80, p-value: 0.0051
Rilevanza Applicativa:
Il test di adattamento alla distribuzione di Poisson è cruciale per la modellazione di eventi rari o la gestione di flussi.
- Gestione Clienti/Traffico: Un’azienda di telecomunicazioni potrebbe voler verificare se il numero di chiamate ricevute in un intervallo di tempo segue una distribuzione di Poisson. Questo è vitale per ottimizzare la pianificazione del personale del call center.
- Epidemiologia: Analizzare la frequenza di una malattia rara in una popolazione.
- Assicurazioni: Modellare il numero di sinistri in un dato periodo per stimare i rischi.
- Analisi del Rischio: Ingegneri o analisti potrebbero testare se il numero di guasti a un macchinario o il numero di incidenti stradali in una certa area si conformano a una distribuzione di Poisson per previsioni e prevenzione.
Esercizio 4 (Indipendenza – 2×2)
Testo:
Un sondaggio su 200 persone:
| Preferisce | Non Preferisce | Totale | |
|---|---|---|---|
| Uomini | 50 | 40 | 90 |
| Donne | 60 | 50 | 110 |
Verificare se genere e preferenza sono indipendenti ([math]\alpha=0.05[/math]).
Soluzione Manuale:
Ipotesi:
- [math]H_0[/math]: Le variabili sono indipendenti.
- [math]H_1[/math]: Sono dipendenti.
Frequenze attese:
- [math]E_{\text{Uomini, Preferisce}} = \frac{90 \times 110}{200} = 49.5[/math]
- [math]E_{\text{Uomini, Non Preferisce}} = \frac{90 \times 90}{200} = 40.5[/math]
- [math]E_{\text{Donne, Preferisce}} = \frac{110 \times 110}{200} = 60.5[/math]
- [math]E_{\text{Donne, Non Preferisce}} = \frac{110 \times 90}{200} = 49.5[/math]
Calcolo [math]\chi^2[/math]:
[math]\displaystyle \chi^2 = \sum \frac{(O_{ij} – E_{ij})^2}{E_{ij}} = \frac{(50-49.5)^2}{49.5} + \frac{(40-40.5)^2}{40.5} + \frac{(60-60.5)^2}{60.5} + \frac{(50-49.5)^2}{49.5} = 0.0204[/math]
[math]\text{df}=1[/math], Valore critico = [math]3.84[/math] → Non rifiuto [math]H_0[/math].
Verifica Python:
from scipy.stats import chi2_contingency
import numpy as np
table = np.array([[50, 40], [60, 50]])
chi2, p, dof, expected = chi2_contingency(table)
print(f"Chi-quadro: {chi2:.4f}, p-value: {p:.4f}") # Output: Chi-quadro: 0.0204, p-value: 0.8866
Rilevanza Applicativa:
Questo è uno degli usi più diffusi del test Chi-quadro, con implicazioni dirette in quasi tutti i campi della ricerca sociale, marketing, medicina e scienze politiche.
- Marketing: Verificare se c’è un’associazione tra il genere e la preferenza per un prodotto, o tra l’età e l’utilizzo di un certo social media.
- Ricerca Sociale: Indagare se il livello di istruzione è indipendente dall’opinione su una questione politica, o se l’area geografica è indipendente dalla partecipazione civica.
- Medicina/Salute Pubblica: Determinare se l’esposizione a un fattore di rischio (es. abitudine alimentare) è associata alla presenza di una malattia (es. diabete).
- Analisi Organizzativa: Valutare se c’è un legame tra il reparto di appartenenza dei dipendenti e la loro soddisfazione lavorativa.
Note Finali:
Dove necessario, le categorie sono state raggruppate per soddisfare [math]E_i \ge 5[/math].





