38
UNIVERSITÀ DEGLI STUDI DI PADOVA Dipartimento di Ingegneria dell’Informazione Corso di Laurea Triennale in Ingegneria Informatica Tesi di Laurea Visualizzazione dati con Python: stato dell’arte Relatore: prof. Giorgio Maria Di Nunzio Laureando: Filippo Rigotto Anno accademico

Visualizzazione dati con Python: stato dell'arte

  • Upload
    others

  • View
    8

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Visualizzazione dati con Python: stato dell'arte

UNIVERSITÀ DEGLI STUDI DI PADOVA

Dipartimento di Ingegneria dell’InformazioneCorso di Laurea Triennale in Ingegneria Informatica

Tesi di Laurea

Visualizzazione dati con Python:stato dell’arte

Relatore:prof. Giorgio Maria Di Nunzio

Laureando:Filippo Rigotto

Anno accademico 2016 2017

Page 2: Visualizzazione dati con Python: stato dell'arte

© 2017 Filippo Rigotto. Alcuni diritti riservati.

L’autore concede solo la consultazione dell’elaborato in formato digitale.Non è permessa la stampa, anche se parziale, del documento.

Per ulteriori necessità contattare l’autore: rigottofilippo [AT] altervista.org.

Page 3: Visualizzazione dati con Python: stato dell'arte

Indice

1 Introduzione 1

2 Visualizzazione dei dati 32.1 Definizioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32.2 Origine e stato attuale della disciplina . . . . . . . . . . . . . . . . . 42.3 La costruzione delle rappresentazioni . . . . . . . . . . . . . . . . . . 52.4 Prospettive nella ricerca . . . . . . . . . . . . . . . . . . . . . . . . . 6

3 Python 93.1 Strutture per l’analisi: lo stack SciPy . . . . . . . . . . . . . . . . . . 9

3.1.1 NumPy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103.1.2 SciPy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103.1.3 Pandas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

3.2 Strutture per la visualizzazione . . . . . . . . . . . . . . . . . . . . . 123.2.1 Matplotlib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123.2.2 Seaborn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133.2.3 ggplot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133.2.4 Altair . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143.2.5 Pygal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

4 Un esempio con Pygal 154.1 Caratteristiche avanzate . . . . . . . . . . . . . . . . . . . . . . . . . 154.2 Descrizione del dataset . . . . . . . . . . . . . . . . . . . . . . . . . . 164.3 Codice e grafici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

5 Conclusioni 27

A Appendice 29A.1 Software utilizzati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29A.2 Licenze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

Riferimenti bibliografici 31

i

Page 4: Visualizzazione dati con Python: stato dell'arte

Elenco delle figure

2.1 La Campagna di Russia secondo C. J. Minard . . . . . . . . . . . . . 42.2 Il processo di elaborazione delle informazioni . . . . . . . . . . . . . . 52.3 Ancora un processo di elaborazione delle informazioni . . . . . . . . . 6

4.1 Grafico a barre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174.2 Grafico a barre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184.3 Grafico a torta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194.4 Grafico radar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204.5 Grafico radar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214.6 Grafico a barre orizzontali . . . . . . . . . . . . . . . . . . . . . . . . 224.7 Grafico a barre orizzontali . . . . . . . . . . . . . . . . . . . . . . . . 234.8 Grafico a linee . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244.9 Grafico SolidGauge . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254.10 Grafico a punti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

ii

Page 5: Visualizzazione dati con Python: stato dell'arte

Elenco dei listati codice

4.1 Configurazioni iniziali e lettura del dataset . . . . . . . . . . . . . . . 174.2 Realizzazione del grafico 4.1 . . . . . . . . . . . . . . . . . . . . . . . 174.3 Realizzazione del grafico 4.2 . . . . . . . . . . . . . . . . . . . . . . . 184.4 Realizzazione del grafico 4.3 . . . . . . . . . . . . . . . . . . . . . . . 194.5 Realizzazione del grafico 4.4 . . . . . . . . . . . . . . . . . . . . . . . 204.6 Realizzazione del grafico 4.5 . . . . . . . . . . . . . . . . . . . . . . . 214.7 Realizzazione del grafico 4.6 . . . . . . . . . . . . . . . . . . . . . . . 224.8 Realizzazione del grafico 4.7 . . . . . . . . . . . . . . . . . . . . . . . 234.9 Realizzazione del grafico 4.8 . . . . . . . . . . . . . . . . . . . . . . . 244.10 Realizzazione del grafico 4.9 . . . . . . . . . . . . . . . . . . . . . . . 254.11 Realizzazione del grafico 4.10 . . . . . . . . . . . . . . . . . . . . . . 26

iii

Page 6: Visualizzazione dati con Python: stato dell'arte
Page 7: Visualizzazione dati con Python: stato dell'arte

Capitolo 1

Introduzione

I dati, descrizioni codificate di entità, fenomeni, avvenimenti, sono presenti ovunquenel mondo odierno, basta una semplice richiesta a un motore di ricerca per rendersiconto di un fatto: enormi moli di informazioni e di dati vengono generati ad ogniistante; [7] collezioni di dati strutturati in forma relazionale, che prendono il nomeinglese di dataset1, vengono caricati, aggiornati e manipolati costantemente.Spesso queste informazioni devono essere ulteriormente elaborate per poter esserepiù comprensibili o per ottenere una vista riassuntiva del contenuto del dataset:analizzare e trasformare dati testuali astratti in rappresentazioni grafico-visive (ancheinterattive), su cui spesso le conclusioni sono più immediate, è ciò di cui si occupa lavasta disciplina del Data Analytics and Visualization.

