はじめに

OECD StatisticsはOECD加盟国の統計データをいろいろ集めている非常に便利なサイトである.しかしデータを探し出すのに骨が折れる.

ここに{OECD}パッケージというものがあり,これを使うことで,OECD StatsのホームページにアクセスすることなくRStudio上だけでデータの収集と分析ができる.

ただし使い方にややクセがあるのでここで備忘録を残しておきたい.

ライブラリ読み込み

インストールしていなければinstall.packages("OECD")でどうぞ.

library(tidyverse)
library(magrittr)
library(OECD)

データセットを探す

{OECD}は大量のデータセットを含んでいるので,お目当てのデータセットを探し当てるのが第一目標となる.ここでは各国の総人口を出してみたい.まずすべてのデータセットを含むオブジェクトを作成し,search_dataset()で検索する.

ds_all <- get_datasets()
search_dataset("population", data = ds_all)
## # A tibble: 14 x 2
##    id               title                                                       
##    <fct>            <fct>                                                       
##  1 ALFS_POP_VITAL   Population and Vital Statistics                             
##  2 ALFS_POP_LABOUR  Population and Labour Force                                 
##  3 SNA_TABLE3       3. Population and employment by main activity               
##  4 POP_FIVE_HIST    Population                                                  
##  5 RPOP             Total population by sex and age                             
##  6 SNA_TABLE3_SNA93 3. Population and employment by main activity, SNA93        
##  7 POP_PROJ         Historical population data and projections (1950-2050)      
##  8 WATER_TREAT      Wastewater treatment (% population connected)               
##  9 AEO2012_CH6_FIG5 Figure 5: Employment Rate to working age population in Afri…
## 10 AEO2012_CH6_BOX6 Box 6: Rural vs. Agricultural population in Nigeria (1980-2…
## 11 HISTPOP          Historical population                                       
## 12 POPPROJ          Population projections                                      
## 13 EDU_DEM          Population data                                             
## 14 SNA_TABLE3_ARCH… 3. Population and employment by main activity, 2019 archive

4行目の“POP_FIVE_HIST”というのがよさそうである.

データセットの変数を絞り込む

しかしこれ自体はdfではなく,dfを束ねたlistである.そこで,get_data_structure()でオブジェクト化したのち,さらに構造をみてみる.

pop_all <- get_data_structure("POP_FIVE_HIST")
str(pop_all, max.level = 1)
## List of 11
##  $ VAR_DESC       :'data.frame': 11 obs. of  2 variables:
##  $ LOCATION       :'data.frame': 47 obs. of  2 variables:
##  $ SUBJECT        :'data.frame': 33 obs. of  2 variables:
##  $ SEX            :'data.frame': 3 obs. of  2 variables:
##  $ FREQUENCY      :'data.frame': 1 obs. of  2 variables:
##  $ TIME           :'data.frame': 65 obs. of  2 variables:
##  $ OBS_STATUS     :'data.frame': 15 obs. of  2 variables:
##  $ UNIT           :'data.frame': 317 obs. of  2 variables:
##  $ POWERCODE      :'data.frame': 32 obs. of  2 variables:
##  $ REFERENCEPERIOD:'data.frame': 96 obs. of  2 variables:
##  $ TIME_FORMAT    :'data.frame': 5 obs. of  2 variables:

一番上のVAR_DESCとはなんだろうか.

pop_all$VAR_DESC
##                 id        description
## 1         LOCATION            Country
## 2          SUBJECT            Subject
## 3              SEX                Sex
## 4        FREQUENCY          Frequency
## 5             TIME               Time
## 6        OBS_VALUE  Observation Value
## 7      TIME_FORMAT        Time Format
## 8       OBS_STATUS Observation Status
## 9             UNIT               Unit
## 10       POWERCODE    Unit multiplier
## 11 REFERENCEPERIOD   Reference period

各dfの説明であった.これを除いて,関係がありそうなのはLOCATIONSUBJECTSEXだろう.

