Open data, libri e biblioteche (con un pizzico di data science)

Circa un anno fa, il sistema delle Biblioteche di Roma BiblioTU ha iniziato a rilasciare dati aperti e consultabili alla pagina: https://www.bibliotechediroma.it/it/open-data-biblioteche-di-roma

Una delle cose più interessanti che ho notato sin da subito è la presenza di alcuni dataset transazionali come i movimenti di documenti fisici e digitali registrati dalle biblioteche del sistema, le iscrizioni degli utenti e le prenotazioni e le richieste online tramite il portale. C’è parecchio materiale insomma, e spero di non sbagliarmi indicando BiblioTU come il primo sistema in Italia che condivide una buona mole di dati relativi alle transazioni. Nel caso, segnalatemelo, così magari aggiungiamo qualche confronto a tutta l’analisi che segue.

Perché mi interessano così tanto le transazioni?

La premessa a questo lungo post è in sostanza che quanto meno i dati aperti sono aggregati e tanto più ci si può fare qualcosa. Sembra una banalità ma le cose stanno così. Le transazioni sono dati grezzi che consentono quantomeno di individuare errori (celle con valori nulli, numeri sbagliati, etc…) e soprattutto scegliere le proprie aggregazioni senza subirle passivamente. Fidatevi, per chi ci lavora, con i dati, non è cosa da poco.

Quanto meno i dati aperti sono aggregati e tanto più ci si può fare qualcosa.

Tra l’altro, centinaia di migliaia di righe esportate da un database sono anche un ottimo campo di indagine su eventuali supposizioni che si possono fare sul metodo di raccolta dei dati. Anche qui, è un vantaggio non da poco per chi li deve analizzare. Avendo una certa confidenza con molti sistemi di ingestione e architetture di flussi di dati, per me individuare un errore molto spesso vuol dire poter capire la natura del flow, della pipeline, poter ragionare sui processi di unione di tabelle o queries che ne sono alla base, supporre l’errore umano di data entry o una mancanza dovuta a un limite del software. Vuol dire alla fine crearmi un dizionario generico preliminare con tanti: “sì, questa cosa la si può esplorare” e “no, da qui non ricaviamo nulla”.

E poi, diciamocelo, non è forse utile anche solo un feedback sugli errori all’interno di un dataset? Vogliamo riconoscere agli open data anche questo punto di forza?

Spremiamoli un po’ questi dati

XKCD, Machine Learning, CC-BY NC 2.5 https://xkcd.com/1838/

Dopo una panoramica su praticamente tutti i dataset disponibili nel portale, ho cercato di concentrarmi su quelli che potevano darmi qualche appiglio per poter giocare con le correlazioni e testare delle inferenze. Come succede spesso, riga di codice dopo riga di codice le domande da poter fare ai dati si moltiplicavano esponenzialmente. La cosa è partita con il classico approccio esplorativo, quello del “vediamo un po’…” , per finire con un perentorio stop auto imposto, perché altrimenti questo post vedeva la luce nel 2050 e perché le ore di sonno, così dicono, sono comunque preziose.

Ma soprattutto mi sono fermato perché, per quanto la mole di dataset sia interessante, non mancano purtroppo dei problemi che in molti casi precludono l’accesso a molte porte.

Nota: le esplorazioni e analisi che seguono sono relative solamente ai libri. Mi interessava in particolare una risposta dei dati sul mondo fisico dei libri, un discorso che è iniziato a Tempo di Libri nel 2017 con un lavoro esplorativo e di analisi fatto assieme a Giulio Blasi e reso possibile dalla collaborazione e disponibilità di tante altre persone. Il prossimo passo sarà magari uno sguardo anche sul digitale e un tentativo di comparazione. Il leitmotif in sottofondo in quell’occasione era: quale peso possono avere i dati delle biblioteche nel mercato editoriale? Io direi che ancora adesso è una delle domande più cruciali che ci si possa porre, in un frangente storico come questo.

Ma andiamo con ordine.

1. Il posseduto delle biblioteche per tipo di documento

Dataset: https://www.bibliotechediroma.it/it/open-data-posseduto-biblioteca-per-tipo-documento

