Merhabalar, blogun ikinci yazısına hoş geldiniz. Takıldığınız ve anlamadığınız yerler olursa lütfen yorum yapmaya çekinmeyiniz. Ayrıca katkılarınızı ve eleştirilerinizi de bekliyorum. Keyifli okumalar.
Blogun ilk yazısını yazarken, ikincisi de birkaç haftaya çıkar, nasıl olsa kodlar hazır diye düşünüyordum ancak tezdir, iştir derken uzadı. Yoğunluk yetmiyormuş gibi bilgisayarın format ihtiyacı ve NTFS dosya sistemine sahip harici diskin linux ile uyumsuzluğu da eklenince yazının taslağı ve kodlarını kaybettim. Sonuç olarak -birbirinden güzel bahanelerimi özetleyecek olursam- gecikmiş, kaybedilmiş ve sıfırdan yazılmış bir yazıyla karşınızdayım.
Bu blog yazısı, bir öncekinin devamı niteliğinde sayılabilir. R ile eBird verilerini işlemeye devam edeceğiz. İlk yazıda birinci soru üzerine odaklanmıştık, bunda ise ikinci soruya odaklanacağız:
Bilindiği gibi Kızılcahamam, Türkiye’deki en önemli kara akbaba - Aegypius monachus popülasyonlarından birisini barındırıyor. Bu türün, Kızılcahamam ilçe sınırları içerisinde nasıl bir dağılımı vardır? Türün dağılımıyla çevresel faktörler arasındaki ilişki kabaca nasıldır?
Temel R ve GIS bilgisine sahip olmanız yazıdaki birçok yeri anlamanız için yeterli olacaktır. Ancak bu alanlarda yeniyseniz de endişelenmeyin. Anlamadığınız her şeyi yorum olarak sorabilirsiniz. Blogun da ana amaçlarından birisi bu zaten. Ayrıca kuşlara ilginiz olmasa bile, bu yazının bazı temel mekânsal analizleri öğrenmek için faydalı olacağını düşünüyorum.
1. PAKETLERİN YÜKLENMESİ
Paket
Açıklama
tidyverse
Çoğunlukla veri manipülasyonu ve görselleştirme üzerine paketler içeren bir paket koleksiyonu
sf
Simple Features: Mekânsal vektör verileri işlemek için
terra
Raster verileri işlemek için
tidyterra
terra paketi için tidyverse metotları sağlayan bir paket
mapview
İnteraktif haritalar için
rgeoboundaries
Mülki idare sınırlarını indirmek için
Bu paketler kurulu değilse aşağıdaki kod bloğu ile kurabilirsiniz. Bu kod bloğu, paketi R’a yüklemeye çalışacak, eğer yükleyemezse kuracaktır. Paketler kuruluysa, library() fonksiyonu ile yükleyebiliriz.
İkinci soruya cevap verebilmek için kuş, ilçe sınırları ve dijital yükseklik modeline (DEM) ihtiyacımız var. İlk ilçeden başlayalım. Kuş ve DEM verisini işlemek için ilçeye ihtiyaç duyacağız ne de olsa.
İlk yazıda olduğu gibi bu sefer de geoBoundaries verisini kullanacağız. Şimdi ilçe verilerini indirip, içinden Kızılcahamam’ı çıkartalım.
tr_ilce <-gb_adm2(country ="Turkey", type ="SSCGS") # type = "SSCGS" argumaniyla basitlestirilmiş versiyonunu indiriyoruzkhamam <- tr_ilce[tr_ilce$shapeName =="Kızılcahamam", ]khamam
Kızılcahamam’ı doğru bir şekilde aldık gibi görünüyor. Verimizi {mapview} paketini kullanarak görselleştirelim, bir kontrol edelim. Bu paket, interaktif haritalar yapmak için oldukça işlevsel.
Kara akbaba - Aegypius monachus, Avrasya’da geniş dağılıma sahip bir yırtıcı türü. 3 metreye varan kanat açıklığıyla en büyük kuşlardan birisi ve azalan bir popülasyona sahip. Türkiye, türün en önemli yaşam alanlarından birisi. Tür, özellikle Kuzey Anadolu’da, orman - bozkır geçişindeki yaşlı ormanları tercih ediyor. Bu alanlardan birisi de bu yazıda incelediğimiz yer olan Kızılcahamam. Kızılcahamam’ın yaşlı karaçam - Pinus nigra ormanları, türün üremesi için oldukça elverişli.
Türle alakalı kısa bir bilgi verdikten sonra verilere tekrardan dönebiliriz. Kuş verisini nasıl elde ettiğimize ilk yazıda değinmiştik. Tekrardan uzun uzun anlatmaya gerek yok.
# A tibble: 2,403,720 × 50
`GLOBAL UNIQUE IDENTIFIER` `LAST EDITED DATE` `TAXONOMIC ORDER` CATEGORY
<chr> <dttm> <dbl> <chr>
1 URN:CornellLabOfOrnithology:E… 2021-04-15 12:59:44 10043 species
2 URN:CornellLabOfOrnithology:E… 2021-04-15 12:58:56 5625 species
3 URN:CornellLabOfOrnithology:E… 2021-04-15 13:04:32 1361 species
4 URN:CornellLabOfOrnithology:E… 2021-04-14 00:03:13 22215 species
5 URN:CornellLabOfOrnithology:E… 2021-04-05 11:01:32 5787 species
6 URN:CornellLabOfOrnithology:E… 2021-04-21 02:26:13 29239 species
7 URN:CornellLabOfOrnithology:E… 2021-04-14 00:03:35 22156 species
8 URN:CornellLabOfOrnithology:E… 2021-04-05 11:01:32 291 species
9 URN:CornellLabOfOrnithology:E… 2018-09-20 02:46:53 5945 species
10 URN:CornellLabOfOrnithology:E… 2018-09-20 02:46:53 5945 species
# ℹ 2,403,710 more rows
# ℹ 46 more variables: `TAXON CONCEPT ID` <chr>, `COMMON NAME` <chr>,
# `SCIENTIFIC NAME` <chr>, `SUBSPECIES COMMON NAME` <chr>,
# `SUBSPECIES SCIENTIFIC NAME` <chr>, `EXOTIC CODE` <chr>,
# `OBSERVATION COUNT` <chr>, `BREEDING CODE` <chr>,
# `BREEDING CATEGORY` <chr>, `BEHAVIOR CODE` <chr>, `AGE/SEX` <chr>,
# COUNTRY <chr>, `COUNTRY CODE` <chr>, STATE <chr>, `STATE CODE` <chr>, …
Gördüğünüz gibi 2,403,720 gözlem (satır) ve 50 değişkene (sütun) sahip bir veri tablomuz var. Bu verilerin çoğuna ihtiyaç duymuyoruz. Dolayısıyla işimize yaramayanlardan kurtulmamız işimizi çokça kolaylaştıracaktır. Sadece işimize yarayan sütunları seçip, kara akbaba türüne ait gözlemleri içerecek şekilde filtreleyelim.
karaakbaba <- ebird |>select(6, 7, 11, 12, 29, 30) |># burada indeks kullanarak sectik, sutun isimleriyle de secebilirizfilter(`SCIENTIFIC NAME`=="Aegypius monachus")karaakbaba
Şimdi değişken sayımız 6’ya, gözlem sayımız ise 1910’a düştü. Veri, çok daha yönetilebilir bir hâlde. Bu etkiyi, değişken isimlerini değiştirerek daha da artırabiliriz. Daha kısa, tamamı küçük harflerden oluşan, latinize ve boşluklar yerine alt çizgi kullandığımız isimler daha kullanışlı olacaktır. Herhangi bir hatayla karşılaşma riskimiz düşecektir. Bunun için ilk olarak karaakbaba data frame’inin değişken (sütun) isimlerine bakalım. names() ya da colnames() fonksiyonunu kullanabiliriz.
[1] "eng_name" "sci_name" "obs_count" "breeding_code"
[5] "y" "x"
Gördüğünüz gibi değişken isimlerini istediğimiz gibi değiştirdik.
Artık ilk yüklediğimiz eBird verisini R’dan silebiliriz. Bu veri, 2 milyondan fazla gözlemden oluştuğu için RAM’in şişmesine ve R’ın çökmesine yol açabilir. Ardından da çöp toplayıcıyı (garbage collector) çalıştırmak faydalı olacaktır. R, bu işi genelde otomatik yapıyor ancak büyük veriler silindiği zaman gc()’nin çalıştırılması öneriliyor.
rm(ebird)gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 3964934 211.8 9938292 530.8 7650458 408.6
Vcells 8520332 65.1 125684295 958.9 145568976 1110.7
Şimdi de mekânsallaştırmaya geçebiliriz. Verimiz şu anda bir data frame. Dolayısıyla onunla mekânsal işler yapmak için verimizi mekânsallaştırmamız gerekiyor. Bunun için {sf} paketini kullanacağız. Bu paket, mekânsal vektör veriler işlemek için geliştirmiş, OGC (Open Geospatial Consortium) standardı bir paket. Ben de işlerimin büyük bir kısmında onu tercih ediyorum.
Koordinatların olduğu sütunları ve koordinat sistemini tanımlayarak verimizi sf objesine dönüştürelim.
Kara akbaba verisi artık mekânsal bir formatta. Geometri tipi, koordinat sistemi gibi öznitelikler barındırıyor.
Veriyi daha iyi tanımak için ilk görselleştirmeleri yapalım. Acaba kara akbabalar Türkiye’de nasıl dağılıyor? Bunun için tekrardan mapview() fonksiyonunu kullanıyoruz.
mapview(karaakbaba_sf)
Bu işlem de tamam. Gördüğünüz gibi ülkemizin kuzeyinde yoğunlaşan bir popülasyon mevcut.
Sıra geldi kuş verimizin Kızılcahamam’a göre alt kümesini almaya.
Kızılcahamam’da, eBird veritabanında kayıtlı 139 tane kara akbaba kaydı varmış. Bunlara bir göz atıp DEM verisiyle ilgilenmeye başlayalım. Kara akbaba dağılımıyla alakalı asıl haritayı en son yapacağız.
Kara akbabanın Kızılcahamam’daki dağılımını ortaya çıkarttık. Şimdi de bazı çevresel değişkenlerle ilişkisi nasılmış, -kabaca- ona bakalım. Ben, topografik değişkenlerle olan ilişkisini merak ettim ve bu sebeple DEM verisine bakacağız.
DEM (Digital Elevation Model), kısaca, yeryüzünün yükseklik bilgisini sayısal olarak temsil eden modele verilen isim. Her bir grid için, sahip olduğu yükseklik verisini barındırır. Topografik ve hidrolojik birçok analizde sıklıkla kullanılıyor. Rakımın biyolojik sistemlerdeki önemi nedeniyle, ekoloji ve biyocoğrafyada da yaygın bir kullanımı var.
Burada COP-DEM (Copernicus DEM) kullandım. Veriye şu bağlantıdan ulaşabilirsiniz. Belki daha sonra bu verinin nereden, nasıl indirilebileceğiyle alakalı bir başka yazı yazarım.
DEM verisi, raster formatında bir veri. Raster veriyi, bir tür resim ya da bir tür matris olarak düşünebilirsiniz. Bu veri, hücrelerden - gridlerden oluşur ve her bir grid için bir değer içerir. Genellikle, yükseklik, eğim, sıcaklık, yağış gibi sürekli veriler bu formattadır.
Biz bu veri için {terra} paketini kullanacağız. Oldukça hızlı ve işlevsel bir paket.
# dem verisini yukleyelimdem <-rast("./dem_4326.tif")dem
class : SpatRaster
size : 7556, 22983, 1 (nrow, ncol, nlyr)
resolution : 0.0008333333, 0.0008333333 (x, y)
extent : 25.66542, 44.81792, 35.80792, 42.10458 (xmin, xmax, ymin, ymax)
coord. ref. : lon/lat WGS 84 (EPSG:4326)
source : dem_4326.tif
name : Copernicus_DSM_COG_30_N35_00_E025_00_DEM
min value : -86.01817
max value : 5107.41357
Veriyi yazdırdığımızda, çözünürlüğünden, dört köşesinin koordinatına ve koordinat sistemine kadar birçok detayı görebiliyoruz.
plot(dem)
Kolayca haritasını da çizebiliyoruz. Gördüğünüz gibi Türkiye topografik haritası.
Şimdi verimizi Kızılcahamam ilçe sınırlarına göre maskeleyelim. khamam, sf formatında olduğu için vect() ile {terra}’nın kendi vektör veri tipi olan SpatVector’e dönüştürüyoruz.
Gördüğünüz gibi kara akbaba verimizin içinde artık her bir nokta için rakım, eğim ve bakı bilgisi mevcut. Bu aşamadan sonra modellerle çalışabiliriz ancak bu, bu yazının konusu değil. Ayrıca elimizdeki veri bunun için ne kadar yeterli, ayrı bir tartışma konusu. Şimdi çıkarttığımız topografik verilere bir göz atıp asıl haritamızı yapmaya geçebiliriz.
Uzun bir yazı oldu yine ancak sonuna geldik. Şimdi Kızılcahamam’daki kara akbaba gözlemlerinin dağılımını, DEM ile birlikte görselleştirmeye çalışalım.