Come trovare media, mediana e modalità in Python?

Media, mediana e moda sono argomenti fondamentali della statistica. Puoi calcolarli facilmente in Python, con e senza l’uso di librerie esterne.

Queste tre sono le principali misure di tendenza centrale. La tendenza centrale ci consente di conoscere i valori “normali” o “medi” di un set di dati. Se hai appena iniziato con la scienza dei dati, questo è il tutorial giusto per te.

Alla fine di questo tutorial:

  • Comprendere il concetto di media, mediana e moda
  • Essere in grado di creare le proprie funzioni di media, mediana e modalità in Python
  • Usa il modulo delle statistiche di Python per avviare rapidamente l’uso di queste misurazioni

Se desideri una versione scaricabile dei seguenti esercizi, non esitare a dare un’occhiata al Deposito GitHub.

Entriamo nei diversi modi per calcolare media, mediana e moda.

Calcolo della media in Python

Il significare o la media aritmetica è la misura di tendenza centrale più utilizzata.

Ricorda che la tendenza centrale è un valore tipico di un insieme di dati.

Un set di dati è una raccolta di dati, quindi un set di dati in Python può essere una qualsiasi delle seguenti strutture di dati integrate:

  • Liste, tuple e insiemi: una raccolta di oggetti
  • Stringhe: una raccolta di caratteri
  • Dizionario: una raccolta di coppie chiave-valore

Nota: sebbene ci siano altre strutture dati in Python come code o stack, useremo solo quelle integrate.

Possiamo calcolare la media sommando tutti i valori di un set di dati e dividendo il risultato per il numero di valori. Ad esempio, se abbiamo il seguente elenco di numeri:

[1, 2, 3, 4, 5, 6]

La media sarebbe 3,5 perché la somma dell’elenco è 21 e la sua lunghezza è 6. Ventuno diviso sei fa 3,5. È possibile eseguire questo calcolo con il seguente calcolo:

(1 + 2 + 3 + 4 + 5 + 6) / 6 = 21

In questo tutorial, utilizzeremo i giocatori di una squadra di basket come dati di esempio.

Creazione di una funzione media personalizzata

Iniziamo calcolando l’età media (media) dei giocatori di una squadra di basket. Il nome del team sarà “Pythonic Machines”.

pythonic_machine_ages = [19, 22, 34, 26, 32, 30, 24, 24]

def mean(dataset):
    return sum(dataset) / len(dataset)

print(mean(pythonic_machine_ages))

Analizzando questo codice:

  • Il “pythonic_machine_ages” è un elenco con le età dei giocatori di basket
  • Definiamo una funzione mean() che restituisce la somma del set di dati dato divisa per la sua lunghezza
    • La funzione sum() restituisce la somma totale (ironicamente) dei valori di un iterabile, in questo caso una lista. Prova a passare il set di dati come argomento, restituirà 211
    • La funzione len() restituisce la lunghezza di un iterabile, se gli passi il set di dati otterrai 8
  • Passiamo l’età della squadra di basket alla funzione mean() e stampiamo il risultato.

Se controlli l’output, otterrai:

26.375
# Because 211 / 8 = 26.375

Questo output rappresenta l’età media dei giocatori della squadra di basket. Nota come il numero non appare nel set di dati ma descrive precisamente l’età della maggior parte dei giocatori.

Usando mean() dal modulo statistico Python

Il calcolo delle misure di tendenza centrale è un’operazione comune per la maggior parte degli sviluppatori. È perché Le statistiche di Python Il modulo fornisce diverse funzioni per calcolarli, insieme ad altri argomenti statistici di base.

Dal momento che fa parte del Libreria standard Python non sarà necessario installare alcun pacchetto esterno con PIP.

Ecco come si utilizza questo modulo:

from statistics import mean

pythonic_machine_ages = [19, 22, 34, 26, 32, 30, 24, 24]

print(mean(pythonic_machine_ages))

Nel codice sopra, devi solo importare la funzione mean() dal modulo delle statistiche e passargli il set di dati come argomento. Ciò restituirà lo stesso risultato della funzione personalizzata che abbiamo definito nella sezione precedente:

26.375

Ora hai chiarissimo il concetto di media, continuiamo con la misurazione della mediana.

Trovare la mediana in Python

Il mediano è il valore medio di un set di dati ordinato. Viene utilizzato – ancora una volta – per fornire un valore “tipico” di un determinato popolazione.

In programmazione, possiamo definire la mediana come il valore che separa una sequenza in due parti — La metà inferiore e la metà superiore —.

