Indici statistici: descrizione e implementazione in pandas
Tags: statistica, python, pandas
Published: 2023-11-01 18:45:43

Nel campo della statistica, gli indici sono valori numerici fondamentali che forniscono un riassunto efficiente di grandi quantità di dati. Questo articolo esplorerà due categorie chiave di indici, quelli univariati e multivariati, parlando anche della relativa implementazione con la libreria Pandas di Python.


## Indici di statistica univariati con Pandas

Gli indici univariati consentono un'analisi approfondita di una singola variabile all'interno di un insieme di dati. Partiamo allora creando un _DataFrame _con una sola colonna _Voti _

```
import pandas as pd
Voti = pd.DataFrame(data=[25,23,28,25,24,29,25],columns = ["Voto"] )
Voti
```

![dataframe d'esempio per calcolo degli indici statistici](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/okqz5ie3f1ane6xwkocs.png)

Tramite il metodo **describe** otteniamo con una sola riga di codice il valore dei principali indici statistici di posizione e di variabilità. Facciamo attenzione però al valori di **std** che corrisponde alla stima della deviazione standard della popolazione da cui è estratto il campione (al denominatore della formula ho n-1).

`Voti.describe()`

![output del metodo describe di pandas](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1klriaia1bbfkjyx4thr.jpg)

Per calcolare gli **indici di forma** possiamo creare prima una colonna con i valori standardizzati e poi applicare le formule degli indici di Fisher e di curtosi.

```
Voti["Voto_StandardScaler"] = (Voti["Voto"]-media)/deviazione_standard
AsimmetriaFisher = Voti["Voto_StandardScaler"].pow(3).mean()
Curtosi = Voti["Voto_StandardScaler"].pow(4).mean() - 3
```

## Indici di statistica bivariati con Pandas
Gli indici multivariati sono utilizzati per descrivere le relazioni tra due o più variabili in un insieme di dati. In base alla [classificazione delle variabili statistiche](https://www.yimp.it/scala-di-misura-variabile-statistica/) è possibile calcolare l'associazione per tutte le combinazioni possibili:

- due variabili qualitative: si utilizzano comunemente **l'indice Chi quadrato** e la sua versione normalizzata, la **V di Cramer **

- una variabile qualitativa e una quantitativa per i quale usiamo generalmente l'indice **eta quadro**

- due variabili quantitative di cui il **coefficiente di correlazione di Pearson** e **quello di Spearman** sono due esempi 

Nel prossimo paragrafo ci concentreremo sugli indici relativi alle variabili qualitative

## Indice Chi Quadrato e indice V di Cramer con Pandas
Vediamo il codice per calcolare gli indici Chi Quadrato e V di Cramer con Pandas. Partiamo da un Dataframe con due colonne che contengono dati di tipo qualitativo, contenenti ad esempio il _colore degli occhi_ e _l'area geografica_, di nome _DatiCramer_.

Partiamo calcolando le frequenze osservate
`FreqOsservate = DatiCramer.groupby(by = ["Occhi","Area geografica"],
dropna = False,
as_index = False).agg(conteggio = ("Occhi", np.size))`

Eseguiamo il pivot dei dati

```
FreqOsservatePivot = FreqOsservate.pivot(columns = "Area geografica",
index = "Occhi", ).fillna(0)
```
Creiamo la tabella di contingenza con l'ausilio della libreria scipy

```
import scipy.stats as stats
stats.chi2_contingency(FreqOsservatePivot, correction=False)
```
A questo punto possiamo calcolare l'indice chi-quadrato

```
indice_chi_quadrato = stats.chi2_contingency(FreqOsservatePivot,
correction=False)[0]
```
e l'indice V di Cramer

```
n = len(DatiCramer)
k = len(DatiCramer["Occhi"].unique())
r = len(DatiCramer["Area geografica"].unique())
indice_v_cramer = pow(indice_chi_quadrato / (n*max(k-1,r-1)),0.5)
indice_v_cramer
```

## Indice di correlazione di Pearson e di Spearman con Pandas
Il calcolo degli indici di associazione tra due variabili quantitative è molto più immediato. Pandas infatti ci mette a disposizione il metodo **corr** utilizzabile per calcolare le correlazioni tra tutte le coppie di variabili numeriche. Se non specifichiamo il parametro method, verrà calcolare l'indice di correlazione lineare di Pearson

```
Dati.corr()
```

![calcolo del coefficiente di Pearson tramite pandas](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gd5o9pj49965s5npr9gy.jpg)

Se invece volessi calcolare il coefficiente di Spearman, mi basterebbe scrivere
```
Dati.corr(method="spearman")
```