Costruire un istogramma con Matplotlib

Una delle maniere migliori per comprendere un certo set di dati consiste nel visualizzarlo. Un istogramma è un tipo di grafico che può aiutarci a capire quanto alcune “classi” di dati siano ricorrenti: esso è infatti costituito da rettangoli adiacenti la cui base rappresenta le varie classi e la cui altezza è determinata dalla loro densità di frequenza. In questo articolo, vedremo come costruire un istogramma utilizzando Matplotlib, una libreria per la raffigurazione dei dati di Python.

Importiamo la libreria

Volendo costruire dei grafici, apprestiamoci ad importare Matplotlib, una libreria aggiuntiva rispetto a quelle per la sola analisi dei dati (come pandas e numpy) che abbiamo coperto in questa sezione.

import matplotlib
import matplotlib.pyplot as pp

Consiglio anche di scrivere la seguente riga di codice per far sì che i grafici siano raffigurati immediatamente, senza dover specificare un comando ogni volta che vogliamo visualizzare il grafico costruito:

%matplotlib inline

Partiamo dal dataframe

Immaginiamo di avere un dataframe costituito da tre colonne contenenti rispettivamente il nome di un account manager, un codice identificativo di un account e il valore di questo account espresso in Euro. Ecco qui le prime 5 righe di questo dataframe:

Immagine 1

Immagine 1

I valori della colonna “Valore Account €” andranno a costituire le classi del nostro istogramma, mentre la frequenza sarà data dal numero di volte che i valori di una certa classe sono ripetuti nel dataframe.

Costruiamo un istogramma semplice

Per costruire un istogramma semplice con Matplotlib non ci resta che scrivere la riga seguente:

df['Valore Account €'].plot(kind='hist')
Immagine 2

Immagine 2

In effetti, qui abbiamo specificato quale colonna del dataframe indicherà le classi del nostro istogramma. Ad una prima occhiata, siamo in grado di capire che la classe più rappresentata è quella degli account con un valore compreso tra 100€ e 200€.

Tuttavia un istogramma semplice è funzionale fino ad un certo punto. Per migliorarne la fruibilità possiamo modificare alcuni parametri.

Aggiungere un tocco di colore

Per scegliere liberamente il colore del nostro grafico dobbiamo semplicemente specificare l’argomento color:

df['Valore Account €'].plot(kind='hist', color='gold')
df['Valore Account €'].plot(kind='hist', color='aquamarine')
df['Valore Account €'].plot(kind='hist', color='indigo')
df['Valore Account €'].plot(kind='hist', color='coral')
df['Valore Account €'].plot(kind='hist', color='teal')
df['Valore Account €'].plot(kind='hist', color='crimson')

Ecco il risultato per ogni riga scritta qui sopra:

gold.png
aquamarine.png
indigo.png
coral.png
teal.png
crimson.png

Scegliere il numero delle classi

Quante classi raffigureremo nel nostro istogramma? Di default, Matplotlib ne genera dieci. Infatti, nel nostro caso ha raggruppato i valori della colonna “Valore Account €” in dieci insiemi. Tuttavia, possiamo cambiare il numero di classi generate specificando l’argomento bins. Ecco qui alcuni esempi:

df['Valore Account €'].plot(kind='hist', color='teal', bins=4)
df['Valore Account €'].plot(kind='hist', color='teal', bins=6)
df['Valore Account €'].plot(kind='hist', color='teal', bins=8)

E adesso diamo un’occhiata ai risultati ottenuti:

4bins.png
6bins.png
8bins.png

Come possiamo osservare, un numero di classi basso contribuisce a visualizzare i dati in maniera generale, sintetica e uniforme. Invece, scegliendo di avere tante classi, si riesce ad andare nel dettaglio, perdendo un po’ la prospettiva globale.

Personalmente, per questo esempio preferisco avere 6 classi e d’ora in poi continueremo a lavorare con questa variante del nostro istogramma.

Aggiungere la trasparenza

