30 e-Stat

30.1 API の使い方

30.1.1 はじめての e-Stat with API

はじめて、R の etatapi を使って、e-Stat のデータを取得する方法を簡単に説明します。

初期設定

パッケージの、estatapi が、e-Stat のデータを取得するためのものです。tidyverse は基本的な解析をおこなうため、showtextshowtext_auto() は、グラフなどに、日本語が含まれる場合の文字化けを防ぐためのものです。

インストールされていないパッケージがありましたら、上のメニューの Tools > Install Packages から、インストールしてください。

library(tidyverse)
#> ── Attaching core tidyverse packages ──── tidyverse 2.0.0 ──
#> ✔ dplyr     1.1.3     ✔ readr     2.1.4
#> ✔ forcats   1.0.0     ✔ stringr   1.5.0
#> ✔ ggplot2   3.4.4     ✔ tibble    3.2.1
#> ✔ lubridate 1.9.3     ✔ tidyr     1.3.0
#> ✔ purrr     1.0.2     
#> ── Conflicts ────────────────────── tidyverse_conflicts() ──
#> ✖ dplyr::filter() masks stats::filter()
#> ✖ dplyr::lag()    masks stats::lag()
#> ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(showtext)
#> Loading required package: sysfonts
#> Loading required package: showtextdb
library(estatapi)
#> このサービスは、政府統計総合窓口(e-Stat)のAPI機能を使用していますが、サービスの内容は国によって保証されたものではありません。
showtext_auto()

30.1.2 e-Stat 登録と、アプリケーションIDの取得

e-Stat API を利用するには、appId が必要です。

  1. e-stat: https://www.e-stat.go.jp/ のページへ行く。
  2. 右上の新規登録から、アカウント登録をします。
    • メールアドレスを入力し、そこに届いてリンクを開き、パスワードを設定。
    • パスワード設定は、Google などのアカウント連携ですることも可能です。
  3. アカウントにログイン。上の帯に、メールアドレスが表示されます。
  4. その右のマイページに行き、API機能(アプリケーションID発行)へ。まず、必要事項の入力が必要ですが、説明をみてください。
    • 名称:API機能を利用するアプリケーション名(システム名等)- R または、RStudio
    • URL:アプリケーションのURL(トップページ等のURL)
  • If you do not use it on the public site, please enter “http: // test.localhost /” etc. - localhost でよいでしょう。
    • 概要:アプリケーション(システム)の概要 - estatapi とでも書いておけば良いでしょう。
    • 右の発行を押すと、appId が表示されます。これを記録。

30.2 estatapi 利用概要

CRAN estatspi URL: https://CRAN.R-project.org/package=estatapi

30.2.1 アプリケーションIDの設定

appId <- " " # 私のものは、英数40文字

30.2.2 統計表情報取得(estat_getStatsList())

提供されている統計表を検索します。この関数は、結果をtbl_df(dplyrのdata.frame。data.frameとほぼ同じように扱える)として返します。

STAT_NAMEやGOV_ORGは人間が読みやすい形式のラベルになっていますが、 プログラム中で扱う場合はコードのままの方が都合がいいこともあります。そのときは.use_label = FALSEを指定してください。

estat_getStatsList(appId = appId, searchWord = "")
estat_getStatsList(appId = appId, searchWord = "人口推計")
estat_getStatsList(appId = appId, searchWord = "外国人人口")

statsDataAPI=0003448219 statsDataAPI=0004001640

estat_getStatsList(appId = appId, searchWord = "国勢調査 時系列データ 男女,年齢,配偶関係")

statsDataID=0003410379

30.2.3 メタ情報取得(estat_getMetaInfo())

統計データのメタ情報を取得します。この関数は、結果をlistとして返します。listの各要素が、それぞれのデータ項目についてのメタ情報を含んだtbl_dfになっています。

meta_info <- estat_getMetaInfo(appId = appId, statsDataId = "")
meta_info <- estat_getMetaInfo(appId = appId, statsDataId = "0003410379")
glimpse(meta_info)
#> List of 5
#>  $ tab   : tibble [2 × 4] (S3: tbl_df/tbl/data.frame)
#>   ..$ @code : chr [1:2] "020" "1120"
#>   ..$ @name : chr [1:2] "人口" "人口性比"
#>   ..$ @level: chr [1:2] "" ""
#>   ..$ @unit : chr [1:2] "人" NA
#>  $ cat01 : tibble [3 × 3] (S3: tbl_df/tbl/data.frame)
#>   ..$ @code : chr [1:3] "100" "110" "120"
#>   ..$ @name : chr [1:3] "総数" "男" "女"
#>   ..$ @level: chr [1:3] "1" "1" "1"
#>  $ area  : tibble [50 × 4] (S3: tbl_df/tbl/data.frame)
#>   ..$ @code      : chr [1:50] "00000" "00100" "00200" "01000" ...
#>   ..$ @name      : chr [1:50] "全国" "人口集中地区" "人口集中地区以外の地区" "北海道" ...
#>   ..$ @level     : chr [1:50] "1" "2" "2" "2" ...
#>   ..$ @parentCode: chr [1:50] NA "00000" "00000" "00000" ...
#>  $ time  : tibble [21 × 3] (S3: tbl_df/tbl/data.frame)
#>   ..$ @code : chr [1:21] "1920000000" "1925000000" "1930000000" "1935000000" ...
#>   ..$ @name : chr [1:21] "1920年" "1925年" "1930年" "1935年" ...
#>   ..$ @level: chr [1:21] "1" "1" "1" "1" ...
#>  $ .names: tibble [4 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ id  : chr [1:4] "tab" "cat01" "area" "time"
#>   ..$ name: chr [1:4] "表章項目" "男女_時系列" "地域_時系列" "時間軸(調査年)"
meta_info$cat01

30.2.4 統計データ取得(estat_getStatsData())

統計データを取得します。この関数は、結果をメタ情報と紐づけてtbl_dfとして返します。

必ず指定しなくてはいけないのはappIdとstatsDataIdだけですが、それだけだとデータがかなり大きくなって取得に時間がかかります。cdCat01(分類事項01)などを指定して必要な項目だけに絞ることをおすすめします。他に絞り込みに指定できるパラメータについては公式ドキュメントを参照してください。

estat_getStatsData(
  appId = appId,
  statsDataId = "",
  cdCat01 = c("",""))
estat_pop <- estat_getStatsData(appId = appId, statsDataId = "0003410379")
#> Fetching record 1-4200... (total: 4200 records)
estat_pop
estat_pop_alien <- estat_getStatsData(appId = appId, statsDataId = "0003448219")
#> Fetching record 1-87... (total: 87 records)
estat_pop_alien
estat_pop_alien2 <- estat_getStatsData(appId = appId, statsDataId = "0004001640")
#> Fetching record 1-87... (total: 87 records)
estat_pop_alien2

0003445244

estat_pop_alien0 <- estat_getStatsData(appId = appId, lang = "E", statsDataId = "0003445244")
#> Fetching record 1-100000... (total: 100215 records)
#> Fetching record 100001-100215... (total: 100215 records)
estat_pop_alien0
estat_pop_alien0 |> distinct(Nationality) |> pull()
#>  [1] "Total"                                               
#>  [2] "Foreigner"                                           
#>  [3] "Republic of Korea"                                   
#>  [4] "People's Republic of China"                          
#>  [5] "Republic of the Philippines"                         
#>  [6] "Kingdom of Thailand"                                 
#>  [7] "Republic of Indonesia"                               
#>  [8] "Socialist Republic of Viet Nam"                      
#>  [9] "India"                                               
#> [10] "Federal Democratic Republic of Nepal"                
#> [11] "United Kingdom of Great Britain and Northern Ireland"
#> [12] "United States of America"                            
#> [13] "Federative Republic of Brazil"                       
#> [14] "Republic of Peru"                                    
#> [15] "Others"                                              
#> [16] "Japanese"                                            
#> [17] "Nationality not reported"
estat_pop_alien2020 <- estat_getStatsData(appId = appId, statsDataId = "0003445244")
#> Fetching record 1-100000... (total: 100215 records)
#> Fetching record 100001-100215... (total: 100215 records)
estat_pop_alien2020
estat_pop_alien2020 |> distinct(国籍) |> pull()
#>  [1] "総数"                      
#>  [2] "外国人"                    
#>  [3] "韓国,朝鮮"                
#>  [4] "中国"                      
#>  [5] "フィリピン"                
#>  [6] "タイ"                      
#>  [7] "インドネシア"              
#>  [8] "ベトナム"                  
#>  [9] "インド"                    
#> [10] "ネパール"                  
#> [11] "イギリス"                  
#> [12] "アメリカ"                  
#> [13] "ブラジル"                  
#> [14] "ペルー"                    
#> [15] "その他"                    
#> [16] "日本人"                    
#> [17] "日本人・外国人の別「不詳」"
estat_pop_alien2020 |> distinct(男女) |> pull()
#> [1] "総数" "男"   "女"
colnames(estat_pop_alien2020)
#>  [1] "tab_code"                 "表章事項"                
#>  [3] "cat01_code"               "男女"                    
#>  [5] "cat02_code"               "国籍"                    
#>  [7] "area_code"                "全国,都道府県,市区町村"
#>  [9] "time_code"                "時間軸(年次)"          
#> [11] "unit"                     "value"                   
#> [13] "annotation"
estat_pop_alien2020 |> 
  filter(`全国,都道府県,市区町村` == "全国") |>
  filter(男女 == "総数") |>
  filter(国籍 != "総数") |>
  select(国籍, value) |>
  arrange(desc(value))
estat_pop_alien2020 |> 
  filter(`全国,都道府県,市区町村` == "全国") |>
  filter(男女 != "総数") |>
  filter(!(国籍 %in% c("総数", "日本人", "外国人", "日本人・外国人の別「不詳」"))) |>
  select(国籍, 男女, value) |>
  arrange(desc(value)) |> 
  mutate(国籍別 = factor(fct_inorder(国籍))) |>
  mutate(`人数(千人)`= value/1000) |>
  ggplot(aes(国籍別, `人数(千人)`, fill = 男女)) + geom_col() +
  labs(title = "国籍別日本在住外国人数", caption = "令和2(2020)年 国勢調査 統計表表示ID=0003445244")