La descrizione del dataset dice testualmente: “… Permette di seguire l’evoluzione del patrimonio posseduto dalle Biblioteche di Roma: Libri, Audiolibri, Compact disc, DVD, Materiale Multimediale”

Bene, mi sono detto, ecco un ottimo inizio per disegnare una serie storica mese per mese del patrimonio e magari ricavare per differenza la quantità di novità immesse nel catalogo. L’arco temporale di questi dati, al momento, va da settembre 2017 a maggio 2018. Un po’ di data wrangling e sono arrivato a:

tabella 1

e quindi, scegliendo di contare solo il numero di titoli di libri presenti nel catalogo (ripeto, tutta l’analisi riguarda solo i libri e non altre forme di documenti) a:

tabella 2

Primo campanello d’allarme: celle vuote risultanti dall’aggregazione.

posseduto_sett_2017_mag_2018.isnull().sum()
Mese
Biblioteca inventario 0
Sep 5
Oct 5
Nov 5
Dec 5
Jan 5
Feb 4
Mar 3
Apr 3
May 2
dtype: int64
tabella 3

Com’è possibile che alcune biblioteche avessero dai 15000 ai 30000 libri a settembre 2017 e poi più nulla nei mesi successivi? Ho ricontrollato più e più volte, pensando alla fine che l’errore fosse dovuto alla fase di esportazione oppure all’eliminazione forzata di alcune sedi dal dataset. Non ci ci sono note a riguardo sulle pagine del sito. Pazienza, è un errore. Poi, controllando sulla pagina della Biblioteca Rispoli leggo questo:

da sabato 31 dicembre CHIUSO DEFINITIVAMENTE
(La struttura è stata chiusa al pubblico dal 2 gennaio 2017)

La Biblioteca Tullio De Mauro sembra avere invece solo quotidiani e riviste.

Insomma tutte sedi non rilevanti per i nostri numeri. Ho risolto eliminandole dal dataset. In totale sono 7 su 58.

['BIBLIOTECA RISPOLI',
'BIBLIOTECA TULLIO DE MAURO',
'BIBLIOTECA VILLA MERCEDE',
'CASA DELLE LETTERATURE',
'PIM CENTRALE',
'REBIBBIA RECLUSIONE 2',
'REBIBBIA TERZA CASA']

Dai dati delle 51 sedi rimanenti speravo di ricavare, per differenza con il mese precedente, il numero di nuovi titoli immessi in catalogo. Cosa che ho scoperto non essere possibile perché le differenze erano in alcuni casi negative. Probabilmente per via di scarti inventariali o altri motivi tecnici che ignoro. Il posseduto è, ovviamente, il totale reale dei titoli a catalogo alla fine del mese.

E arriviamo così al primo suggerimento:
Dato che esiste un dataset Open Data Movimento prestiti su nuove acquisizioni ed è davvero interessante, sarebbe utile averne uno che ci dica anche quali sono i titoli nuovi che entrano in catalogo ogni mese. Una cosa semplice per ciascuna esportazione mensile del tipo:

DATA INGRESSO | INVENTARIO | ID TITOLO | TITOLO | BIBLIOTECA

Questo permetterebbe un’analisi approfondita sulla proporzione di novità movimentate nel tempo rispetto alla quantità acquistata. E, soprattutto, potremmo valutare nel corso dell’anno quanto pesa l’effetto “novità” sui prestiti dei libri totali delle biblioteche. Insomma, cose belle, code lunghe e distribuzioni di probabilità bernoulliane all’orizzonte.

Metto un attimo da parte questo dataset per passare alla parte più divertente, ma teniamolo buono, perché ci serve più avanti e perché, alla fine, non si è rivelato poi così inutile.

2. I prestiti

Dataset: https://www.bibliotechediroma.it/it/open-data-dettaglio-movimento-prestiti

Periodo: giugno-ottobre 2017

