Come fare geocoding su Tableau con R

Tableau è un potente strumento per la realizzazione di visualizzazioni basate sulle mappe. A volte può essere utile poter passare da un elenco di indirizzi o posti a un elenco di coordinate geografiche per poi poterli visualizzare sulla mappa. In termini più tecnici parliamo di “geocoding”. Tableau non permette di farlo autonomamente, ma è possibile farlo passando attraverso R.

R è un popolare linguaggio di programmazione open source per l’analisi statistica ed è implementabile in Tableau. In questo articolo vedremo come implementarlo, come fare geocoding su Tableau e su Tableau Prep.

R su Tableau

Per connettere R e Tableau bisogna ricorrere al pacchetto Rserve, che permette ai programmi esterni di usare R. Avere qualche base di programmazione è necessario per poter fare il geocoding.

Da RStudio installiamo e abilitiamo Rserve con i seguenti comandi:

install.packages(“Rserve”)

library(Rserve)

Rserve()

Fatto questo si va su Tableau > Help > Setting and performance > Manage Analytics Extension Connection e si sceglie RServe, la terza opzione. In hostname si scrive localhost e in Port 6311. Si fa Test connection e, se tutto ha funzionato, Tableau ci dirà che la connessione ha avuto successo. Salviamo e chiudiamo questa finestra.

Per una trattazione più dettagliata vi rimandiamo a un articolo pubblicato in passato.

 

Geocoding su Tableau

Per fare il geocoding è necessario affidarsi a servizi esterni. Ne esistono molti, ma per questo articolo abbiamo deciso di utilizzare Google e Open Street Map. Il primo è a pagamento ma con una prova gratuita, mentre il secondo è completamente gratuito. OSM può fare una richiesta di indirizzo al secondo, mentre Google in media a noi ne ha fatte 2 con picchi di 4-5.

Per il geocoding è necessario avere una serie di indirizzi. Noi abbiamo scelto di affidarci a 250 indirizzi di Torino, scelti in modo completamente casuale. Più è preciso l’indirizzo e maggiore sarà la precisione delle coordinate.

Il nostro dataset mostra l’indirizzo della città nel seguente modo:

A questo punto creeremo il campo “Location”, dove inseriamo anche la città e lo Stato: Torino e Italia. Se nel dataset avessimo ad esempio anche il CAP, potremmo inserirlo nel nostro campo calcolato.

Portiamo Location in vista al posto di indirizzo.

A questo punto abbiamo la Location da utilizzare per il geocoding, ma servono ancora un po’ di passaggi.

Nella prima versione utilizziamo i servizi Google, per cui è necessario avere un API. Si può fare da qui, registrandosi e inserendo i dati di una carta di credito valida. A quel punto Google fornisce un credito mensile ricorrente da $200 dollari che permette di scaricare i dati di migliaia di indirizzi. Bisogna quindi abilitare la Geocoding API e copiare la API Key (una sequenza di numeri e lettere).

Adesso torniamo su RStudio e installiamo le librerie necessarie. Il codice per farlo è

install.packages(“ggplot2”)

install.packages(“ggmap”)

Possiamo quindi tornare su Tableau. Portiamo Location sulle righe e calcoliamo il nostro primo campo nel seguente modo:

SCRIPT_REAL(

‘library(ggplot2); library(ggmap);

register_google(key = “##################”);

loc <- geocode(.arg1, output=”latlon”, source=”google”);

loc$lat’,

attr([Location]))

In key= “ “ bisogna inserire la chiave API che abbiamo salvato prima da Google.

SCRIPT_REAL indica che il dato che andiamo ad estrarre è un numero reale. library() carica i pacchetti di R che ci servono per la funzione. register_google() serve per dire a ggmap quale chiave API deve usare. La funzione geocode partendo da .arg1 estrae latitudine e longitudine usando i servizi Google. loc$lat estrae poi la latitudine. Tableau ad arg.1 sostituirà il campo che mettiamo dopo la virgola, in questo caso Location che abbiamo messo come attributo perché deve essere aggregato.

A questo punto replichiamo il tutto creando un altro campo calcolato che chiameremo Lon_Google identico in tutto tranne che nella penultima riga dove andremo a mettere loc$lon per avere la longitudine.

Se tutto ha funzionato dovremmo avere il seguente risultato in vista:

Ora vediamo come usare Open Street Map (OSM) per fare la stessa cosa. Come abbiamo detto prima ha il vantaggio di essere gratuito.

Lo script per calcolare la latitudine è il seguente:

SCRIPT_REAL(

‘library(rvest);

library(stringi);

library(jsonlite);

library(tidyverse);

address <- as.data.frame(.arg1);

query <- str_replace_all(string = address,pattern = “\\s|,”,replacement = “+”);

src_url <- “https://nominatim.openstreetmap.org/search?q=”;

addr <- paste(address, “Torino”, “Italia”, sep = “%2C”);

requests <- paste0(src_url, query, “&format=geojson”);

response <- read_html(requests) %>% html_node(“p”) %>%html_text() %>%fromJSON();

lon <- as.numeric(response$features$geometry$coordinates[[1]][1]);

lat <- as.numeric(response$features$geometry$coordinates[[1]][2]);

lat’,

attr([Location]))

 

Come si vede in questo caso lo script è leggermente più complesso. Molto brevemente, prende l’indirizzo, sostituisce agli spazi il + in modo da essere compatibile con il servizio che usiamo per estrarre le coordinate, compone la query, interroga il sito ed ottiene un json. Dal json poi estrae longitudine e latitudine e ci restituisce la longitudine.

Portiamo in vista, ma il calcolo non funzionerà. Bisogna spostare il computing using su cell e a quel punto farà il calcolo della latitudine.

Duplichiamo il campo e creiamo Lon_OSM andando poi a sostituire nella penultima riga lon a lat in modo da avere la longitudine. Portiamo in vista, modifichiamo il computing using ed eseguirà il calcolo.

A questo punto ci troviamo con i nostri indirizzi geolocalizzati. Adesso bisogna specificare a Tableau che si tratta di dati geografici e spostare Location in dettaglio, latitudine in riga e longitudine in colonna. Tableau genererà la mappa con i nostri pallini.

Quali limiti ha il geocoding su Tableau?

Il principale è che si lavora solo con table calculation. Ogni cosa che facciamo sul worksheet e che comprende i due campi calcolati (o Location) porterà a ricalcolare tutte le latitudini e longitudini, in quanto quei calcoli esistono solo in vista e non nella base dati. Per impedire questo, dopo che sono state calcolate, bisogna andare su Worksheet, poi su Auto update e poi su Auto update worksheet.

Quando le si metterà in mappa bisogna comunque riabilitare gli aggiornamenti automatici del foglio in modo che le ricalcoli e le faccia apparire.

In generale, quindi, per dataset non particolarmente grandi (qualche decina o poche centinaia) si può utilizzare questa soluzione, ma in un caso con migliaia di variabili potrebbe non essere la soluzione ottimale.

L’alternativa è quindi fare il Geocoding in Tableau Prep in modo che, quando arriviamo a Tableau Desktop, i dati siano già nella source. Per questo vi rimandiamo a un prossimo articolo; nel frattempo, potete continuare a seguirci sui nostri social!