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.

 


 

Segnalami un errore, un refuso o un suggerimento per migliorare gli appunti

FacebookTwitterLinkedinLinkedin
knowledge base
  1. Il linguaggio Python
  2. Come installare Python sul PC
  3. Come scrivere un programma in Python
  4. Come usare Python in modalità interattiva
  5. Le variabili
  6. I numeri
  7. Gli operatori logici
  8. Le strutture iterative ( o cicli )
  9. Le strutture condizionali
  10. Le eccezioni
  11. I file in python
  12. Le classi
  13. I moduli