Perché: perché sulla pagina dei dataset mancano i mesi di novembre 2017, gennaio 2018 e febbraio 2018.
L’unica serie storica continua possibile, nonché la più ampia, è appunto quella da giugno a ottobre 2017 (ho segnalato a BiblioTU la cosa e mi hanno gentilmente risposto che provvederanno a integrare. Con i dati mancanti, avremo per le mani un meraviglioso anno intero, con tutte le implicazioni e le analisi della stagionalità possibili e immaginabili.)

Filtrando dai circa 300.000 movimenti totali del periodo giugno-ottobre 2017 solo quelli relativi ai libri, ho ottenuto un dataset di 222.920 righe.

2018-07-25 20:59:20,938 INFO: Movimenti giu-ott totali: 303608
2018-07-25 20:59:21,704 INFO: Movimenti giu-ott solo libri: 222920

Delle 51 biblioteche che avevamo in precedenza, quelle con movimenti nel periodo sono effettivamente 42. Rimangono fuori:

['B. COSTANZO LICEO GIULIO CESARE',
"BIBLIOTECA DELL'AVVOCATURA",
'BIBLIOTECA DI STATISTICA',
'BIBLIOTECA WWF ITALIA P.L.FLORIO',
'CASAL DEL MARMO',
'COMUNE DI ROMA - CENTRO SISTEMA',
'REBIBBIA FEMMINILE',
'REBIBBIA NUOVO COMPLESSO',
'REBIBBIA RECLUSIONE 1',
'REGINA COELI SEZIONE 3',
'REGINA COELI SEZIONE 4',
'REGINA COELI SEZIONE 6']

Ciascuna riga del dataset è un movimento legato a un utente del quale non abbiamo un identificativo, per via della tutela della privacy. Sappiamo se l’utente è un lavoratore, uno studente o un pensionato, sappiamo quanti anni ha ma non possiamo utilizzare questi dati pensandoli legati a una singola persona. Bisogna cercare di generalizzare in qualche modo.

[Il tema dell’anonimizzazione dei dati sensibili gode comunque (e per fortuna) di grande popolarità. Esistono, volendo, metodi e tecniche che consentono un buon compromesso tra “oscuramento” e “arricchimento del dato”. Nel numero di aprile 2018 di The Computer Journal (British Computer Society) è stato pubblicato un paper molto interessante sulla proposta di un cosiddetto metodo k-NMF per la pubblicazione di Social Network Data. Una soluzione intermedia potrebbe essere anche quella di generare mensilmente semplici chiavi algoritmiche dagli id utenti reali e non renderle consistenti di proposito con i mesi precedenti o successivi. Su Kaggle alcuni dataset adottano metodi analoghi. Insomma, ci si può ragionare.]

Altro problema: l’età dell’utente non è presente nei movimenti del tipo “Prestiti intersistemici”.

2018-07-25 22:23:37,887 INFO: Totale prestiti intersistemici: 22535
Identificativo Titolo         0    
Titolo 0
Cod. tipo materiale 0
Tipo materiale 0
Cod. tipo documento 0
Tipo documento 0
Cod. natura 0
Natura 0
Cod. tipo monografia 0
Tipo monografia 0
Anno di pubblicazione 14
Cod. Lingua 1 0
Lingua 1 0
Cod. Paese 0
Paese 0
Cod. tipo movimento 0
Tipo Movimento 0
Data inizio movimento 0
Biblioteca movimento 0
Cod. tipo utente movimento 0
Tipo utente movimento 0
Eta' utente-movimento 22535
Identificativo movimento 0
dtype: int64
tabella 4

Un errore dovuto più probabilmente all’esportazione che non al software di gestione. Da qualche parte dovrà pur essere registrato il movimento dell’utente con annessi dati anagrafici (tra l’altro quasi sicuramente l’età è ricavata dinamicamente da un time diff tra la data del prestito e quella di nascita, quindi nulla di più semplice per un’integrazione). In ogni caso, bisognerà tenerne conto nell’analisi per fasce di età.

Titoli

