HOME/Articles/

Rで国際通貨基金(IMF)のデータを取得する(その2)

Article Outline

Rで国際通貨基金(IMF)のデータを取得する(その2)

2023-05-06: WEOcountry.Rデータを手直し。それにより、Rコードの少し変更しました。

">Hits

RでGDPの推移を見る(世界銀行のデータ)で WDIパッケージを使って、世界銀行のデータを取得し、グラフを作成した。

今回は、imfrパッケージを使ってIMFの貿易に関するデータを取得し、地図上にプロットする。

Package‘imfr’was removed from the CRAN repository.
Archived on 2022-07-09 for policy violation.

ということなので、imfr package: https://github.com/christophergandrud/imfrからインストールする。

(参考)

  1. Downloading Data from the IMF API Using R

  2. Static and dynamic network visualization with R

2つの国を結ぶのに国の位置情報が必要なので、いろんなコードとの対応付けするデータ「WEOcountry.R」を作成した。

作成に使ったデータは、

  • countrycode::codelist <- データの中に、imf(WEO)コードも含む

  • CoordinateCleaner::countryref <- 国の位置情報

  • World Economic Outlook Database:2023 April

    • SDMX Data Structure Definition -> weoapr2023-sdmx-dsd.xlsxREF_AREA シート

これらを共通するコードにより、merge。RとlibreOffice Calcを使って編集。

なお、Sri Lanka、Nauru、Puerto Rico、Uzbekistan、Kosovo、West Bank and Gaza、Macao SAR の位置情報はネットで検索した。

確認して、使ってください。<- 重要

中国が輸出しているアフリカの国

ExpChina

  • 輸出額に応じて、線の太さを変えています。

日本が輸出しているアフリカの国

ExpJapan

アメリカが輸出しているアフリカの国

ExpUSA

なお、leaflet パッケージを使った地図を書くコードは下に載せています。図は省略。

Rコード

(注意) imfr パッケージは、githubからremotes::install_github("christophergandrud/imfr")でインストールする。

#source("WEOcountry.R")
url="https://raw.githubusercontent.com/statrstart/statrstart.github.com/master/source/data/"
source(paste0(url,"WEOcountry.R"))
#
# WEO(imf)コードが欠損しているデータを取り除く
WEOcountry <- WEOcountry[!is.na(WEOcountry$WEO) , ] 
# 
# remotes::install_github("christophergandrud/imfr")
require(imfr)
# sudo apt install libharfbuzz-dev libfribidi-dev
require(tidyverse)
#require(stringr)
require(knitr)
kable( head(WEOcountry) )
Name iso2c iso3c WEO continent destination_lon destination_lat capital.lon capital.lat
Andorra AD AND 171 Europe 1.50 42.500 1.52 42.50
United Arab Emirates AE ARE 466 Asia 54.00 24.000 54.37 24.47
Afghanistan AF AFG 512 Asia 65.00 33.000 69.18 34.52
Antigua & Barbuda AG ATG 311 Americas -61.80 17.050 -61.85 17.12
Anguilla AI AIA 312 Americas -63.05 18.217 -63.05 18.22
Albania AL ALB 914 Europe 20.00 41.000 19.82 41.32
# 輸入国(アフリカの国)
( Africa_ISO2<- WEOcountry$iso2c[WEOcountry$continent=="Africa"] )
#
# [1] "AO" "BF" "BI" "BJ" "BW" "CD" "CF" "CG" "CI" "CM" "CV" "DJ" "DZ" "EG" "ER"
#[16] "ET" "GA" "GH" "GM" "GN" "GQ" "GW" "KE" "KM" "LR" "LS" "LY" "MA" "MG" "ML"
#[31] "MR" "MU" "MW" "MZ" "NA" "NE" "NG" "RW" "SC" "SD" "SH" "SL" "SN" "SO" "SS"
#[46] "ST" "SZ" "TD" "TG" "TN" "TZ" "UG" "ZA" "ZM" "ZW" "RE"
#
# 輸出国(今回は、日本、中国、アメリカを調べる)
ISO2<- c("JP","CN","US")
WEOcountry[WEOcountry$iso2c %in% ISO2 ,c("Name", "iso2c", "destination_lon", "destination_lat") ]
#             Name iso2c destination_lon destination_lat
#44          China    CN             105              35
#103         Japan    JP             138              36
#213 United States    US             -97              38

2022年のデータをダウンロード

DOT <- imf_dataset(database_id = "DOT" , indicator = c("TXG_FOB_USD") ,freq='A',ref_area = ISO2 , start = 2022, end=2022,return_raw = TRUE)
# 輸入国がアフリカ地域のデータを抽出
DOT_Data<-DOT %>% 
  filter(`@COUNTERPART_AREA` %in% Africa_ISO2) %>% unnest(Obs) %>% 
  select(From=`@REF_AREA`, To=`@COUNTERPART_AREA`,Year=`@TIME_PERIOD`,Value=`@OBS_VALUE`) 
# 扱い慣れたデータフレームにしちゃう。
dat<- as.data.frame(DOT_Data)
#colnames(dat)<- c("From","To","Year","Value")
# 10億ドル単位にする
dat$Value<- as.numeric(dat$Value)/1000
dat$Year<- as.integer(dat$Year)
nrow(dat)
#[1] 162
# アフリカの国の位置データ
country<- WEOcountry[WEOcountry$iso2c %in% Africa_ISO2 ,c("Name", "iso2c", "destination_lon", "destination_lat") ]
#kable(country)

地図を書くためのパッケージを読み込む

今回は、maps、igraphを使う。

# 地図:maps  矢印:arrowsでもいいけど、igraph:::igraph.Arrows <- カーブ矢印も書ける
require(maps)
require(igraph)
# 長ったらしい関数名(igraph.Arrows)を短く(Arrows)
Arrows <- igraph:::igraph.Arrows

中国が輸出している国

fromC="CN"の部分をfromC="JP"とかfromC="US"に変えれば、よい。

fromC="CN"
todat<-dat[dat$From==fromC ,]
# 中国の経度、緯度
lonlat<- as.numeric(WEOcountry[WEOcountry$iso2c %in% fromC ,c("destination_lon", "destination_lat") ])
# 地図を描く範囲
xlim<- range(c(lonlat[1],country$destination_lon) )
ylim<- range(c(lonlat[2],country$destination_lat) )

地図を作成

par(mfrow = c(1,1), mar=c(0,0,0,0))
map("world", col="grey30", fill=TRUE, bg="gray10", lwd=0.5,xlim=c(xlim[1]-5,xlim[2]+5),ylim=c(ylim[1]-25,ylim[2]+25))
# 中国の重心位置に点
points(x=lonlat[1], y=lonlat[2], pch=19,cex=1, col="blue")
# point: アフリカの国
points(x=country$destination_lon, y=country$destination_lat, pch=19,cex=0.5, col="tomato")
# 矢印の色
col="orange"
# 矢印を書く
for(i in 1:nrow(todat))  {
    from= lonlat
    to=country[country$iso2c==todat[i,"To"],c("destination_lon", "destination_lat")]
    lwd=ifelse(todat[i,"Value"] > 1 , round(log(todat[i,"Value"]),1) + 1 , todat[i,"Value"]+0.5 )
        Arrows(x1=from[1],y1=from[2], x2=as.numeric(to[1]),y2=as.numeric(to[2]) , 
            h.lwd=lwd, sh.lwd=lwd, sh.col=col, curve=0, width=1, size=1.5)
}

タイトルを付けてみる

当然、「中国」の部分は輸出国によって変える。

text(x=mean(par("usr")[1:2]),y=par("usr")[3],labels="輸出:中国 -> アフリカの国々(2022)",cex=1.5,pos=3,col="white")

参考1 のように leaflet パッケージを使う

# パッケージを読み込む
require(leaflet)
require(leaflet.minicharts)
# データ結合
X_Flow=merge(todat,country,by.x="To",by.y="iso2c")
# インタラクティブな地図
leaflet() %>% 
  addTiles() %>%
  addFlows(lng0 = lonlat[1] , 
           lat0 = lonlat[2]  , 
           lng1 = X_Flow$destination_lon , 
           lat1 = X_Flow$destination_lat , 
           flow = X_Flow$Value , 
           dir = 1, 
           minThickness = 0.1,
           maxThickness = 2.5)