Indici statistici: cosa sono e come calcolarli con SQL e Python

indagine statistica

Gli indici statistici sono dei valori risultanti da calcoli matematici che permettono di riassumere con pochi numeri la distribuzione statistica di una particolare serie di dati. L’indice statistico più utilizzato è senza dubbio la media aritmetica, ma non è assolutamente l’unico! In questo articolo vedremo le principali definizioni e, in alcuni casi, anche  l’implementazione con i linguaggi di programmazione SQL e Python.

 

Classificazione degli indici statistici

Per prima cosa possiamo classificare i numerosi indici statistici in due grandi categorie:

  • indici di statistica monovariata che studiano una singola variabile alla volta
  • indici di statistica multivariata che studiano la relazione tra due o più variabili.

In questo articolo ci soffermeremo inizialmente sugli indici monovariati che possono essere ulteriormente classificati in:

  • indici di posizione centrale
  • indici di variabilità
  • indici di forma

 

La Media aritmetica

La media aritmetica è il primo indice di posizione centrale che analizzeremo. Supponiamo di volerla calcolare per i valori

8,7,6 e 9

che rappresentano una serie di voti in una scala da 1 a 10. La media aritmetica è data semplicemente dalla somma di tutti i valori divisa per la numerosità totale. Nel nostro caso ad esempio avremo (8+7+7+9)/4 = 7.75.

La media aritmetica è un indice molto sensibile agli outlier (valori anomali), vale a dire quei valori che sono molto distanti da tutti gli altri e per questo possiamo supporre anomali. Vediamo ad esempio il caso in cui abbiamo un nuovo valore molto diverso dai precedenti, come un 2. La media diventerà  (8+7+7+9+2)/5 = 6,6 subendo cioè una riduzione considerevole del 15% circa.

Quando lavoriamo con grossi moli di dati, la presenza di outlier è molto frequente. A volte si tratta di dati la cui esistenza è legittima e che è giusto tenere in considerazione, altre volte invece potrebbe trattarsi di semplici errori di imputazione o di dati prodotti in circostanze che non ci interessa analizzare (ad esempio un competitor che inserisce una recensione negativa per abbassare la reputazione del rivale).

Concludiamo la sezione riportando il codice per calcolare la media con SQL e la libreria Pandas di Python. Per quanto il calcolo possa sembrare banale, occorre fare molta attenzione perché su alcuni database come Microsoft SQL Server la media di una colonna di valori di tipo INT restituirà sempre un INT. Per questo su SQL Server occorrerà utilizzare la funzione CONVERT e scrivere una query come questa:

SELECT 
  AVG(
   CONVERT(DECIMAL(18,2), Punteggio))
FROM    Voti;

Su un DataFrame di Pandas scriveremo invece

Voti["Punteggio"].mean()

A questo link trovi un nostro articolo di approfondimento su un particolare tipo di media aritmetica: la media ponderata.

 

La Mediana

La mediana è un ulteriore indici di posizione centrale per il cui calcolo occorrono sostanzialmente due passaggi:

  • riscrivere i dati in ordine crescente, ad esempio nel nostro caso passeremo da 8, 7, 7, 9, 2 a 2, 7, 7, 8, 9
  • se i dati sono in numero dispari la mediana è il valore in posizione centrale, se i dati sono in numero pari la mediana è la media aritmetica dei due valori centrali.

Nel caso precedente, ho cinque dati e quindi la mediana sarà uguale a 7, cioè il valore in terza posizione (la centrale). Calcoliamo ora la mediana dei primi quattro valori (senza l’outlier 2): riordino 8, 7, 7, 9 in 7, 7, 8, 9 e la mediana sarà dunque la media tra 7 e 8 (i valori nelle due posizioni centrali). Il valore così ottenuto è 7.5, molto simile al valore precedente.

