*** R programı ile ilgili eski dökümanlara ulaşmak için lütfen buraya tıklayınız.***

Veri analizi ve görselleştirmenin öneminin giderek arttığı bu dönemde, bu trende bağlı olarak spatial(konumsal) verinin kullanımı da önem kazandı. Özellikle demografik konuların, örneğin işszilik oranı, göç oranı vs grafiksel olarak sunumu, spatial dataların en çok kullanıldığı yer olarak gösterilebilir.

R’da spatial dataları görselleştirmek için çeşitli yollar mevcut. Bunlardan biri Hadley Wickham tarafından bir haftasonu projesi olarak ortaya çıkan ggplot2 kütüphanesi kullanarak harita çizdirme, bir diğeri ise ggmap kütüphanesi kullanarak harita çizdirme. Ayrıca en çok kullanılan yollardan biri de maps kütüphanesi kullanarak harita çizimi. Bu dosyada ggplot2 vemaps kütüphaneleri kullanarak harita çizimi konusuna bakacağız. ggmap ise yolda. :)

İlk olarak konumuzla alakali kütüphaneleri yükleme ve ardından çağırma işlemlerini yapmak zorundayız.

install.packages("tidyverse")
install.packages("sp") #for spatial data
install.packages("map")
install.packages("mapproj")
install.packages("ggmap")
install.packages("DeducerSpatial")
install.packages("maps")

maps Kullanarak Harita Çizimi

Bu örneğin İngilizce hali bu linkte bulabilirsiniz.

İnternette maps kütüphanesi kullanarak R’da harita çizdirmek diye aratma yaptığınız zaman, en çok göreceğiniz örnek Amerika’ya ait. Bunun nedeni ise maps kütüphanesinin indexinde saklı. help(package='maps') komutunu çalıştırdıktan sonra yardım menüsünde gelen listeye baktığınızda, bu kütüphanede sınırlı sayıda-Amerika, İtalya, Yeni Zelanda, Fransa, Çin ve Kanada- ülke haritasının olduğunu görüyorsunuz.

require(maps)
## Loading required package: maps
map("usa") #map komutu harita ve poligon çizimi için kullanılıyor

Eğer Amerika haritası eyaletlerine bölünmüş olarak çizdirmek istiyorsanız, map komutunun içine maps kütüphanesinin içinde yer alan county seçeneğini kullanabilirsiniz.

map("county")

Uygulama

Amerika’daki eyaletlerin işsizlik oranlarının, oranların büyüklüğüne göre renklendirilmiş haritada gösterilmesi.

data(unemp) #data komutu yardımıyla R'ın içerisinde yer alan dataları enviromentimizie yüklüyoruz.
data(county.fips)
head(unemp) #datamızın ilk 6 satırını görmek için head komutunu kullanıyoruz. 

Bu datasetinde fips kolonunun altındaki sayılar eyaletlere karşılık gelirken, pop kolonu bu eyaletlerin populasyonlarını, unemp kolonu da işsizlik yüzdelerini göstermekte.

head(county.fips)

County.fips dataseti ise 2 kolondan oluşmakta. fips kolonu tıpkı bir önceki datasetinde olduğu gibi eyaletleri gösterirken, polyname kolonu fips numaralarına karşılık gelen eyaletlerin isimlerini göstermekte.

colors = c("#F1EEF6", "#D4B9DA", "#C994C7", "#DF65B0", "#DD1C77", "#980043")

Burada birbirine yakın tonlarda 6 adet renk belirledik. 6 adet renk belirlememiz tamamen tercihimize bağlı, çünkü işsizlik oranını 6 aralığa bölerek yapmak istedik bu örnekte. Ancak siz bu sayıyı azaltabilir ya da arttırabilirsiniz.

unemp$colorBuckets <- as.numeric(cut(unemp$unemp, c(0, 2, 4, 6, 8, 10, 100)))  
head(unemp)

Burada unemp datamıza colorBuckets adında yeni bir değişken oluşturduk. Bu değişkeni oluştururken cut komutundan faydalandık. cut komutu herhangi bir numerik değişkeni belirlenilen aralıklara bölmeden kullanılır. Daha fazla detay için bu adresi ziyaret edebilirsiniz

colorsmatched <- unemp$colorBuckets[match(county.fips$fips, unemp$fips)]
map("county", col = colors[colorsmatched], fill = TRUE, resolution = 0, lty = 0, projection = "polyconic")
# Add border around each State
map("state", col = "white", fill = FALSE, add = TRUE, lty = 1, lwd = 0.2, projection = "polyconic")
title("Eyaletlerin işsizlik oranı / Amerika, 2009")
leg.txt <- c("<2%", "2-4%", "4-6%", "6-8%", "8-10%", ">10%")
legend("topright", leg.txt, horiz = TRUE, fill = colors)

ggplot2 Kullanarak Harita Çizimi

ggplot2 kullanımına dair temel bilgiler için lütfen tıklayın

Yukarıdaki örnekte de görüldüğü gibi maps kütüphanesini kullanarak R’da haritasını çizdirebileceğimiz ülkelerin sayısı kısıtlı. Ancak ggplot kütüpanesi kullanarak, spatial datasını indirdiğiniz her ülkenin haritasını kolayca çizdirebilirsiniz. Bu örnekte 2015 yılında TUİK tarafında yayınlanan Türkiye’de illere göre mutluluk endeksi datasını ve aşağıda yazan siteden elde edilen Türkiye’nin spatial datasını birleştirerek bir harita grafiği elde edeceğiz.

İlk olarak bu adresteki linkten Türkiye’yi seçip, dosya formatı olarak da R (SpatialPolygonsDataFrame) ’i seçiyoruz. Not: Buradan indireceğiniz veriyi ticari amaçla kullanamazsınız.

Ardından ekranınıza her bir R dosyasının yanında yazan level 0, level 1 ve level 2 seçeneklerini göreceksiniz. Bunlardan level 0, il ve ilçelerin olmadığı sadece Türkiye ülke sınırlarının yer aldığı dosyadır.Öte yandan level 1 il sınırlarının dahil olduğu, level 2 ise ilçe sınırlarının da dahil olduğu dosyadır. Bu örnekte illerle ilgilendiğimiz için biz level 1 i indiriyoruz.

require(tidyverse)
## Loading required package: tidyverse
## -- Attaching packages ---------------------------------------------------------------------------- tidyverse 1.2.1 --
## <U+221A> ggplot2 2.2.1     <U+221A> purrr   0.2.5
## <U+221A> tibble  1.4.2     <U+221A> dplyr   0.7.6
## <U+221A> tidyr   0.8.1     <U+221A> stringr 1.3.1
## <U+221A> readr   1.1.1     <U+221A> forcats 0.3.0
## -- Conflicts ------------------------------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
## x purrr::map()    masks maps::map()
library(sp) # Konumsal (Spatial) veri için

Spatial veriyi okutma;

tur<- readRDS("turkey.rds") #reading a spatial data
plot(tur)

Verinizi okuttuktan sonra plot komutu ile kolayca görselleştirebilirsiniz, ancak başlıkta da belirtildiği gibi biz bu görselleştirmeyi ggplot2 kütüphanesinin komutlarını kullanarak yapacağız.

tur@data %>% as_tibble() %>% head(10) 

Datayı tibble dosyası haline getirdik, böylece ilerleyen aşamalarda tidyverse içerisinde yer alan tidyr kütüphanesindeki left_join komutunun kullanımını kolaylaştırdık. Ardından head komutu ile datanın ilk 10 satırına göz attık.

ID_0 : Ülke Kimlik Numarası

ID_1 : Şehirlerin kimlik numaraları, bu numaraları plaka kodları ile karıştırmayın.

ID_2 : Bu veride yok ancak ilçelerin kimlik numaraları

Aynı şekilde,

NAME_0 : Ülke ismi

NAME_1 : Şehir isimleri

NAME_2 : İlçe İsimleri

ggplot(tur,aes(x=long,y=lat))+geom_polygon()
## Regions defined for each Polygons

Bu haritanın beklenilenden farklı çıkmasının sebebi, ggplot komutunun elimizdeki veriyi tam olarak anlamamasından kaynaklanıyor.

ggplot(tur, aes(x = long, y = lat)) + geom_polygon(aes(group = group)) + coord_fixed()
## Regions defined for each Polygons

Ülke sınırlarını çizdirdikten sonra şehirlere bölmek için sp kütüphanesinin içindeki fortify fonksiyonunu kullanacağız.

tur_for <- fortify(tur) # Bu fonksiyon 'sp' paketinin içinde.
## Regions defined for each Polygons
head(tur_for) #her ilin lattitude ve longitude değerleri gösterililyor
ggplot(tur_for) + geom_polygon(aes(x = long, y = lat,group = group),color = "white",fill = "red") +
theme_void() + coord_fixed()