Per calcolare la mediana, per prima cosa dobbiamo ordinare il set di dati. Potremmo farlo con algoritmi di ordinamento o utilizzando la funzione integrata sorted(). Il secondo passaggio consiste nel determinare se la lunghezza del set di dati è pari o dispari. A seconda di ciò, alcuni dei seguenti processi:

  • Dispari: la mediana è il valore medio del set di dati
  • Pari: la mediana è la somma dei due valori medi divisi per due

Continuando con il set di dati della nostra squadra di basket, calcoliamo l’altezza mediana dei giocatori in centimetri:

[181, 187, 196, 196, 198,  203, 207, 211, 215]
# Since the dataset is odd, we select the middle value
median = 198

Come puoi vedere, poiché la lunghezza del set di dati è dispari, possiamo prendere il valore medio come mediana. Tuttavia, cosa accadrebbe se un giocatore si ritirasse?

Dovremmo calcolare la mediana prendendo i due valori centrali del set di dati

[181, 187, 196, 198, 203, 207, 211, 215] 
# We select the two middle values, and divide them by 2
median = (198 + 203) / 2
median = 200.5

Creazione di una funzione mediana personalizzata

Implementiamo il concetto di cui sopra in una funzione Python.

Ricorda i tre passaggi che dobbiamo seguire per ottenere la mediana di un set di dati:

  • Ordina il set di dati: possiamo farlo con la funzione sorted()
  • Determina se è pari o dispari: possiamo farlo ottenendo la lunghezza del set di dati e utilizzando l’operatore modulo (%)
  • Restituisci la mediana in base a ciascun caso:
    • Odd: restituisce il valore medio
    • Pari: restituisce la media dei due valori medi

Ciò comporterebbe la seguente funzione:

pythonic_machines_heights = [181, 187, 196, 196, 198, 203, 207, 211, 215]
after_retirement = [181, 187, 196, 198, 203, 207, 211, 215]

def median(dataset):
    data = sorted(dataset)
    index = len(data) // 2
    
    # If the dataset is odd  
    if len(dataset) % 2 != 0:
        return data[index]
    
    # If the dataset is even
    return (data[index - 1] + data[index]) / 2

Stampa del risultato dei nostri set di dati:

print(median(pythonic_machines_heights))
print(median(after_retirement))

Produzione:

198
200.5

Nota come creiamo una variabile di dati che punta al database ordinato all’inizio della funzione. Sebbene gli elenchi sopra siano ordinati, vogliamo creare una funzione riutilizzabile, ordinando quindi il set di dati ogni volta che viene richiamata la funzione.

L’indice memorizza il valore medio, o il valore medio-alto, del set di dati, utilizzando l’operatore di divisione intero. Ad esempio, se passassimo l’elenco “pythonic_machine_heights”, avrebbe il valore di 4.

Ricorda che in Python gli indici di sequenza iniziano da zero, questo perché siamo in grado di restituire l’indice centrale di una lista, con una divisione intera.

Quindi controlliamo se la lunghezza del set di dati è dispari confrontando il risultato dell’operazione modulo con qualsiasi valore diverso da zero. Se la condizione è vera, restituiamo l’elemento centrale, ad esempio, con l’elenco “pythonic_machine_heights”:

>>> pythonic_machine_heights[4]
# 198

D’altra parte, se il set di dati è pari, restituiamo la somma dei valori medi divisa per due. Si noti che i dati[index -1] ci fornisce il punto medio inferiore del set di dati, mentre data[index] ci fornisce il punto medio superiore.

Usando median() dal modulo statistico Python

In questo modo è molto più semplice perché stiamo usando una funzione già esistente dal modulo delle statistiche.

Personalmente, se c’è qualcosa di già definito per me, lo userei per il principio DRY —Non ripeterti — (in questo caso, non ripetere il codice di altri).

Puoi calcolare la mediana dei set di dati precedenti con il seguente codice:

from statistics import median

pythonic_machines_heights = [181, 187, 196, 196, 198, 203, 207, 211, 215]
after_retirement = [181, 187, 196, 198, 203, 207, 211, 215]

print(median(pythonic_machines_heights))
print(median(after_retirement))

Produzione:

198
200.5

Calcolo della modalità in Python

Il modalità è il valore più frequente nel set di dati. Possiamo pensarlo come il gruppo “popolare” di una scuola, che può rappresentare uno standard per tutti gli studenti.

Un esempio di modalità potrebbe essere la vendita giornaliera di un negozio di tecnologia. La modalità di quel set di dati sarebbe il prodotto più venduto di un giorno specifico.

['laptop', 'desktop', 'smartphone', 'laptop', 'laptop', 'headphones']

Come puoi apprezzare, la modalità del set di dati sopra è “laptop” perché era il valore più frequente nell’elenco.

