1 CEPII貿易データ

フランスの研究機関CEPIIが作成している、Gravityという無料のデータベースから、2国間の貿易額など必要最小限のデータを抜き出した。2019年の1年間の世界の2国間の貿易額(tradeflow_baci)が収録されている。

Gravityデータベースは定期的に更新されている。本ページで用いるデータは、「Gravity_dta_V202211」版であり、2024年3月に入手した。主な変数は以下の通りである。

  • gravity_basic2019.xlsx
  • iso_o: 輸出国 (origins) のISO国コード。例)USA, JPN, CHN。
  • iso_d: 輸入国(destinations) のISO国コード。例)USA, JPN, CHN。
  • tradeflow_baci: 貿易フロー。1000 USD (source: BACI)。 輸出国から輸入国への輸出額
  • pair: ペアのID。
library(readr)
gravity_basic2019 <- read_csv("gravity_basic2019.csv")

gravity_basic2019 <- subset(gravity_basic2019, gravity_basic2019$iso3_o == "JPN")

オンラインでデータ読み込む場合は、以下のコード。

gravity_basic2019 <- read_csv("https://ayumu-tanaka.github.io/teaching/gravity_basic2019.csv")

2 空間ポリゴンをデータに変換する

  • ここで使うggplot2fortify()関数は、地図オブジェクトを、ggplot2で描画できるようにデータ・フレームに変換する関数である。以下のページに簡単な解説がある。
  • ggplot2: Fortify method for map objects
  • fortify()関数は、変数として、国の輪郭の緯度経度(long, lat)のほかに、groupとして国名を生成する。
# 世界地図
library(rworldmap)
worldMap <- getMap()

# ggplot2で地図を描画したり、データ処理を行うため。
library(tidyverse)
mapworld_df <- fortify(worldMap) 
head(mapworld_df)
##       long      lat order  hole piece          id         group
## 1 61.21082 35.65007     1 FALSE     1 Afghanistan Afghanistan.1
## 2 62.23065 35.27066     2 FALSE     1 Afghanistan Afghanistan.1
## 3 62.98466 35.40404     3 FALSE     1 Afghanistan Afghanistan.1
## 4 63.19354 35.85717     4 FALSE     1 Afghanistan Afghanistan.1
## 5 63.98290 36.00796     5 FALSE     1 Afghanistan Afghanistan.1
## 6 64.54648 36.31207     6 FALSE     1 Afghanistan Afghanistan.1

3 地図ファイルから緯度経度のデータを取り出す

# 世界地図
library(rworldmap)
worldMap <- getMap()

# データ処理のため。
library(tidyverse)

# 空間データを数値データに変換
worldMap_data <- as.data.frame(worldMap) 

# 緯度経度のデータ作成
Long_Lat <- worldMap_data[, c(17, 30, 31, 32)]

# エクセルに出力
library(openxlsx)
write.xlsx(Long_Lat, file = "Long_Lat.xlsx")

4 貿易データに緯度経度を接続

gravity_map1 <- left_join(gravity_basic2019, Long_Lat, 
                                   by = c("iso3_o" = "ISO3"))

gravity_map2 <- left_join(gravity_map1, Long_Lat, 
                                   by = c("iso3_d" = "ISO3"),
                                   suffix = c("", "_d"))

5 上位貿易相手国に限定する

  • rank()関数は、昇順のため、そのままでは、第1位は貿易額が少ない国になってしまう。
  • 降順にするため、逆数でランクを作成している。
# 貿易額順のランク
gravity_map2$rank <- rank(1/gravity_map2$tradeflow_baci, na.last = TRUE)
# 上位国
gravity_map2_top <- subset(gravity_map2, gravity_map2$rank<=5)
# 並び替え
gravity_map2_top <- gravity_map2_top[order(gravity_map2_top$rank), ]
# データ確認
head(gravity_map2_top)
## # A tibble: 5 × 12
##    year iso3_o iso3_d tradeflow_baci  pair NAME    LON   LAT NAME_d  LON_d LAT_d
##   <dbl> <chr>  <chr>           <dbl> <dbl> <fct> <dbl> <dbl> <fct>   <dbl> <dbl>
## 1  2019 JPN    USA        132881829. 14747 Japan  137.  36.0 United… -99.1  39.5
## 2  2019 JPN    CHN        128358138. 14582 Japan  137.  36.0 China   104.   36.6
## 3  2019 JPN    KOR         44631166. 14650 Japan  137.  36.0 S. Kor… 128.   36.4
## 4  2019 JPN    TWN         41610938. 14742 Japan  137.  36.0 Taiwan  121.   23.7
## 5  2019 JPN    THA         28485440. 14732 Japan  137.  36.0 Thaila… 101.   15.0
## # ℹ 1 more variable: rank <dbl>
barplot(gravity_map2_top$tradeflow_baci, names.arg = gravity_map2_top$iso3_d)

6 地図の描画

  • scale_colour_distillerで使える色:Blues, BuGn, BuPu, GnBu, Greens, Greys, Oranges, OrRd, PuBu, PuBuGn, PuRd, Purples, RdPu, Reds, YlGn, YlGnBu, YlOrBr, YlOrRd

  • direction = 1で色が濃いいほど、貿易額が増えるように設定。

  • 貿易フローの形を直線にしたい場合は、geom_curve()の代わりにgeom_segment()を使う。

  • 南極などを除くために、coord_sf(xlim = c(-150, 150), ylim = c(90, -60), expand = TRUE)と設定。

  • 貿易フロー(1000 USD)のままでは、値が大きすぎるので、10000000で割っている。貿易額の単位は、100億ドル。

  • color = tradeflow_baci/10000000 で、貿易額でフローの曲線の色を変えている。

  • linewidth = tradeflow_baci/10000000で、貿易額でフローの曲線の幅を変えている。

  • geom_curveshow.legend = FALSEとすると、凡例を非表示にできる。

  • 国名ラベルと矢印が重ならないように、緯度経度をたし引き補正している。

# 地図作成
  ggplot() + 
    geom_polygon(data = mapworld_df, 
               aes(long, lat, group = group), 
                 fill = "white", colour = "grey50") +
    geom_curve(data = gravity_map2_top, 
               aes(x = LON, y = LAT, 
                   xend = LON_d + 10, yend = LAT_d + 10, 
                   color = tradeflow_baci/10000000, 
                   linewidth = tradeflow_baci/10000000),
                   #show.legend = FALSE,
                 arrow = arrow(length = unit(0.01, "inches"))) +
    scale_colour_distiller(palette = "YlGnBu", direction = 1, 
               name="貿易額(100億ドル)", guide = "colorbar") +
    scale_linewidth(name = "貿易額(100億ドル)", guide = "legend") +
    geom_text(data = gravity_map2_top, 
              label = gravity_map2_top$iso3_d, 
              aes(x = LON_d - 5, y = LAT_d - 5), hjust=0, vjust=0, 
              fontface='bold', size=3, check_overlap = FALSE) +
    coord_sf(xlim = c(-150, 150), ylim = c(100, -60), expand = TRUE) 

# 保存
ggsave("trade_flow_ggplot2_baci.png", width = 8, height = 4, dpi = "print")

7 参考にしたサイト