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

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 faremo un overview generale sulle principali definizioni e, in alcuni casi, anche sull’implementazione con i linguaggi di programmazione SQL e Python. Nelle lezioni successive entreremo più nel dettaglio dei singoli indici.

Classificazione degli indici statistici

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

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

Gli indici univariati possono essere ulteriormente classificati in:

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

Gli indici multivariati si classificano generalmente in base alle tipologie di variabili coinvolte

  • indici per confrontare solo variabili qualitative;
  • indici per confrontare solo variabili quantitative;
  • indici per confrontare variabili qualitative con variabili quantitative.

Indici di posizione centrale

Gli indici di posizione centrale sono particolari indici di statistica univariata che permettono di riassumere l’intera distribuzione dei dati con pochi singoli valori. Non è corretto dire che il valore di questi indici sia “il valore più probabile”, si tratta piuttosto del valore più idoneo rispetto agli altri a riassumere la variabile con un singolo numero.

Media aritmetica

La media aritmetica è sicuramente l’indice di posizione centrale più conosciuto. Può essere calcolata semplicemente sommando tutti i valori della variabile e dividendo il totale ottenuto per il numero di misurazioni. Ad esempio la media aritmetica di questo insieme di cinque valori

8, 7, 2, 9, 7

che rappresentano una serie di voti in una scala da 1 a 10, è 6.6 perché (8 + 7 + 2 + 9 + 7)/5 = 6,6.

Per quanto il calcolo possa sembrare semplice, occorre fare molta attenzione quando utilizziamo il linguaggio SQL 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 articolo di approfondimento su un particolare tipo di media aritmetica: la media ponderata.

Mediana

La media aritmetica non è comunque l’unico indice statistico di posizione esistente. Se ad esempio sono presenti degli outlier, possiamo ottenere un valore migliore utilizzando la mediana, di cui parleremo in dettaglio nell’articolo sui quartili. In breve, occorrono sostanzialmente due passaggi:

  • riscrivere i dati in ordine crescente, ad esempio nel nostro caso passeremo da 8, 7, 2, 9, 7 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 nostro caso la mediana sarà dunque 7, pari al terzo valore tra i dati ordinati.

Per calcolare la mediana con Pandas ci basterà scrivere

Voti["Punteggio"].median()

Mentre su alcuni database relazionali (soprattutto le versioni più datate) non c’è una funzione specifica per il calcolo e occorrerà dunque implementare manualmente l’algoritmo. 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

L’ultimo indice di posizione che andiamo a studiare è la moda, cioè il valore che ricorre più frequentemente all’interno di una distribuzione. Ad esempio, nel caso precedente la moda dei valori 8, 7, 2, 9, 7 sarà 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 a 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;
 

Indici di variabilità

Gli indici di posizione centrale non bastano da soli a descrivere la distribuzione dei dati in una variabile. Per iniziare a fare analisi statistica è fondamentale abbinargli un indice di variabilità, per misurare appunto la tendenza dei dati a variare e ad assumere valori anche molto distanti dagli indici di posizione studiati precedentemente.

Range

Il range è l’indice di variabilità più semplice da calcolare, ma anche quello meno preciso. Ci basterà calcolare la differenza tra il valore massimo e il valore minimo della nostra distribuzione. Nel nostro esempio il massimo è 9, il minimo è 2 quindi il range sarà 9 – 2 = 7.

Possiamo eseguire facilmente il calcolo su Pandas

Voti["Punteggio"].max() - Voti["Punteggio"].min()

e su SQL Server

SELECT MAX(Punteggio)  - MIN(Punteggio)  AS Range
FROM    Voti;

Differenza interquartile

La differenza interquartile (o range interquartile) è un indice di variabilità più sofisticato calcolato eseguendo 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 uno di questi criteri:

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

Su Pandas 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 saranno dedicate delle lezioni apposite

Gli indici di forma principali sono invece due:

  • l’indice di asimmetria di Fisher per misurare appunto quanto sia simmetrica la variabile a sinistra e a destra degli indici di posizione
  • l’indice di curtosi per misurare il grado di “appiattimento” della forma

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 due o più variabili. 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 e che vedremo nelle prossime lezioni:

  • il coefficiente di correlazione lineare di Pearson per il confronto tra due variabili quantitative;
  • il coefficiente di correlazione di Spearman per il confronto tra due variabili quantitative o qualitative ordinabili;
  • il coefficiente chi quadrato per il confronto tra due variabili qualitative;
  • il coefficiente eta quadro per il confronto tra una variabile qualitativa e una quantitativa;
  • più in generale tutte le tecniche legate a calcolare la correlazione tra variabili.

Continua a imparare

Scroll to Top
Torna su