La visualizzazione dei dati è uno degli aspetti fondamentali dell’analisi dei dati. Esplorare la natura dei dati e la loro distribuzione permette al data analyst di capire come analizzarli. Inoltre, la visualizzazione dei risultati di analisi permette di comunicare in modo immediato il risultato di analisi complesse.
La scelta della libreria per visualizzare i dati e/o i risultati è a volte complicata. Infatti, esistono diverse librerie facili da usare ma che limitano l’interazione con i dati stessi. Altre, invece, permettono un interazione con i grafici ma la curva di apprendimento è alquanto ripida. Esistono però delle librerie open-source che risolvono in parte questo problema.
Abbiamo visto nell’articolo PandasGUI: Interfaccia grafica per analizzare i dati con Pandas come possiamo usare un tool per interagire con i dati tramite un interfaccia grafica. Se però vogliamo includere all’interno del nostro codice la generazione di grafici, bisogna utilizzare altre librerie.
In questo articolo, confronteremo la libreria pandas e pandas_boken. Analizzeremo la sintassi e i risultati ottenuti confrontando alcune tipologie di grafici disponibili. In particolare ci limiteremo a sei grafici base, ossia grafici a linee, grafici a barre, grafici a barre impilate, istogrammi, scatter e grafici a torta. L’obiettivo è rendere i grafici interattivi in modo tale che si possa sfruttare a pieno l’informazione che ci presentano.
Dataset
Esistono molti datasets pubblici con cui si possono testare questi tool. Ad esempio, su Kaggle si possono scaricare gratuitamente dataset che coprono diversi ambiti, dai dati finanziari a quelli relativi al meteo. Esistono poi diversi repository che forniscono i cosiddetti open data, ossia dati gratuiti pubblicati online.
In questo tutorial useremo gli open data relativi ai casi del COVID-19 in Italia disponibili qui. Non faremo un’analisi di quei dati, ma li useremo solo per mostrare le funzionalità delle librerie. In particolare, useremo i dati sull’andamento nazionale e ci concentreremo solo sui dati delle ospedalizzazioni. Potete scaricare il dataset qui.
Prima di installare la libreria consigliamo di crearvi il vostro ambiente di sviluppo. Per farlo potete semplicemente usare pipenv. In questo modo installerete solo le librerie necessarie per il vostro progetto in un workspace dedicato e non a livello di sistema operativo. Pertanto dopo aver creato il vostro workspace con pipenv shell, potete procedere con l’installazione di Pandas e Pandas_bokeh. I comandi sono i seguenti.
# from PyPi
pip install pandas-bokeh
# with Conda
conda install -c patrikhlobil pandas-bokeh
A questo punto possiamo importare le librerie e il dataset necessari.
# Importing required modules
import pandas as pd
import pandas_bokeh
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# Reading in the data
data = pd.read_csv('covid.csv',parse_dates=["data"],index_col='data')
data.head()
Con l’ultimo comando possiamo vedere il DataFrame letto dal file csv. Come si può notare ci sono 23 colonne (attributi) per ogni data. Per semplificare selezioniamo solo i dati relativi alle ospedalizzazioni, ossia le colonne ricoverati_con_sintomi e terapia_intensiva. Inoltre, per avere meno punti da visualizzare possiamo ricampionare i dati della serie temporale mediante il comando resample() di pandas. Di seguito riportiamo i comandi e gli output ottenuti.
Out[1]:
stato ricoverati_con_sintomi terapia_intensiva ... totale_positivi_test_antigenico_rapido tamponi_test_molecolare tamponi_test_antigenico_rapido
data ...
2020-02-24 18:00:00 ITA 101 26 ... NaN NaN NaN
2020-02-25 18:00:00 ITA 114 35 ... NaN NaN NaN
2020-02-26 18:00:00 ITA 128 36 ... NaN NaN NaN
2020-02-27 18:00:00 ITA 248 56 ... NaN NaN NaN
2020-02-28 18:00:00 ITA 345 64 ... NaN NaN NaN
[5 rows x 23 columns]
data = data[['ricoverati_con_sintomi', 'terapia_intensiva']]
In [2]: data.head()
Out[2]:
ricoverati_con_sintomi terapia_intensiva
data
2020-02-24 18:00:00 101 26
2020-02-25 18:00:00 114 35
2020-02-26 18:00:00 128 36
2020-02-27 18:00:00 248 56
2020-02-28 18:00:00 345 64
In [3]: data_resample = data.resample(rule='M').mean()
In [4]: data_resample
Out[4]:
ricoverati_con_sintomi terapia_intensiva
data
2020-02-29 222.833333 53.666667
2020-03-31 12762.612903 1985.645161
2020-04-30 25565.800000 2975.466667
2020-05-31 11501.645161 882.516129
2020-06-30 3353.800000 207.433333
2020-07-31 808.741935 57.870968
2020-08-31 890.451613 58.129032
2020-09-30 2204.833333 194.566667
2020-10-31 7843.870968 785.290323
2020-11-30 29880.800000 3231.666667
2020-12-31 27113.612903 3005.516129
2021-01-31 22392.354839 2483.451613
2021-02-28 18799.535714 2128.571429
2021-03-31 25040.580645 3127.032258
2021-04-30 24889.600000 3306.833333
2021-05-31 12422.516129 1783.645161
2021-06-30 3408.100000 531.966667
2021-07-31 1248.000000 179.400000
Ora che abbiamo i nostri dataframes pronti, è il momento di visualizzarli tramite diversi grafici.
Sintassi per i plot
Le due librerie che useremo per generare i plot sono quella fornita da pandas e la libreria pandas_brokeh. Vediamo di seguito la sintassi fornita da entrambe.
Pandas
Per generare un grafico usando pandas, si usa il metodo .plot() del dataframe. Questo metodo è un semplice wrapper intorno al plt.plot() di matplotlib. E’ possibile anche specificare alcuni parametri aggiuntivi come quelli riportati di seguito.
Some of the important Parameters
--------------------------------
x : label or position, default None
Only used if data is a DataFrame.
y : label, position or list of label, positions, default None
title: title to be used for the plot
X and y label: Name to use for the label on the x-axis and y-axis.
figsize : specifies the size of the figure object.
kind : str
The kind of plot to produce:
- 'line' : line plot (default)
- 'bar' : vertical bar plot
- 'barh' : horizontal bar plot
- 'hist' : histogram
- 'box' : boxplot
- 'kde' : Kernel Density Estimation plot
- 'density' : same as 'kde'
- 'area' : area plot
- 'pie' : pie plot
- 'scatter' : scatter plot
- 'hexbin' : hexbin plot.
Per una lista completa dei parametri e del loro uso, rimandiamo alla documentazione ufficiale.
Pandas bokeh
La libreria Pandas bokeh fornisce un backend di plottaggio bokeh per i DataFrames di Pandas, GeoPandas e Pyspark, aggiungendo il metodo plot_bokeh(). Richiede di definire all’inizio un metodo di plottaggio tra i due possibili: Jupyter notebook o file HTML. La sintassi è la seguente.
# for embedding plots in Jupyter Notebooks.
pandas_bokeh.output_notebook()
# for exporting plots as HTML.
pandas_bokeh.output_file(filename)
Comparazione dei diversi plot
In questa sezione mostriamo sia i comandi che i risultati per diverse tipologie di grafico. In particolare analizzeremo le tipologie:
- Grafici a linee
- Scatter
- Istogrammi
- Grafici a barre
- Grafici a barre impilate
- Grafici a torta
Grafici a linee
#pandas
data.plot(title='Covid', xlabel='Values').figure.show()
# pandas_bokeh
data_new.plot_bokeh(kind='line')
Pandas

Bokeh

Scatter plot
#pandas
data.plot(kind='scatter',
x='ricoverati_con_sintomi',
y='terapia_intensiva',
title='Scatter Covid').figure.show()
# pandas_bokeh
data_new.plot_bokeh.scatter(x='ricoverati_con_sintomi',
y='terapia_intensiva',
title='Scatter Covid')
Pandas

Bokeh

Istogrammi
#pandas
data.plot(kind='hist', bins=30).figure.show()
# pandas_bokeh
data.plot_bokeh(kind='hist', bins=30)
Pandas

Bokeh

Grafici a barre
#pandas
data_resample.plot(kind='bar').figure.show()
# pandas_bokeh
data_resample.plot_bokeh(kind='bar')
Pandas

Bokeh

Grafici a barre impilate
#pandas
data_resample.plot(kind='barh', stacked=True).figure.show()
# pandas_bokeh
data_resample.plot_bokeh(kind='barh', stacked=True)
Pandas

Bokeh

Grafici a torta
#pandas
data_resample['terapia_intensiva'].plot.pie(legend=False, autopct='%.1f').figure.show()
# pandas_bokeh
data_resample.plot_bokeh.pie(y='terapia_intensiva')
Pandas

Bokeh

Per questa tipologia di grafico, Bokeh fornisce anche un altro tipo di output che ingloba più grafici a torta. La sintassi e il risulto sono riportati di seguito.
data_resample.plot_bokeh.pie()

Conclusioni
Pandas fornisce un ottima libreria per generare grafici dei dati contenuti nei DataFrame. Tuttavia, questi grafici mancano di interattività e capacità come lo zoom e il pan. La libreria Pandas Bokeh supera questo limite fornendo anche un output in HTML che può essere facilmente incluso nei siti web. Ovviamente l’uso di una libreria rispetto ad un’altra dipende dal contesto applicativo e dalle preferenze dello sviluppatore o data analyst.