Come prima cosa sono andato a guardarmi i numeri relativi ai titoli. Questo perché ogni particella dell’organismo pulsante del mondo dell’informazione è dominato da quella che chiamiamo “Legge di Potenza” (Power Law). Pochi autori pubblicano la maggior parte dei titoli, pochi titoli monopolizzano l’80% delle vendite, pochi lettori costituiscono da soli l’80% del consumo di libri e così via. Albert Greco ne ha dissertato per quasi 400 pagine in un libro capitale, uscito circa 15 anni fa: The Book Publishing Industry. Qui una pagina che sintetizza il fenomeno in un modo schietto e diretto.

tabella 5

Nell’arco di 5 mesi, circa 223.000 movimenti riguardano 84.560 titoli. Bene, direte, una media di 2.5 prestiti per titolo. E invece…

La distribuzione è abbastanza brutale. Paolo Cognetti, Teresa Ciabatti, Paula Hawkins e pochi, pochissimi altri, svettano con il maggior numero di prestiti. Segue una coda lunghissima e non meno interessante (ne parliamo tra un po’).

I percentili dei movimenti parlano da soli:

Il 75% dei titoli prestati è sotto i 3 movimenti.

Fatti i dovuti conti, questo si traduce nel fatto che il 25% dei titoli pesa, nel nostro caso, per il 54% dei movimenti complessivi. 13.623 titoli si portano a casa 119.750 prestiti. Già da sola, una situazione come questa si meriterebbe un’analisi a parte. Da cosa dipende? Dagli acquisti concentrati sugli stessi titoli? Dall’effetto “novità”? Dal fatto che la gente usa meno i cataloghi delle biblioteche di quanto non assorba esposizioni fisiche e digitali delle librerie? Dalla pubblicità?

Comunque sia, la curva del grafico è una classica distribuzione paretiana. E’ un’amica, ci convivo, niente paura. E la sua funzione di densità di probabilità (PDF) è questa:

(mi scuso per le formule in formato immagine ma… su medium non si può scrivere in LaTex, quindi, siccome ho riaperto tipo dopo 3 anni LaTexiT sul Mac, abituato oramai al markdown supportato un po’ dovunque, ve le beccate comunque e pure in questo formato. Non fosse altro per il tempo perso a riparare i symlinks di brew con ghostscript, printpdf e famiglia. So di avere la solidarietà incondizionata di chi vive di sistemi unix e package manager, quindi va tutto bene.)

La funzione di ripartizione empirica (nota come ECDF) della distribuzione dei nostri prestiti per titolo si presenta infatti così:

Essendo già qui sul versante probabilistico, diciamo che c’è praticamente il 90% di probabilità nell’intero sistema BiblioTU che un titolo venga prestato meno di 10 volte nell’arco di 5 mesi.

Se sovrapponessi alla linea rossa una distribuzione esponenziale teorica, con media e deviazione standard pari a quelle reali, otterrei una corrispondenza quasi millimetrica:

Questo per dire, senza farla tanto lunga, che con qualche calcolo in più scopriremmo di essere in presenza, con molta probabilità, di una perfetta legge di potenza.

Benvenuti nel mondo dei libri.

Anni di pubblicazione

Togliamoci subito il pensiero e, sempre sul discorso del 25% dei titoli che si mangiano il 54% dei prestiti, vediamo per curiosità gli anni di pubblicazione di questi titoli.

Non si può dire che sia evidente una distribuzione esponenziale latente, ma di certo non è una distribuzione normale. Anche all’interno del contesto “anni di pubblicazione”, in ogni caso, prova sempre a riemergere la regola dell’un quarto fa sempre più della metà del lavoro. Possiamo scomporre all’infinito, da qui non ci muoveremo più di tanto.

A meno che…

Sorpresa!

Tornando al totale dei nostri 222.920 titoli prestati tra giugno e ottobre del 2017, la distribuzione dei prestiti per anno di pubblicazione dei titoli si presentava così:

Quello spostamento della curva era interessante. Occhio alla funzione di ripartizione in questo caso:

Teniamola lì, perché esplorando in seguito i prestiti per singola biblioteca all’interno del sistema è successo qualcosa.

Prestiti per biblioteca

I percentili dei movimenti delle singole biblioteche mi hanno suggerito un’idea:

Il primo quartile contiene il il 25% delle biblioteche (tra le nostre 42 oggetto dell’analisi) con prestiti tra 1 e 1696 nell’arco di 5 mesi (le biblioteche con 1 movimento non sono nemmeno poche, segno che non è questo uno dei servizi principali in quelle sedi) .

E se togliessimo d’emblée quel quartile e scoprissimo che i dati si normalizzano di più?

Detto fatto. Risultato: tagliando sopra il 25. percentile se ne vanno 11 biblioteche su 42 ma rimane il 97% dei prestiti totali. Ora, il 97% inteso come campione di una popolazione di dati, in statistica, non è nemmeno lontanamente pensabile come tale. E’, di fatto, il 100%.

Le biblioteche responsabili di 216.534 movimenti sono:

['BIBLIOTECA GUGLIELMO MARCONI',
'BIBLIOTECA CORNELIA',
'BIBLIOTECA RAFFAELLO',
'BIBLIOTECA GIORDANO BRUNO',
'BIBLIOTECA CASA DEL PARCO',
'BIBLIOTECA VALLE AURELIA',
'BIBLIOTECA VACCHERIA NARDI',
'BIBLIOTECA COLLI PORTUENSI',
'BIBLIOTECA NELSON MANDELA',
'BIBLIOTECA EUROPEA',
'BIBLIOTECA SANDRO ONOFRI',
'BIBLIOTECA ENNIO FLAIANO',
'BIBLIOTECA CASA DEI BIMBI',
'BIBLIOTECA RENATO NICOLINI',
'BIBLIOTECA GALLINE BIANCHE',
'TEATRO BIBLIOTECA QUARTICCIOLO',
'BIBLIOTECA PENAZZATO',
'BIBLIOTECA FRANCO BASAGLIA',
'BIBLIOTECA GIANNI RODARI',
'BIBLIOTECA LONGHENA',
'BIBLIOTECA ENZO TORTORA',
'BIBLIOTECA VILLA LEOPARDI',
'BIBLIOTECA FLAMINIA',
'BIBLIOTECA BORGHESIANA',
'BIBLIOTECA ELSA MORANTE',
'BIBLIOTECA CENTRALE PER RAGAZZI',
'BIBLIOTECA PIER PAOLO PASOLINI',
'BIBLIOTECA GOFFREDO MAMELI',
'BIBLIOTECA VILLA MERCEDE',
'BIBLIOTECA RUGANTINO',
'COLLINA DELLA PACE']

È qui che bisogna indagare, questa è la locomotiva che traina i movimenti dei libri nell’intero sistema.

e, sorpresa delle sorprese:

anche se si tratta di un’approssimazione grossolana a una vera distribuzione normale, c’è gente che venderebbe l’anima per trovarsi di fronte a una situazione del genere.

Adesso sì che possiamo scendere agevolmente nel dettaglio dei prestiti per anno di pubblicazione.

Sosta in Autogrill nel 2016

La sproporzione di movimenti di titoli pubblicati nel 2016, rispetto al resto, meritava una pausa di riflessione.

Parliamo di 3.256 titoli editi nel 2016. Per un totale di 18.561 movimenti distribuiti così:

È evidente come dalla curva di successo di questi titoli sia esclusa, principalmente, la responsabilità della fascia di età dai 6 ai 35 anni.

Insomma quel picco dei titoli del 2016 lo dobbiamo ai bambini in età prescolare e agli over 35. Un dato demografico interessante che già da solo può far nascere un bel po’ di domande.

Per la precisione, queste sono le età responsabili dell’80% dei prestiti di titoli editi nel 2016 (le età sopra il 50. percentile di prestiti, in pratica la metà del campione):

[ 3,  4,  5,  6,  7,  8,  9, 11, 38, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 74, 75, 76, 77, 78]

E questa la top 20 delle loro preferenze:

tabella 6

Ho ritrovato nell’output della “top 20" una situazione che ho visto spesso. La sproporzione tra i titoli di narrativa e il resto degli argomenti. Sarebbe interessante avere il dataset con i dati di acquisto di cui parlavo prima, per capire se c’è una correlazione (o un bias magari sbilanciato versa la sola narrativa per adulti) tra la quantità di acquisti di narrativa e i relativi movimenti, e come tutto questo si relaziona al resto. Perché se c’è, questo bias, i dati ci suggeriscono che si sta probabilmente tagliando fuori dal gioco un’ampia fascia di età, che va dalla pre-adolescenza alla maturità degli over 30.

