• Non ci sono risultati.

3.2 Data Transformation

3.2.1 Preparazione del Dataset

In Sezione 1.2, abbiamo introdotto ampiamente le tabelle che contengono i dati necessari al nostro studio. Ricordiamo che abbiamo a nostra disposizione anche l’informazione della categoria di utente che ha effettuato la chiamata, ricavato precedentemente applicando il Sociometro.

In questa sezione mostriamo come ottenere le informazioni temporali e spaziali che consentono di effettuare le aggregazioni utili a rispondere ai requisiti indicati nella Sezione 2.2. In particolare mostriamo come unire opportunamente le informazioni delle tabelle a disposizione di cui riportiamo brevemente il formato dei dati e un esempio di contenuto in Tabella 3.5.

Per prima cosa, abbiamo dovuto creare un dataset che mettesse in relazione le antenne telefoniche con le zone OMI, associando ogni antenna telefonica all’area OMI

timestamp tower caller duration 2007/09/10 23:34 36 4F80460 120 2007/10/10 01:12 36 2B01359 10 2007/10/10 01:43 38 2B19935 301 .. . ... ... ...

(a) Call Detail Records

tower latitude longitude

36 49.54 3.64 37 48.28 1.258 38 48.22 -1.52 .. . ... ... (b) Antenne

nome descr comune omi

PISA - B1 ... G702 B1 PISA - B2 ... G702 B2 PISA - R1 ... G702 R1 .. . ... ... ... (c) OMI

caller municipality label

4F80460 Pisa visitor 2B01359 Pisa resident 2B19935 Livorno resident 2B19935 Pisa visitor .. . ... ... (d) Etichette utenti

Tabella 3.5: Mostriamo il formato dei dati per le tabelle Call Detail Record (a), Antenne telefoniche (b), della suddivisione territoriale rispetto alle Aree Omogenee Immobiliari (c) e i profili degli utenti generate dal Sociometro (d).

che la contiene. La mappatura è stata fatta tramite dei comandi SQL su database PostGIS, effettuando una JOIN spaziale tra la tabella contenente le geometrie delle zone OMI e quella con le indicazioni della posizione delle antenne telefoniche (Tabella 3.6). Questa operazione è necessaria perché nella Sezione 2.2 abbiamo deciso che il livello di granularità spaziale minimo delle nostre analisi deve essere la zona OMI, per cui dobbiamo portare le informazioni delle chiamate effettuate dagli utenti etichettati al livello minimo spaziale desiderato. E’ necessaria quindi una giunzione spaziale tra la Tabella 3.5(a) e la Tabella 3.6 per ottenere la Tabella 3.7.

La successiva manipolazione ha riguardato l’arricchimento dei dati con il profilo dell’utente, generato dal Sociometro (Sezione 3.1.1), per il comune in cui ha effettuato la chiamata. Il risultato definitivo è mostrato in Tabella 3.8. Possiamo notare come

tower OMI Comune 36 B1 Pisa 37 B2 Pisa 38 R1 Pisa .. . ... ...

Tabella 3.6: Tabella risultato della query che effettua il JOIN spaziale tra la tabella delle zone OMI e quella delle antenne telefoniche. L’associazione delle antenne alle zone OMI è stata fatta valutando la distanza tra la posizione dell’antenna ed il centro della zona OMI.

timestamp OMI caller duration

2007/09/10 23:34 B1 - Pisa 4F80460 120 2007/10/10 01:12 B1 - Pisa 2B01359 10 2007/10/10 01:43 R1 - Pisa 2B19935 301

..

. ... ... ...

Tabella 3.7: Intersezione CDR grezzi con mappatura delle antenne sulle zone OMI. La Tabella è il risultato della giunzione tra la Tabella 3.5 (a) e la Tabella 3.6 e contiene le stesse informazioni dei CDR tranne che invece dell’antenna abbiamo l’indicazione della zona OMI e del comune da cui è stata effettuata la chiamata. a termine dell’intero processo, il dato di partenza è stato arricchito con una nuova informazione spaziale e con la tipologia di utente associata a quel territorio.

timestamp OMI caller duration label

2007/09/10 23:34 B1 - Pisa 4F80460 120 visitor 2007/10/10 01:12 B1 - Pisa 2B01359 10 resident 2007/10/10 01:43 B1 - Pisa 2B19935 301 visitor

..

. ... ... ... ...

Tabella 3.8: Intersezione CDR mappati con le etichette associate agli utenti dal Sociometro. Il risultato è l’intersezione tra la Tabella 3.7 con la Tabella 3.5 (d). Quindi, la Tabella contiene i CDR mappati con la zona OMI e con l’indicazione della categoria degli utenti.

L’ultima operazione che effettuiamo sui dati riguarda la manipolazione della marca temporale (timestamp), per i quali effetuiamo un troncamento all’ora in cui è stato registrato l’evento. In questo modo rispettiamo le scelte prese durante l’analisi dei requisiti in Sezione 2.2 fissando come livello di granularità temporale minimo l’ora. Il dataset, al termine della fase di Data Transformation è mostrato in Tabella 3.9.

Le operazioni che hanno riguardato la creazione dei dataset mostrati nelle tabelle 3.6, 3.7, 3.8 e 3.9 sono state effettuate tramite la realizzazione di un programma Python8. Come possiamo vedere nella descrizione dell’Algoritmo 1 contenente il

timestamp OMI caller duration label 2007/09/10 23 B1 - Pisa 4F80460 120 visitor 2007/10/10 01 B1 - Pisa 2B01359 10 resident 2007/10/10 01 B1 - Pisa 2B19935 301 visitor .. . ... ... ... ...

Tabella 3.9: Dataset finale, contenente i CDR arricchiti con la zona OMI dalla quale parte la chiamata, il profilo dell’utente e l’indicazione temporale a livello orario.

processo che ha portato dai CDR grezzi (Tabella 3.5(a)) alla creazione delle time series di granularità minima che andranno a popolare la struttura di archiviazione dati (Tabella 3.9), le operazioni di giunzione tra le tabelle sono state possibili attraverso l’uso delle strutture dati Dizionari. I dizionari in Python sono degli array che vengono indicizzati da un qualunque oggetto immutabile. L’oggetto che serve da indice viene anche detto chiave, mentre l’oggetto associato a quella chiave viene detto valore. Tale soluzione è molto efficiente perché nota la chiave, consente un accesso diretto al valore, molto più veloce di un accesso sequenziale.

Algorithm 1 Time Series Computation(CDR,SociometerLabels, P ole2M unicipality)

1: //Il metodo partendo dal dataset contenente i CDR grezzi, costruisce le time series di granularità minima che andranno a popolare la struttura di archiviazione dei dati.

2: Input: Insieme dei CDR grezzi CDR, insieme delle etichette utenti per ogni municipalità SociometerLabels, mappa relativa alla municipalità a cui appartiene ogni antenna indicata nei CDR P ole2M unicipality.

3: Output: Serie temporale oraria per ogni categoria di utente T imeSeries

4: //crea un insieme vuoto che mi conterrà le serie temporali

5: T imeSeries = ∅

6: //raggruppa gli id degli utenti per zona OMI, per ora e per categoria di utente

7: for all c ∈ CDR do

8: //ricostruisci la gerarchia spaziale partendo dall’antenna a cui è associata c

9: omi = P ole2Omi[c.site_id]

10: municipality = Omi2M unicipality[omi]

11: //etichetta l’utente associato a c per la municipalità corrente

12: labels = SociometerLabels[municipality][c.uid]

13: //conserva l’informazione temporale fino ad hour

14: date_trunc = trunc(c.date, hour)

15: //aggiungi l’utente all’insieme degli utenti presenti in quell’ora, in quella OMI e per quella categoria. L’insieme garantisce l’eliminazione dei duplicati

16: T imeSeries[municipality][omi][date_trunc][labels]+ = c.uid

17: return T imeSeries

Documenti correlati