Tracciare e Analizzare la Mobilità con Twitter e Neo4j

Pubblicato il Pubblicato in News

Un caldo benvenuto al nostro nuovo collaboratore Fabio

Fabio è un ingegnere dei trasporti e dottore di ricerca, appassionato di tutto ciò che riguarda la mobilità, dati e dinamiche di rete. Lavora come consulente a servizio di PA e privati su analisi di reti di trasporto, mobilità e pianificazione urbana, e studi di traffico. Ha svolto attività di ricercatore post-doc per due anni presso l’istituto IFISC di Palma di Mallorca analizzando dati provenienti da social networks, sistemi urbani e di trasporto.

Ha iniziato a collaborare con LARUS un paio di mesi fa, e ci piacerebbe presentarlo con un suo primo post riguardo al suo lavoro sulla mobilità attraverso dati di Twitter con Neo4j.

Introduzione

Nell’ambito dell’ingegneria dei trasporti, da qualche anno sto esplorando nuove fonti di dati che possono integrare o, in certi casi, sostituire adeguatamente le tecniche e le metodologie tradizionali di analisi della mobilità. In particolare, Twitter si è rivelata una ottima fonte di informazioni per stimare gli spostamenti di utenti, paragonabile alle tecniche tradizionali di rilevamento statistico. Dal lato della gestione dati, grazie al supporto che LARUS mi ha fornito, ho scoperto le potenzialità della tecnologia del database a grafo, specializzandomi in Neo4j, leader mondiale nel settore.

In questo articolo presento un caso di studio riguardante l’analisi della mobilità di utenti di Twitter che si spostano attraversando i 25 aeroporti più trafficati d’Europa, scrivendo almeno un tweet nell’ambito dell’area aeroportuale. L’utente è quindi tracciato nei suoi spostamenti effettuati prima e dopo il passaggio per ogni aeroporto.

Modellizzazione ed Importazione del database in Neo4j

Il database che si può estrarre da Twitter grazie alle API consiste in un file .json, da cui sono stati estratti solo i campi di interesse, in particolare:

  • user_ID – Identificativo dell’utente;
  • tweet_ID – Identificativo del singolo tweet emesso;
  • datetime – Campo contenente informazioni sulla data e sull’orario di emissione del tweet;
  • longitude – Coordinata Longitudine relativa all’emissione del tweet;
  • latitude – Coordinata Latitude relativa all’emissione del tweet
  • twitter_string – Testo del tweet.

In questo caso siamo interessati anche al testo vero e proprio del tweet, per effettuare una ricerca delle parole più utilizzate nell’ambito dell’aeroporto ed una possibile analisi di “sentimento” dell’utente in presenza di eventi quali ritardi, scioperi, etc.

I dati estratti dal .json in formato .csv sono stati quindi importati in Neo4j grazie al comando batch LOAD CSV.

Il modello dati in Neo4j è basato sui seguenti nodi e relazioni:

(:User)-[:VISITED]->(:Loc)
(:User)-[:WRITES]->(:Tweet)
(:Tweet)-[:EMITTED]->(:Loc)
(:Loc)-[:IS_WITHIN]->(:Airport)

datamodel

 

Analisi e Queries sul Database

Di seguito presento alcuni esempi delle potenzialità di Neo4j e del modulo py2neo per interagire molto semplicemente con il database, fornendo molto facilmente informazioni relative al filtraggio di utenti e tweet automatici (bot) e parole chiave; come esempio facciamo riferimento ai dati di Twitter degli ultimi 3 anni relativi all’aeroporto di Zurigo (ZRH).

Filtraggio utenti/tweet automatici (bot)

Con Neo4j possiamo contare rapidamente il numero totale di tweets emessi da ogni singolo user nell’area aeroportuale, e quanti utenti twittano lo stesso tweet:

MATCH (u:User)-[:WRITES]->(t:Tweet)-[:EMITTED_IN]->(l:Loc)-[:IS_WITHIN]->(a:Airport)
RETURN u AS user, count(t) AS nTweets, t AS tweet, count(u) AS nUsers
ORDER BY nTweets DESC