3. [intervallo]Machine learning

“Columbus was not the first person to discover America, but the last.”
― Pedro Domingos, The Master Algorithm: How the Quest for the Ultimate Learning Machine Will Remake Our World

A questo punto ero curioso di capire se, incrociando qualche dato, fosse possibile ricavare qualcosa di predittivo da queste 31 biblioteche.

La domanda che ho provato a fare ai dati è stata: quale percentuale della variabilità dei prestiti può essere spiegata con il totale dei titoli in catalogo ?

Spiegare in pratica questo:

tabella 7

con questo:

tabella 8

Gli unici 2 mesi che si possono correlare sono settembre 2017 e ottobre 2017. Ho scelto ottobre come banco di prova, un mese abbastanza lontano dall’estate e dal generale lento risveglio del mondo di settembre.

A prima vista, sembrerebbe esserci una certa correlazione:

Regressione lineare

Ho dato in pasto i dati a una regressione lineare giusto per capire se le indicazioni della KDE avevano una solida ragione d’essere (la stima kernel di densità è pur sempre un metodo non parametrico importantissimo per individuare, seppure sommariamente, dei pattern nella classificazione).

Dopo diverse prove, il massimo della precisione del modello che sono riuscito a ottenere è stato un punteggio del 47,22%.

Che equivale a dire: con questo approccio, solo il 47.22% della variabilità dei prestiti (y) può essere spiegato con il numero dei titoli in catalogo (X). E’ qualcosa, ma è ben poco per procedere oltre.

Un test previsionale del modello sui dati reali mi ha restituito questo (il grafico va osservato a coppie di pallini verticali. Alcuni si avvicinano, altri si sovrappongono ma l’imprecisione è fortissima nelle coppie molto distanziate):

k-nearest neighbors

Ho provato in seguito a creare un modello di regressione con l’algoritmo k-nearest neighbors, ottenendo il 61% di precisione. Già meglio del precedente 47,22% ma ancora troppo impreciso. Le coppie ravvicinate sono certamente di più, ma rimangono degli errori random distribuiti un po’ tra tutte le grandezze di numeri.

Quindi perché?

Ho scelto volutamente questi 2 esempi per un semplice motivo. Mi aspettavo un risultato del genere. Nel mondo dell’apprendimento automatico questo è il cosiddetto underfitting che fa capolino dai nostri modelli predittivi. Si verifica quando il modello è troppo semplice per apprendere correttamente le strutture sottostanti ai dati. I risultati ci dicono che la realtà è ben più complessa di come i 2 modelli la possono interpretare, e che, stando così le cose, le previsioni saranno sempre destinate ad essere inaccurate, perfino nella fase di training.

Soluzione: abbiamo bisogno di dati più performanti. Dataset con il numero del totale degli utenti attivi per mese e per ogni biblioteca, del totale dei libri posseduti con l’aggiunta dello storico acquisti delle novità, l’esatto numero mensile di utenti attivi per età… insomma qualsiasi numero importante sia possibile ricavare in più dal database del sistema.

I’m no expert but using a neural net on 200 data points is like killing an ant with a thermonuclear weapon. — un tizio, su Reddit.

Solo allora potremmo divertirci con modelli ben più complessi e tutto l’iter di estrazione e selezione delle features più indicate per insegnare alle macchine, una buona volta, come si studiano i numeri di una biblioteca.

4. Movimenti per fascia di età

Ancora qui? Wow!

Bene, se siete arrivati fino a qui forse vi interesserà sapere qualcosa sui movimenti, le fasce di età dell’Istat e le iscrizioni.

Andiamo con ordine.

Non potendo ragionare sui singoli identificativi utenti, le fasce di età sono alla fine in pratica l’unico metodo per analizzare i lettori. Anche qui, segnalo qualche errore nel campo età dei dati che magari si può correggere senza troppi problemi a monte:

tabella 9 (sono in tutto 25 movimenti con età > 900)

Per la scelta del range di età e del raggruppamento, ho provato a usare il criterio dell’ISTAT, che nelle sue indagini sulle biblioteche considera solo persone dai 6 anni in su (in realtà esistono delle tavole anche sulla prelettura dei bambini dai 3 ai 5 anni, da un indagine ISTAT se non sbaglio del 2015, ma è un contesto che richiede un approccio completamente diverso e una serie di ragionamenti a parte).

La distribuzione dei prestiti (sempre giugno-ottobre 2017) per età, senza l’applicazione di alcun raggruppamento, si presenta così:

Secondo le fasce di età dell’ISTAT:

Questo è già interessante. Stando al primo grafico sembrerebbe che il grosso dei movimenti sia prima di tutto dai 6 ai 10 anni. Secondo il raggruppamento con i criteri ISTAT svetta il range 35–54. Questo è un problema ben noto nella data visualization, che va sotto il nome di binning bias. Qual è la dimensione ideale dei rettangoli? Potremmo perdere giorni a parlarne. Per ora, accettiamo le cose così.

Tornando alla nostra ECDF, come si presenta la funzione di distribuzione della probabilità di questi movimenti per età?

Dando un’occhiata al range delle regressioni possibili su questi dati, sembrerebbe inoltre che la funzione che esprimono sia qualcosa del tipo: con l’aumentare dell’età diminuiscono i movimenti.

Chissà, sarebbe da indagare anche questo. Mi fermo qui per chiudere con le iscrizioni, dove vedremo qualcosa di più interessante. Le domande che possono nascere dall’analisi dei movimenti per età sono, in ogni caso, moltissime. Non ho nemmeno scalfito la superficie. Sennò questo post vedeva la luce nel… eccetera eccetera….

Come diceva Luca Rosati nel suo bellissimo libro del 2007, Architettura dell’informazione. Guida alla trovabilità, dagli oggetti quotidiani al web:

Correlate gente, correlate.

5. Iscrizioni

Dataset: https://www.bibliotechediroma.it/it/open-data-elenco-utenti-anagrafica-biblioteche-roma

Periodo: giugno-ottobre 2017 (e sì, stiamo sempre filtrando per quelle 31 biblioteche più attive di cui all’inizio del post)

Potevano mancare le serie storiche? :D

La premessa:

che secondo l’ISTAT sarebbe:

A confronto con i movimenti per fascia di età, le differenze sono notevoli. Sarebbe interessante un dato di confronto con altri sistemi nazionali, una omogeneizzazione dei dati capace di far “parlare” tra di loro Roma, Bologna e Milano, perché da tutto questo, in qualche modo, si potrebbe magari derivare una generalizzazione con una buona confidenza.

Sapere che abbiamo il 95% di probabilità che le distribuzioni, le medie e le deviazioni standard di questo sistema siano simili a quelle di altri sistemi non è la stessa cosa che avere un 95% di confidenza solo nel proprio giardino.

Le serie storiche

Nell’attesa che BiblioTU integri i dati mancanti di prestito per i mesi di novembre 2017, gennaio e febbraio 2018, ho preferito non sbilanciarmi su analisi comparative tra prestiti e iscrizioni. Le serie storiche hanno bisogno di un minimo sindacale di dati continui per essere modellabili.

Quello che secondo me è interessante notare, nei 5 mesi da giugno a ottobre 2017, è l’andamento delle iscrizioni passato al filtro di una serie di modellazioni statistiche preliminari.

Ho diviso il tutto in due grafici per maggiore chiarezza. Tra i principali responsabili delle linee degli andamenti segnalo solo la media mobile esponenziale (EWMA) con α = 2/(n+1), giusto per sapere che la funzione della varianza di ciascun intervallo temporale è influenzata dalla funzione della varianza di quello precedente. In ogni caso lo scopo è sempre ridurre il rumore.

Non ho calcolato alcun trend vero e proprio, una cosa però che con MLOL abbiamo fatto qui , nel mondo digitale, in maniera molto più complessa e con una mole di dati ben più importante. Per dire, si può fare, ma arrivati a questo punto del post forse non è il caso di allungare a dismisura con cose come i processi stazionari, ARIMA e compagnia.

Ecco i grafici:

la scala dei valori sugli assi Y è uguale nei 2 grafici, per cui lascio a voi la parte di interpretazione di queste serie. Tutto quello che è stato affrontato in questo post può essere facilmente scalato sulla singola realtà di ciascuna delle 31 biblioteche per quel che riguarda iscrizioni e movimenti di libri. Come ho detto all’inizio, la mole di dati è pur sempre interessante. C’è qualche errore qua e là ma facilmente correggibile a monte, in modo che i dataset siano un po’ più consistenti e omogenei.

Suggerimenti finali

Sarebbe utilissimo l’inserimento di una colonna con il numero di inventario nelle transazioni mensili relative ai prestiti (c’è già nel dataset dei movimenti sulle nuove acquisizioni, quindi si può fare). Utilissima anche una colonna con l’isbn perché si possano riconciliare gli autori o una colonna separata dal brodo testuale del titolo dei libri con il solo autore (purchè univoco, come nel VIAF e in Wikidata) e un’altra con l’editore. Insomma, due o tre accorgimenti che possono fare veramente la differenza e aprire l’analisi ad altri bellissimi mondi.

La Classificazione Commerciale (BIC e CCE)

non so quanti cataloghi online di biblioteche italiane ne facciano uso, ma secondo me è arrivato il momento di parlarne. Uno dei migliori (Opac Provincia di Varese), sia dal punto di vista della UI che del design funzionale, gestisce con tranquillità anche questo metadato senza pensare di sostituire alcunché ma solo di arricchire.

Note finali

Il codice dell’analisi è su github: https://github.com/marcogoldin/data_science/tree/master/open_data_bibliotu

Qui se volete leggerlo più comodamente dal browser: https://nbviewer.jupyter.org/github/marcogoldin/data_science/blob/master/open_data_bibliotu/OpenData%20BiblioTU.ipynb

A proposito di analisi degli autori, un aspetto molto importante nel mondo editoriale che è un peccato tralasciare, devo ringraziare di cuore Andrea Zanni, con il quale abbiamo discusso a lungo sopra questi dati. Lui che è un esperto in processi di riconciliazione era riuscito anche a ricrearmi una corrispondenza tra gli autori dei titoli nel dataset e la voce univoca VIAF-Wikidata. Non ho potuto usare quei dati non per colpa sua, ma per l’imprecisione dell’arzigogolato flusso di lavoro che mi ero creato per scorporare gli autori dalla descrizione dei titoli. Il margine di errore era troppo alto perché si potessero usare le voci univoche finali.

L’ISBD rimane un problema forse un po’ anacronistico, per quanto mi riguarda, nel panorama della metadatazione dei libri, e questo si riflette sull’appetibilità dei dati stessi. Un po’ come se all’interno di ciascun documento, in un indice di elasticsearch, dovessimo inserire per forza la sequenza di una scheda traforata degli anni 70 che lo descrive. E senza fornire campi standard alternativi. Ma tutto questo si potrebbe risolvere anche solamente lato software gestionale, a valle quindi dell’intera filiera della catalogazione, quindi sono fiducioso.

Ultima cosa, il formato bibframe con il quale BiblioTU offre l’intero catalogo è una bella cosa e orientata ai LOD, però per molti versi difficile da integrare in un processo di analisi. A volte una tabella fatta bene (in questo contesto, mica in assoluto) vale più di mille speculazioni sui tanto acclamati linked open data, che hanno un ambito di applicazione molto specifico e un po’ lontano dal mondo che sta dietro a questo post.

Da qualche parte ho scritto: “coda lunga” e “ne parliamo più avanti”. L’idea era di dimostrare come un motore di raccomandazione pensato bene, anzi benissimo, sia capace di fare emergere dal buio i titoli consultati 1 o 2 volte ma che hanno in potenza un appeal per un certo tipo di lettore. Ma ne parliamo un’altra volta, va’, con l’aiuto di LaTexIt ovviamente, “visto che il markdown su medium…”