Oggigiorno le operazioni di estrazione dei dati e di analisi e trasformazione deidataset sono completamente informatizzate e si ricorre all’uso di software e libreriespecializzati per automatizzare la manipolazione di dati strutturati e la creazione dirappresentazioni grafiche vettoriali, disponibili per una grande varietà di linguaggi diprogrammazione e per tutti i maggiori sistemi operativi: viene solitamente privilegiatol’uso di linguaggi nati per l’ambito scientifico, come fortran, matlab, julia e r,ma possono essere impiegati equivalentemente, quando sono presenti librerie apposite,linguaggi ad alto livello di stampo più generale come c++, c#, java, javascript,php oppure, come in questo elaborato, python.

1Questo termine viene anche usato per dati facenti parte di un insieme di tabelle legate tra loroda un legame concettuale, ad esempio relativi a una realtà sperimentale o un evento

1

Page 8: Visualizzazione dati con Python: stato dell'arte

1 – Introduzione

Questo elaborato si propone di:

• Mostrare un’introduzione più approfondita sull’ambito della visualizzazionedati, comprensiva di storia, stato dell’arte attuale e direzioni nel progresso dellaricerca in questo campo (Cap. 2)

• Esplorare alcune delle più popolari librerie per l’elaborazione numerica, lamanipolazione di dati tabellari e la creazione di diagrammi bidimensionali inPython, linguaggio generico, ad alto livello, interpretato e multi-paradigma(imperativo, procedurale, funzionale e ad oggetti) (Cap. 3)

• Analizzare informazioni provenienti da un dataset e generare alcuni graficicome esempio, con le librerie Pandas e Pygal, esposte nel precedente capitolo(Cap. 4)

e porge infine, oltre alle conclusioni, alcune riflessioni a complemento (Cap. 5).

2

Page 9: Visualizzazione dati con Python: stato dell'arte

Capitolo 2

Visualizzazione dei dati

A picture is worth a thousand words

Fred R. Barnard, 1921

2.1 Definizioni

Sotto il nome “Visualizzazione dati”, dal termine inglese Data Visualization, vieneraccolta la disciplina che si occupa di studiare procedure, modelli matematici, softwaree tutto ciò che è coinvolto nella conversione dei dati, forniti da una sorgente, inuna rappresentazione grafica visuale (come grafici, mappe, o tabelle) [18] per poteresplorare, capire, interpretare più facilmente le informazioni in possesso, e presentarliin una forma chiara e comprensibile: schemi complessi sono tradotti in un più chiarolinguaggio di linee, forme e colori. [12] [7, p. 9]

È opportuno dividere questa grande scienza in tre rami principali, come definitoanche in [5, p. 12] [6, p. 9] e [7, p. 14–15]:

Scientific Visualization, “SciVis” Si occupa di dati strutturati collegati a oggettidel mondo reale, proprietà fisiche definite nello spazio: previsioni meteo, eventisismici, temperature e correnti di un oceano, e simili.

Information Visualization, “InfoVis” Si occupa di dati senza struttura appa-rente o più astratti di quelli scientifici, anche multidimensionali, legati principal-mente, ma non esclusivamente, alla finanza, al mercato globale, alla statistica,alla politica e alla società.

Visual analytics La pratica di usare oggetti grafici per contestualizzare e sintetiz-zare grandi moli di dati (audio, video, testi, immagini. . . )

3

Page 10: Visualizzazione dati con Python: stato dell'arte

2 – Visualizzazione dei dati

2.2 Origine e stato attuale della disciplina

Le radici più antiche dell’uso di diagrammi per rappresentare visivamente datinumerici si ritrovano nel 1786, quando lo scozzese William Playfair sviluppò ecominciò ad usare istogrammi, grafici a barre, a linee, circolari e “a torta”: gli stessiin uso ancora oggi. [12]

Nel 1869 Charles J. Minard, un ingegnere civile francese, disegnò (sotto forma dilitografia, qui in figura 2.1) un diagramma che riassume la Campagna di Russia diNapoleone (1812), tracciando su una mappa il numero di soldati in forza all’esercito,in relazione al luogo e alla temperatura in gradi Reaumur1. È stato da molti definitopossibilmente il miglior grafico statistico mai disegnato2. [4, p. 12] [5, p. 7] [6, p. 14]

da https://commons.wikimedia.org/w/index.php?curid=297925

Figura 2.1. La Campagna di Russia secondo C. J. Minard

Al giorno d’oggi, con il boom dei Big Data, raccolte di dati estesi, in termini di volumee varietà, tali da richiedere tecnologie e metodi analitici specifici, l’InfoVis viene usataampiamente nei campi finanziario, scientifico, scolastico, sportivo, delle aste e neirisultati delle ricerche online: è confermato come una migliore analisi e comprensionedelle informazioni stia diventando fondamentale per la crescita economica, produttivae in termini di innovazione per le aziende e le istituzioni.

Molti dataset inoltre sono e stanno diventando sempre più di pubblico dominio, siain Italia, grazie al Decreto soprannominato Codice dell’Amministrazione Digitale,

1stessi punti di congelamento e ebollizione della scala Celsius, con 80 divisioni al posto di 1002in questo caso, citazione trascritta del Prof. Edward Tufte

4

Page 11: Visualizzazione dati con Python: stato dell'arte

2.3 – La costruzione delle rappresentazioni

sia nel mondo: sono quindi liberamente consultabili da tutti, anche da persone nondirettamente coinvolte nel settore di origine delle informazioni. [9, § 1]