pop_all$LOCATION
##      id                         label
## 1   AUS                     Australia
## 2   AUT                       Austria
## 3   BEL                       Belgium
## 4   CAN                        Canada
## 5   CHL                         Chile
## 6   COL                      Colombia
## 7   CZE                Czech Republic
## 8   DNK                       Denmark
## 9   EST                       Estonia
## 10  FIN                       Finland
## 11  FRA                        France
## 12  DEU                       Germany
## 13  GRC                        Greece
## 14  HUN                       Hungary
## 15  ISL                       Iceland
## 16  IRL                       Ireland
## 17  ISR                        Israel
## 18  ITA                         Italy
## 19  JPN                         Japan
## 20  KOR                         Korea
## 21  LUX                    Luxembourg
## 22  MEX                        Mexico
## 23  NLD                   Netherlands
## 24  NZL                   New Zealand
## 25  NOR                        Norway
## 26  POL                        Poland
## 27  PRT                      Portugal
## 28  SVK               Slovak Republic
## 29  SVN                      Slovenia
## 30  ESP                         Spain
## 31  SWE                        Sweden
## 32  CHE                   Switzerland
## 33  TUR                        Turkey
## 34  GBR                United Kingdom
## 35  USA                 United States
## 36 EA19      Euro area (19 countries)
## 37 EU28 European Union (28 countries)
## 38  G-7                            G7
## 39 OECD                  OECD - Total
## 40  WLD                         World
## 41 NMEC            Non-OECD Economies
## 42  BRA                        Brazil
## 43  CHN  China (People's Republic of)
## 44  IND                         India
## 45  IDN                     Indonesia
## 46  RUS                        Russia
## 47  ZAF                  South Africa
pop_all$SUBJECT
##             id                                       label
## 1           YP                                  Population
## 2  YP9901L1_ST                   Population (hist5)  00-04
## 3  YP9902L1_ST                   Population (hist5)  05-09
## 4  YP9903L1_ST                   Population (hist5)  10-14
## 5  YP9904L1_ST                   Population (hist5)  15-19
## 6  YP9905L1_ST                   Population (hist5)  20-24
## 7  YP9906L1_ST                   Population (hist5)  25-29
## 8  YP9907L1_ST                   Population (hist5)  30-34
## 9  YP9908L1_ST                   Population (hist5)  35-39
## 10 YP9909L1_ST                   Population (hist5)  40-44
## 11 YP9910L1_ST                   Population (hist5)  45-49
## 12 YP9911L1_ST                   Population (hist5)  50-54
## 13 YP9912L1_ST                   Population (hist5)  55-59
## 14 YP9913L1_ST                   Population (hist5)  60-64
## 15 YP9914L1_ST                   Population (hist5)  65-69
## 16 YP9915L1_ST                   Population (hist5)  70-74
## 17 YP9916L1_ST                   Population (hist5)  75-79
## 18 YP9917L1_ST                   Population (hist5)  80-84
## 19 YP9920L1_ST                     Population (hist5)  85+
## 20 YP99TLL1_ST                 Population (hist5) All ages
## 21 YPTTTLL1_GY    Population (hist5) All ages, growth rate
## 22 YPTTDRY1_ST        Youth (-15) Dependency Ratio (15-64)
## 23 YPTTDRY2_ST        Youth (-20) Dependency Ratio (20-64)
## 24 YPTTDRY4_ST     Youth (-20) Dependency Ratio (All ages)
## 25 YPTTDRO1_ST          Old (+65) Dependency Ratio (15-64)
## 26 YPTTDRO2_ST          Old (+65) Dependency Ratio (20-64)
## 27 YPTTDRT1_ST    Age (-15 & +65) Dependency Ratio (15-64)
## 28 YPTTDRT2_ST    Age (-20 & +65) Dependency Ratio (20-64)
## 29 YPTTDRT3_ST Age (-15 & +65) Dependency Ratio (All ages)
## 30 YPTTDRT4_ST Age (-20 & +65) Dependency Ratio (All ages)
## 31 YPTT21PP_ST          Share (80+) in all ages population
## 32 YPTTDRW1_ST   Working Age (15-64) per Pension Age (+65)
## 33 YPTTDRW2_ST   Working Age (20-64) per Pension Age (+65)
pop_all$SEX
##   id       label
## 1 FE     Females
## 2 MA       Males
## 3 TT All persons

LOCATIONは国名,SUBJECTは具体的な統計の項目とその説明,SEXは性別が入ったdfであるようだ.

この場合,LOCATIONにはG7など国以外の行が入っており,これを消したい.またSUBJECTは,20行目の“All ages”と書かれたYP99TLL1_ST以外は不要である.SEXは両性合計のみでいい.

データフレームをつくる

このような条件のもと,必要なdfから必要な行の情報だけ抜き出すには,まず各dfの必要とする行を指定するlistをつくり,それをget_dataset()1でフィルターリストとして参照させた上でdfをつくればよい.具体的には以下のようにする.

filter_list <-
  list(c(pop_all$LOCATION$id)[c(1:35, 42:47)], "YP99TLL1_ST", "TT")

df_pop <- get_dataset(
  dataset = "POP_FIVE_HIST",
  filter = filter_list,
  start_time = 2011,
  end_time = 2013
)

上でfilter_listとオブジェクト化したlistでは,pop_allに並べられた順に条件を書いていくことに注意が必要である.この場合はLOCATION, SUBJECTSEXである.それ以降は書かなければ選択されない.また,たとえばLOCATIONSEXにだけ条件づけしたいような場合でも,その間のLOCATIONの条件(すべて選択)も書かないといけない.

また時間に関しては,上のTIMEdfもあるが,get_dataset()の引数で特別にstart_timeend_timeというのが用意されているのでこちらを使うのが簡便.

データの整形

df_pop
## # A tibble: 112 x 10
##    LOCATION SUBJECT SEX   FREQUENCY TIME_FORMAT UNIT  POWERCODE obsTime obsValue
##  * <chr>    <chr>   <chr> <chr>     <chr>       <chr> <chr>     <chr>      <dbl>
##  1 NZL      YP99TL… TT    A         P1Y         PER   0         2011     4384000
##  2 NZL      YP99TL… TT    A         P1Y         PER   0         2012     4408100
##  3 NZL      YP99TL… TT    A         P1Y         PER   0         2013     4442100
##  4 SVK      YP99TL… TT    A         P1Y         PER   0         2011     5398384
##  5 SVK      YP99TL… TT    A         P1Y         PER   0         2012     5407579
##  6 SVK      YP99TL… TT    A         P1Y         PER   0         2013     5415949
##  7 HUN      YP99TL… TT    A         P1Y         PER   0         2011     9958823
##  8 HUN      YP99TL… TT    A         P1Y         PER   0         2012     9920361
##  9 HUN      YP99TL… TT    A         P1Y         PER   0         2013     9886774
## 10 NOR      YP99TL… TT    A         P1Y         PER   0         2011     4953000
## # … with 102 more rows, and 1 more variable: OBS_STATUS <chr>

{dplyr}に引き渡して整形する.

df_pop %>%
  select(LOCATION, obsTime, obsValue) %>%
  filter(obsTime == 2011) %>%
  select(-obsTime) %>% 
  rename(cou = LOCATION, pop2011 = obsValue) %>% 
  arrange(cou)
## # A tibble: 41 x 2
##    cou      pop2011
##    <chr>      <dbl>
##  1 AUS     22340000
##  2 AUT      8388534
##  3 BEL     11047740
##  4 BRA    194932700
##  5 CAN     34483980
##  6 CHE      7912398
##  7 CHL     17248450
##  8 CHN   1368440000
##  9 COL     46044600
## 10 CZE     10496670
## # … with 31 more rows

できた

ここまでやって完成です.結構めんどくさいけど,.xlsxファイル大量ダウンロードとか,API云々よりは楽な気がします.


  1. 全データセットを取得するget_datasets()との違いに注意↩︎