Time series, teoria dei grafi e la matematica di sé stessi: quello che non sapevo sul mio utilizzo di Twitter

Dal 18 dicembre 2015 ho uno script che mi salva in un foglio di calcolo tutti i tweet da me preferiti. La cosa era nata un po’ come un esercizio per aggiornarmi sulla nuova versione delle Api di Twitter, poi per la mia mania di raccogliere dati ho lasciato che lo script corresse ininterrottamente da allora a oggi. Non si sa mai.

Mentre scrivo ho un dataset di 1137 tweet preferiti (o meglio “piaciuti”, adesso che si usa il cuoricino) che continua e continuerà ad aggiornarsi. In fondo il mondo dei network personali è stato per me il punto di partenza, circa 5 anni fa, per una lunga avventura nella network analisi. Se mai a qualcuno potesse interessare l’uso di questo dataset come palestra, l’ho messo su github con licenza Creative Commons Attribuzione – Condividi allo stesso modo 4.0 Internazionale. Giocateci pure (magari fatemelo sapere che sono curioso). Stessa cosa per i due file usati per costruire il network di cui parlo alla fine del post: nodi e semi-archi (edges).

Mi chiedevo da tempo se un mining di questo mio dataset potesse raccontarmi cose che ignoro del tutto o parzialmente sul modo in cui uso Twitter;  mi chiedevo se strizzare con forza questa spugna potesse darmi dei suggerimenti o farmi capire bene come funzionano le mie reazioni nel mondo dei real time network.

Insomma, ho fatto due conti.

Esplorazione

Nella prima fase esplorativa ho cercato di capire la distribuzione dei dati guardandomi subito il violin plot relativo:

Su una scala da 0 a +50 risulta che, quantitativamente, ho messo pochi like ai tweet di molti account diversi e molti like ai tweet di pochi, selezionati, profili. La distribuzione mi suggerisce già l’asintoto della possibile rappresentazione cartesiana di questi dati.

Il boxplot che conferma gli indici di dispersione e di posizione dei miei like è questo:

Oltre l’upper whisker che delimita il 4° quartile ci sono 6 outliers che meritavano subito attenzione. Quali sono questi 6 profili ai quali in questi 15 mesi ho piaciuto moltissimi tweet?

Mi basta questo per dire che questi sono gli account che seguo e apprezzo di più su Twitter? No, non basta ed ecco perché: rappresentando per istogrammi le quantità di like, ma in modo che queste siano graficamente divergenti dalla media (in questo caso il punto 0 sull’asse x), ho scoperto che i profili che si sono guadagnati percentualmente più like da parte mia sono un po’ di più.

Per l’esattezza, 15 (@pycoders escluso).

Mi sento rappresentato dalla distribuzione di questi dati? Abbastanza. In quei 15 account ci sono amicizie e soprattutto persone che stimo profondamente, con in più le mie fonti preferite per l’aggiornamento su argomenti di lavoro.

Analisi della serie storica

A questo punto mi sono chiesto però se dietro a quei like non ci fossero altre correlazioni che magari mi sfuggivano. Ad esempio: qual è stata la mia frequenza di like in questi 15 mesi? La serie storica è poco interessante oppure ci sono delle costanti, delle stagionalità, dei periodi in cui uso di più Twitter o sono più attento ai contenuti degli account che ricevono più like da parte mia? Esistono dei trend? Vuoi mai che la storia dei miei like nel tempo sia una serie stazionaria?

Con una semplice normalizzazione logaritmica ho disegnato l’andamento settimanale dei mei like.

Dopodiché, grazie alla libreria statistica StatsModel per Python, mi sono costruito un test di Dickey-Fuller per capire se potevo individuare degli aspetti stagionali o meno in questi 15 mesi di utilizzo di Twitter. O meglio, il test l’ho costruito per determinare se la serie storica era o meno caratterizzata da un processo stazionario.

Una serie storica stazionaria ha proprietà (media, varianza, autocorrelazione…) costanti nel tempo. Perché è importante tutto questo? Perché moltissimi metodi di previsione si basano sull’assunzione che una serie storica possa essere resa approssimativamente stazionaria attraverso l’uso di trasformazioni matematiche.

Insomma, se domani mi andrà di costruire un modello predittivo dei like che metterò ai tweet di altri nel 2017, ho bisogno di dati connotati da un processo stazionario per allenare quel modello e minimizzare l’errore.

Per farla breve e il meno nerd possibile, diciamo che se le statistiche del test Dickey-Fuller (Test Statistic) sono inferiori ai valori critici (Critical Values) , possiamo rigettare l’ipotesi nulla e dire che la serie storica analizzata è stazionaria.

Test di Dickey-Fuller per la stazionarietà:
Statistiche del test -6.600671e+00
p-value 6.748515e-09
#Lags utilizzati 0.000000e+00
Numero di osservazioni usate: 75.400000e+01
Valori critici (1%) -3.536928e+00
Valori critici (5%) -2.907887e+00
Valori critici (10%) -2.591493e+00
dtype: float64

