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”.

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à.

Il nome istogramma a questo tipo di rappresentazione visiva dei dati fu attribuito dal matematico britannico Karl Pearson nel 1895.
# 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 graficofig =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

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)
Commenti recenti