Lấy dữ liệu IMF bằng R

Bài viết ngắn sau đây hướng dẫn mọi người cách lấy dữ liệu của IMF bằng R sử dụng package imfr. Sau đó chúng ta sẽ thử plot một cái interactive map bằng leaflet biểu thị hướng xuất khẩu của Việt Nam.

Packages

Sử dụng package “imfr” từ https://github.com/christophergandrud/imfr Để cài được thì trước tiên cần cài devtool trước.
install.packages("devtools")
install.packages("tidyverse")
Sau đó dùng lệnh sau:
devtools::install_github("christophergandrud/imfr")
Sau đó load imfr và số thư viện thường dùng
library(imfr)
library(tidyverse)
library(stringr)
library(knitr)

Database

IMF sử dụng rất nhiều cơ sở dữ liệu khác nhau, mỗi CSDL cho biết thông tin về một nhóm các chỉ số nào đó, mỗi chỉ số đi kèm với một code riêng và các parameters khác nhau. Đễ dễ hình dung, nếu muốn lấy dữ liệu x nào đó, chúng ta theo các bước sau:
  1. Tìm xem x thuộc CSDL nào
  2. Có những parameters nào cần phải biết.
  3. Sử dụng API để lấy data
Trước tiên, sử dụng lệnh sau để fetch các database có trong IMF.
databases <- imf_databases()

Query

Nhìn qua sẽ thấy một số databases sau
Bước 1: Search Description xem có đề cập tới dữ liệu bạn cần không. Mình không thấy chỗ nào ghi GDP, cơ mà mình biết GDP nằm trong database IFS nên mình sẽ sử dụng nó. Một số databases khác khá phổ biến là DOTS, BOP, vân vân. Bước 2: Bên trong mỗi Database sẽ đi kèm với một loạt các tham số (parameters). Để truy suất, dùng lệnh sau:
params_ifs <- imf_parameters(database_id = "IFS")
Ở đây có 3 tham số
  • freq : tần suất theo tháng, quý, hay năm
  • ref_area: khu vực. Chúng ta có thể lấy khu vực hoặc quốc gia.
  • indicator: chỉ số.
Mỗi parameter này có tên của nó. Fetch chúng như sau:
param_codelist_ifs <- imf_codelist(database_id = "IFS")
Trong cái CL_INDICATOR_IFS có rất nhiều thứ ngoài GDP. Để xem rõ hơn các giá trị bên trong parameter đó, dùng lệnh sau:
IFS_INDICATOR_codes<-imf_codes(codelist = "CL_INDICATOR_IFS")
Và các bạn sẽ thấy hiện ra gần 1700 indicators. Search Gross Domestic Product cho ra các kết quả sau:
Như vậy, mình biết được x là gì. Nó là NGDP_R_XDC. Bước 3: Để lấy dữ liệu, các bạn sử dụng lệnh imf_dataset và liệt kê các tham số mà chúng ta vừa tìm. Các arguments gồm có: database_id, freq, ref_area, indicator, start_year, end_year.
df2 <- imf_dataset(database_id = "IFS",
         freq = "A", ref_area = "VN",
         indicator = "NGDP_XDC",
         start_year = 2000, end_year = 2015)
Chú ý là ref_area sẽ dùng ISO 2 kí tự. Mình đã thử freq="Q" (quý) nhưng nó báo không ra kết quả. Thử lại theo năm freq="A" thì được.

Kết quả

  date            value freq ref_area indicator unit_mult time_format