D.Lgs. 82/2005, art. 50, comma 1I dati delle pubbliche amministrazioni sono formati, raccolti, conservati, residisponibili e accessibili con l’uso delle tecnologie dell’informazione e dellacomunicazione che ne consentano la fruizione e riutilizzazione, alle condizionifissate dall’ordinamento, da parte delle altre pubbliche amministrazioni e daiprivati; [. . .]

2.3 La costruzione delle rappresentazioni

Il modo di procedere per ottenere informazioni da una sorgente dati e poi visualizzarlegraficamente è abbastanza generale, e si trova descritta anche in numerosi testi epubblicazioni: si confronti ad esempio [7, p. 11–12] e [9, p. 1374].

1. Raccolta e collezione dei dati dalla sorgente, che possono essere già strutturatio non ancora vincolati a uno schema logico

2. Pre-processing e analisi dei dati: filtraggio e interpolazione in caso di valorimancanti, selezione dei dati da visualizzare, applicazione di maschere

3. Mappatura risultati con colori e forme geometriche specifiche, in preparazionealla disposizione

4. Rendering: disegno della grafica d’insieme, con disposizione e trasformazionedelle geometrie nell’immagine finale

5. Visualizzazione o incorporamento sul supporto scelto, con possibile interazioneda parte dell’utente

da http://www.infovis-wiki.net/index.php/Visualization_Pipeline

Figura 2.2. Il processo di elaborazione delle informazioni

5

Page 12: Visualizzazione dati con Python: stato dell'arte

2 – Visualizzazione dei dati

da http://jcsites.juniata.edu/faculty/rhodes/ida/intro.html

Figura 2.3. Ancora un processo di elaborazione delle informazioni

2.4 Prospettive nella ricerca

In quest’ambito, la ricerca solitamente viene motivata da esigenze, richieste e datireali: per questo è possibile trovare una modalità di classificazione delle varie tecnichee delle modalità usate, come è stato possibile costruire un diagramma generale diprocedimento nella sezione precedente.

I ricercatori del Microsoft Research Asia, nel report generato valutando princìpifondamentali, trend e approcci nei recenti papers dal 2000 [9] hanno riscontrato comesia possibile classificare quest’ultimi in un numero ristretto di categorie, usando comecriterio i principali temi trattati:

Metodi empirici usati Modelli, teorie e studi su dati del mondo reale, per forniresolide basi per molte altre applicazioni: possono essere applicabili a un ampiospettro di situazioni e domini (modelli nel senso proprio) oppure ad una cerchiaristretta di esempi (valutazioni particolari sul caso in oggetto di studio).

Interazione con la visualizzazione Importante per la piena comprensione e l’a-nalisi, può avvenire in modo classico tramite mouse e tastiera3 o con stilo etouch-screen; tipiche interazioni sono la selezione e il filtraggio, la modificadell’aspetto, la codifica, l’interconnessione.

Sistemi e Frameworks Sviluppo di sistemi di librerie per creare visualizzazionigrafiche, o per modellare differenti aspetti delle tecniche di grafica. Tra iframework si evidenzia in particolare Data-Driven Documents4 (stilizzato D3,

3paradigma wimp: finestre, icone, mouse, puntatore4https://d3js.org

6

Page 13: Visualizzazione dati con Python: stato dell'arte

2.4 – Prospettive nella ricerca

anche noto come d3.js), che permette di costruire visualizzazioni interattive inpagine web con JavaScript, tramite manipolazione diretta del dom5.

Applicazioni I tipi di lavoro che si desidera eseguire; vi rientrano visualizzazionedi grafici, di testi, di mappe e di dati multidimensionali.

Tipi differenti hanno caratteristiche diverse e necessitano di operazioni specificheper essere visualizzati:

• nei grafici solitamente si è interessati a strutture topologiche (es: relazionitra un gruppo di persone);

• dei testi è importante la semantica del contenuto (es: argomenti principalidi una collezione di documenti);

• le mappe sono usate per dare una rappresentazione spaziale di unadistribuzione (es: pattern in dati di traiettorie di oggetti);

• per i dati multidimensionali solitamente interessa esplorare le relazionitra le varie dimensioni.

Come conclusione finale dello studio, i ricercatori hanno evidenziato come molte dellericerche effettuate si stiano focalizzando sui metodi empirici e sulle applicazioni, ecome ciò indichi una larga base di ricercatori attivi e una certa maturità della ricercasull’argomento. I frameworks sono stati invece oggetto di notevoli attenzioni, e hannoriscontrato un grande avanzamento tecnico, nel corso degli anni passati.

5la rappresentazione ad oggetti della pagina web, https://www.w3.org/DOM

7

Page 14: Visualizzazione dati con Python: stato dell'arte
Page 15: Visualizzazione dati con Python: stato dell'arte

Capitolo 3

Python

Python nasce come linguaggio di programmazione generico e ad oggetti, non orientatoesclusivamente all’ambito scientifico come lo sono matlab1, r2 o julia3: non possiedenativamente le classi necessarie per i calcoli e le computazioni avanzate.

Per poterne quindi dimostrare le potenzialità nel settore della visualizzazione, cisi deve appoggiare al Python Scientific Stack: un set di librerie scritte in Python,facilmente integrabili e open-source (come il linguaggio stesso), nato per ovviare aquesta mancanza; è sponsorizzato dall’associazione PyData4, che ne sostiene eco-nomicamente lo sviluppo e la diffusione, anche grazie all’organizzazione di svariatieventi annuali su scala mondiale.

Molti dei software facenti parte dello Stack (la lista completa è disponibile allapagina https://pydata.org/downloads.html), principalmente quelli appartenentialla suite principale, SciPy, saranno introdotti nelle sezioni seguenti.

3.1 Strutture per l’analisi: lo stack SciPy

SciPy5 è un ecosistema di librerie e tools open-source facente parte della suite PyData:aggiunge importanti funzionalità in campo matematico, scientifico e ingegneristico,

1https://it.mathworks.com/products/matlab.html2https://www.r-project.org3https://julialang.org4https://pydata.org5https://www.scipy.org

9

Page 16: Visualizzazione dati con Python: stato dell'arte

3 – Python

in particolare per l’analisi di dati sotto forma di matrici; le componenti principalidello stack sono Numpy, Scipy (omonima della suite), Pandas, Matplotlib, altrelibrerie per il machine learning, l’algebra e una console interattiva.

3.1.1 NumPy

NumPy6 è una libreria che aggiunge all’installazione base di Python funzionalità perl’elaborazione di dati matriciali; implementa principalmente:

• Definizione di tipi di dati arbitrari

• Array multidimensionali efficienti (visti come oggetti/classi)

• Operazioni algebriche tra matrici e array

• Funzioni per leggere e scrivere array di dati su disco

• Funzioni per l’algebra lineare, trasformate di Fourier e un generatore di numeripseudo-casuali

• Funzionalità per l’integrazione in Python di codice c/c++ (oltre a quelle giàpresenti di default) e fortran

Si presta quindi molto bene per fare da contenitore a dataset tabellari o multidimen-sionali, facilmente collegabili ai database.

3.1.2 SciPy

SciPy7, oltre a essere il nome della collezione, è anche il nome della principale libreriain essa contenuta, costruita sopra la base fornita da NumPy.

Aggiunge a quanto già presente funzionalità come:

• Altre routine per le matrici, il calcolo integrale e differenziale

• Algoritmi per le radici

• Algoritmi per processare segnali

• Distribuzioni di probabilità, funzioni statistiche

6http://www.numpy.org, licenza BSD-37https://www.scipy.org/scipylib, licenza BSD-3

10

Page 17: Visualizzazione dati con Python: stato dell'arte

3.1 – Strutture per l’analisi: lo stack SciPy

3.1.3 Pandas

Pandas8 è una libreria che fornisce funzioni di analisi e strutture di memorizzazioneorientate a lavorare nello specifico con dati relazionali (es: database). Può accettarecome parametri gli array di NumPy, sono tra loro compatibili.

Ambisce ad essere il più potente tool open-source del settore per la manipolazione:molte delle routine di basso livello sono state ottimizzate scambiando codice Pythoncon codice c, precompilato e ottimizzato, più veloce nell’esecuzione.

In particolare è ottimizzata per lavorare con:

• Dati tabellari, con colonne di vari tipi primitivi (come in sql o in excel)

• Serie temporali, anche non necessariamente ordinate

• Dati matriciali, con righe e colonne definite da label, etichette testuali

• Dataset statistici

Si compone principalmente di due strutture per la memorizzazione, che copronoquasi tutte le esigenze di rappresentazione dei dati usati in finanza, statistica, scienzae ingegneria: Series unidimensionali e DataFrame9 bidimensionali.

Alcune funzioni significative:

• Gestione dei dati mancanti (rappresentati come NaN) per tutti i tipi

• Modificabilità di colonne e righe da altri DataFrame

• Allineamento dati mediante una serie di label specificate dall’utente o in modoautomatico

• Funzioni di raggruppamento, divisione, combinazione, merge e join tra dataset

• Funzioni di indicizzazione tramite label

• Funzioni di i/o per interagire con dati salvati in file csv10, excel, database

8http://pandas.pydata.org, licenza BSD-39Simile a data.frame di r, ma con molte più funzionalità

10https://it.wikipedia.org/wiki/Comma-separated_values

11

Page 18: Visualizzazione dati con Python: stato dell'arte

3 – Python

3.2 Strutture per la visualizzazione

Nel corso degli anni sono state create molte librerie per rappresentare i dati conPython, a partire da Matplotlib, la prima e la più famosa, creata da John Hunter epresentata in [8].

Il motore fondamentale che ha spinto alla loro creazione è stato a volte la necessitàdi dover creare un sistema di visualizzazione simile a quello di altri linguaggi, a voltedi voler proporre un’interfaccia semplice ma funzionale per i principianti, così daconseguire ottimi risultati nel minor tempo possibile.

Qui di seguito sarà esposta una selezione di alcune tra le più popolari librerie.

3.2.1 Matplotlib

Matplotlib11 è stata la prima libreria a disposizione degli utenti Python per poterdisegnare grafici, in particolar modo bidimensionali. Ha origine dall’interfaccia dimatlab (ma è indipendente poiché scritta completamente con classi Python) eNumPy (sez. 3.1.1 a pagina 10). È l’unica libreria grafica delle proposte parteintegrante della suite SciPy, nata dall’idea di creare una libreria che permettessedi produrre in modo semplice grafici di alta qualità e facile comprensione, prontiper l’inclusione in documenti TEX (output in PostScript12), in programmi adinterfaccia grafica e in pagine web (output png13).

Il codice è concettualmente diviso in tre parti:

1. L’interfaccia pylab: disponibile in matplotlib.pylab, consente all’utente dicreare i grafici con un’interfaccia simile a quella di matlab.

2. Frontend: il set di classi adibite alla creazione e disposizione di figure, testi,grafici, legende.

3. Backend: classi che trasformano e salvano la rappresentazione ottenuta in unfile (come ps, svg, gtk, agg per il formato png, pdf, ecc. . . ).

11http://matplotlib.org, licenza basata su PSF12https://it.wikipedia.org/wiki/Encapsulated_PostScript13https://it.wikipedia.org/wiki/Portable_Network_Graphics

12

Page 19: Visualizzazione dati con Python: stato dell'arte

3.2 – Strutture per la visualizzazione

3.2.2 Seaborn

Seaborn14 è costruita su Matplotlib, ed è fortemente integrata con numerose librerieprecedentemente incontrate, in particolare supporta NumPy, le strutture dati diPandas e le routine di SciPy (descritte nelle pagine 10–11).

Sono inclusi nel pacchetto temi grafici, palette di colori personalizzabili, funzionistatistiche di analisi e comparazione di dataset, griglie di grafici per visualizzazionipiù complesse.

Mira a creare grafici quanto più possibile “production-ready”, ma la personalizzazionecompleta richiede una notevole conoscenza degli oggetti Matplotlib sottostanti.

Il fatto che sia costruita su Matplotlib inoltre implica che è possibile, una voltagenerato l’oggetto, modificarlo con metodi propri di questa, e infine anche salvarlotramite una qualsiasi classe del backend; per lo stesso motivo è pensata più come uncomplemento che un rimpiazzo: è probabile che ci si trovi a invocare direttamenteMatplotlib per grafici più semplici, quando disponibili tramite pyplot, piuttosto cheusare Seaborn.

3.2.3 ggplot

ggplot15 è una libreria indipendente realizzata da yhat e basata sull’interfacciadi ggplot2, presente in r. È creata per realizzare grafici professionali con pocherighe di codice: la personalizzazione è posta in secondo piano, dato che interessaprincipalmente la velocità nella creazione di ciò che è richiesto.

L’interfaccia è fatta di tanti singoli componenti separati, da applicare in sequenza aun’area che diventerà il grafico finale, procedendo secondo lo schema:

• Crea l’oggetto del grafico

• Aggiungi una linea

• Aggiungi determinati punti in evidenza

• Aggiungi un disegno come sfondo

• Aggiungi altri elementi visivi. . .

14https://seaborn.pydata.org, licenza BSD-315http://ggplot.yhathq.com, licenza BSD-2

13

Page 20: Visualizzazione dati con Python: stato dell'arte

3 – Python

Tramite questa modalità di composizione via oggetti, che possiedono una ricca inter-faccia che consente ampia personalizzazione del risultato finale, gli stessi frammentipossono essere riutilizzati in più punti del codice.

ggplot usa in modo esteso gli oggetti DataFrame della libreria Pandas (a pagina 11)come strutture-contenitori dei dati di input, garantendo così la compatibilità dell’inputcon molte altre librerie.

3.2.4 Altair

Altair16 è basata su una struttura modulare: i dati normalmente sono contenuti inDataFrame di Pandas, la definizione degli elementi del grafico usa la sintassi json17

fornita da Vega-Lite18; la programmazione si concentra attorno alla classe Chartche interpreta, gestisce e interconnette entrambe le astrazioni.

Al tempo della scrittura di questo elaborato è in sviluppo la nuova versione 2.0 el’interfaccia di programmazione è destinata a cambiare notevolmente.

3.2.5 Pygal

Gli sviluppatori di Pygal19 hanno convogliato i loro sforzi per scrivere una libreriache sia semplice e facile da usare anche per i principianti, che abbia poche dipendenzeesterne, e che produca grafici anche complessi in svg20, formato vettoriale che puòessere scalato e ridimensionato senza perdere in qualità, oltre a poter essere facil-mente incorporato in pagine web html521 (tags <svg> e <canvas>) e in documentidigitali. [1, p. 61–63] Il prossimo capitolo è interamente dedicato a questa libreria,all’esplorazione di alcuni dettagli specifici e al suo utilizzo.

16https://altair-viz.github.io, licenza BSD-317http://www.json.org/json-it.html18https://vega.github.io/vega-lite19http://pygal.org, licenza LGPL-320https://www.w3.org/Graphics/SVG21https://www.w3.org/html

14

Page 21: Visualizzazione dati con Python: stato dell'arte

Capitolo 4

Un esempio con Pygal

A titolo d’esempio, ci si propone ora di usare, tra tutte le proposte preceden-ti, la libreria Pygal su un dataset di studenti di due scuole portoghesi, creatoda Paulo Cortez1 (Università del Minho, Portogallo) e pubblicato online al sitohttps://archive.ics.uci.edu/ml/datasets/Student+Performance. Sono stateconsiderate solo le classi di matematica e i dati sono aggiornati al Novembre 2014.

4.1 Caratteristiche avanzate

Con Pygal è possibile costruire velocemente vari tipi di diagrammi:

• a linee (verticali e orizzontali)

• a barre, istogrammi

• cartesiani (bidimensionali)

• circolari “a torta” (mezza oppure completa) e “a radar”

• a scatole (con indicazioni statistiche)

• distribuzione di punti

• indicatori circolari e semicircolari

• piramidali

• mappe (su una carta geografica in svg come sfondo)

1http://www3.dsi.uminho.pt/pcortez

15

Page 22: Visualizzazione dati con Python: stato dell'arte

4 – Un esempio con Pygal

Inoltre:

• supporta 15 diversi temi di colori predefiniti, e l’applicazione di gradienti dicolore personali su alcuni di questi;

• dimensioni, titoli, etichette, legenda, assi, interpolazioni e il rendering sonoconfigurabili;

• ogni serie di dati aggiunta al diagramma ha anch’essa proprietà impostabili;

• ogni valore di una serie ha label e stile individualmente modificabili;

• l’output nativo è in svg, facilmente inseribile in pagine web (dove il graficorisulta animato grazie all’inserimento automatico di codice css2 e javascript)o in png, basandosi internamente su CairoSVG3 per la conversione.

4.2 Descrizione del dataset

Il dataset, estratto da questionari e documenti ufficiali delle scuole, include:

Caratteristiche sociali Sesso, età, provenienza, stato, qualità e persone del nucleofamiliare, educazione e lavoro dei genitori, accesso a Internet, relazioni amorosee con gli amici, consumo di alcol nel weekend e negli altri giorni.

Caratteristiche scolastiche Nome della scuola, motivo della scelta, supervisoredello studente, tempo di percorrenza casa - scuola, tempo di studio settimanale,tempo libero dopo scuola, numero di bocciature e assenze, volontà di proseguiregli studi.

Voti Parziali G1, G2 e Finale G3, dipendente dai primi due.

4.3 Codice e grafici

Di seguito alcuni esempi dei vari tipi di diagrammi realizzabili, accompagnati dalcodice relativo alla loro creazione a partire dalla tabella del dataset.

2https://www.w3.org/Style/CSS3http://cairosvg.org

16

Page 23: Visualizzazione dati con Python: stato dell'arte

4.3 – Codice e grafici

3 import pandas , pygal4 from pygal . style import LightSolarizedStyle as DefStyle56 # impostazioni per i grafici7 conf = pygal . Config ()8 conf. print_values = True9

10 # lettura del dataset11 ds = pandas . read_csv ("student -mat.csv", sep=";")

Codice 4.1. Configurazioni iniziali e lettura del dataset

Figura 4.1. Grafico a barre

37 # estrazione colonne , raggruppamento per campi e conta38 fields = [" school ","sex"]39 data = ds.loc [:, fields ]40 # pivot e trasposizione41 data = data. groupby ( fields ).size (). unstack ().T4243 plot = pygal .Bar( config =conf , style = DefStyle )44 plot. title = " Campione diviso per scuole e sesso "45 plot. x_labels = [" Gabriel Pereira (GP)"," Mousinho da Silveira (MS)"]4647 plot.add(" Maschi ", list(data.loc["M"]))48 plot.add(" Femmine ", list(data.loc["F"]))49 plot. render_to_file (" chart1 .svg")

Codice 4.2. Realizzazione del grafico 4.1

17

Page 24: Visualizzazione dati con Python: stato dell'arte

4 – Un esempio con Pygal

Figura 4.2. Grafico a barre

54 fields = ["age"]55 data = ds.loc [:, fields ]56 data = data. groupby ( fields ).size ()5758 plot = pygal .Bar( config =conf , style = DefStyle )59 plot. title = "Eta ’ del campione (in anni)"6061 for i in range (0, 22 -15+1):62 # conversione in stringa degli anni63 plot.add(str(data. index [i]) , data.iloc[i])64 plot. render_to_file (" chart2 .svg")

Codice 4.3. Realizzazione del grafico 4.2

18

Page 25: Visualizzazione dati con Python: stato dell'arte

4.3 – Codice e grafici

Figura 4.3. Grafico a torta

69 fields = [" famsize "]70 data = ds.loc [:, fields ]71 data = data. groupby ( fields ).size ()7273 plot = pygal .Pie( config =conf , style = DefStyle )74 plot. title = " Numero di comp. familiari "7576 plot.add("Fino a 3", data.loc["LE3"])77 plot.add(" Oltre 3", data.loc["GT3"])78 plot. render_to_file (" chart3 .svg")

Codice 4.4. Realizzazione del grafico 4.3

19

Page 26: Visualizzazione dati con Python: stato dell'arte

4 – Un esempio con Pygal

Figura 4.4. Grafico radar

83 fields = ["Fedu","Medu"]84 data = ds.loc [:, fields ]85 dataf = data. groupby ("Fedu").size ()86 datam = data. groupby ("Medu").size ()8788 plot = pygal . Radar ( style = DefStyle )89 plot. title = " Educazione scolastica dei genitori "90 plot. x_labels = [" Nessuna "," Primaria "," Intermedia "," Secondaria "," Maggiore "]9192 plot.add(" Padre ", list( dataf ))93 plot.add(" Madre ", list( datam ))94 plot. render_to_file (" chart4 .svg")

Codice 4.5. Realizzazione del grafico 4.4

20

Page 27: Visualizzazione dati con Python: stato dell'arte

4.3 – Codice e grafici

Figura 4.5. Grafico radar

99 fields = ["Fjob","Mjob"]100 data = ds.loc [:, fields ]101 dataf = data. groupby ("Fjob").size ()102 datam = data. groupby ("Mjob").size ()103104 plot = pygal . Radar ( config =conf , style = DefStyle )105 plot. title = " Settore di lavoro dei genitori "106 plot. x_labels = [" Casalingo /a"," Salute "," Altro "," Servizi "," Insegnamento "]107108 plot.add(" Padre ", list( dataf ))109 plot.add(" Madre ", list( datam ))110 plot. render_to_file (" chart5 .svg")

Codice 4.6. Realizzazione del grafico 4.5

21

Page 28: Visualizzazione dati con Python: stato dell'arte

4 – Un esempio con Pygal

Figura 4.6. Grafico a barre orizzontali

115 # indici del dataset : 1..4 : vuoto in zero116 times = ["","< 15 min","15 - 30 min","30 min - 1 ora","> 1 ora"]117 fields = [" traveltime "]118 data = ds.loc [:, fields ]119 data = data. groupby ( fields ).size ()120121 plot = pygal . HorizontalBar ( config =conf , style = DefStyle )122 plot. title = " Tempo di viaggio casa - scuola "123124 for i in range (0 ,4):125 # i = {0..3} , data. index [i] = {1..4}126 plot.add( times [data. index [i]], data.iloc[i])127 plot. render_to_file (" chart6 .svg")

Codice 4.7. Realizzazione del grafico 4.6

22

Page 29: Visualizzazione dati con Python: stato dell'arte

4.3 – Codice e grafici

Figura 4.7. Grafico a barre orizzontali

133 times = ["","< 2 ore","2 - 5 ore","5 - 10 ore","> 10 ore"]134 fields = [" studytime "]135 data = ds.loc [:, fields ]136 data = data. groupby ( fields ).size ()137138 plot = pygal . HorizontalBar ( config =conf , style = DefStyle )139 plot. title = " Tempo di studio settimanale "140141 for i in range (0 ,4):142 # i = {0..3} , data. index [i] = {1..4}143 plot.add( times [data. index [i]], data.iloc[i])144 plot. render_to_file (" chart7 .svg")

Codice 4.8. Realizzazione del grafico 4.7

23

Page 30: Visualizzazione dati con Python: stato dell'arte

4 – Un esempio con Pygal

Figura 4.8. Grafico a linee

149 fields = ["G1","G2","G3"]150 data = ds.loc [:, fields ]151152 plot = pygal .Line( config =conf , style = DefStyle )153 plot. title = " Andamento dei voti di 8 studenti "154155 for i in range (0 ,8):156 # uno ogni 50 dalla tabella157 # aggiunta zeri davanti a numeri piccoli158 number = str(i*50). zfill (3)159 plot.add("Stud {0}". format ( number ), list(data.loc[i *50]) )160 plot. render_to_file (" chart8 .svg")

Codice 4.9. Realizzazione del grafico 4.8

24

Page 31: Visualizzazione dati con Python: stato dell'arte

4.3 – Codice e grafici

Figura 4.9. Grafico SolidGauge

165 fields = {" schoolsup ": " Supporto scolastico ",166 " famsup ": " Supporto scol. familiare ",167 " activities ": " Attivita ’ extra curr.",168 " nursery ": "Freq. scuola infanzia ",169 " higher ": " Intenzione proseguire studi ",170 " internet ": " Accesso Internet a casa",171 "paid": " Altri corsi pagati ",172 " romantic ": "In una relazione "}173 data = ds.loc [:, fields .keys ()]174 num = ds. count ()[" schoolsup "]175176 plot = pygal . SolidGauge ( inner_radius =0.5 , legend_at_bottom =True , style = DefStyle )177 plot. title = "Vari dati booleani (in evidenza il ’SI ’)"178179 for fld in fields .keys ():180 dtemp = data. groupby (fld).size ()181 # estrazione valore ’SI ’ e impostazione massimo182 plot.add( fields [fld], [{" value ": dtemp .loc["yes"], " max_value ": num }])183 plot. render_to_file (" chart9 .svg")

Codice 4.10. Realizzazione del grafico 4.9

25

Page 32: Visualizzazione dati con Python: stato dell'arte

4 – Un esempio con Pygal

Figura 4.10. Grafico a punti

188 fields = {" famrel ": " Relazioni coi familiari ",189 " freetime ": " Tempo libero dopo scuola ",190 " goout ": " Uscite con gli amici ",191 " health ": " Stato di salute ",192 "Dalc": " Consumo alcool giorni lav.",193 "Walc": " Consumo alcool weekend "}194 data = ds.loc [:, fields .keys ()]195196 plot = pygal .Dot( show_legend =False , config =conf , style = DefStyle )197 plot. title = "Vari dati su scala 1 ( minimo ) - 5 ( massimo )"198 plot. x_labels = [" Basso / Brutto ",""," Normale ","","Alto/ Buono "]199200 for fld in fields :201 dtemp = data. groupby (fld).size ()202 # aggiunta valori della colonna come lista203 plot.add( fields [fld], list( dtemp ))204 plot. render_to_file (" chart10 .svg")

Codice 4.11. Realizzazione del grafico 4.10

26

Page 33: Visualizzazione dati con Python: stato dell'arte

Capitolo 5

Conclusioni

La disciplina della visualizzazione dati è ampia e comprende molte branchie, tecni-che di analisi e software: la trattazione qui presentata, solo una breve introduzio-ne, non è certo esaustiva; come esempio, per ulteriori approfondimenti nel campodell’Information Visualization si rimanda all’ottimo sito www.infovis-wiki.net.

Per i capitoli 3 e 4, riguardanti linguaggio e codice, dopo una breve esposizione delleprincipali librerie di uso comune, si è cercato di tenere fede a una strada precisa eben delineata: dimostrare com’è possibile usare un linguaggio generico come Pythonper analizzare dataset in modo sistematico e poter creare grafici di buona qualità efacilmente integrabili in documenti e pagine web, impiegando un tempo relativamentebreve per la stesura del codice e la successiva generazione del grafico risultante.

Dai risultati ottenuti nel capitolo 4, la libreria Pandas, con le sue proprietà diselezione di righe, colonne e singoli elementi, si è rivelata un potente ma semplicemezzo per la manipolazione degli elementi della tabella esempio, e l’uso di Pygal haprodotto grafici di qualità accettabile, più che idonei per l’inclusione in pubblicazioni,offrendo al contempo grande semplicità e rapidità di utilizzo, grazie all’interfaccia diprogrammazione intuitiva; per poter però personalizzare anche i dettagli più minutidel grafico finale, quali posizioni, dimensioni e colori dei vari oggetti, si deve ricorrereall’uso di altre librerie tra quelle proposte, in particolare la più potente Matplotlib.

Infine, oltre all’uso specifico qui considerato, Python rimane uno dei linguaggi piùpopolari1 e il primo a sintassi non “C-like”, a causa della sua versatilità e facilitàdi apprendimento; essendo poi interpretato, piuttosto che compilato, è inoltre unavalida alternativa per creare script da eseguire in shell unix.

1si veda https://www.tiobe.com/tiobe-index

27

Page 34: Visualizzazione dati con Python: stato dell'arte
Page 35: Visualizzazione dati con Python: stato dell'arte

Appendice A

A.1 Software utilizzati

Gli esempi proposti in questo elaborato sono stati realizzati con Python 2.71 usandoVisual Studio Code2 su Windows e Ubuntu; sono compatibili (o adattabili con modificheminime) anche con Python 3, usando la giusta versione delle librerie; la scelta èeseguita automaticamente da pip.

La conversione delle immagini per l’inclusione in questo elaborato è stata effettuatacon Inkscape3: è consigliabile usare sempre formati vettoriali, dato che le immaginisono composte principalmente da forme geometriche e testi; convertirle in bitmapcomporterebbe maggiore spazio occupato e minore qualità complessiva. Se non visono alternative, preferire formati senza compressione.

A.2 Licenze

Di seguito i link delle licenze incontrate nell’elaborato.

• PSF: https://opensource.org/licenses/Python-2.0

• BSD 3-clause: https://opensource.org/licenses/BSD-3-Clause

• BSD 2-clause: https://opensource.org/licenses/BSD-2-Clause

• Matplotlib: http://matplotlib.org/users/license.html

• LGPL v3: https://www.gnu.org/licenses/lgpl-3.0.en.html

1https://www.python.org2http://code.visualstudio.com3https://inkscape.org

29

Page 36: Visualizzazione dati con Python: stato dell'arte
Page 37: Visualizzazione dati con Python: stato dell'arte

Bibliografia

Libri

[1] Chad Adams. Learning Python Data Visualization. Packt Publishing Ltd.,agosto 2014. url: https://www.packtpub.com/big-data-and-business-intelligence/learning-python-data-visualization.

[2] Wes McKinney. Python for data analysis. O’Reilly Media Inc., ottobre 2012.url: http://shop.oreilly.com/product/0636920023784.do.

[3] Igor Milovanovic, Giuseppe Vettigli e Dimitry Foures. Python Data Visualiza-tion Cookbook. 2nd Edition. Packt Publishing Ltd., novembre 2015. url: https://www.packtpub.com/big-data-and-business-intelligence/python-data-visualization-cookbook.

[4] Kirthi Raman. Mastering Python Data Visualization. Packt Publishing Ltd.,ottobre 2015. url: https://www.packtpub.com/big-data-and-business-intelligence/mastering-python-data-visualization.

Articoli e corsi

[5] Greg Abram. «Introduction to Data Visualization». url: http : / / www .montana.edu/itcenter/rci/documents/DataViz_Intro.pdf.

[6] Joshi Alark. «Introduction to Data Visualization». [da COMPSCI 564: Visuali-zation Tecniques]. Gennaio 2012. url: http://cs.boisestate.edu/~alark/cs564/lectures/Introduction_to_Data_Visualization.pdf.

[7] Guoning Chen. «Introduction to visualization». [da COSC6397-F13: Researchmethods in Computer Science]. Ottobre 2013. url: http://www2.cs.uh.edu/~gnawali/courses/cosc6397-f13/intro-visualization.pdf.

[8] J. D. Hunter. «Matplotlib: A 2D graphics environment». In: Computing InScience & Engineering 9.3 (2007), pp. 90–95.

31

Page 38: Visualizzazione dati con Python: stato dell'arte

Bibliografia

[9] S. Liu et al. «A survey on information visualization: recent advances andchallenges». In: The Visual Computer 30.12 (gennaio 2014), pp. 1373–1393.

Online

[10] Melissa Bierly. 10 Useful Python data visualization libraries for any discipline.Giugno 2016. url: https : / / blog . modeanalytics . com / python - data -visualization-libraries.

[11] Billy Ceskavich. An Introduction to Data Visualization And Its Tools. Feb-braio 2015. url: https://ischool.syr.edu/infospace/2015/02/25/an-introduction-to-data-visualization-and-its-tools.

[12] David McCallum. Introduction to Data Visualization. Maggio 2016. url: http://library.uoregon.edu/introduction-data-visualization.

[13] Chris Moffitt. Overview of Python visualization tools. Gennaio 2015. url:http://pbpython.com/visualization-tools-1.html.

[14] Vik Paruchuri. Python data visualization: Comparing 7 tools. Novembre 2015.url: https://www.dataquest.io/blog/python- data- visualization-libraries.

[15] Sunil Ray. 9 popular ways to perform Data Visualization in Python. Maggio2015. url: https://www.analyticsvidhya.com/blog/2015/05/data-visualization-python.

[16] Lisa Charlotte Rost. One chart, twelve charting libraries. Maggio 2016. url:https://lisacharlotterost.github.io/2016/05/17/one-chart-code.

[17] Dan Saber. A dramatic tour through Python’s data visualization landscape.Ottobre 2016. url: https : / / dansaber . wordpress . com / 2016 / 10 / 02 /a- dramatic- tour- through- pythons- data- visualization- landscape-including-ggplot-and-altair.

[18] Angela Zoss. Introduction to Data Visualization. Aprile 2017. url: http://guides.library.duke.edu/datavis.

32