Indici statistici: quali scegliere 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. Facciamo un esempio: troviamo due corsi di formazione online sullo stesso argomento e per scegliere quale acquistare ci affidiamo alle rispettive recensioni, indicate con un voto da 1 a 10. Abbiamo due strategie per decidere quale sia il prodotto migliore:

  • leggere una per una tutte le recensioni;
  • ricorrere agli indici statistici.

La prima strategia può risultare molto lunga, per questo è normale affidarsi agli indici. Nonostante ne abbiamo a disposizione un ampio ventaglio, la maggior parte di noi ne utilizza sempre e comunque soltanto uno: la media aritmetica. Ciò dà luogo ad una visione spesso distorta e semplicistica dell’analisi dei dati, lo scopo di questo articolo sarà dunque quello di presentare i principali indici statistici e implementarne il calcolo sui due principali linguaggi di programmazione utilizzati dai Data Analyst: SQL e Python.

 

Indici di posizione centrale

In questa sezione studiamo uno a uno i principali indici di posizione centrale. Il loro scopo è quello di fornire un ordine di grandezza dei dati, darci un’idea di quelli che sono i valori che possiamo trovare all’interno della serie. Inizieremo da quello che è sicuramente l’indice centrale più famoso: la media aritmetica. Vedremo però come in alcuni casi sarà opportuno valutare indici diversi.

Media aritmetica

Non ci soffermeremo troppo a lungo sul calcolo della media aritmetica. Supponiamo che il nostro corso abbia ricevuto i voti 8,7,6 e 9: 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 venga assegnato un nuovo voto completamente diverso dai precedenti, come un 2. In questa distribuzione il 2 è sicuramente un outlier perché è un valore molto distante dai restanti. 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). Vedremo che in questi casi la mediana è un indice più affidabile.

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), Voti))
FROM    Recensioni;

Su un DataFrame di Pandas scriveremo invece

Recensioni["Voti"].mean()

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

 

Mediana

Per calcolare la mediana occorrono 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 Recensioni[“Voti”].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 Valore) OVER()
FROM    Recensioni;

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

Recensioni["Voti"].mode()

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

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

 

Indici di variabilità

Per descrivere statisticamente una serie di dati è fondamentale affiancare ad un indice di posizione centrale anche un indice di variabilità. Essi infatti ci forniscono informazioni fondamentali su quanto i dati possono variare attorno all’indice di posizione centrale. A questo link trovi un articolo in cui ho parlato approfonditamente della deviazione standard e di quanto sia importante affiancare il suo calcolo a quello della media. Ora invece voglio parlarvi della differenza interquartile: un altro indice per cui il calcolo della variabilità è meno sensibile agli outlier rispetto alla deviazione standard.

Differenza interquartile

La differenza interquartile di una serie di n valori è la differenza tra il terzo quartile e il primo quartile, dove:

  • il terzo quartile è il valore che, una volta ordinati i dati, è alla posizione 3*(n+1)/4;
  • il primo quartile è il valore che, una volta ordinati i dati, è alla posizione (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,25 e 0,75.

Per calcolare la differenza interquartile su Pandas scriverò

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

Su SQL Server invece

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

 

Continua a imparare

Torna su