github linkedin
Dünya Bankası, OECD ve Eurostat API'lerine Erişim

Uluslararası Ekonomik Kuruluşlar ve API’leri

API sistemi (Application Programing Interfaces - Uygulama Programlama Arayüzleri) en kısa hali ile iki yazılımın veya veritabanının birbiri ile sorunsuz çalışabilmesini, en sağlıklı bir şekilde birbiri ile iletişime geçmesini, birbiri ile veri alışverişi yapabilmesini sağlayan yapılara verilen isimdir.

R ekosistemi içerisinde geliştirilen bazı paketler kullanarak çeşitli kurum ve veri sahiplerinin ürettiği verilere API’ler kanalıyla kolayca erişilebilmektedir. Bu veritabanları içerik olarak çok zengin ve büyük veri tabanlarıdır.

R kütüphanelerin sağladığı en büyük kolaylık ise API’lerin yanıt olarak gönderdiği XML ve JSON dosyalarının paket içerisindeki çeşitli fonksiyonlar tarafından işlenerek doğrudan düzenli tablolara çevirilmesidir.

Bu blog paylaşımımda sosyal bilimciler için çok kritik konumda olan Dünya Bankası, OECD ve Avrupa Birliği tarafından derlenenen verilere ilişkin veritabanlarına API’ler kanalıyla nasıl erişilebileceğine kısaca değinmeye çalışacağım.

Dünya Bankası-API

Dünya Bankası’nın geliştirmiş API ile bir çok ülke detayında farklı sektör ve temadaki veriye kolaylık ulaşılabilmektedir. Data360r paketi ile bu işlem gerçekleştirilmektedir. Yapacağım bu çalışmada da veri manipülasyon işlemlerinde dplyr ve tidyr paketlerini, görselleme işlemlerinde ise ggplot2 paketini kullanacağım.

#Gerekli kütüphanelerin aktif hale getirilmesi
library(data360r)
library(dplyr)
library(tidyr)
library(ggplot2)
library(ggthemes)
library(plotly)
library(forcats)

Dünya Bankası, bu paket ile tc ve gov olmak üzere iki ayrı veritabanına erişime olanak sağlamaktadır. Bunların içerikleri ve göstergeler de birbirlerinden farklıdır. Çok fazla veri olduğu için öncelikle metaveri bilgisini data frame’e kaydediyoruz. Bu data frame nesnelerinin içeriğine kendi IDE’nizden bakarak hangi göstergeyi kullanmak istediğiniza karar verebilirsiniz.

#Metaverinin oluşturulması
df_indicators_tc <- get_metadata360(site="tc", metadata_type = "indicators")
df_indicators_tc <- df_indicators_tc %>% arrange(id)

df_indicators_gov <- get_metadata360(site="gov", metadata_type = "indicators")
df_indicators_gov <- df_indicators_gov %>% arrange(id)

Veri setlerinde hangi ülkelin olduğu ve bu ülkelere ilişkin referans kodları öğrenmek için de aşağıdaki komutu yazabiliriz.

#Ülke kodlarının alınması
df_countries <- get_metadata360(metadata_type = 'countries')

Aşağıdaki örnekte Türkiye için toplam milli tasarufların GSYH’ye oranını alalım

#Türkiye için verinin çekilmesi
tur_data <- get_data360(site = "tc", country_iso3 = c("TUR"),
                        indicator_id = c(983),
                        output_type = "long")
#Zaman serisi grafiğinin oluşturulması


ggplotly(
  ggplot(data = tur_data,aes(x=Period, y=Observation, group=1)) +
  geom_line(size=1)+geom_point() +
  scale_x_discrete(breaks = seq(1960,2016,2)) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
    labs(x="", y= "Tasarruf/GSYH")
  )

Aşağıdaki örnekte ise bazı ülkerininde verilerini alıyoruz ve bunlarıda grafiğimize ekliyoruz.

#Dört ükeye ilişkin verinin çekilmesi
countries_data <- get_data360(site = "tc", country_iso3 = c("TUR","CHN","USA","RUS"),
                        indicator_id = c(983),
                        output_type = "long")
