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の説明であった.これを除いて,関係がありそうなのはLOCATIONとSUBJECT,SEXだろう.
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, SUBJECT,SEXである.それ以降は書かなければ選択されない.また,たとえばLOCATIONとSEXにだけ条件づけしたいような場合でも,その間のLOCATIONの条件(すべて選択)も書かないといけない.
また時間に関しては,上のTIMEdfもあるが,get_dataset()の引数で特別にstart_timeとend_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云々よりは楽な気がします.
全データセットを取得するget_datasets()との違いに注意↩︎