R’da Mekansal Veri Bilimine Giriş

Giriş

Mekansal Veri Bilimi (Spatial Data Science) popülaritesi son yıllarda gittikçe artan, temel anlamda verilerdeki mekansallığı dikkate alarak analiz eden yeni bir bilim alanı. Veri biliminde kullanılan tekniklerin gelişmesi ve veri görselleştirmede her gün yaşanan yeni gelişmeler mekansal veri bilimini de olumlu yönde etkilemekte. Peki, nedir mekansal veri bilimi? Sadece veri biliminin bir alt alanı mıdır? Bu sorunun cevabı basitçe hayırdır. Günümüzde sosyal bilimlerin kullandığı pek çok veri, örneğin il bazındaki GSYİH verileri iller arası etkileşime tabi olan veriler. Ya da daha mikro ölçekte düşünecek olursak bir zincir marketin farklı mahallelerdeki satış ya da ciro rakamları yine mekansal anlamda o mahallelerdeki demografi, gelir gibi verilerden kaldırım genişliğine kadar çeşitli değişkenlerden etkilenmekte. Hal böyle iken söz gelimi basit bir regresyon analizinde bile eğer mekansal etkileşimi dikkate almazsanız, büyük bir olasılıkla sapmalı katsayılara ulaşacaksınız. Çünkü verileriniz mekansal etkiler içermekte ve siz bu etkileri dikkate almadınız! Mekansal Veri Bilimi bu bağlamda az önce bahsedilen lokasyon bazlı etkilerin hangi araçlarla göz önünde bulundurulabileceğine yönelik bir dizi istatistik, ekonometrik ve coğrafi bilgi kümesi olarak tanımlanabilir.

Mekansal Veri Analizinin iki ana ayağı bulunmaktadır: İstatistik ve Görselleştirme. Bunu yapabilmek için ise çeşitli GIS (Geographical Information Systems) tabanlı programlar kullanılır. Bunlar arasında en popülerlerinden biri ArcGIS’dir ki bireysel lisansı oldukça pahalıdır. Bunun dışında ArcGIS ile yapabileceğiniz her işi yapabileceğiniz bir başka program olan QGIS de var, üstelik free olarak download edebilirsiniz. Eğer mekansal veri bilimine harita mühendisliği ya da mekansal makine öğrenme değil de daha sosyal bilim perspektifinden yaklaşmak istiyorsanız, GeoDa programını kullanabilirsiniz. GeoDa hem free hem de her türlü mekansal istatistik (Moran’s I, Geary’s C, LISA) ve mekansal regresyon analizi yapabileceğiniz, az yer kaplayan ve gayet hızlı çalışan bir mekansal istatistik programı.

Bu araçlardan başka RStudio da mekansal analize imkan veren kütüphaneler (library) sayesinde ciddi bir açık kaynak imkan sunuyor. Bu kısa yazıda RStudio’da Türkiye’nin haritası ve verileriyle mekansal bir analiz için en önemli gereksinim olan shape file yükleme, mekansal veri birleştirme (spatial data merging) ve mekansal görselleştirme (geovisualization) üzerine giriş seviyesinde bilgi vereceğiz, umarım çalışmalarınıza yardımcı olur.

Shape File Yükleme

Öncelikle bu çalışmada bize lazım olan kütüphaneleri sistemimize yükleyerek aktif hale getirelim.

library(sf)
library(ggplot2)
library(dplyr)
library(tmap)

Burada kısaca belirtmek gerekirse “sf” ve “dplyr” kütüphaneleri veriyi sisteme yükler ve manipüle ederken; ggplot’da veriyi görselleştirirken işimize yarayacak. Şimdi mekansal veriyi nasıl yükleyeceğimizi anlatalım!

Mekansal analiz için en temel gereksinimlerden biri shape file denilen geometri dosyasıdır. Basit anlamda shape file, geometrik bilgiyi ve o geometriye ilişkin coğrafi özellikleri içerir. Bir shape file’daki geometrik bilgiler nokta, çizgi ya da poligon ile temsil edilebilirler. Burada basitçe bir ülkedeki şehirlerin her birinin birer poligon olarak ifade edildiğini söyleyerek devam edelim.

Mekansal analizde shape file’dan sonra bir diğer gereksinim duyduğumuz dosya .shx uzantılı dosyadır. Bu dosya “Autodesk AutoCAD” tarafından derlenen ve şekil ve font tanımlarını içeren bir dosyadır. Muhtemelen bu dosyayı hiçbir şekilde manipüle etmeyeceğiz, fakat o olmadan da en basit mekansal analizleri yapamayız. O yüzden .shx dosyası mekansal dosyalarımızın yer aldığı klasörde mutlaka bulunmalı!

Son olarak ihtiyaç duyduğumuz diğer dosya ise .dbf uzantılı veri dosyasıdır. Açılımı “data base file” olan bu veri dosyası geometrilerle (örneğin poligon) veriler arasındaki (örneğin il nüfusu) ilişkiyi kurar. Biz her yeni veriyi harita üzerinde görselleştirmek için almak istediğimizde, aslında .dbf dosyasına almış olacağız.

Bunlara, .prj, .gda, .sbx, vb. başka uzantılı dosyalar da eklenebilir fakat basit bir mekansal analiz için mutlaka az önce bahsedilen üç dosyaya (.shp, .shx, .dbf) ihtiyaç vardır. Ayrıca bu üç dosyanın adları da aynı olmalıdır. Örneğin;

# turkey.shp
# turkey.shx
# turkey.dbf

Bu 3 dosya varsa RStudio’da rahatlıkla mekansal analiz yapabiliriz. Peki bu dosyalara nasıl ulaşırız? Genelde bir harita için .shp file indirildiğinde söz konusu 3 dosya da indirilen klasörde bulunur. Bize kalan bu dosyaların manipülasyonudur. Burada temel mekansal analiz için Türkiye il haritasını kullanacağız. İnternette hem Türkiye’nin hem de diğer ülkelerin shape file’larına ulaşabileceğiniz sayısız kaynak mevcut. Bunlardan biri, Türkiye’nin de shape file’ına ulaşabileceğimiz şu adrestir: Turkey – Subnational Administrative Boundaries

Günümüzde Avrupa ülkelerinin siyasi sınırlarını çeşitli düzeylerde ifade etmek için NUTS (Nomenclature of Territorial Units for Statistics – İstatistiki Bölge Birimleri Sınıflandırması) terimleri kullanılmaktadır. NUTS1 ülkenin ana sosyo-ekonomik bölgelerini, NUTS2 bölgesel politikalar için daha küçük bölgeleri, NUTS3 ise bölgeden küçük olan mekanları ifade etmektedir. Türkiye’de de 12 adet NUTS1, 26 adet NUTS2 ve 81 adet NUTS3 (yani Türkiye’deki şehirler) bölgesi bulunmaktadır. Yukarıdaki linkten indireceğiniz klasör sadece NUTS3 düzeyindeki il haritasını (tur_polbnda_adm1 isimli dosyalar) değil, Türkiye’nin ilçe haritasını da (tur_polbnda_adm2 isimli dosyalar) içermekte. Eğer il düzeyinden daha detaylı, yani ilçe bazında bir analiz yapacaksanız söz konusu dosyaya güzel bir kaynak! Biz bunlardan Türkiye’nin şehirlerini içeren haritayı kullanacağız, dolayısıyla kullanacağımız shape file tur_polbnda_adm1.shp isimli shape file’dır. Ben dosyaları bir klasör şeklinde bilgisayarımın masaüstüne kopyaladım, kodların modifiyesinde kolaylık olması açısından siz de söz konusu dosyayı bilgisayarınızın masaüstüne alabilirsiniz. Haydi gelin önce Türkiye’nin NUTS3 düzeyindeki shapefile’ını RStudio’da açmaya çalışalım!

turkey <- st_read(
  "C:/Users/firat/Desktop/turkey_administrativelevels0_1_2/adm1a/tur_polbnda_adm1a.shp"
)

Yukarıda haritamızla ilgili ilk olarak temel bilgileri görüyoruz. Bilgiler bize basitçe kullandığımız dosyanın “ESRI Shapefile” olduğunu, 81 gözlem ve 8 değişken içerdiğini, çoklu-poligon olduğunu, haritamızın yer aldığı kesimin koordinatlarını (bbox) ve projekte edilip edilmediğini gösteriyor. Haritayı görselleştirmeye geçmeden önce .dbf file’da gömülü gelen verinin türü ile ilgili bilgi alabiliriz!

head(turkey)

head() kodu verilerimize ilişkin yeterince bilgi veriyor. İlk iki sütun verilerin Türkçe ve İngilizce isimlerini, adm_01 sütunu satırlara (yani il isimlerine) verilen ID’leri, Shape_Leng ve Shape_Area poligon alanlarına ilişkin bilgileri içermekte, geri kalan sütunlar ise bazı tekrar eden isim ve kısaltmalardan oluşmaktadır. Burada ihtiyacımız olmayan verilerden kurtulabiliriz. İleride mekansal analiz için kullanmayacağım bilgilerin yer aldığı Shape_Leng, Shape_Area , adm0_en, adm0_tr, adm0 kolonlarını siliyorum.

turkey <- turkey[, 1:3]
turkey

Burada shape file’ın içindeki değişkenleri dikkatlice incelemekte fayda var. İllerin İngilizce ve Türkçe isimleri sonraki veri birleştirme yöntemi için faydalı olabilir. Öte yandan bu değişkenlerin karakter sorunlarından dolayı veri birleştirirken sıkıntı çıkarması muhtemeldir. Bu konuya ileride tekrar döneceğiz. Yukarıda ayrıca “geometry” sütunu var. O sütundaki bilgiler sadece il sınırlarını çizmek için gerekli olan bilgilerden ibarettir. Aşağıda ilk üç sütunun ve geometry sütunlarının görselleştirmesi yer almakta.

plot(turkey)
plot(st_geometry(turkey))

Mekansal Veri Projeksiyonu

Bu basit haritalama ile çalıştığımız coğrafyayı basitçe görselleştirdik. Özellikle harita ile çalışırken verinin projeksiyonu önemlidir. Bazı ülkeler çok geniş bir alan kaplamakta, dolayısıyla da iki boyutlu düzlemlerde görselleştirilirken belli hatalar ortaya çıkmaktadır. Pek çoğumuz Alaska’nın ABD anakarasının neredeyse yarısı kadar göründüğü ya da Grönland’ın neredeyse Afrika kıtası kadar göründüğü haritalar görmüştür. Bu tür hatalar, harita görselleştirilirken ki projeksiyon yanlışlıklarından kaynaklanmaktadır. Türkiye bu konuda nispeten diğer ülkeler göre (ABD, Rusya) şanslı konumda çünkü onlar kadar geniş yer kaplamıyor. Dolayısıyla verinizi projekte etmeseniz de RStudio’nun otomatik olarak atadığı projeksiyon verisi (WGS 84) Türkiye haritası için çalışıyor görünüyor. Ama gelin yine de elimizdeki shape file’ın projeksiyon bilgisini kontrol edelim.

st_crs(turkey)

Burada son satırda gördüğümüz “ID[“EPSG”,4326]]” bilgisi haritamızın projekte edilmiş olduğunu gösteriyor. Peki “st_crs” kodunu çalıştırdıktan sonra şöyle bir ifade ile karşılaşmış olsaydık ne yapacaktık?

#proj4string: "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs

Bu ifade bize haritamızın projekte edilmediğini gösterecekti çünkü “proj4string” ifadesini “+proj=longlat” takip ediyor. Eğer karşılaştığımız sonuç bu şekilde olsaydı, o zaman haritamızı projekte etmemiz gerekecekti. Peki hangi projeksiyon bilgisini kullanmamız lazım? Bu sorunun cevabı derin felsefi tartışmalar gerektirir ki bizim amacımız sadece haritamızı doğru bir şekilde görselleştirmek. Bunun için ülkelerin EPSG kodlarını bulmamız işimizi görecektir. Bunu yapabilmek için de ülkelerin UTM paftalarını bilmemiz gerekiyor.

Kısa bir Google araştırmasından sonra Türkiye’nin 4 farklı UTM paftasına sahip olduğunu görüyoruz.

Bu pafta bölümlemelerinden 36 no’lu bölümleme başkent Ankara’yı kapsadığı için, haritamızı 36 numaralı UTM zone’una tekabül eden EPSG kodu ile projekte edebiliriz. 36 numaralı UTM paftasının EPSG kodunu internetten rahatlıkla buluruz! Buna göre 36 no’lu UTM paftasının EPSG kodu 32636’dır. Hadi gelin bu bilgiyi shape file’ımız için güncelleyelim.

turkey_utm <- st_transform(turkey, 32636)
st_crs(turkey_utm)

Görüldüğü gibi en alt satırdaki ID bilgisi ID[“EPSG”,32636]] olacak şekilde güncellenmiş oldu. Artık haritamız doğru bir şekilde görselleştirilmeye hazır.

Türkiye haritasının projeksiyonu için gerekli EPSG kodunu/kodlarını şuradaki adresten bulabiliriz.

Shape File İçin Düzenleme

Az önce yüklediğimiz shape file dosyasını birazdan başka verilerle birleştirip görselleştireceğiz. Fakat elimizdeki shape file bu haliyle veri birleştirme için pek uygun değil. Normalde bir veri setinde her bir mekanı temsil eden bir ID Variable (basitçe bir kimlik kodu) vardır. Aslında bizim indirdiğimiz shape file’da bir ID variable var (adm1) ve dikkat ederseniz son iki rakamı illerin plakalarından oluşuyor. Öte yandan bu haliyle adm1 verisini veri birleştirme işlemi yaparken anahtar olarak kullanamam çünkü adm1 değişkeni 4 basamaktan oluşuyor (plaka verileri ise 2). Burada, ileride yaşanması muhtemel sinir bozucu errorlardan da kurtulmak için manuel olarak NUTS3 ve plaka kodlarını .dbf file’a eklemek hayat kurtarır ve zaman kazandırır. .dbf uzantılı dosyalar free olarak indirebileceğiniz openoffice programı ile kolaylıkla açılıp manipüle edilebilir. Ben bu tür durumlar için her ilin adı, plakası ve NUTS3 kodunun yer aldığı bir yedek .csv dosyası bulunduruyorum. Analize başlamadan hemen önce de manuel olarak NUTS3 ve plaka bilgilerini çok dikkatli bir şekilde (eğer hata yaparsanız, yani yanlış eşleştirme yaparsanız mekansal analiziniz yanlış olur) .dbf file’a ekliyorum. Şöyle düşünün, bu işlemi sadece bir kere yapacaksınız fakat daha sonraki veri birleştirmelerde tekrar yapmanıza gerek kalmayacak çünkü elimizdeki .dbf file’da zaten bir değil iki tane (NUTS3 kodu ve plaka sayıları) olmuş olacak. Manipüle edilmiş shape file bilgilerini aşağıda görüyorsunuz.

turkey <- st_read(
  "C:/Users/firat/Desktop/turkey_administrativelevels0_1_2/tur_polbnda_adm1.shp"
)
turkey

Mekansal Veri Birleştirme (Spatial Data Merging)

Haritamız henüz veri görselleştirme için herhangi bir anlamlı veri içermiyor. Haritamızla veri görselleştirmek için sosyal bilim alanında en çok kullanılan verilerden il bazında kişi başına GSYİH ($) verisini .csv formatında 2019 yılı için indirelim. Veriyi TÜİK’in web sitesindeki şu adresten kolayca indirebiliriz.

Veri birleştirirken dikkat etmemiz gereken husus öncelikle her bir ilin (yani haritamızdaki poligonların) bir ID Variable’ı (yani kimliği) olması ki biz bunu az önce yaptığımız işlemle gerçekleştirdik. Yukarıdaki adresten indirdiğimiz .csv dosyası da her bir il için NUTS3 kodlarını içermekte, çok güzel 🙂 Artık indirdiğim .csv dosyası ile elimdeki shapefile’da anahtar olarak kullanabileceğim bir değişken var: NUTS3.

Önce indirdiğimiz .csv dosyasını kolaylık olsun diye shape file’ımızın olduğu klasöre kopyalayalım, adına “df.csv” diyelim ve verimizi inceleyelim:

df <- read.csv(
  "C:/Users/firat/Desktop/turkey_administrativelevels0_1_2/df.csv",
  header = TRUE
)
head(df)

Görüldüğü gibi dosyamız yıl, NUTS3 kodu, il adı ve en son sütunda da 2019 yılına ait kişi başı GSYİH ($) verilerini içermekte. Öte yandan değişken adları Türkçe karakter içermekte ve çok uzun, bunları İngilizce karakterlerle ve kısa şekilde tekrar yazalım. Ayrıca görselleştirmesini yapacağımız “gsyih” değişkeninin de “numeric” değil “integer” olduğunu görüyoruz. Görselleştirirken sıkıntı yaşamamak adına onu da “numeric” hale getirelim.

df_tidy <- rename(df, 
                  NUTS3 = "BÖLGE.KODU", 
                  adm1_en = "BÖLGE.ADI",
                  gsyih = "Kiþi.baþýna.Gayrisafi.Yurtiçi.Hasýla..2009.bazlý....Kiþi.baþýna.GSYH....") %>% 
  mutate(gsyih = as.numeric(gsyih)) 
head(df_tidy)

Şimdi verimiz birleştirilmeye hazır, haydi verimizi shapefile ile birleştirelim 🙂

turkey <- merge(turkey, df_tidy, by="NUTS3", all.x=TRUE)
head(turkey)

Böylelikle csv dosyamızdaki verileri shape file ile birleştirdik. Artık geriye sadece görselleştirmesi kalıyor. Haydi bakalım 🙂

Veri Görselleştirme

Veri görselleştirmede en sık kullanılan kütüphanelerden biri ggplot’tur. Mekansal görselleştirmede de sıklıkla kullanılır. ggplot sadece veriyi görselleştirmemize izin vermez, aynı zamanda haritamızı istediğimiz gibi manipüle etmeye de olanak verir. Gelin öncelikle sadece haritamızı görselleştirelim.

Sade görselleştirme

ggplot(turkey) +
  geom_sf(col = "blue")

Yukarıdaki görselleştirme bize sadece NUTS3 düzeyindeki il sınırlarını vermektedir. Biz ise veri dosyamıza 2019 yılı için ($) bazlı GSYİH verilerini eklemiştik, verimizin adı “gsyih” idi. Haydi o veriyi haritada görselleştirelim.

Detaylı görselleştirme

Aşağıdaki kodlar ggplot kütüphanesi ile oluşturulan çeşitli görselleştirmeleri içermektedir.

ggplot(data = turkey) +
  geom_sf(aes(fill = gsyih))+
  labs(
    fill = "",
    title = paste0(
      "GSYIH ($) ",
      "2019"))

Yukarıdaki görselleştirme ile “gsyih” verisini harita üzerinde göstermiş oluyoruz. Yukarıdaki haritada koyu renkler 2019 yılı için düşük kişi başına GSYİH, açık renkler ise yüksek GSYİH’ye sahip illeri göstermekte. Bu gösterimi tersine çevirmek, yani yüksek değerleri koyu, düşük değerleri ise koyu renklerle göstermek mümkün.

ggplot(data = turkey) +
  geom_sf(aes(fill = gsyih))+
  labs(
    fill = "",
    title = paste0(
      "GSYIH ($) ",
      "2019")) +
  scale_fill_continuous(trans = 'reverse')

Sanırım bu daha iyi görünüyor! Burada mesela illeri sınıflandırmalara tutarak yüksek ve düşük gelirli illeri belli renklerle ifade etmek ve eğer varsa mekansal kümeleri görsel olarak tespit etmek isteyebiliriz. ggplot iller için yüksek-orta-düşük gibi sınıflandırmaları manuel yapmayı gerektirmekte. Bunun yerine bir diğer library olan tmap library’si kolaylıkla istediğimiz harita görselleştirmesini yapma imkanı sunuyor. Üstelik syntax’i de ggplot ile çok benzer.

tm_shape(turkey) + 
    tm_borders(col = "black", lwd = 2, lty = "solid", alpha = 0.5) +   
  tm_shape(turkey)+
  tm_borders(col = "black", lwd = 2, lty = "solid", alpha = 0.5) +
  tm_fill("gsyih", n = 4, palette = "Blues", style = "quantile")+
  tm_layout(legend.outside = TRUE)

Yukarıdaki harita, Türkiye’nin illerini 2019 yılı dolar bazlı kişi başına GSYİH verilerine göre sınırlandırdı. Legend’den anladığımız gibi en açık renkler kişi başına GSYİH’nın 2949 ile 5330 dolar arasında olduğu illeri, bir ton daha koyu olan iller 5330 ile 6484 dolar arasındaki illeri, ondan da koyusu 6484 ile 8194 dolar arasında olan illeri ve en koyu renkli olanlar ise kişi başına GSYİH’si 8194 ile 15285 dolar arasında olan illeri gösteriyor. Haritaya bakınca yüksek kişi başına gelire sahip olan illerin batıda, düşük kişi başına gelire sahip olan illerin ise doğuda kümelendiği rahatlıkla görünüyor!

Bundan sonra siz de ggplot ve tmap kodlarını kendi keyfinize göre modifiye ederek, istediğiniz veriyi harita üzerinde görselleştirebilirsiniz 🙂 İyi eğlenceler!

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir