Calcolare il chi-quadro con Scipy in Python
Questo codice calcola le frequenze attese e il chi-quadro di un set di dati utilizzando il linguaggio Python.
Per prima cosa, devo importare le librerie che utilizzerò: scipy e numpy.
import numpy as np
import scipy.stats as stats
La procedura cambia a seconda se devo calcolare il chi-quadro in una tabella di contingenza come test di indipendenza o in un campione rispetto a una distribuzione teorica.
Chi-quadro di indipendenza (tabella di contingenza)
Se ho una tabella di contingenza, il calcolo del chi-quadro avviene dopo aver calcolato le frequenze attese.
In questo esempio salvo i dati osservati in una tabella di contingenza 2x2 utilizzando un array
osservato = np.array([[50, 30], [20, 100]])
La matrice `osservato` rappresenta la tabella di contingenza.
Calcolo le frequenze attese e il valore chi-quadro tramite la funzione chi2_contingency() di scipy.stats
chi2, p_valore, dof, frequenze_attese = stats.chi2_contingency(osservato)
Questa funzione calcola e restituisce:
- `chi2`: il valore del chi-quadro.
- `p_valore`: il p-valore associato.
- `dof`: i gradi di libertà.
- `frequenze_attese`: la matrice delle frequenze attese.
Infine stampo i risultati
print("Frequenze attese:")
print(frequenze_attese)
print("Valore chi-quadro:", chi2)
print("P-valore:", p_valore)
print("Gradi di libertà:", dof)
Ecco l'output
Frequenze attese: [[28. 52.] [42. 78.]]
Valore chi-quadro: 42.33058608058608
P-valore: 7.707766001215446e-11
Gradi di libertà: 1
Chi-quadro di adattamento (un singolo campione)
Quando confronto un singolo campione con una distribuzione teorica, calcolo prima le frequenze attese e poi il chi-quadro.
In questo esempio salvo le frequenze osservate in una lista
osservato = [20, 30, 50]
Poi salvo le probabilità teoriche di ciascuna categoria in un'altra lista.
prob_teoriche = [0.25, 0.25, 0.5]
Sommo e memorizzo il numero dei dati osservati nella variabile N.
N = sum(osservato)
Le frequenze attese sono ottenute moltiplicando le probabilità teoriche per il numero totale di osservazioni.
frequenze_attese = [p * N for p in prob_teoriche]
Calcolo il chi-quadro tramite la funzione stats.chisquare()
chi2, p_valore = stats.chisquare(f_obs=osservato, f_exp=frequenze_attese)
Questa funzione calcola il chi-quadro e il p-valore per confrontare le frequenze osservate con quelle attese.
Infine, stampo i risultati
print("Frequenze attese:", frequenze_attese)
print("Valore chi-quadro:", chi2)
print("P-valore:", p_valore)
Ecco l'output
Frequenze attese: [25.0, 25.0, 50.0]
Valore chi-quadro: 2.0
P-valore: 0.36787944117144245
In entrambi i casi, il calcolo delle frequenze attese e del chi-quadro mi permette di valutare se le differenze tra i dati osservati e quelli attesi sono statisticamente significative.
E così via.