A volte può capitare di voler aggiungere delle altre misure al proprio istogramma (come faremo in seguito). In tal caso, ai fini di migliorare la leggibilità del grafico, possiamo specificare un livello di trasparenza con l’argomento alpha. Come al solito, vediamo tre varianti:

df['Valore Account €'].plot(kind='hist', color='teal',
                            bins=6, alpha=0.9)
df['Valore Account €'].plot(kind='hist', color='teal',
                            bins=6, alpha=0.6)
df['Valore Account €'].plot(kind='hist', color='teal',
                            bins=6, alpha=0.3)
alpha09.png
alpha06.png
alpha03.png

Quando il valore di alpha è tendente a 1, allora il colore sarà più opaco. Inversamente, quando alpha tende a zero, il livello di trasparenza aumenta. D’ora in avanti continueremo ad utilizzare il valore 0.6 di alpha per il nostro istogramma.

Visualizzare la media e la mediana

Per una maggiore comprensione dei dati, una buona idea è quella di rendere visibili i valori della media e della mediana del nostro dataframe. Il primo non è altro che la classica media aritmetica, mentre il secondo ci indicherà il valore di account di mezzo in base al numero di account che abbiamo.

Per rendere visibili questi valori, scriviamo queste due righe:

pp.axvline(df['Valore Account €'].mean(), c='navy')
pp.axvline(df['Valore Account €'].median(), c='navy', linestyle='--')

Abbiamo appena raffigurato il valore della media (mean) e della mediana (median) tra quelli della colonna “Valore Account €”. Abbiamo deciso di specificare il colore (in questo caso l’argomento è indicato da c) e, nel caso della mediana, abbiamo anche indicato lo stile che la linea assumerà nel grafico (stile tratteggiato). Invece, nel caso della media, abbiamo lasciato lo stile di default (riga piena). Diamo un’occhiata al risultato:

Immagine 15

Immagine 15

Quindi, ricapitolando: il valore medio degli account è di poco meno di 300€. Per quanto riguarda la mediana, essa ci indica che il 50% di questi account ha un valore inferiore a 200€ e l’altra metà ha un valore compreso tra 200€ e 800€.

Visualizzare i quantili

A dire il vero, visualizzando la mediana nella sezione precedente, abbiamo già fatto sì che il quantile di ordine 1/2 fosse facilmente individuabile sul nostro grafico. Volendo essere più specifici, ipotizziamo di voler rappresentare anche i quantili di ordine 1/4 e 3/4 (tecnicamente chiamati anche quartili). Ci basta scrivere queste due righe:

pp.axvline(df['Valore Account €'].quantile(0.25),c='navy', linestyle=':')
pp.axvline(df['Valore Account €'].quantile(0.75),c='navy', linestyle=':')

In questo caso, abbiamo optato per un stile di linea punteggiata. Ecco come appare il nostro grafico aggiungendo la rappresentazione dei quartili:

Immagine 16

Immagine 16

A seconda dello scopo per cui si decide di costruire un grafico, la visualizzazione dei quartili può fornire delle informazioni diverse. In questo caso, possiamo supporre che sia di interesse sapere che il 25% degli account ha un valore superiore a 400€.

Ovviamente si può modificare l’ordine del quantile da raffigurare in base alle proprie necessità.

Conclusione

Come abbiamo visto, costruire e personalizzare un istogramma con Matplotlib può aiutarci a comprendere i dati del nostro dataframe. Alle volte, una semplice tabella pivot può bastare, altre conviene optare per la rappresentazione grafica dei nostri dati.

Ecco qui il codice completo per ottenere l’istogramma analizzato in questo articolo:

import pandas as pd import numpy as np import matplotlib import matplotlib.pyplot as pp %matplotlib inline df['Valore Account €'].plot(kind = 'hist', color = 'teal', bins = 6, alpha = 0.6) pp.axvline(df['Valore Account €'].mean(), c='navy') pp.axvline(df['Valore Account €'].median(),c='navy', linestyle='--') pp.axvline(df['Valore Account €'].quantile(0.25),c='navy', linestyle=':') pp.axvline(df['Valore Account €'].quantile(0.75),c='navy', linestyle=':')