#Dört ülkeli zaman serisi grafiğinin oluşturulması
ggplotly(
 ggplot(data = countries_data,aes(x=Period, y=Observation, group=`Country ISO3`,colour=`Country ISO3`)) + 
  geom_point(size=1)+ geom_line()+ scale_x_discrete(breaks = seq(1960,2016,2)) + 
  theme(axis.text.x = element_text(angle = 90, hjust = 1),
        plot.margin = unit(c(0,2,1,1), "cm")) +
   labs(x="", y= "Tasarruf/GSYH")

)

Bu verileri tek bir koordinat düzleminde göstermek yerine ülkeye göre dağıtarak da gösterebiliriz. Veriler incelendiğinde Türkiye’de ve özellikle Çin’de tasarruf oranlarındaki artış göze çarpmaktadır.

#Dört ülkeli zaman serisi grafiğinin oluşturulması
ggplotly(
  ggplot(data = countries_data,aes(x=Period, y=Observation, group=1)) +
    geom_line() + scale_x_discrete(breaks = seq(1960,2016,10)) +
    theme(axis.text.x = element_text(angle = 90, hjust = 1),
          plot.margin = unit(c(0,0,1,1), "cm")) +
    labs(x="", y= "Tasarruf/GSYH") + facet_grid(. ~ `Country ISO3`)
)

OECD-API

OECD verilerine ise OECD paketi ile erişilebilebilmektedir.

library(OECD)

Hangi veriyi aradığımız hakkında herhangi bir fikrimiz yoksa, ilk olarak bütün alt veritabanı bilgilerini bir dataframe’e kaydedip, onun üstünden belirli metin filtreleri ile arama yapabiliriz. Aşağıdaki kodda tüm alt veritabanları listesi kaydediliyor ve ardından “verimlilik” ifadesinin geçtiği alt veritabanlarının arıyoruz.

dataset_list <- get_datasets()
search_dataset("Productivity", data = dataset_list)
## # A tibble: 9 x 2
##   id      title                                                           
##   <fct>   <fct>                                                           
## 1 PDYGTH  Labour productivity growth in the total economy                 
## 2 LEVEL   Labour productivity levels in the total economy                 
## 3 MFP     Multi-factor Productivity                                       
## 4 ULC_EEQ Unit labour costs and labour productivity (employment based), T~
## 5 PDBI    Productivity by industry (ISIC Rev.3)                           
## 6 PDB_LV  Level of GDP per capita and productivity                        
## 7 PDB_GR  Growth in GDP per capita, productivity and ULC                  
## 8 PDBI_I4 Productivity and ULC by main economic activity (ISIC Rev.4)     
## 9 EAMFP   Environmentally Adjusted Multifactor Productivity

Eldeki verileri incelediğimde ekonomideki iş gücü verimliliğini ifade eden LEVEL id’ sine sahip alt veritabanını kullanmaya karar veriyorum.

dataset <- "LEVEL"

Veritabanını indirmeden önce verinin yapısına bakmakta fayda bulunmaktadır. str fonksiyonu ile verinin yapısını incelediğimiz “list” yapısı halinde metaveri bilgilerini görebiliyoruz. Veriyi indirmeden önce bu veri filtreleri ile indirilecek dosya büyüklüğü kısıtlanabilir. Alternatif olarak tüm veri setini indirip, ardından base R fonksiyonları ile filtreleme de yapılabilir fakat bu yöntem dosyası indirme süresini uzatacaktır.

dstruc <- get_data_structure(dataset)
str(dstruc, max.level = 1)
## List of 6
##  $ VAR_DESC   :'data.frame': 6 obs. of  2 variables:
##  $ VAR        :'data.frame': 8 obs. of  2 variables:
##  $ COU        :'data.frame': 38 obs. of  2 variables:
##  $ TIME       :'data.frame': 1 obs. of  2 variables:
##  $ OBS_STATUS :'data.frame': 23 obs. of  2 variables:
##  $ TIME_FORMAT:'data.frame': 5 obs. of  2 variables:

Tek bir değişkenle çalışacağım için dosya büyüklüğü sorununu ihmal ediyorum ve tüm veri setini filtre kullanmadan indiriyorum. Devamında dplyr paketi yardımıyla gerekli filtrelemeleri yapacağım.


df_productivity <- get_dataset(dataset = dataset)

head(df_productivity)
## # A tibble: 6 x 4
##   VAR   COU   TIME  obsValue
##   <chr> <chr> <chr>    <dbl>
## 1 PPPS  AUS   2012      1.46
## 2 HRSA  AUS   2012   1685   
## 3 EMPT  AUS   2012  11594   
## 4 HRST  AUS   2012  19538   
## 5 PDYC  AUS   2012     53   
## 6 PDYU  AUS   2012     82.7

Veriyi indirildiğinde VAR değişkeni dikkate çarpmaktadır. Buradaki VAR değişkeni veritabanındaki farklı değişkenleri ifade etmektedir. Bunların ne olduğu aşağıdaki sorgu ile anlyabiliriz.

dstruc$VAR
##     id                                                              label
## 1 PPPS Purchasing Power Parities for total GDP, national currency per USD
## 2 HRSA                                    Average hours worked per person
## 3 EMPT                       Total employment (number of persons engaged)
## 4 HRST                                  Hours worked for total employment
## 5 PDYC                           GDP per hour worked, current prices, USD
## 6 PDYU                          GDP per hour worked as % of USA (USA=100)
## 7 GDNC Gross Domestic Product, current prices, national currency millions
## 8 GDUS               Gross Domestic Product, current prices, USD millions

Sonuçları incelediğimde Çalışılan Saat Başına GSYH Tutarını (Dolar) ifade eden PDYC değişkenini kullanmaya karar veriyorum ve verisetimi buna göre filtreliyorum

df_productivity <- df_productivity %>% filter(VAR == "PDYC")
df_productivity$COU <- as.factor(df_productivity$COU)

Filtreleme işlemini tamamladıktan sonra değişkene ilişkin yalnızca 2012 yılı verilerinin olduğunu görüyorum. Artık veri görselleştirmeye hazır durumdadır.


ggplotly(
  ggplot(df_productivity) + geom_bar(aes(x= fct_reorder(COU, obsValue,.desc = TRUE), y= obsValue), 
                                     alpha=0.7, fill="green4", stat = "identity") +
    theme(axis.text.x = element_text(angle = 90, hjust = 1),
          plot.margin = unit(c(0,0,1,1), "cm")) + 
    labs(x="", y= "GSYH / Çalışılan Saat")
     )


Eurostat-API

Eurostat’ın API kanalıyla sunduğu verilere erişmek için eurostat paketi kullanılabilmektedir. Eurostat veritabanlarında yer alan verilere ilişkin metaveriye erişmek için aşağıdaki fonksiyon kullanılabilir.

library(eurostat)
library(stringr)

toc <- get_eurostat_toc()

#Metaverinin incelenmesi
colnames(toc)
## [1] "title"                       "code"                       
## [3] "type"                        "last update of data"        
## [5] "last table structure change" "data start"                 
## [7] "data end"                    "values"
head(toc)
## # A tibble: 6 x 8
##   title code  type  `last update of~ `last table str~ `data start`
##   <chr> <chr> <chr> <chr>            <chr>            <chr>       
## 1 Data~ data  fold~ <NA>             <NA>             <NA>        
## 2 Gene~ gene~ fold~ <NA>             <NA>             <NA>        
## 3 Euro~ euro~ fold~ <NA>             <NA>             <NA>        
## 4 Busi~ ei_b~ fold~ <NA>             <NA>             <NA>        
## 5 Cons~ ei_b~ fold~ <NA>             <NA>             <NA>        
## 6 Cons~ ei_b~ data~ 29.11.2018       29.11.2018       1980M01     
## # ... with 2 more variables: `data end` <chr>, values <chr>

Metaverinin yer aldığı toc dataframe nesnesi RStudio’dan da detaylı incelenip, hangi verilerin olup olmadığı görülebilir. Kullanılacak olan değişken belirlendikten sonra toc dataframe dosyasından hangi değişkene ilişkin code değerinin elde edilmesi gerekmektedir. Dataframe’i inceledikten sonra NUTS3 bölgelerine göre nüfus yoğunluğu verisetini kullanmaya karar veriyorum.