Questo esempio dimostra come la mediana sia in generale meno sensibile della media agli outlier, per questo in alcuni casi dobbiamo almeno prendere in considerazione il suo utilizzo.

Veniamo ora al calcolo con i linguaggi di programmazione: con Pandas scriveremo semplicemente Voti[“Punteggio”].median()

Alcuni database relazionali (soprattutto le versioni più datate) non hanno una funzione specifica per il calcolo della mediana e occorrerà dunque implementare manualmente l’algoritmo descritto precedentemente. Dall’edizione SQL Server 2012 potremmo calcolare la mediana di una colonna in questo modo un po’ astruso:

SELECT DISTINCT 
 PERCENTILE_CONT(0.5) 
  WITHIN GROUP(
  ORDER BY Punteggio) OVER()
FROM    Voti;

In questo articolo trovate un approfondimento sul calcolo della mediana su SQL Server https://sqlperformance.com/2012/08/t-sql-queries/median.

 

Moda

La moda è il valore che ricorre più frequentemente all’interno di una distribuzione. Ad esempio, nel caso precedente la moda dei valori 8, 7, 7, 9, 2 è 7 perché è il valore che ricorre il maggior numero di volte. Su Pandas la sintassi è praticamente identica agli altri casi

Voti["Punteggio"].mode()

Su SQL Server invece dobbiamo ricorrere ad una window function o alle subquery:

WITH CTE AS
 (SELECT Punteggio,
   RANK() OVER(
   ORDER BY COUNT(*) 
   DESC) AS Frequenza
 FROM Voti
 GROUP BY Punteggio)
SELECT Punteggio
FROM   CTE
WHERE Frequenza = 1;

 

Differenza interquartile

La differenza interquartile è il primo indice di variabilità che consideriamo. In una serie di n valori è la differenza tra il terzo quartile e il primo quartile. Non ci sono regole universali per calcolare il primo quartile e il terzo quartile. Molto spesso si utilizza questo criterio:

  • il primo quartile è il valore che, una volta ordinati i dati, è alla posizione (n+1)/4.
  • il terzo quartile è il valore che, una volta ordinati i dati, è alla posizione 3*(n+1)/4;

Se le posizione calcolate non sono numeri interi si procede calcolando la media pesata tra i due valori a sinistra e a destra della posizione trovata. Se ad esempio (n+1)/4 = 1.25, calcolerò la media pesata tra il primo e il secondo valore con i pesi 0,75 e 0,25.

Su Pandas ad esempio le posizioni sono individuate con la formula (n-1)/4 + 1 e 3*(n-1)/4 + 1 tramite il metodo quantile (https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.quantile.html)

Voti["Punteggio"].quantile(0.75) - Voti["Punteggio"].quantile(0.25)

Su SQL Server potrò analogamente scrivere la query

SELECT DISTINCT 
PERCENTILE_CONT(0.75) 
WITHIN GROUP (ORDER BY Punteggio) 
OVER()
 - 
PERCENTILE_CONT(0.25) 
WITHIN GROUP(ORDER BY Punteggio) 
OVER()
FROM    Voti;

 

Altri indici di variabilità e di forma

Sono presenti altri indici di variabilità a cui ho dedicato degli articoli appositi:

Per gli indici di forma ti riporto un link esterno con una descrizione molto dettagliata https://e-l.unifi.it/pluginfile.php/832942/mod_resource/content/5/Statistica2019_cap06.pdf

 

Indici statistici per l’analisi multivariata

Fino ad ora ci siamo concentrati sullo studio di una singola variabile. Tuttavia uno dei grandi obiettivi delle tecniche statistiche e dell’analisi dei dati è misurare il grado di associazione tra più di una variabile. Questa tipologia di analisi è più complicata e spesso richiede anche tecniche di statistica inferenziale per poter generalizzare i risultati ottenuti. Comunque anche in questi casi esistono degli indici statistici che fanno da supporto all’analisi:

Scroll to Top
Torna su