Vizualizacija podataka na karti RH

BI alati / Poslovna analitika / Vizualizacija podataka

Vizualizacija podataka na karti RH

U ovom članku će se prikazati prilagođeno geokodiranje. Dakle, ukoliko imate hrpu ulica i gradova za koje želite saznati geografsku širinu i geografsku dužinu i želite ih prikazati na karti (recimo karti Republike Hrvatske), onda je ovo pravi članak za Vas. Sve korake ćemo raditi u statističkom jeziku R i komercijalnom alatu za poslovno izvještavanje i vizualizaciju podataka Tableau. Tableau, o kojem ste imali prilike već nešto pročitati u prošlim člancima, veoma jednostavno prikazuje podatke na kartama ukoliko posjeduje informacije o geografskoj širini i dužini te lokacije (u ovo slučaju izraženim u DDD-decimal degrees (decimalni stupnjevi) – npr. Lat: 45.80635, Lon: 45.80635). Te lokacije u Tableau se dalje mogu povezati sa stvarnim podacima prodaje pa se tako te stvarne geografske točke mogu pretvoriti u strukturne krugove (pie chart), gdje bi veličina tog kruga ovisila o visini profita u toj točki, a boja o kategoriji proizvoda (Department ispod) gdje je ostvaren taj profit. Ovdje se radi o veoma vrijednim informacijama, jer upravitelj na jednom geografskom prikazu može vidjeti točnu raspodjelu profita u toj državi/državama i to po kategoriji proizvoda ili usluge.

karta_Tableau

No, da bi to sve bilo ostvarivo potrebno je dobiti prvo informacije o geografskoj dužini i širini pomoću Google Maps API-a. U tu svrhu ćemo koristiti statistički jezik R. Osim R-a postoje i besplatne online stranice za ovu svrhu (www.findlatitudeandlongitude.com). Ovdje će se prikazati dvije modifikacije javno dostupnih skripti za prilagođeno geokodiranje. Prvu i jednostavniju ćemo detaljno objasniti, a druga će Vam biti dostupna kroz link za preuzimanje.

Kad pokrenemo R, prvo što trebamo je definirati sve pakete koji su nam potrebni za ovu svrhu te ih pozvati preko library() naredbe. U našem slučaju su to paketi: Rcurl, RJSONIO, plyr, splitstackshape. Nakon toga kreće definicija dviju funkcija od kojih je jedna za dohvaćanje url-a za svaku od adresa za koje želimo dohvatiti geografsku širinu i dužinu, a druga je funkcija ona koja iz preuzetih podataka dohvaća nama korisne informacije (u našem slučaju lat, lon te cijelu adresu). Nakon ovih ključnih početnih koraka može se započeti s radom.


library(RCurl)
library(RJSONIO)
library(plyr)
library(splitstackshape)

url <- function(address, return.call = "json", sensor = "false") {
  root <- "http://maps.google.com/maps/api/geocode/"
  u <- paste(root, return.call, "?address=", address, "&sensor=", sensor, sep = "")
  return(URLencode(u))
}

geoCode <- function(address,verbose=FALSE) {
  if(verbose) cat(address,"\n")
  u <- url(address)
  doc <- getURL(u)
  x <- fromJSON(doc,simplify = FALSE)
  if(x$status=="OK") {
    lat <- x$results[[1]]$geometry$location$lat
    lng <- x$results[[1]]$geometry$location$lng
    formatted_address <- x$results[[1]]$formatted_address
    return(c(lat, lng, formatted_address))
  } else {
    return(c(NA,NA,NA))
  }
}

Sljedeći koraci su učitavanje podataka, koji se u našem slučaju nalaze u csv formatu. Za primjer sam uzeo neke od najtraženijih lokacija u RH (Top 10 prema telefonski-imenik.biz). Kad preuzmete podatke ovdje, vidjet ćete da su formatirani na način „adresa, grad, država“ te se svaka adresa nalazi u drugom redku. Nama je potreban cijeli taj redak te njega kao upit šaljemo na Google Maps API. Učitavanje se odvija u prvim koracima naredbom read.csv te se odabire samo prvi stupac tablice (data.frame) pomoću  podaci$V1. Na taj način dobijemo jednostavno niz tekstova (adresa), koje ćemo jednu po jednu slati na API. Naredbom ldply koristimo prethodno definiranu funkciju geoCode te u ovom koraku zapravo dobijemo željene informacije koje sada sadrže geografsku širinu i dužinu.

</pre>
<pre>
podaci <- read.csv("Adrese.csv",sep="\n",header=FALSE,stringsAsFactors = FALSE)
podaci<-podaci$V1
lokacije <- ldply(podaci, function(x) geoCode(x))

lokacije1<-cbind(podaci,lokacije)
lokacije1$V1<-as.numeric(lokacije1$V1,decimal.mark=",")
lokacije1$V1<-format(lokacije1$V1, decimal.mark=",")
lokacije1$V2<-as.numeric(lokacije1$V2)
lokacije1$V2<-format(lokacije1$V2, decimal.mark=",")
lokacije1<-data.frame(cSplit(lokacije1,"podaci",","))
lokacije1<- na.omit(lokacije1)
colnames(lokacije1) <- c("lat","lon","Full Address","Street","City","Country")

write.table(lokacije1,"tableaudata.csv",sep=",",col.names = TRUE,row.names = FALSE)

Dakle, informacije su već sad pogodne za daljnu analizu, ali s obzirom da ih želimo prikazati u Tableau, potrebno je odraditi određene preinake tako da prilikom učitavanja podataka Tableau sve informacije prepozna kao geografske te da krajnji korisnik ne treba ništa raditi već samo učitati podatke. Prvo se naredbama as.numeric (iz teksta u broj) te format decimalni brojevi odvajaju zarezom „ , ” umjesto točkom „ . “. Ovo je bitno jer time olakšavamo prepoznavanje Tableau-u. Nakon toga se naredbom cSplit odavaja stupac naziva “podaci” na tri dijela (Adresa – Grad – Država) te se naredbom “colnames” stupci preimenuju u smislena imena. Naredbom “na.omit” brišemo sve eventualne praznine u našoj tablici. Ove korake možete preskočiti pa koristiti podatke već nakon ldply naredbe. Za kraj ostaje zapisivanje tablice u csv dokument, koji se zatim učitaju u Tableau.

Prilikom učitavanja ovog dokumenta možete primjetiti kako Tableau automatski prepoznaje, zahvaljujući formatiranju podataka, naše geografske podatke (pazite na to da li ste definirali da se dokument odvaja zarezom te da li ste stavili „“ za navod). Nakon učitavanja vrijeme je da se poberu plodovi našeg rada. Povucite “lon” na mjesto stupaca, a “lat” na mjesto redaka, te full address na mjesto detalja (Marks traka). Prikaz bi trebao izgledati kao na slici ispod. Dakle, već sada imate prikazane Vaše adrese na karti RH, a dalje se možete igrati s njima na koji god način želite pa da više izgledaju kao na prvoj slici (spojiti ih s nekim drugim podacima recimo o profitu te prihodima i rashodima).

karta

Za one koji žele za nešto više adresa saznati geografsku širinu i dužinu, skriptu preuzmite ovdje. Ova skripta pazi na dnevna ograničenja koja postavlja sam Google te se kreira privremeni dokument koji prati koliko je adresa obrađeno, a koliko je još ostalo.

Toliko o prilagođenom geokodiranju i uživajte u vizualizacijama na karti RH na kakvim bi Vam i Mislav Bago zavidio.