id <- "demo_r_d3dens"
dat <- get_eurostat(id, time_format = "num")
head(dat)
## # A tibble: 6 x 4
##   unit    geo    time values
##   <fct>   <fct> <dbl>  <dbl>
## 1 HAB_KM2 AL     2016  105. 
## 2 HAB_KM2 AL0    2016  105. 
## 3 HAB_KM2 AT     2016  106. 
## 4 HAB_KM2 AT1    2016  165. 
## 5 HAB_KM2 AT11   2016   77.1
## 6 HAB_KM2 AT111  2016   54.4

Verisetinde farklı mekansal ölçekte ve yıllara göre kırınımlar bulunmaktadır. Bu sebeple verisetini yalnızca 2016 yılı ve NUTS-3 bölgeleri olacak şekilde filtreliyorum.

dat <- dat %>% filter(time == 2016) %>%
  filter(str_length(geo)==5) 
#Şehir adlarının yerleştirilmesi
city_labels <- label_eurostat(dat, fix_duplicated = T)
dat$geo_name <- city_labels$geo

Yukarıda gösterdiğim diğer örneklerden farklı olarak bu örnekte veriyi harita üzerinde görselleştirmek istiyorum. Fakat harita üzerinde görselleştirmeden önce Avrupa ülkelerinin NUTS-3 ölçeğinde vektör harita verisine ihtiyaç bulunmaktadır.

AB komisyonunun mekansal verilerden sorumlu GISCO biriminin mekansal verilerine de eurostat paketi aracılığıyla ulaşılabilmektedir.

eu_map <- get_eurostat_geospatial(output_class = "sf", resolution = "60", 
                                  nuts_level = 3)

Verideki değerler sürekli sayısal değerlerdir. Harita üzerinde görselleştirmede kolaylık sağlaması için bu değerleri belirli aralıklarda grupluyorum.

eu_map <- eu_map %>% left_join(dat, by = c("NUTS_ID" = "geo"))
eu_map$category <- cut(eu_map$values, c(0,25,50,100,150,200,500,1000,5000,20000))

Artık geriye ggplot2 ile verilerin görselleştirilmesi kalmaktadır.


ggplot(data = eu_map) + geom_sf(aes(fill = category)) +
  coord_sf(xlim=c(-12,44), ylim=c(35,67)) +
  scale_fill_brewer(palette = "RdPu", name = "") +
  theme(legend.position = c(0.9,0.7),
        legend.background =  element_rect(fill = "transparent"),
        axis.text=element_blank(),
        axis.ticks = element_blank()) +
  ggtitle("NUTS 3 Bölgelerine Göre Nüfus Yoğunluğu")

Bonus!!! İnteraktif Harita

library(leaflet)

bins <- c(0,25,50,100,150,200,500,1000,5000,20000, Inf)
pal2 <- colorBin("plasma",  domain = eu_map$values, bins = bins,
                 reverse = TRUE)

labels <- sprintf(
  "<strong>%s</strong><br/>Km2 başına düşen kişi sayısı: %g",
  eu_map$geo_name, eu_map$values) %>% lapply(htmltools::HTML)

leaflet(width = 720) %>% addPolygons(data= eu_map, color = "#444444", weight = 1, smoothFactor = 0.5, dashArray="",
              opacity = 1.0, fillOpacity = 0.7, fillColor = ~pal2(eu_map$values),
              highlightOptions = highlightOptions(color = "white", weight = 2,
                                                  dashArray = "",
                                                  fillOpacity = 1,
                                                  bringToFront = TRUE),
              label = labels,
              labelOptions = labelOptions(
                style = list("font-weight" = "normal", padding = "3px 8px"),
                textsize = "12px",
                direction = "auto"))  %>% 
  
   addLegend(pal = pal2, values = eu_map$values, opacity = 0.7, title = NULL,
    position = "topright") %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  setView(lng = 20.508074,lat = 48.552978, zoom = 3)