La cosa interessante della modalità è che il set di dati non deve essere numerico. Ad esempio, possiamo lavorare con le stringhe.

Analizziamo le vendite di un altro giorno:

['mouse', 'camera', 'headphones', 'usb', 'headphones', 'mouse']

Il set di dati sopra ha due modalità: “mouse” e “cuffie” perché entrambe hanno una frequenza di due. Questo significa che è un multimodale insieme di dati.

Cosa succede se non riusciamo a trovare la modalità in un set di dati, come quello qui sotto?

['usb', 'camera', 'smartphone', 'laptop', 'TV']

Questo si chiama a distribuzione uniformein sostanza, significa che non esiste alcuna modalità nel set di dati.

Ora hai una rapida comprensione del concetto di modalità, calcoliamola in Python.

Creazione di una funzione modalità personalizzata

Possiamo pensare alla frequenza di un valore come a una coppia chiave-valore, in altre parole, a un dizionario Python.

Ricapitolando l’analogia con il basket, possiamo utilizzare due set di dati con cui lavorare: i punti per partita e la sponsorizzazione delle scarpe da ginnastica di alcuni giocatori.

Per trovare la modalità prima dobbiamo creare un dizionario di frequenza con ciascuno dei valori presenti nel set di dati, quindi ottenere la frequenza massima e restituire tutti gli elementi con quella frequenza.

Traduciamo questo in codice:

points_per_game = [3, 15, 23, 42, 30, 10, 10, 12]
sponsorship = ['nike', 'adidas', 'nike', 'jordan',
               'jordan', 'rebook', 'under-armour', 'adidas']

def mode(dataset):
    frequency = {}

    for value in dataset:
        frequency[value] = frequency.get(value, 0) + 1

    most_frequent = max(frequency.values())

    modes = [key for key, value in frequency.items()
                      if value == most_frequent]

    return modes

Verificando il risultato passando come argomenti le due liste:

print(mode(points_per_game))
print(mode(sponsorship))

Produzione:

[10]
['nike', 'adidas', 'jordan']

Come puoi vedere, la prima dichiarazione di stampa ci ha fornito una singola modalità, mentre la seconda ha restituito più modalità.

Spiegando più a fondo il codice sopra:

  • Dichiariamo un dizionario di frequenza
  • Iteriamo sul set di dati per creare un file istogramma — il termine statistico per un insieme di contatori (o frequenze) —
    • Se la chiave viene trovata nel dizionario, aggiunge uno al valore
    • Se non viene trovato, creiamo una coppia chiave-valore con valore uno
  • La variabile most_frequent memorizza, ironia della sorte, il valore più grande (non la chiave) del dizionario delle frequenze
  • Restituiamo la variabile modes che consiste di tutte le chiavi nel dizionario di frequenza con la maggior frequenza.

Nota quanto sia importante la denominazione delle variabili per scrivere codice leggibile.

Usando mode() e multimode() dal Python Statistic Module

Ancora una volta il modulo delle statistiche ci fornisce un modo rapido per eseguire operazioni statistiche di base.

Possiamo usare due funzioni: modalità() e multimodale().

from statistics import mode, multimode

points_per_game = [3, 15, 23, 42, 30, 10, 10, 12]
sponsorship = ['nike', 'adidas', 'nike', 'jordan',
               'jordan', 'rebook', 'under-armour', 'adidas']

Il codice sopra importa entrambe le funzioni e definisce i set di dati con cui abbiamo lavorato.

Ecco la piccola differenza: la funzione mode() restituisce la prima modalità che incontra, mentre multimode() restituisce un elenco con i valori più frequenti nel set di dati.

Di conseguenza, possiamo dire che la funzione personalizzata che abbiamo definito è in realtà una funzione multimode().

print(mode(points_per_game))
print(mode(sponsorship))

Produzione:

10
nike

Nota: in Python 3.8 o versioni successive la funzione mode() restituisce la prima modalità trovata. Se hai una versione precedente otterrai un file StatisticheErrore.

Usando la funzione multimode():

print(multimode(points_per_game))
print(multimode(sponsorship))

Produzione:

[10]
['nike', 'adidas', 'jordan']

Per riassumere

Congratulazioni! Se hai seguito fino a qui, hai imparato a calcolare la media, la mediana e la moda, le principali misure di tendenza centrale.

Sebbene sia possibile definire le proprie funzioni personalizzate per trovare media, mediana e moda, si consiglia di utilizzare il modulo delle statistiche, poiché fa parte della libreria standard e non è necessario installare nulla per iniziare a utilizzarlo.

Successivamente, leggi un’introduzione amichevole all’analisi dei dati in Python.