Misure di Tendenza Centrale: Media, Mediana e Moda

Potrebbe interessarti:

Il progetto Python, che comprende gli script mostrati in questo post, e quelli relativi alla creazione dei grafici Matplotlib, è disponibile assieme al corso Fondamenti di Statistica per il ML.

Dimmi di Più

La tendenza centrale rappresenta il “centro di gravità” di una distribuzione, ovvero il valore verso il quale i punti di dati tendono a convergere. Le tre misure principali sono la media, la mediana e la moda.

Le misure di tendenza centrale possono essere calcolate sia sulla popolazione, che sul campione. Quando le popolazioni sono piccole, non è necessario ricorrere a campioni, poiché è possibile utilizzare l’intera popolazione per ottenere informazioni.

Le misure ottenute utilizzando tutti i valori dei dati della popolazione sono chiamate parametri.
Le misure ottenute utilizzando i valori dei dati dei campioni sono chiamate statistiche. Ad esempio:

  • la media delle vendite ottenute dall’intera popolazione è un parametro;
  • la media delle vendite ottenute da un campione rappresentativo è una statistica.

Quindi:

  • un parametro è una caratteristica o una misura ottenuta utilizzando tutti i valori dei dati di una popolazione specifica;
  • una statistica è una caratteristica o una misura ottenuta utilizzando i valori dei dati di un campione.

Nella statistica, le lettere greche sono utilizzate per indicare i parametri, mentre quelle romane indicano le statistiche. Si presume che i dati siano ottenuti da campioni, salvo diversamente specificato.

La Media

La media è il tipo più comune di misura do tendenza, ed è data dalla somma dei valori divisa per il numero totale dei valori. Possiamo considerarla come il “punto di equilibrio” dei dati. La media campionaria, indicata con $\bar{X}$ (pronunciata “X bar”), viene calcolata utilizzando dati campionari. La media campionaria è una statistica e viene calcolata come segue:

$$ \bar{X} = \frac{1}{n} \sum_{i=1}^{n} x_i = \frac{1}{n} \left( x_1 + x_2 + \cdots + x_n\right) $$

dove:

  • $n$ rappresenta il numero totale di valori nel campione;
  • $x_i$ è l’i-esimo valore del campione.

La media della popolazione, indicata con $\mu$ (pronunciata “mew”), viene calcolata utilizzando tutti i valori della popolazione. La media della popolazione è un parametro, e viene calcolata come segue:

$$ \mu = \frac{1}{N} \sum_{i=1}^{N} x_i $$

dove $N$ è il numero totale di valori nella popolazione.

La media è il punto centrale in cui tutti i valori su un lato della media hanno lo stesso peso di tutti i valori sull’altro lato della media. Supponiamo di avere un campione di osservazioni: $\{ 2, 3, 4, 11\}$. La media è calcolata come:

$$ \bar{X} = \frac{1}{4} \sum_{i=1}^{4} x_i = \frac{1}{4} \left( 2 + 3 + 4 + 11\right) = 5 $$

Se rappresentiamo i dati su una retta numerica, abbiamo:

Media: bilanciamento dei valori

Il valore 5 è il punto che bilancia tutte le distanze tra i valori del campione (o della popolazione). Se la media venisse spostata a sinistra o a destra, i valori del dataset si sposterebbe in un senso o nell’altro.

In Python, possiamo clacolare la media di un dataset in questo modo:

data = [2, 3, 4, 11]

media = sum(data) / len(data)
print(f"Media: {media}")
# Media: 5.0

# Con Numpy:
# NumPy diventa utile quando dobbiamo lavorare con array numerici,
# e dobbiamo eseguire molte operazioni statistiche e matematiche
import numpy as np
media = np.mean(data)
print(f"Media: {media}")
# Media: 5.0

La media è più efficace con dati distribuiti in modo approssimativamente normale (gaussiano) e con tipi di dati continui (numeri reali). Tuttavia, può “fallire” in presenza di outlier (punteggi estremi) e in distribuzioni bimodali o asimmetriche:

  • un outlier può spostare la media in una direzione o nell’altra, e renderla meno rappresentativa dell’insieme dei punteggi e meno utile come misura della tendenza centrale.

  • Se una distribuzione ha due picchi o è fortemente sbilanciata (skewed), la media può cadere in un punto dove non ci sono dati reali, risultando poco rappresentativa del valore tipico.

Il grafico seguente costruisce due distribuzioni empiriche discrete di frequenza:

  • una simmetrica, con forma approssimativamente a campana;
  • una asimmetrica positiva, con una lunga coda verso destra:
Media: distribuzione simmetrica e asimmetrica

Media della Popolazione VS Media del Campione

La media della popolazione è considerata un valore teorico e fisso perché rappresenta una proprietà intrinseca dell’intero gruppo, che non cambia in base a come decidi di estrarre i dati. Non sempre essa deve essere misurata nel senso pratico del termine. Ad esempio, per il lancio di un dado non truccato a 6 facce, la media della popolazione è nota a priori:

$$\frac{1 + 2 + 3 + 4 + 5 + 6}{6} = 3.5$$

perché deriva dal calcolo di tutti i risultati possibili. È il valore che otterremo idealmente dopo un numero infinito di lanci.

Di contro, la media campionaria è definita empirica1 perché dipende dai dati specifici che abbiamo raccolto, e cambia ogni volta che estraiamo un nuovo gruppo. La media della popolazione è il “bersaglio” fisso che cerchiamo di stimare attraverso le misurazioni empiriche dei campioni.

La Media Pesata

La media pesata (o media ponderata) è una misura di posizione centrale in cui non tutte le osservazioni hanno la stessa importanza: a ciascun valore viene associato un peso che ne indica la rilevanza.

In una media semplice, tutti i valori contribuiscono allo stesso modo. Nella media pesata, invece, alcuni valori “contano di più” di altri.

La formula generale, valida sia per la popolazione che per il campione, è:

$$ \bar{x}_w = \frac{\sum_{i=1}^{n} w_i x_i}{\sum_{i=1}^{n} w_i} $$

dove:

  • $x_i$ è l’i-esimo valore osservato;
  • $w_i$ è il peso associato all’i-esimo valore osservato;
  • $\sum w_i x_i$ è la somma dei valori pesati;
  • $\sum w_i$ è la somma totale dei pesi.

La media pesata campionaria $\bar{x}_w$ si riferisce a un sottoinsieme della popolazione, mentre la media pesata della popolazione si riferisce all’intera popolazione di interesse. Si indica talvolta con il simbolo $\mu_w$.

Supponiamo di avere un campione di osservazioni: $\{2, 3, 4, 11\}$$, assegnate ai seguenti pesi: $\{1, 1, 1, 5\}$. La media pesata è calcolata come:

$$ \begin{align*} \bar{x} &= \frac{1}{ \sum_{j=1}^{4} w_j } \sum_{i=1}^{4} x_i\\[6pt] &= \frac{1}{1 + 1 + 1 +5} \left( 2 \times 1 + 3 \times 1 + 4 \times 1 + 11 \times 5\right)\\[6pt] &= \frac{64}{8} = 8 \end{align*} $$

In Python:

# dati
data = [2, 3, 4, 11]

# pesi
weights = [1, 1, 1, 5]

# calcolo della media pesata "manuale"
weighted_sum = sum(x * w for x, w in zip(data, weights))
total_weight = sum(weights)
weighted_mean = weighted_sum / total_weight
print(f"Media pesata: {weighted_mean}")
# Media pesata: 8.0

# con Numpy.
# NumPy mette a disposizione np.average(), che permette
# di specificare direttamente i pesi:
import numpy as np
weighted_mean = np.average(data, weights=weights)
print(f"Media pesata: {weighted_mean}")
# Media pesata: 8.0

Rispetto all’esempio precedente della media “semplice”, in questo caso, se rappresentiamo i dati su una retta numerica, vediamo come il peso $5$ assegnato al valore $11$ sposti la media pesata di $3$ unità verso destra:

Media: bilanciamento dei valori nella media pesata

La Media Troncata

La media troncata (o trimmed mean) è una misura di tendenza centrale che si ottiene eliminando una certa percentuale dei valori più piccoli e dei valori più grandi del campione, per poi calcolare la media aritmetica dei dati rimanenti. L’obiettivo è ridurre l’influenza dei valori anomali (outlier), che possono alterare significativamente la media tradizionale.

Se si elimina il $p%$ dei valori in ciascuna coda della distribuzione, si parla di media troncata al $p%$.

La media troncata è particolarmente utile quando il campione contiene valori estremi, oppure si desidera una misura più robusta della media, ma non si vuole usare la mediana in quanto essa risulta troppo “aggressiva”, perché ignora completamente la distanza tra i valori.

La media troncata rappresenta quindi un compromesso tra la media aritmetica, che utilizza tutti i dati ma è sensibile agli outlier, e la mediana, che è molto robusta ma utilizza solo la posizione centrale dei dati.

Supponiamo di avere il seguente insieme di osservazioni:

$$ \{10, 11, 12, 13, 14, 15, 16, 17, 18, 100\} $$

Il valore 100 è chiaramente molto distante dagli altri.
La media aritmetica è calcolata come:

$$ \bar{x} = \frac{10+11+12+13+14+15+16+17+18+100}{10} = 22.6 $$

Come possiamo intuire, la media è fortemente influenzata dall’outlier $100$.

Calcoliamo ora la media troncata al $10%$. Nel dataset di esempio contenente $10$ valori, il $10%$ corrisponde a un valore, che eliminiamo dalla coda sinistra e da quella destra.

Ordiniamo i dati (sono già ordinati) ed eliminiamo il valore più piccolo, $10$, e il valore più grande, $100$. Otteniamo quindi:

$$ \{11, 12, 13, 14, 15, 16, 17, 18\} $$

La media troncata diventa quindi:

$$ \bar{x}_{tr} = \frac{11+12+13+14+15+16+17+18}{8} = 14.5 $$

Questo valore rappresenta molto meglio il centro della distribuzione rispetto alla media tradizionale ($22.6$).

In Python:

# dati
data = [10, 11, 12, 13, 14, 15, 16, 17, 18, 100]

# Calcolo della media troncata "a mano"
# =====================================
# rimozione del 10% dei dati
trim_percentage = 0.10

# ordiniamo i dati
data_sorted = sorted(data)

# calcoliamo il numero di elementi da rimuovere
# dalla coda sinistra e da quella destra. Nel nostro caso:
# k = 10 * 10% = 1
k = int(len(data_sorted) * trim_percentage)

# prendiamo i valori che partono dall'indice k,
# e arrivano all'indice (ultimo elemento - k), escluso
data_trimmed = data_sorted[k:-k]

# calcolo la media troncata
trimmed_mean = sum(data_trimmed) / len(data_trimmed)
print(f"Dataset troncato: {data_trimmed}")
print(f"Media troncata: {trimmed_mean}")
# Dataset troncato: [11, 12, 13, 14, 15, 16, 17, 18]
# Media troncata: 14.5

# Calcolo della media troncata con Scipy
# ======================================
from scipy.stats import trim_mean

# "proportiontocut" indica la percentuale degli elementi
# più positivi e più negativi da eliminare
trimmed_mean = trim_mean(data, proportiontocut=0.10)
print(f"Media troncata: {trimmed_mean}")
# Media troncata: 14.5

Se la percentuale di troncamento aumenta, la media diventa sempre più robusta agli outlier, ma si utilizzano sempre meno dati. Nei casi estremi, una media fortemente troncata tende ad avvicinarsi alla mediana.

La Mediana

La mediana è il valore che divide esattamente a metà un set di dati: il $50%$ dei valori si trova al di sotto di essa, e il $50%$ al di sopra.

Per calcolarla, è necessario prima ordinare i dati dal più piccolo al più grande. Se il numero di dati è dispari, la mediana è il valore centrale. Se è pari, si calcola la media dei due valori centrali. In entrambi i casi, se indichiamo con n il numero di osservazioni, la mediana si trova nella posizione $(n + 1)/2$ nell’elenco ordinato.

Procediamo come segue:

  1. elenchiamo i valori in ordine, dal più alto al più basso o dal più basso al più alto;
  2. troviamo il punteggio centrale. Quello è la mediana.

Ad esempio, se abbiamo i redditi annuali di cinque famiglie diverse (numero dispari, usiamo il carattere “${,}$” come separatore delle migliaia):

$$ \{135{,}456; 45{,}500; 62{,}456; 54{,}365; 37{,}668\} $$

Ordiniamo l’elenco dal valore più più basso al più alto, e consideriamo il valore centrale:

$$ \{37{,}668; 45{,}500; \color{green}{54{,}365}; 62{,}456; 135{,}456\} $$

Il valore mediano è $54{,}365$:

Valore mediano dei redditi

Se il numero di valori è pari, prendiamo i due valori centrali, e calcoliamo la loro media. La mediana dei seguenti redditi:

$$ \{37{,}668; 45{,}500; 54{,}365; 62{,}456; 64{,}500; 135{,}456\} $$

è calcolata come:

$$ \frac{54{,}365 + 62{,}456}{2} = 58{,}410.50 $$
Valore mediano dei redditi (numero pari)

In Python:

# dati di valore di alcuni immobili
data1 = [135456, 45500, 62456, 54365, 37668]
data2 = [37668, 45500, 54365, 62456, 64500, 135456];

# La libreria standard di Python mette a disposizione statistics.median()
from statistics import median
median_value = median(data1)
print(f"Mediana Data1: ${median_value:,.0f}")
print(f"Mediana Data2: ${median(data2):,.2f}")
# Mediana Data1: $54,365
# Mediana Data2: $58,410.50

# Con NumPy possiamo usare np.median():
import numpy as np
median_value = np.median(data1)
print(f"Mediana: ${median_value:,.0f}")
print(f"Mediana Data2: ${np.median(data2):,.2f}")
# Mediana: $54,365
# Mediana Data2: $58,410.50

A differenza della media, la mediana è molto meno sensibile ai valori anomali (outlier) e alle distribuzioni sbilanciate. Questo accade poiché la mediana è il valore centrale dei dati ordinati, e dipende solo dalla posizione, non dalla grandezza dei valori. Quindi, un outlier molto grande o molto piccolo, finché non cambia l’ordine centrale, non sposta la mediana.

Ad esempio, è spesso preferibile alla media per analizzare la distribuzione dei redditi, poiché i redditi estremamente alti non ne influenzano il valore quanto farebbero con la media.

Riassumendo: la mediana è una misura robusta: la presenza di outlier, anche molto estremi, di solito non la modifica sensibilmente, a meno che il dataset sia molto piccolo o gli outlier siano numerosi.

La mediana è indicata soprattutto per distribuzioni unimodali (con un solo picco); se i dati hanno più picchi, la mediana perde di utilità informativa.

La Moda

La moda rappresenta il valore che appare più frequentemente in un insieme di dati. Per calcolare la moda, procediamo come segue:

  1. Elenchiamo tutti i valori di una distribuzione, considerando ciascun valore una sola volta.
  2. Contiamo il numero di volte in cui ciascun valore ricorre.
  3. Il valore che ricorre più spesso è la moda.

Per esempio, nel dataset:

$$\{37, 42, 42, 45, 48, 48, 48, 52, 55\}$$

il valore $48$ compare tre volte, quindi è la moda:

Moda della distribuzione)

In Python, possiamo calcolare la moda in questo modo:

data = [37, 42, 42, 45, 48, 48, 48, 52, 55]

# La libreria standard di Python mette a disposizione statistics.mode():
from statistics import mode
mode_value = mode(data)
print(f"Moda: {mode_value}")
# Moda: 48

# SciPy mette a disposizione scipy.stats.mode():
from scipy.stats import mode
result = mode(data)
mode_value = result.mode
print(f"Moda: {mode_value}")
# Moda: 48

La moda è l’unica misura di tendenza centrale che può avere più valori contemporaneamente (distribuzioni bimodali o multimodali):

  • Un dataset che presenta un solo valore con la frequenza maggiore è detto unimodale.
  • Un dataset che presenta due valori con la stessa frequenza maggiore è detto bimodale. Entrambi i valori sono considerati la moda.
  • Un dataset che presenta più di due valori con la stessa frequenza maggiore è detto multimodale. Ciascun valore è utilizzato come moda.

Nel dataset:

$$\{37, 42, 42, 45, 48, 48, 48, 52, 55, 58, 58, 58\}$$

i valori che hanno la stessa frequenza maggiore moda sono il 48 e il 58:

Valori modali della distribuzione bimodale)

In Python:

# esempio con dataset bimodale: Moda = [48, 58]
data = [37, 42, 42, 45, 48, 48, 48, 52, 55, 58, 58, 58]

# Con Python "standard", in presenza di più mode
# è preferibile utilizzare statistics.multimode(),
# che restituisce tutti i valori con frequenza massima:
from statistics import multimode
mode_values = multimode(data)
print(f"Mode: {mode_values}")
# Mode: [48, 58]

# scipy.stats.mode() invece restituisce una sola moda.
# In caso di più valori con la stessa frequenza massima,
# restituisce il valore più piccolo
# (in questo caso statistics.multimode() è la soluzione più semplice e più appropriata).
from scipy.stats import mode
print(f"Moda: {result.mode}")
# Moda: 48

La moda particolarmente utile per i dati nominali (categorie non numeriche), dove non è possibile calcolare media o mediana. Sebbene possa essere usata per dati numerici, questi devono essere spesso convertiti in dati discreti per rendere la moda significativa.

Per dati continui raggruppati in classi, invece, non si individua generalmente una moda esatta: si parla di classe modale, cioè dell’intervallo corrispondente alla barra più alta dell’istogramma.

Che Misura Scegliere

Una misura resistente è poco influenzata dalla presenza di pochi valori estremi (outlier).

La media è estremamente sensibile ai valori anomali (outlier), poiché considera l’entità di ogni singolo dato, e quindi può essere significativamente alterata da osservazioni molto grandi o molto piccole. Al contrario, la mediana è uno stimatore “robusto” e non viene distorta dagli outlier, poiché divide i dati a metà, indipendentemente dai valori estremi.

Sebbene media e mediana siano entrambe utilizzate per individuare il centro di un insieme di dati, la moda ha un ruolo diverso: rappresenta il valore più frequente, e non necessariamente si colloca in prossimità del centro della distribuzione.

Di conseguenza, media, mediana e moda forniscono generalmente informazioni differenti. Non esiste una regola universale per stabilire quale misura di posizione sia più appropriata: la scelta dipende dalle caratteristiche specifiche dei dati analizzati.

Misura CentraleDescrizione
MediaIdeale per dati con distribuzione normale (a campana).
MedianaIdeale per distribuzioni con un solo picco ma non normali o con forti outlier.
ModaIdeale per dati nominali.

  1. Il termine empirico significa ciò che si basa sull’esperienza concreta, sull’osservazione diretta dei fatti o sulla prova pratica, in contrapposizione a ciò che è puramente teorico, astratto o dedotto solo con il ragionamento. ↩︎

Caricamento
  • Rendering delle formule LaTeX...