Şimdi TUİK’ten indirdiğimiz excel dosyasını okutuyoruz. Konu başında da belirtildiği gibi data, Türkiye’deki 81 ilin mutluluk endeksini göstermekte.

mutluluk=read.csv("mutluluk.csv",header=T,sep=";")
head(mutluluk)

Bu noktada karşımıza ufak bir problem çıkıyor.

head(tur@data$NAME_1)
## [1] "Adana"    "Adiyaman" "Afyon"    "Agri"     "Aksaray"  "Amasya"
head(mutluluk$sehir)
## [1] Adana          Adıyaman       Afyonkarahisar Ağrı          
## [5] Amasya         Ankara        
## 81 Levels: Adana Adıyaman Afyonkarahisar Ağrı Aksaray Amasya ... Zonguldak

Görüldüğü üzere spatial data ve okuttuğumuz datada şehir isimleri içinde farklılıklar var. Örn: Afyon ve Afyonkarahisar. Bu soruna ek Türkçe karakter sorunu da bir diğer problem. Bu sorunların çözümü için ise gsub fonksiyonunu kullanacağız. Bu fonksiyon karakter yapısındaki bir değişkenin içerisinde yer alan bir ya da birden fazla harfin değiştirilmesinde kullanılan bir fonksiyon.

x <- "Ozancan"
gsub("an","on",x)
## [1] "Ozoncon"
turkceden_ingilizceye <- function(dataset){
  turkce_harfler<- c("Ç","Ş","Ğ","İ","Ü","Ö","ç","ş","ğ","ı","ü","ö")
  ingilizce_harfler<- c("C","S","G","I","U","O","c","s","g","i","u","o")
  dataset=mgsub(turkce_harfler,ingilizce_harfler,dataset)
  return(dataset)
}



# Multiple gsub function

mgsub <- function(pattern, replacement, x, ...) {
  n = length(pattern)
  if (n != length(replacement)) {
    stop("pattern and replacement do not have the same length.")
  }
  result = x
  for (i in 1:n) {
    result <- gsub(pattern[i],replacement[i],result)
  }
  return(result)
}

tur@data$NAME_1 <- turkceden_ingilizceye(tur@data$NAME_1 )
tur@data$NAME_1 <- gsub("K. Maras", "Kahramanmaras",tur@data$NAME_1 )
tur@data$NAME_1 <- gsub("Kinkkale","Kirikkale",tur@data$NAME_1 )
tur@data$NAME_1 <- gsub("Zinguldak", "Zonguldak", tur@data$NAME_1 )
tur@data$NAME_1 <- gsub("Afyon","Afyonkarahisar", tur@data$NAME_1 )
mutluluk$sehir=turkceden_ingilizceye(mutluluk$sehir)

Yukarıda yazdığımız fonksiyon yardımıyla TÜİK’ten indirdiğimiz datadaki il isimlerini İngilice karaktere uygun bir hale getiriyoruz.

mutluluk%>%as_tibble

left_join kullanmak için tibble değişken tipine çeviriyoruz.

id_and_cities<- data_frame(id = rownames(tur@data), sehir = tur@data$NAME_1) %>% left_join(mutluluk, by = "sehir")

left_join kullanarak iki datayı ortak değişken olan şehir isimleri kesişecek şekilde birleştiriyoruz.

head(id_and_cities)

Artık son aşama. Yukarıdaki kodlarda da görüldüğü gibi ggplot kullanarak haritalama işlemi yapmak istiyorsanız elinizdeki datada mutlaka lattitude ve longitude değerleri olmak zorunda. Bu yüzden birkez daha left_join kullanarak bir önceki stepte oluşturduğumuz dataya şehirlerin lattitude ve longitude değerlerini ekliyoruz.

final_map <- left_join(tur_for, id_and_cities, by = "id")
head(final_map)
ggplot(final_map) +geom_polygon( aes(x = long, y = lat, group = group, fill = mutluluk), color = "grey") +
coord_map() +theme_void() + labs(title = "Türkiye'nin illere göre mutluluk indeksi-2015",caption = "Kaynak: Türkiye Istatistik Kurumu") +
scale_fill_distiller(name = "Mutluluk indeksi",palette = "Spectral", limits = c(0,100), na.value = "white") +
theme(plot.title = element_text(hjust = 0.5),plot.subtitle = element_text(hjust = 0.5))

Soru ve görüşleriniz için ozancan@metu.edu.tr adresine e-mail yollayabilirsiniz.