L’istogramma è uno strumento molto utilizzato nelle attività di “Data Analysis” poiché la rappresentazione visiva dei dati permette al nostro cervello di cogliere in modo rapido una quantità enorme di informazioni.

Il primo istogramma della storia apparve nel 1833 nell’opera  “Essai sur la statistique morale de la France“, pubblicato dall’avvocato e statistico André-Michel Guerry.

L’istogramma di Guerry rappresentava il numero di crimini commessi in Francia in rapporto all’età dei criminali.

Nella prima parte di questo articolo seguiremo i passi logici per realizzare un istogramma ricostruendo quello pubblicato da Guerry, mentre nella seconda parte riporterò le righe di codice per realizzarlo su PC con Python, un linguaggio free software molto potente e versatile.

1) Identifichiamo l’evento da rilevare e le possibili variabili d’influenza.

Nel nostro esempio l’evento è un crimine contro la proprietà e le variabili d’influenza scelte da Guerry erano l’età e il sesso.

2) Raggruppiamo i valori rilevati in classi e riportiamoli su una tabella.

Nel nostro caso Guerry raggruppò l’età dei criminali in 14 classi, e il genere secondo le due classi “uomini” e “donne”.

dati_istogramma

Una domanda molto frequente è: con quale criterio suddividere i dati raccolti in classi ?

E’ una domanda a cui non esiste una risposta precisa. Nel caso in esame Guerry scelse 14 classi con ampiezza di circa 5 anni. Ma Guerry avrebbe potuto raggruppare i dati con classi di ampiezza di tre o sette o dieci anni o addirittura una classe per ogni età. E’ chiaro che a seconda dell’ampiezza e del numero delle classi di raggruppamento cambiano la forma dell’istogramma e la chiarezza dell’informazione.

Per individuare il numero delle classi possiamo utilizzare due regole empiriche basate sul numero totale delle osservazioni:

a) il numero delle classi K =  n

b) il numero delle classi K = 1+3,332 * log(n)

dove n è il numero totale delle osservazioni (nel nostro caso n = 1000)

 

3) Realizziamo una barra per ogni classe, la cui altezza ne rappresenta la frequenza (assoluta o relativa).

Di seguito gli istogrammi pubblicati da Michel Guerry in funzione del sesso e delle fasce di età.

istogramma_di_guerry

Il nome istogramma a questo tipo di rappresentazione visiva dei dati fu attribuito dal matematico britannico Karl Pearson nel 1895.

____________________________________________________________________________________________

Riportiamo ora i dati come ragguppati da Guerry nel linguaggio Python:

# Creo un lista con le classi di età che sarà passata come indice del DataFrame.
classi=['<16anni','da16a21','da21a25','da25a30','da30a35','da35a40','da40a45','da45a50','da50a55','da55a60','da60a65',
        'da65a70','da70a80','>80anni'] 
#Creo ora un dizionario con le frequenze dei crimini relativi alle classi elencate nella classe sopra creata
crimini = {'uomini':[19,169,162,182,144,91,76,59,40,23,18,9,7,1],
           'donne' :[14,135,158,185,148,117,84,66,38,22,17,8,8,0]}

#Passiamo ora i dati in un DataFrame Pandas
import pandas as pd
crimini_contro_il_patrimonio = pd.DataFrame(crimini, index = classi, columns =['uomini','donne'])
crimini_contro_il_patrimonio['totale'] =crimini_contro_il_patrimonio['uomini']+crimini_contro_il_patrimonio['donne']

Visualizziamo i dati su di una una bar-char. Si utilizza lo strumento “Bar-Char” e non “Istogramma” poiché i dati forniti nel saggio di Guerry sono già raggruppati in formato tabellare, mentre per utilizzare lo strumento “Istogramma” occorrerebbe avere la lista dei dati grezzi.

import matplotlib.pyplot as plt # Importo la libreria Python per realizzare il grafico
fig =plt.figure(figsize=(18,10)) # Crea la finestra e gli assegna le dimensioni di lunghezza e altezza
ax1 =fig.add_subplot(2,1,1) # Crea il primo sottografico(2,1,1)specifica che vi sono 2 righe , 1 colonna , ed è il 1 grafico
ax2 =fig.add_subplot(2,1,2) # Crea il secondo sottografico(2,1,1)specifica che vi sono 2 righe , 1 colonna , ed è il 2 grafico
larghezza=0.7 # Parametro usato per specificare la larghezza delle barre
bar_char1 = ax1.bar(classi,crimini_contro_il_patrimonio['uomini'].values,larghezza,color='b') #inserisco i dati nel 1^grafico
bar_char2 = ax2.bar(classi,crimini_contro_il_patrimonio['donne'].values,larghezza,color='r') #inserisco i dati nel 2^grafico
ax1.set_title('UOMINI') # Specifico il titolo del 1^grafico
ax2.set_title('DONNE') # Specifico il titolo del 2^grafico
ax1.set_xlabel('Fasce di età') # Specifico l'etichetta dell'asse x del 1^grafico
ax1.set_ylabel('Numero di crimini commessi') # Specifico l'etichetta dell'asse y del 1^grafico
ax2.set_xlabel('Fasce di età') # Specifico l'etichetta dell'asse x del 2^grafico
ax2.set_ylabel('Numero di crimini commessi')  # Specifico l'etichetta dell'asse y del 2^grafico

istogramma_python

Per calcolare il numero di classi in funzione del numero n di osservazioni utilizzando i due metodi empirici sopra citati, è possibile utilizzare le seguenti righe di codice:

import math
classi_calcolate={'con_la_prima_formula' : round(math.sqrt(n)), 
                  'con_la_seconda_formula':round(1+3.332*math.log(n))}
print(classi_calcolate)