Le statistiche del test, -6.6, sono inferiori all’1% dei valori critici. Insomma potrei dire, così sulle prime, che questa serie storica è al 99% stazionaria.

Per esserne certo ho fatto un passo in più, ripassando i dati al Dickey-Fuller sottraendo la media mobile alla normalizzazione logaritmica.

Test di Dickey-Fuller per la stazionarietà:
Statistiche del test -4.506449
p-value 0.000191
#Lags utilizzati 5.000000
Numero di osservazioni usate: 56.000000
Valori critici (1%) -3.552928
Valori critici (5%) -2.914731
Valori critici (10%) -2.595137
dtype: float64

Le statistiche del test sono nuovamente inferiori all’1% dei valori critici. La serie è stazionaria, al 99%.

A questo punto potevo tentare addirittura di estrarre il trend dei miei like, per capire come potrebbe andare da qui a qualche mese. Il trend degli ultimi 15 mesi (linea rossa) è oscillante, con un segno di ripresa da novembre 2016. Se dovessi fare il bookmaker di me stesso, scommetterei che da oggi al mese di maggio 2017 la mia serie tornerà a toccare i valori (logaritmici) sopra al 3.

Volendo proprio essere pignoli e applicando uno shift sui periodi (le osservazioni) normalizzati logaritmicamente della mia serie storica, il test mi darebbe comunque valori statistici inferiori ai valori critici.

Test di Dickey-Fuller per la stazionarietà:
Statistiche del test -4.317878
p-value 0.000414
#Lags utilizzati 7.000000
Numero di osservazioni usate: 56.000000
Valori critici (1%) -3.552928
Valori critici (5%) -2.914731
Valori critici (10%) -2.595137
dtype: float64

Un bayesiano convinto (sul serio, clicca questo link, ne vale la pena) a questo punto mi direbbe che questa è la serie su cui dovrei costruire un modello predittivo per i miei like futuri. C’è poco da fare (aggiungerebbe): ho una serie che non ha tendenze a cambiare nello spazio e nel tempo e finché non arriveranno nuovi dati bisogna basarsi su questo 99% di attendibilità.

Spero solo che Twitter tenga conto anche di questo fattore, quando deve piazzarmi gli annunci pubblicitari nella timeline.

A questo punto…

Poteva mancare la teoria dei grafi?

Forte dell’autorità predittiva della serie dei miei like, mi rimaneva solamente da spazializzare con un grafo ad hoc l’analisi del mio network di account preferiti. Ho già pronto un modello per casi come questi, grazie alla libreria NetworkX per Python che, diversamente da Gephi, permette di mettere in produzione su un server un ragionamento completo in salsa network analysis per i più diversi scopi. Gephi, non voglio essere frainteso, è meraviglioso, ma pur sempre di un software si tratta e come tale esaurisce la sua funzione nella visualizzazione e al limite nell’esportazione in formati diversi del risultato. Non puoi usarlo nel machine learning, per farla breve, perché non espone delle Api per interfacciarsi dall’esterno.

Calcolando il peso dei semi-archi che vanno da me agli account ai cui tweet ho messo un like, e usando un algoritmo di force-directed graph drawing per la spazializzazione, ho ottenuto le cerchie del mio mondo di like. Quanto più gli altri account sono vicini al centro (dove mi trovo io) tanto più sono evidentemente importanti per me.

Gli algoritmi force-directed sono vere e proprie simulazioni fisiche dove viene assegnata una forza tra i semi-archi e i nodi calcolata sulle loro posizioni relative. Le forze di repulsione invece, che alla fine si traducono nelle distanze tra i nodi (vedi grafico sotto), sono calcolate simultaneamente ispirandosi alla fisica delle particelle elettricamente cariche. Alla base di tutto questo si trova la Legge di Hooke, un principio della fisica che dice semplicemente che la forza necessaria per estendere o comprimere di una certa distanza X una molla è proporzionale a quella distanza. Questo, per farla breve, permette di visualizzare un network in maniera esteticamente piacevole senza che i semi-archi si incrocino (o lo facciano il meno possibile) o si allontanino in maniera disordinata e non proporzionale tra loro.

I colori sono l’esito di un ragionamento e un calcolo della modularità a partire dalla media del peso dei semi-archi. Un clustering, in pratica, di account che rappresentano per me insiemi di importanze diverse, proporzionali alla distanza e al cerchio concentrico a cui appartengono.

Infine, con i nomi degli account:

 

 

 

 

 

 

 

 

 

 

Annunci
Time series, teoria dei grafi e la matematica di sé stessi: quello che non sapevo sul mio utilizzo di Twitter

Un pensiero su “Time series, teoria dei grafi e la matematica di sé stessi: quello che non sapevo sul mio utilizzo di Twitter

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...