1  2000 441646126.403925    A       VN  NGDP_XDC         6         P1Y
2  2001 481294607.382071    A       VN  NGDP_XDC         6         P1Y
3  2002 535761844.030122    A       VN  NGDP_XDC         6         P1Y
4  2003 613443025.683183    A       VN  NGDP_XDC         6         P1Y
5  2004 779337670.445458    A       VN  NGDP_XDC         6         P1Y
6  2005 914001166.898895    A       VN  NGDP_XDC         6         P1Y
7  2006  1061564518.7912    A       VN  NGDP_XDC         6         P1Y
8  2007 1246769288.99484    A       VN  NGDP_XDC         6         P1Y
9  2008   1616047128.951    A       VN  NGDP_XDC         6         P1Y
10 2009 1809148949.95394    A       VN  NGDP_XDC         6         P1Y
11 2010 2739843171.96272    A       VN  NGDP_XDC         6         P1Y
12 2011 3539881312.29571    A       VN  NGDP_XDC         6         P1Y
13 2012 4073762287.04081    A       VN  NGDP_XDC         6         P1Y
14 2013 4473655598.64269    A       VN  NGDP_XDC         6         P1Y
15 2014 4937031677.60098    A       VN  NGDP_XDC         6         P1Y
16 2015 5191323729.85015    A       VN  NGDP_XDC         6         P1Y
17 2016 5639401003.26228    A       VN  NGDP_XDC         6         P1Y
18 2017 6293904553.91016    A       VN  NGDP_XDC         6         P1Y
19 2018 7009042131.65849    A       VN  NGDP_XDC         6         P1Y
20 2019 7707200287.05148    A       VN  NGDP_XDC         6         P1Y
21 2020 8044385729.09459    A       VN  NGDP_XDC         6         P1Y
Để lấy nhiều dữ liệu cùng một lúc thì các bạn xài c("x","y") trong R. Ví dụ
IFS_VN <-imf_dataset(database_id = "IFS",
              indicator = c("BG_BP6_USD" , "LE_PE_NUM" , "EREER_IX" , "FMA_XDC"),
              ref_area = "VN", 
              freq = 'A', 
              start_year = 1990 , end_year = 2020)
   date             value @OBS_STATUS freq ref_area  indicator unit_mult time_format
1  1996             -2775        <NA>    A       VN BG_BP6_USD         6         P1Y
2  1997             -1247        <NA>    A       VN BG_BP6_USD         6         P1Y
3  1998              -989        <NA>    A       VN BG_BP6_USD         6         P1Y
4  1999               972        <NA>    A       VN BG_BP6_USD         6         P1Y
5  2000               375        <NA>    A       VN BG_BP6_USD         6         P1Y
6  2001               481        <NA>    A       VN BG_BP6_USD         6         P1Y
7  2002             -1054        <NA>    A       VN BG_BP6_USD         6         P1Y
8  2003             -2581        <NA>    A       VN BG_BP6_USD         6         P1Y
9  2004             -2287        <NA>    A       VN BG_BP6_USD         6         P1Y
10 2005 -2439.18900000001        <NA>    A       VN BG_BP6_USD         6         P1Y
11 2006         -2775.559        <NA>    A       VN BG_BP6_USD         6         P1Y
12 2007          -10438.1        <NA>    A       VN BG_BP6_USD         6         P1Y
13 2008            -12783        <NA>    A       VN BG_BP6_USD         6         P1Y
14 2009             -7607        <NA>    A       VN BG_BP6_USD         6         P1Y
15 2010             -5136        <NA>    A       VN BG_BP6_USD         6         P1Y
16 2011              -450        <NA>    A       VN BG_BP6_USD         6         P1Y
17 2012              9913        <NA>    A       VN BG_BP6_USD         6         P1Y
18 2013              8713           B    A       VN BG_BP6_USD         6         P1Y
19 2014             12126        <NA>    A       VN BG_BP6_USD         6         P1Y
20 2015              7374        <NA>    A       VN BG_BP6_USD         6         P1Y
21 2016             11042        <NA>    A       VN BG_BP6_USD         6         P1Y
22 2017             10846        <NA>    A       VN BG_BP6_USD         6         P1Y
23 2018         16539.629        <NA>    A       VN BG_BP6_USD         6         P1Y
24 2019         21494.247        <NA>    A       VN BG_BP6_USD         6         P1Y
25 2020             30708        <NA>    A       VN BG_BP6_USD         6         P1Y
26 1990             30286        <NA>    A       VN  LE_PE_NUM         3         P1Y
27 1991             30974        <NA>    A       VN  LE_PE_NUM         3         P1Y
28 1992           31815.2        <NA>    A       VN  LE_PE_NUM         3         P1Y
29 1993             32718        <NA>    A       VN  LE_PE_NUM         3         P1Y
30 1994           33663.9        <NA>    A       VN  LE_PE_NUM         3         P1Y
31 1995           34589.6        <NA>    A       VN  LE_PE_NUM         3         P1Y
32 1996         35385.968        <NA>    A       VN  LE_PE_NUM         3         P1Y
33 1997         35602.532        <NA>    A       VN  LE_PE_NUM         3         P1Y
34 1998         36954.303        <NA>    A       VN  LE_PE_NUM         3         P1Y
35 1999         38119.872        <NA>    A       VN  LE_PE_NUM         3         P1Y
36 2000           38367.6        <NA>    A       VN  LE_PE_NUM         3         P1Y
37 2001           39000.3        <NA>    A       VN  LE_PE_NUM         3         P1Y
38 2002           40162.3        <NA>    A       VN  LE_PE_NUM         3         P1Y
39 2003           41175.7        <NA>    A       VN  LE_PE_NUM         3         P1Y
40 2004         42315.615        <NA>    A       VN  LE_PE_NUM         3         P1Y
41 2005           42526.9        <NA>    A       VN  LE_PE_NUM         3         P1Y
42 2006           43338.9        <NA>    A       VN  LE_PE_NUM         3         P1Y
43 2007         46020.235        <NA>    A       VN  LE_PE_NUM         3         P1Y
44 2009          48011.95        <NA>    A       VN  LE_PE_NUM         3         P1Y
45 2010         49493.696        <NA>    A       VN  LE_PE_NUM         3         P1Y
46 2011       50881.18025        <NA>    A       VN  LE_PE_NUM         3         P1Y
47 2012       51685.54275        <NA>    A       VN  LE_PE_NUM         3         P1Y
48 2013       52208.07625        <NA>    A       VN  LE_PE_NUM         3         P1Y
49 2014       52754.39725        <NA>    A       VN  LE_PE_NUM         3         P1Y
50 2015       52619.05175        <NA>    A       VN  LE_PE_NUM         3         P1Y
51 2016       53302.75575        <NA>    A       VN  LE_PE_NUM         3         P1Y
52 2017       53703.36225        <NA>    A       VN  LE_PE_NUM         3         P1Y
53 2018         54211.847        <NA>    A       VN  LE_PE_NUM         3         P1Y
54 2019         54574.308        <NA>    A       VN  LE_PE_NUM         3         P1Y
55 2020        53326.0225        <NA>    A       VN  LE_PE_NUM         3         P1Y

DIRECTION OF TRADE

Ở phần cuối, chúng ta sẽ thử làm một bản đồ DOT của Việt Nam sang các nước khác trong năm 2018 (trước Covid).
DOT_VN <- imf_dataset(database_id = "DOT" , 
                                indicator = c("TXG_FOB_USD") , 
                                ref_area = "VN" , 
                                start_year = 1990 , end_year = 2020, 
                                return_raw = TRUE)

# filter annual data
DOT_VN_data <- DOT_VN %>%
  filter(`@FREQ` == "A")

# unnest Obs
DOT_VN_data_df <- DOT_VN_data %>%
  mutate(Obs = map(Obs, ~ if(is.list(.x)) as_tibble(.x) else .x)) %>%
  unnest(Obs)
Để plot bản đồ, các bạn phải cài các package leaflet, leaflet.extrasleaflet.minicharts
library(leaflet)
library(leaflet.extras)
library(leaflet.minicharts)

# extract codes for trade partners
TRADE_PARTNERS <- unique(DOT_VN_data_df$`@COUNTERPART_AREA`)

# extract lattitudes and longitudes of trade partners
library(CoordinateCleaner)
data(countryref)

Long_Lat <-countryref %>% 
  filter(type == "country" & iso2 %in% TRADE_PARTNERS) %>% 
  select(iso2, "destination_lon" = centroid.lon , "destination_lat"= centroid.lat, capital.lon, capital.lat) %>%
  distinct(capital.lat, .keep_all = TRUE) %>% 
  mutate(VN_Lat = 14.0583, VN_Long = 108.2772) %>% rename("destination" = iso2)

# extract map data
VN_X_Flow <- DOT_VN_data_df %>% 
  filter(`@REF_AREA`== "VN" & `@TIME_PERIOD` == 2018) %>% 
  select("origin" = `@REF_AREA`, "destination" = `@COUNTERPART_AREA`, "Export_Value" =`@OBS_VALUE`) %>% 
  left_join(. , Long_Lat)

VN_X_Flow$Export_Value <- as.numeric(VN_X_Flow$Export_Value)/1000

# plot flows
leaflet() %>% 
  addTiles() %>%
  addFlows(lng0 = VN_X_Flow$VN_Long , 
           lat0 = VN_X_Flow$VN_Lat  , 
           lng1 = VN_X_Flow$destination_lon , 
           lat1 = VN_X_Flow$destination_lat , 
           flow = VN_X_Flow$Export_Value , 
           dir = 1, 
           minThickness = 0.1,
           maxThickness = 2.5)

Tham khảo:

Để lại bình luận

Trang web này sử dụng Akismet để lọc thư rác. Tìm hiểu cách xử lý bình luận của bạn.