Possiamo quindi evidenziare il primo classificato (come sospettato di essere un ‘bot’ a causa del numero estremamente elevato di tweets) con:

MATCH (u:User {user_id:520225342})-[:WRITES]->(t:Tweet)
return t.twitter_string AS string

Un semplice verifica sui dati permette di riconoscere che l’utente identificato è automatico; in questo caso si riferisce ad un generatore di informazioni relative al meteo atmosferico. Al fine di automatizzare la ricerca, è necessario calcolare alcune misure di similarità sulle stringhe. Una di queste è la Distanza di Hamming, che misura il numero di caratteri necessari per trasformare una stringa in un’altra. Tale funzione è facilmente implementabile esternamente a Neo4j grazie al modulo py2neo. Quest’ultimo pacchetto è sviluppato per Python, e consente un comodo strumento per interrogare il database e restituire i dati dalle queries direttamente nello script, e quindi analizzabili successivamente. I risultati statistici consentono di verificare che le sequenze dei primi 30 caratteri di ogni stringa di testo sono per la maggior parte uguali tra loro, secondo la seguente distribuzione:

Boxplot relativo alla distribuzione della Distanza di Hamming nei primi 30 caratteri delle stringhe dei potenziali utenti automatici.

 

Parole chiave

Nel caso di analisi della correlazione tra attività degli utenti ed operatività aeroportuale, è utile estrarre dal database strutture dati che corrispondano a determinate parole chiave che l’utente associa alle proprie esperienze di viaggio. In questo caso associamo la parola ‘delay’ ai messaggi emessi dagli utenti durante i loro passaggi NON in area aeroportuale:

MATCH p_OUT=(:User)-[:WRITES]->(t:Tweet)-[:EMITTED_IN]->(l:Loc)
WHERE NOT (l)-[:IS_WITHIN]->(:Airport) AND t.twitter_string CONTAINS 'delay'
return p_OUT

delayOUT

e, viceversa, quelli all’interno di ZRH:

MATCH p_IN=(:User)-[:WRITES]->(t:Tweet)-[:EMITTED_IN]->(:Loc)-[:IS_WITHIN]->(:Airport)
WHERE t.twitter_string CONTAINS 'delay'
return p_IN

delayZRH

 

E’ molto facile quindi selezionare sottoinsiemi di utenti in funzione sia del luogo di passaggio che del contenuto del messaggio. Con due semplici query abbiamo quindi diviso il dataset su utenti sui quali applicare un possibile “sentiment” in base al contenuto del messaggio durante la permanenza in aeroporto (p_IN), e quelli sui quali applicare un tracciamento spazio temporale (p_OUT).

Futuri Sviluppi

Ho presentato brevemente alcuni dei vantaggi che il database a grafo Neo4j riserva anche nell’ambito di analisi di mobilità. La potenzialità di estrarre strutture dati (anche da elaborare in ambienti esterni) in tempi molto rapidi e con strutture di query molto semplici fa si che Neo4j possa essere considerato un ottimo partner anche per gli studi di trasporto e tutto ciò che ha a che fare con una “rete” di informazioni. Ulteriori sviluppi del progetto sono diretti verso il tracciamento puntuale delle località visitate dagli utenti, al fine di estrarre un possibile luogo di residenza, e la potenziale costruzione di matrici Origini/Destinazione, strutture fondamentali nell’ambito dell’ingegneria dei trasporti.

Maggiori informazioni tecniche relative alla modellizzazione, importazione ed analisi dei dati sono reperibili nella mia pagina GitHub relativa al progetto Neo4j-mobility e nel mio Sito Web.

Ringraziamenti

I dati di Twitter sono stati estratti dall’IFISC per scopi di ricerca. Grazie a LARUS per l’introduzione ai database a grafo e per il supporto nella gestione dei dati.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *