28  Coğrafi Bilgi Sistemleri (CBS) Temelleri

28.1 Genel Bakış

Verilerinizin uzamsal yönleri, salgının durumuna ilişkin pek çok içgörü sağlayabilir ve aşağıdaki gibi soruları yanıtlayabilir:

  • Mevcut hastalık noktaları nerede?
  • Kümelenme noktaları zaman içinde nasıl değişti?
  • Sağlık tesislerine ulaşım nasıl? Herhangi bir iyileştirme gerekli mi?

Bu CBS sayfasının mevcut odak noktası, salgın yanıtında uygulamalı epidemiyologların ihtiyaçlarını ele almaktır. tmap ve ggplot2 paketlerini kullanarak temel mekansal veri görselleştirme yöntemlerini keşfedeceğiz. Ayrıca sf paketi ile bazı temel uzamsal veri yönetimi ve sorgulama yöntemlerini de inceleyeceğiz. Son olarak, spdep paketini kullanarak uzamsal ilişkiler, uzamsal otokorelasyon ve uzamsal regresyon gibi mekansal istatistik kavramlarına kısaca değineceğiz.

28.2 Anahtar terimler

Aşağıda bazı temel terminolojiyi tanıtıyoruz. CBS ve mekansal analize kapsamlı bir giriş için, Referanslar bölümünde listelenen daha uzun öğreticilerden veya kurslardan birini incelemenizi öneririz.

Coğrafi Bilgi Sistemi (CBS) - CBS, mekansal verileri toplamak, yönetmek, analiz etmek ve görselleştirmek için bir çerçeve veya ortamdır.

CBS yazılımı

Bazı popüler CBS yazılımları, harita geliştirme ve mekansal analiz için işaretle ve tıkla etkileşimine izin verir. Bu araçlar, kod öğrenmeye gerek olmaması ve simgeleri ve özellikleri bir haritaya manuel olarak seçme ve yerleştirme kolaylığı gibi avantajlarla birlikte gelir. İşte iki popüler olan:

ArcGIS - ESRI şirketi tarafından geliştirilen, çok popüler ancak oldukça pahalı olan ticari bir CBS yazılımı

QGIS - ArcGIS’in yapabileceği hemen hemen her şeyi yapabilen ücretsiz bir açık kaynaklı CBS yazılımı. QGIS’i buradan indirebilirsiniz

R’ı bir CBS olarak kullanmak, “işaretle ve tıkla” yerine bir “komut satırı arayüzüne” sahip olduğundan (istenen sonucu elde etmek için kodlamanız gerekir) ilk başta daha korkutucu görünebilir. Ancak, tekrar tekrar haritalar üretmeniz veya tekrarlanabilir bir analiz oluşturmanız gerekiyorsa bu büyük bir avantajdır.

Mekansal veri

CBS’de kullanılan iki temel konumsal veri biçimi vektör ve hücresel(raster) veridir:

Vektör Verileri - CBS’de kullanılan en yaygın konumsal veri biçimi olan vektör verileri, köşelerin ve yolların geometrik özelliklerinden oluşur. Vektör uzamsal verileri ayrıca yaygın olarak kullanılan üç türe ayrılabilir:

  • Noktalar - Bir nokta, bir koordinat sistemindeki belirli bir konumu temsil eden bir koordinat çiftinden (x,y) oluşur. Noktalar, uzamsal verilerin en temel biçimidir ve bir durumu (yani hasta evi) veya bir konumu (yani hastaneyi) bir harita üzerinde belirtmek için kullanılabilir.

  • Çizgiler - Çizgi, birbirine bağlı iki noktadan oluşur. Çizgilerin bir uzunluğu vardır ve yollar veya nehirler gibi şeyleri belirtmek için kullanılabilir.

  • Çokgenler - Çokgen, noktalarla birbirine bağlanan en az üç doğru parçasından oluşur. Çokgen özellikleri bir uzunluğa (yani alanın çevresi) ve ayrıca bir alan ölçümüne sahiptir. Çokgenler bir alanı (yani bir köyü) veya bir yapıyı (yani bir hastanenin gerçek alanını) belirtmek için kullanılabilir.

Hücresel Veri - Uzamsal veriler için alternatif bir format olan hücresel veriler, her hücrenin yükseklik, sıcaklık, eğim, orman örtüsü vb. gibi bilgileri içeren bir hücre matrisidir (örneğin pikseller). Bunlar genellikle hava fotoğrafları, uydu görüntüler, vb. Rasterler (yani hücresel haritalar), vektör verilerinin altında “temel haritalar” olarak da kullanılabilir.

Uzamsal verileri görselleştirme

Bir harita üzerinde uzamsal verileri görsel olarak temsil etmek için, CBS yazılımı, farklı özelliklerin birbiriyle ilişkili olarak nerede olması gerektiği hakkında yeterli bilgi sağlamanızı gerektirir. Çoğu kullanım durumu için geçerli olan vektör verilerini kullanıyorsanız, bu bilgiler genellikle bir şekil dosyasında depolanır:

Shapefiles - Shapefile, çizgilerden, noktalardan veya çokgenlerden oluşan “vektör” uzamsal verileri depolamak için yaygın bir veri biçimidir. Tek bir şekil dosyası aslında en az üç dosyadan oluşan bir koleksiyondur - .shp, .shx ve .dbf. Şekil dosyasının okunabilmesi için tüm bu alt bileşen dosyalarının belirli bir dizinde (klasörde) bulunması gerekir. Bu ilişkili dosyalar, e-posta yoluyla gönderilmek veya bir web sitesinden indirilmek üzere bir ZIP klasörüne sıkıştırılabilir.

Şekil dosyası, özelliklerin kendileri ve bunların Dünya yüzeyinde nereye yerleştirileceği hakkında bilgi içerecektir. Bu önemlidir, çünkü Dünya bir küre iken, haritalar tipik olarak iki boyutludur; uzamsal verilerin nasıl “düzleştirileceğine” ilişkin seçimler, ortaya çıkan haritanın görünümü ve yorumlanması üzerinde büyük bir etkiye sahip olabilir.

Koordinat Referans Sistemleri (CRS) - CRS, Dünya yüzeyindeki coğrafi özellikleri konumlandırmak için kullanılan koordinat tabanlı bir sistemdir. Birkaç temel bileşeni vardır:

  • Koordinat Sistemi - Birçok farklı koordinat sistemi vardır, bu nedenle koordinatlarınızın hangi sistemden olduğunu bildiğinizden emin olun. Enlem/boylam dereceleri yaygındır, ancak UTM koordinatlarını da görebilirsiniz.

  • Birimler - Koordinat sisteminiz için birimlerin ne olduğunu öğrenin (ör. ondalık dereceler, metreler)

  • Datum - Dünya’nın belirli bir modellenmiş versiyonu. Bunlar yıllar içinde revize edilmiştir, bu nedenle harita katmanlarınızın aynı veriyi kullandığından emin olun. Özellikle herhangi bir konum verisi elde edilirken yatay ve düşey konumunu tanımlamak için başlangıç alınan bir referans yüzeyi gereklidir. Yer’in şeklini ve boyutunu tanımlayan bu yüzeye Datum adı verilmektedir.

  • Projeksiyon - Gerçekten yuvarlak olan dünyayı düz bir yüzeye (harita) yansıtmak için kullanılan matematiksel denklem.

Aşağıda gösterilen haritalama araçlarını kullanmadan uzamsal verileri özetleyebileceğinizi unutmayın. Bazen coğrafyaya göre (ör. ilçe, ülke vb.) basit bir tablo yeterlidir!

28.3 CBS’yi kullanmaya başlama

Bir harita yapmak için sahip olmanız ve düşünmeniz gereken birkaç önemli öğe var. Bunlar şunları içerir:

  • Bir veri kümesi – bu, uzamsal bir veri biçiminde olabilir (yukarıda belirtildiği gibi şekil dosyaları gibi) veya uzamsal bir biçimde olmayabilir (örneğin sadece bir csv olarak).

  • Veri kümeniz uzamsal biçimde değilse ayrıca bir referans veri kümesine ihtiyacınız olacaktır. Referans verileri, verilerin uzamsal temsilinden ve belirli özelliklerin konum ve adres bilgilerini içeren materyali içeren ilgili niteliklerden oluşur.

    • Önceden tanımlanmış coğrafi sınırlarla (örneğin, idari bölgeler) çalışıyorsanız, referans şekil dosyaları genellikle bir devlet kurumundan veya veri paylaşım kuruluşundan ücretsiz olarak indirilebilir. Şüpheye düştüğünüzde, Google “[bölgeler] şekil dosyası” başlamak için iyi bir yerdir.

    • Adres bilginiz varsa ancak enlem ve boylam yoksa, kayıtlarınız için uzamsal referans verilerini almak için bir coğrafi kodlama motoru kullanmanız gerekebilir.

  • Veri kümelerinizdeki bilgileri hedef kitlenize nasıl sunmak istediğiniz hakkında fikriniz olmalı. Birçok farklı harita türü vardır ve ihtiyaçlarınıza en uygun harita türünü düşünmek önemlidir.

Verilerinizi görselleştirmek için harita türleri

Choropleth haritası - coğrafi bölgeleri bir öznitelik değerine göre temsil etmek için renklerin, gölgelerin veya desenlerin kullanıldığı bir tür tematik haritadır. Örneğin, daha büyük bir değer, daha küçük bir değerden daha koyu bir renkle gösterilebilir. Bu harita türü, bir değişkeni ve onun tanımlanmış bölgeler veya jeopolitik alanlar arasında nasıl değiştiğini görselleştirirken özellikle kullanışlıdır.

Vaka yoğunluğu ısı haritası - renklerin bir değerin yoğunluğunu temsil etmek için kullanıldığı, ancak verileri gruplamak için tanımlanmış bölgeleri veya jeopolitik sınırları kullanmadığı bir tür tematik haritadır. Bu harita türü tipik olarak “sıcak noktaları” veya yüksek yoğunluklu veya nokta yoğunluğuna sahip alanları göstermek için kullanılır.

Nokta yoğunluğu haritası - verilerinizdeki öznitelik değerlerini temsil etmek için noktaları kullanan tematik bir harita türüdür. Bu tür harita en iyi, verilerinizin dağılımını görselleştirmek ve kümeleri görsel olarak taramak için kullanılır.

Oransal semboller haritası (dereceli semboller haritası) - bir choropleth haritasına benzer bir tematik harita, ancak bir özelliğin değerini belirtmek için renk kullanmak yerine, değere göre bir sembol (genellikle bir daire) kullanır. Örneğin, daha büyük bir değer, daha küçük bir değerden daha büyük bir sembolle gösterilebilir. Bu harita türü en iyi, coğrafi bölgelerdeki verilerinizin boyutunu veya miktarını görselleştirmek istediğinizde kullanılır.

Karmaşık coğrafi kalıpları göstermek için birkaç farklı görselleştirme türünü de birleştirebilirsiniz. Örneğin aşağıdaki haritadaki vakalar (noktalar) en yakın sağlık kuruluşuna göre renklendirilmiştir (bkz. lejand). Büyük kırmızı daireler, belirli bir yarıçaptaki sağlık tesisi hizmet alanlarını ve herhangi bir hizmet alanı dışında kalan parlak kırmızı vaka noktalarını gösterir:

Not: Bu CBS sayfasının birincil odak noktası, saha salgın yanıtı bağlamına dayanmaktadır. Bu nedenle sayfanın içeriği, temel uzamsal veri manipülasyonlarını, görselleştirmeleri ve analizleri kapsayacaktır.

28.4 Hazırlık

Paketleri yükleyin

Bu kod parçası, analizler için gereken paketlerin yüklenmesini gösterir. Bu el kitabında, gerekirse paketi kuran ve kullanım için yükleyen pacman’dan p_load() vurgusunu yapıyoruz. R tabanından library() ile kurulu paketleri de yükleyebilirsiniz. R paketleri hakkında daha fazla bilgi için [R basics] sayfasına bakabilirsiniz.

pacman::p_load(
  rio,           # verileri içe aktarmak için
  here,          # dosyaları bulmak için
  tidyverse,     # verileri temizlemek, işlemek ve çizmek için (ggplot2 paketini içerir)
  sf,            # Basit Özellik formatı kullanarak uzamsal verileri yönetmek için
  tmap,          # basit haritalar üretmek için hem etkileşimli hem de statik haritalar için çalışır
  janitor,       # sütun adlarını temizlemek için
  OpenStreetMap, # ggplot haritasına OSM altlık haritası eklemek için
  spdep          # mekansal istatistik
  ) 

CRAN “Uzamsal Görev Görünümü”nde uzamsal verilerle ilgilenen tüm R paketlerinin bir özetini görebilirsiniz.

Örnek vaka verileri

Gösteri amacıyla, simüle edilmiş Ebola salgını “satır listesi” veri çerçevesinden rastgele 1000 vakalık bir örneklemle çalışacağız (hesaplamalı olarak, daha az vakayla çalışmak bu el kitabında daha kolaydır). Takip etmek isterseniz, “clean” dosyasını indirmek için tıklayın. (.rds dosyası olarak).

Vakaların rastgele bir örneğini aldığımız için, kodları kendi başınıza çalıştırdığınızda sonuçlarınız burada gösterilenden biraz farklı görünebilir.

rio paketinden import() fonksiyonuyla verileri içe aktarın (.xlsx, .csv, .rds gibi birçok dosya türünü işler - ayrıntılar için [İçe aktarma ve dışa aktarma] sayfasına bakın).

# temizlenmiş vaka satır listesini içe aktarmak
linelist <- import("linelist_cleaned.rds")  

Daha sonra R tabanından sample() kullanarak 1000 satırlık rastgele bir örnek seçiyoruz.

# satır listesindeki satır sayısından 1000 rastgele satır numarası üretmek
sample_rows <- sample(nrow(linelist), 1000)

# yalnızca örnek satırları ve tüm sütunları tutmak için alt küme satır listesi üretmek
linelist <- linelist[sample_rows,]

Şimdi sınıf veri çerçevesi olan bu ’linelist’i “sf” (uzaysal özellikler) sınıfının bir nesnesine dönüştürmek istiyoruz. Satır listesinin, her vakanın ikametgahının enlem ve boylamını temsil eden iki sütun “boy” ve “en” olduğu göz önüne alındığında, bu kolay olacaktır.

sf (uzaysal özellikler) paketini ve onun ‘st_as_sf()’ fonksiyonunu ‘linelist_sf’ dediğimiz yeni nesneyi yaratmak için kullanırız. Bu yeni nesne, esasen satır listesiyle aynı görünüyor, ancak “boy” ve “enlem” sütunları koordinat sütunları olarak belirlenmiş ve noktalar görüntülendiğinde bir koordinat referans sistemi (CRS) atanmıştır. 4326, koordinatlarımızı, GPS koordinatları için standart olan World Geodetic System 1984 (WGS84) temelinde tanımlar.

# sf nesnesi oluşturmk
linelist_sf <- linelist %>%
     sf::st_as_sf(coords = c("lon", "lat"), crs = 4326)

Orijinal “satır listesi” veri çerçevesi bu şekilde görünür. Bu gösterimde, yalnızca “date_onset” ve “geometry” (yukarıdaki boylam ve enlem alanlarından oluşturulan ve veri çerçevesindeki son sütun olan) sütununu kullanacağız.

DT::datatable(head(linelist_sf, 10), rownames = FALSE, options = list(pageLength = 5, scrollX=T), class = 'white-space: nowrap' )

Yönetici sınır şekil dosyaları

Sierra Leone: Yönetici sınır şekil dosyaları

Sierra Leone için tüm idari sınırları önceden İnsani Veri Değişimi’nden (HDX) web sitesi burada indirdik. ). Alternatif olarak, bu el kitabı için bunları ve diğer tüm örnek verileri [El kitabını ve verileri indir] sayfasında açıklandığı gibi R paketimiz aracılığıyla indirebilirsiniz.

Şimdi Admin Level 3 şekil dosyasını R’a kaydetmek için aşağıdakileri yapacağız:

  1. Şekil dosyasını içe aktarın
  2. Sütun adlarını temizleyin
  3. Yalnızca ilgi alanlarını korumak için satırları filtreleyin

Bir şekil dosyasını içe aktarmak için sf’den read_sf() fonksiyonunu kullanırız. Dosya yolu here() ile sağlanır. - bizim durumumuzda dosya, “data”, “gis” ve “shp” alt klasörlerinde “sle_adm3.shp” dosya adıyla R projemizin içindedir (daha fazla bilgi için [İçe aktarma ve dışa aktarma] ve [R projeleri] sayfalarına bakabilirsiniz). Kendi dosya yolunuzu sağlamanız gerekecek.

Daha sonra, şekil dosyasının sütun adlarını standartlaştırmak için janitor paketinden clean_names() kullanıyoruz. Ayrıca sadece “Western Area Urban” veya “Western Area Rural” admin2name ile satırları tutmak için filter() kullanırız.

# ADM3 seviyesi temizlik 
sle_adm3 <- sle_adm3_raw %>%
  janitor::clean_names() %>% # sütun isimlerini standardize etmek
  filter(admin2name %in% c("Western Area Urban", "Western Area Rural")) # belirli alanları tutmak için filtrelemek

Aşağıda, içe aktarma ve temizleme işleminden sonra şekil dosyasının nasıl göründüğünü görebilirsiniz. sağa doğru kaydırın yönetici düzeyi 0 (ülke), yönetici düzeyi 1, yönetici düzeyi 2 ve son olarak yönetici düzeyi 3 olan sütunların nasıl olduğunu görmek için her düzeyin bir karakter adı ve benzersiz bir “pcode” tanımlayıcısı vardır. Pcode, artan her yönetici düzeyiyle birlikte genişler; SL (Sierra Leone) -> SL04 (Batı) -> SL0410 (Batı Bölgesi Kırsal) -> SL040101 (Koya Kırsal).

Nüfus verileri

Sierra Leone: ADM3’e göre nüfus

Bu veriler tekrar HDX’ten (bağlantı buradan) veya [bu sayfada] açıklandığı gibi epirhandbook R paketimizden indirilebilir. [El kitabını ve verileri indirin]. .csv dosyasını yüklemek için import() kullanıyoruz. Ayrıca, sütun adı sözdizimini standartlaştırmak için içe aktarılan dosyayı clean_names() öğesine iletiyoruz.

# ADM3'e göre nüfus
sle_adm3_pop <- import(here("data", "gis", "population", "sle_admpop_adm3_2020.csv")) %>%
  clean_names()

Popülasyon dosyası böyle görünüyor. Her yetki alanında “erkek” nüfus, “kadın” nüfus, “toplam” nüfus ve yaş grubuna göre nüfus dökümü sütunlarının nasıl olduğunu görmek için sağa kaydırın.

Sağlık Tesisleri

Sierra Leone: OpenStreetMap’ten alınan sağlık tesisi verileri

Yine sağlık tesislerinin konumlarını HDX buradan veya [el kitabını ve verileri indir] sayfasındaki talimatlar aracılığıyla indirdik.

Tesis noktaları şekil dosyasını read_sf() ile içe aktarıyoruz, sütun adlarını tekrar temizliyoruz ve ardından yalnızca “hastane”, “klinik” veya “doktorlar” olarak etiketlenmiş noktaları tutmak için filtreliyoruz.

# OSM sağlık tesisi şekil dosyası
sle_hf <- sf::read_sf(here("data", "gis", "shp", "sle_hf.shp")) %>% 
  clean_names() %>%
  filter(amenity %in% c("hospital", "clinic", "doctors"))

İşte ortaya çıkan veri çerçevesi - tesis adını ve “geometri” koordinatlarını görmek için sağa kaydırın.

28.5 Koordinatları grafikleştirme

Bu durumda X-Y koordinatlarını (boylam/enlem, noktalar) çizmenin en kolay yolu, bunları doğrudan hazırlık bölümünde oluşturduğumuz linelist_sf nesnesinden nokta olarak çizmektir.

tmap paketi, hem statik (“çizim” modu) hem de etkileşimli (“görünüm” modu) için yalnızca birkaç satır kodla basit eşleme yetenekleri sunar. tmap sözdizimi ggplot2’ninkine benzerdir, öyle ki komutlar `+’ ile birbirine eklenir. Bu gösterimde daha fazla ayrıntı okuyabilirsiniz.

  1. tmap modunu ayarlayın. Bu durumda statik çıktılar üreten “plot” modunu kullanacağız.
tmap_mode("plot") # "görünüm" veya "grafik"i seçin

Aşağıda, noktalar tek başına çizilir.tm_shape()``,linelist_sfnesneleri ile sağlanır. Daha sonra boyut ve rengi belirterektm_dots()` aracılığıyla noktalar ekliyoruz. “linelist_sf” bir sf nesnesi olduğundan, enlem/boylam koordinatlarını ve koordinat referans sistemini (CRS) içeren iki sütunu zaten belirledik:

# noktalar sadece vakalar
tm_shape(linelist_sf) + tm_dots(size=0.08, col='blue')

Yalnız, puanlar bize fazla bir şey söylemez. Dolayısıyla idari sınırları da haritalandırmalıyız:

Yine tm_shape() kullanıyoruz (bkz. [dokümantasyon] https://www.rdocumentation.org/packages/tmap/versions/3.3/topics/tm_shape)) ancak vaka noktaları şekil dosyası sağlamak yerine, idari sınır şekil dosyası (çokgenler) sağlıyoruz.

bbox = değişkeniyle (bbox “sınırlayıcı kutu” anlamına gelir) koordinat sınırlarını belirleyebiliriz. Önce harita gösterimini bbox olmadan ve sonra onunla birlikte gösteriyoruz.

# Çokgenler sadece idari sınırlar
tm_shape(sle_adm3) +               # yönetici sınırları şekil dosyası
  tm_polygons(col = "#F7F7F7")+    # çokgenleri açık gri olarak göster
  tm_borders(col = "#000000",      # renk ve çizgi ağırlığı ile sınırları göster
             lwd = 2) +
  tm_text("admin3name")            # her çokgen için görüntülenecek sütun metni


# Yukarıdakiyle aynı, ancak sınırlayıcı kutudan yakınlaştırma ile
tm_shape(sle_adm3,
         bbox = c(-13.3, 8.43,    # corner
                  -13.2, 8.5)) +  # corner
  tm_polygons(col = "#F7F7F7") +
  tm_borders(col = "#000000", lwd = 2) +
  tm_text("admin3name")

Ve şimdi hem noktalar hem de çokgenler birlikte:

# Hepsi birlikte
tm_shape(sle_adm3, bbox = c(-13.3, 8.43, -13.2, 8.5)) +     
  tm_polygons(col = "#F7F7F7") +
  tm_borders(col = "#000000", lwd = 2) +
  tm_text("admin3name")+
tm_shape(linelist_sf) +
  tm_dots(size=0.08, col='blue', alpha = 0.5) +
  tm_layout(title = "Distribution of Ebola cases")   # haritaya isim vermek

R’daki eşleme seçeneklerinin iyi bir karşılaştırmasını okumak için bu blog gönderisine bakabilirsiniz.

28.6 Mekansal birleşimler

Verileri bir veri kümesinden diğerine birleştirmeye aşina olabilirsiniz. Bu el kitabının [Birleştirme verileri] sayfasında çeşitli yöntemler tartışılmaktadır. Bir uzamsal birleşim benzer bir amaca hizmet eder, ancak uzamsal ilişkilerden yararlanır. Gözlemleri doğru bir şekilde eşleştirmek için sütunlardaki ortak değerlere güvenmek yerine, bir özelliğin bir diğerinin içinde olması veya bir diğerine en yakın komşu olması veya belirli bir yarıçapın tampon içinde olması gibi uzamsal ilişkilerini kullanabilirsiniz.

sf paketi, uzamsal birleşimler için çeşitli yöntemler sunar. Bu başvuruda st_join yöntemi ve uzamsal birleştirme türleri hakkında daha fazla belgeye bakabilirsiniz.

Çokgendeki noktalar

Mekansal olarak vakalara idari birimler atama

İşte ilginç bir muamma: vakaların satır listesi, vakaların idari birimleri hakkında herhangi bir bilgi içermiyor. İlk veri toplama aşamasında bu tür bilgileri toplamak ideal olsa da, uzamsal ilişkilerine dayalı olarak bireysel vakalara idari birimler de atayabiliriz (yani nokta bir çokgenle kesişir).

Aşağıda, durum konumlarımızı (noktaları) ADM3 sınırları (poligonlar) ile uzamsal olarak keseceğiz:

  1. Satır listesi(puan) ile başlayın
  2. Sınırlara uzamsal birleştirme, birleştirme türünü “st_intersects” olarak ayarlayın
  3. Yeni yönetim sınırı sütunlarından yalnızca belirli bir kısmını tutmak için select() kullanın
linelist_adm <- linelist_sf %>%
  
  # idari sınır dosyasını uzamsal kesişime dayalı olarak satır listesine ekleyin
  sf::st_join(sle_adm3, join = st_intersects)

’sle_adms’deki tüm sütunlar satır listesine eklendi! Artık her vaka, içinde bulunduğu idari seviyeleri detaylandıran sütunlara sahiptir. Bu örnekte, yeni sütunlardan yalnızca ikisini (yönetici düzeyi 3) tutmak istiyoruz, bu nedenle eski sütun adlarını ve yalnızca iki ek ilgiyi “select()” yapıyoruz:

linelist_adm <- linelist_sf %>%
  
  # idari sınır dosyasını uzamsal kesişime dayalı olarak satır listesine ekleyin
  sf::st_join(sle_adm3, join = st_intersects) %>% 
  
  # Eski sütun adlarını ve ilgilendiğiniz iki yeni yönetici adlarını saklayın
  select(names(linelist_sf), admin3name, admin3pcod)

Aşağıda, yalnızca görüntüleme amacıyla, noktanın çokgen şekilleriyle uzamsal olarak kesiştiği yere bağlı olarak ilk on vakayı ve bunların admin seviyesi 3 (ADM3) yargı yetkilerini görebilirsiniz.

# Şimdi her bir vakaya eklenmiş ADM3 adlarını göreceksiniz.
linelist_adm %>% select(case_id, admin3name, admin3pcod)
Simple feature collection with 1000 features and 3 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: -13.27101 ymin: 8.448085 xmax: -13.20725 ymax: 8.490662
Geodetic CRS:  WGS 84
First 10 features:
     case_id     admin3name admin3pcod                   geometry
1823  7a14dd Mountain Rural   SL040102 POINT (-13.21995 8.448376)
2407  80fdfb Mountain Rural   SL040102 POINT (-13.21994 8.477752)
4553  801839       East III   SL040205 POINT (-13.20911 8.481916)
5296  08877f        West II   SL040207 POINT (-13.25233 8.472419)
3335  3c86fe        West II   SL040207 POINT (-13.22427 8.461701)
545   160b12     Central II   SL040202 POINT (-13.23829 8.489217)
3046  73be6b        East II   SL040204 POINT (-13.21209 8.478791)
5499  2a61fd       East III   SL040205 POINT (-13.20923 8.463647)
5721  eb460a        West II   SL040207 POINT (-13.25167 8.474329)
5821  c49942         East I   SL040203 POINT (-13.21732 8.489863)

Şimdi durumlarımızı idari birime göre tanımlayabiliriz - uzaysal birleşmeden önce yapamadığımız bir şey!

# İdari birime göre vaka sayılarını içeren yeni veri çerçevesi yapın
case_adm3 <- linelist_adm %>%          # yeni yönetici sütunlarına sahip satır listesiyle başlayın
  as_tibble() %>%                      # daha iyi görüntü için tibble'a dönüştürün
  group_by(admin3pcod, admin3name) %>% # admin birimine göre gruplandır, hem ada hem de pkoda göre
  summarise(cases = n()) %>%           # satırları özetle ve say
  arrange(desc(cases))                     # azalan sırada düzenle

case_adm3
# A tibble: 10 × 3
# Groups:   admin3pcod [10]
   admin3pcod admin3name     cases
   <chr>      <chr>          <int>
 1 SL040102   Mountain Rural   268
 2 SL040208   West III         223
 3 SL040207   West II          172
 4 SL040204   East II          121
 5 SL040203   East I            65
 6 SL040201   Central I         59
 7 SL040206   West I            42
 8 SL040205   East III          24
 9 SL040202   Central II        23
10 <NA>       <NA>               3

Ayrıca idari birime göre vaka sayımlarının bir çubuk grafiğini de oluşturabiliriz.

Bu örnekte, ggplot()‘a ’linelist_adm’ ile başlıyoruz, böylece çubukları frekansa göre sıralayan ‘fct_infreq()’ gibi faktör fonksiyonlarını uygulayabiliriz (ipuçları için [Faktörler] sayfasına bakınız).

ggplot(
    data = linelist_adm,                       # yönetici birimi bilgilerini içeren satır listesiyle başlayın
    mapping = aes(
      x = fct_rev(fct_infreq(admin3name))))+ # x ekseni, frekansa göre sıralanmış (tersine çevrilmiş) yönetici birimleridir
   geom_bar()+                      # çubuk oluştur, yükseklik satır sayısıdır
   coord_flip()+ # adm birimlerinin daha kolay okunması için X ve Y eksenlerini çevirin
   theme_classic()+ # arka planı basitleştirir
   labs( # başlık ve etiket
    x = "Admin level 3",
    y = "Number of cases",
    title = "Number of cases, by adminstative unit",
    caption = "As determined by a spatial join, from 1000 randomly sampled cases from linelist"
  )

En yakın komşu

En yakın sağlık kuruluşunu / toplanma alanını bulma

Hastalık sıcak noktaları ile ilgili olarak sağlık tesislerinin nerede olduğunu bilmek faydalı olabilir.

Bireysel vakalara en yakın sağlık tesisini görselleştirmek için st_join() fonksiyonundan (sf paketi) st_nearest_feature birleştirme yöntemini kullanabiliriz.

  1. Satır listesinin şekil dosyası linelist_sf ile başlıyoruz
  2. Sağlık tesislerinin ve kliniklerin konumları olan sle_hf ile mekansal olarak birleştiriyoruz (puan)
# Her vakaya en yakın sağlık kuruluşu
linelist_sf_hf <- linelist_sf %>%                  # satır listesini şekil dosyası ile başla
  st_join(sle_hf, join = st_nearest_feature) %>%   # vaka verilerine en yakın klinikten alınan veriler
  select(case_id, osm_id, name, amenity) %>%       # sağlık tesisinin adı, türü ve geometrisi dahil olmak üzere ilgili sütunları tutmak
  rename("nearest_clinic" = "name")                # netlik için yeniden adlandırın

Aşağıda (ilk 50 satır) her vakanın artık en yakın klinik/hastaneye ait verileri olduğunu görebiliriz.

Vakaların yaklaşık %30’u için en yakın sağlık kuruluşunun “Den Clinic” olduğunu görebiliyoruz.

# Sağlık kuruluşuna göre vaka sayıları
hf_catchment <- linelist_sf_hf %>%   # en yakın klinik verilerini içeren satır listesiyle başlayın
  as.data.frame() %>%                # şekil dosyasından veri çerçevesine dönüştür
  count(nearest_clinic,              # satırları "ad" ile sayın (kliniğin)
        name = "case_n") %>%         # yeni sayım sütununu "case_n" olarak ata
  arrange(desc(case_n))              # azalan sırada düzenlemek

hf_catchment                         # konsola yazdırmak
                         nearest_clinic case_n
1                            Den Clinic    360
2       Shriners Hospitals for Children    307
3         GINER HALL COMMUNITY HOSPITAL    192
4                             panasonic     47
5 Princess Christian Maternity Hospital     38
6                     ARAB EGYPT CLINIC     26
7                  MABELL HEALTH CENTER     15
8                                  <NA>     15

Sonuçları görselleştirmek için tmap kullanabiliriz - bu sefer daha kolay görüntüleme için etkileşimli mod

tmap_mode("view")   # tmap modunu etkileşimli olarak ayarla

# vakaları ve klinik noktaları çizin 
tm_shape(linelist_sf_hf) +            # vaka grafikleri
  tm_dots(size=0.08,                  # en yakın klinik tarafından renklendirilen vakalar
          col='nearest_clinic') +    
tm_shape(sle_hf) +                    # klinik tesisleri büyük siyah noktalarla çizin
  tm_dots(size=0.3, col='black', alpha = 0.4) +      
  tm_text("name") +                   # tesis adı ile üzerine bindirme
tm_view(set.view = c(-13.2284, 8.4699, 13), # yakınlaştırmayı ayarla (merkez kodları, yakınlaştırma)
        set.zoom.limits = c(13,14))+
tm_layout(title = "Cases, colored by nearest clinic")

Tamponlar

Ayrıca en yakın sağlık kuruluşuna 2,5 km (~30 dakika) yürüme mesafesinde kaç vaka bulunduğunu da keşfedebiliriz.

Not: Daha doğru mesafe hesaplamaları için, sf nesnenizi UTM (düzlemsel bir yüzeye yansıtılan Dünya) gibi ilgili yerel harita projeksiyon sistemine yeniden yansıtmak daha iyidir. Bu örnekte, basit olması için Dünya Jeodezi Sistemi (WGS84) Coğrafi koordinat sistemine bağlı kalacağız (Dünya küresel / yuvarlak bir yüzeyde temsil edilir, bu nedenle birimler ondalık derece cinsindendir). Genel bir dönüşüm kullanacağız: 1 ondalık derece = ~111km.

Bu esri makalesinde harita projeksiyonları ve koordinat sistemleri hakkında daha fazla bilgi bulabilirsiniz. Bu blog harita projeksiyonu ve ilgi alanına ve haritanızın / analizinizin içeriğine bağlı olarak uygun bir projeksiyonun nasıl seçilebileceği gibi farklı türlerden bahsetmektedir.

İlkin, her sağlık tesisinin çevresinde ~2,5 km yarıçaplı dairesel bir tampon oluşturun. Bu, tmap’teki st_buffer() fonksiyonuyla yapılır. Haritanın birimi enlem/boylam ondalık derece cinsinden olduğundan, “0,02” bu şekilde yorumlanır. Harita koordinat sisteminiz metre cinsinden ise sayının metre cinsinden verilmesi gerekir.

sle_hf_2k <- sle_hf %>%
  st_buffer(dist=0.02)       # ondalık derece, yaklaşık 2,5 km'ye eşittir 

Aşağıda, tampon bölgeleri şu şekilde çiziyoruz:

tmap_mode("plot")
# Create circular buffers
tm_shape(sle_hf_2k) +
  tm_borders(col = "black", lwd = 2)+
tm_shape(sle_hf) +                    # klinik tesislerini büyük kırmızı noktalarla çizin
  tm_dots(size=0.3, col='black')      

**İkinci olarak, bu arabellekleri ‘st_join()’ ve st_intersects* birleştirme türünü kullanarak durumlar (noktalar) ile kesiştiririz. Yani tamponlardan gelen veriler kesiştikleri noktalara birleştirilir.

# Vakaları arabelleklerle kesiştirin
linelist_sf_hf_2k <- linelist_sf_hf %>%
  st_join(sle_hf_2k, join = st_intersects, left = TRUE) %>%
  filter(osm_id.x==osm_id.y | is.na(osm_id.y)) %>%
  select(case_id, osm_id.x, nearest_clinic, amenity.x, osm_id.y)

Şimdi sonuçları sayabiliriz: nrow(linelist_sf_hf_2k[is.na(linelist_sf_hf_2k$osm_id.y),]) 1000 vakadan herhangi biri arabellekle kesişmedi (bu değer eksik) ve bu yüzden en yakın sağlık kuruluşundan 30 dakikadan fazla yürüyün.

# Sağlık tesisi tamponlarından herhangi biriyle kesişmeyen vakalar
linelist_sf_hf_2k %>% 
  filter(is.na(osm_id.y)) %>%
  nrow()
[1] 1000

Sonuçları, herhangi bir arabellekle kesişmeyen vakaların kırmızı görüneceği şekilde görselleştirebiliriz.

tmap_mode("view")

# İlk önce vakaları puan olarak görüntüleyin
tm_shape(linelist_sf_hf) +
  tm_dots(size=0.08, col='nearest_clinic') +

# klinik tesisleri büyük siyah noktalarla çizin
tm_shape(sle_hf) +                    
  tm_dots(size=0.3, col='black')+   

# Ardından sağlık tesisi arabelleklerini çoklu çizgilerle kaplayın
tm_shape(sle_hf_2k) +
  tm_borders(col = "black", lwd = 2) +

# Herhangi bir sağlık tesisi tamponunun parçası olmayan vakaları vurgulayın
# kırmızı noktalarda
tm_shape(linelist_sf_hf_2k %>%  filter(is.na(osm_id.y))) +
  tm_dots(size=0.1, col='red') +
tm_view(set.view = c(-13.2284,8.4699, 13), set.zoom.limits = c(13,14))+

# Başlık ekleyin
tm_layout(title = "Cases by clinic catchment area")