はじめに

このWEBサイトに設置したリンクは,新しいタブ・ウィンドウで開くことを推奨します.
バグの影響で,新しいタブ・ウィンドウでないと開けないリンクが多いためです.
予めご容赦ください.

やること

このページでは,その無茶振り,(Rで)GISが解決します:フローデータ分析編で用いるデータの前処理方法を解説します.加えて,estatapiパッケージを用いて,e-Stat(政府統計の総合窓口)から政府統計データをダウンロードし,それらを分析に用いることができる形に加工する方法も詳解します.
 e-Stat上のデータは,e-Stat APIというサービスを通じ,RやPython等のソフトウェア上でのコマンド操作を用いて,直接ダウンロードすることができます.一方,APIの扱いには若干の専門知識が必要となるので,初心者が用いるにはハードルが高いです.estatapiは,そうした専門知識がなくても,APIを用いたデータのダウンロードを可能にするパッケージです.
 e-Stat APIを使う際には,ユーザ登録の上,APIキー(appId)を取得する必要があります.これは,estatapiを用いる場合も同様です.ユーザ登録及びAPIキーの取得については,こちらのスライドを参照してください.スライドのパスワードは,「r_de_geonw」です.  GISデータ等の基本的な扱い方等の前提知識については,その無茶振り,(Rで)GISが解決しますの方で詳しく解説していますので,そちらもあわせて参照してください.

必要パッケージの読み込み

今回の演習では,以下のパッケージを用います.未インストールのものについては,適宜インストールを行ってください.インストールの過程で「Do you want to install from sources the packages which need compilation? (Yes/no/cancel)」というメッセージが表示された場合には,とりあえず「no」を選択することをお勧めします.

  • tidyverse:各種データ操作のためのパッケージ
  • openxlsx:Rでxlsx形式のファイルを読み込み・書き出しするためのパッケージ
  • magrittr:パイプ処理を行うためのパッケージ
  • estatapi:e-Stat上の政府統計データをAPIでダウンロードするためのパッケージ
  • sf:空間データ(ベクタデータ)操作のためのパッケージ
  • geojsonio:TopoJSON(GeoJSONの亜種)操作のためのパッケージ
library(tidyverse)
library(openxlsx)
library(magrittr)
library(estatapi)
library(sf)
#sfパッケージ使用時のおまじない
sf::sf_use_s2(FALSE)
library(geojsonio)

動作環境によっては,sfパッケージの読み込み時にエラーが出る場合があります.その原因は,sfパッケージが依存しているRcppのバージョンが古いことが多いようです.もしエラーが出る場合には,以下のコードを実行して見てください(筆者のPCではエラーが出なかったので,コメント化してあります).

# install.packages("Rcpp")
# library(Rcpp)

APIキーの入力

APIキーを,オブジェクトappIdに格納します.「XXXXXXXXX」というIDは架空のものですので,e-Stat APIから各自発行したキーを,実際には用いてください.

appId <- "XXXXXXXXX"

県外進学者データ

学校基本調査の統計表の一覧を取得

estatapiのestat_getStatsList関数を用いて,学校基本調査に該当する統計表の一覧を取得します.統計表の検索方法はいくつかありますが,今回は,政府統計コードを用いた検索を行います.政府統計コードの一覧はこちらのページにあります.学校基本統計調査のコードは「00400001」と書いてありますので,引数statsCodeに,こちらを指定します.引数appIdには先程入力したappIdを,searchWordはブランクを指定してください.

tbl_info_school <- estatapi::estat_getStatsList(appId=appId,
                                                statsCode="00400001",
                                                searchWord="")
head(tbl_info_school)
## # A tibble: 6 × 26
##   `@id`      STAT_…¹ GOV_ORG STATI…² TITLE CYCLE SURVE…³ OPEN_…⁴ SMALL…⁵ COLLE…⁶
##   <chr>      <chr>   <chr>   <chr>   <chr> <chr> <chr>   <chr>   <chr>   <chr>  
## 1 0003061540 学校基… 文部科… 学校基… 総括  -     0       2007-1… 0       該当な…
## 2 0003015869 学校基… 文部科… 学校基… 都道… -     0       2007-1… 0       該当な…
## 3 0003061522 学校基… 文部科… 学校基… 種類… -     200604… 2006-1… 0       該当な…
## 4 0003061523 学校基… 文部科… 学校基… 外国… -     200604… 2006-1… 0       該当な…
## 5 0003061524 学校基… 文部科… 学校基… 理由… -     200604… 2006-1… 0       該当な…
## 6 0003061525 学校基… 文部科… 学校基… 帰国… -     200604… 2006-1… 0       該当な…
## # … with 16 more variables: MAIN_CATEGORY <chr>, SUB_CATEGORY <chr>,
## #   OVERALL_TOTAL_NUMBER <chr>, UPDATED_DATE <chr>, TABULATION_CATEGORY <chr>,
## #   TABULATION_SUB_CATEGORY1 <chr>, TABULATION_SUB_CATEGORY2 <chr>,
## #   TABULATION_SUB_CATEGORY3 <chr>, TABULATION_SUB_CATEGORY4 <chr>,
## #   DESCRIPTION <chr>, TABLE_NAME <chr>, TABULATION_SUB_CATEGORY5 <chr>,
## #   TABLE_SUB_CATEGORY1 <chr>, TABLE_SUB_CATEGORY2 <chr>,
## #   TABLE_SUB_CATEGORY3 <chr>, TABLE_CATEGORY <chr>, and abbreviated variable …

データを取得

今回は例として,2010年の県外進学データを取得します.項目STATISTICS_NAMEに「平成22年」「大学・大学院」,TITLEに「出身高校の所在地県別 入学者数」を含むデータがその候補になりますので,統計表情報からそちらを抽出します.

tbl_info_school_mig_2010 <- tbl_info_school %>%
  dplyr::filter(grepl("平成22年",STATISTICS_NAME)&
                  grepl("大学・大学院",STATISTICS_NAME)&
                  grepl("出身高校の所在地県別 入学者数",TITLE))
tbl_info_school_mig_2010
## # A tibble: 1 × 26
##   `@id`      STAT_…¹ GOV_ORG STATI…² TITLE CYCLE SURVE…³ OPEN_…⁴ SMALL…⁵ COLLE…⁶
##   <chr>      <chr>   <chr>   <chr>   <chr> <chr> <chr>   <chr>   <chr>   <chr>  
## 1 0003023902 学校基… 文部科… 学校基… 出身… -     0       2010-1… 0       該当な…
## # … with 16 more variables: MAIN_CATEGORY <chr>, SUB_CATEGORY <chr>,
## #   OVERALL_TOTAL_NUMBER <chr>, UPDATED_DATE <chr>, TABULATION_CATEGORY <chr>,
## #   TABULATION_SUB_CATEGORY1 <chr>, TABULATION_SUB_CATEGORY2 <chr>,
## #   TABULATION_SUB_CATEGORY3 <chr>, TABULATION_SUB_CATEGORY4 <chr>,
## #   DESCRIPTION <chr>, TABLE_NAME <chr>, TABULATION_SUB_CATEGORY5 <chr>,
## #   TABLE_SUB_CATEGORY1 <chr>, TABLE_SUB_CATEGORY2 <chr>,
## #   TABLE_SUB_CATEGORY3 <chr>, TABLE_CATEGORY <chr>, and abbreviated variable …

得られた統計表番号@idに該当する統計表を,estatapiのestat_getStatsData関数を用いてダウンロードします.引数statsDataIdに,統計表番号を指定します.

mig_2010 <- estatapi::estat_getStatsData(appId=appId,
                                         statsDataId=tbl_info_school_mig_2010$`@id`)
head(mig_2010)
## # A tibble: 6 × 13
##   cat01_code 設置者別9 cat02_c…¹ 都道…² cat03_…³ 所在…⁴  cat04…⁵ 所在…⁶  area_…⁷
##   <chr>      <chr>     <chr>     <chr>  <chr>    <chr>   <chr>   <chr>   <chr>  
## 1 010        計        010       計     010      大学の… 010     出身高… 00000  
## 2 010        計        010       計     010      大学の… 010     出身高… 01000  
## 3 010        計        010       計     010      大学の… 010     出身高… 02000  
## 4 010        計        010       計     010      大学の… 010     出身高… 03000  
## 5 010        計        010       計     010      大学の… 010     出身高… 04000  
## 6 010        計        010       計     010      大学の… 010     出身高… 05000  
## # … with 4 more variables: 都道府県別1 <chr>, unit <chr>, value <dbl>,
## #   annotation <chr>, and abbreviated variable names ¹​cat02_code, ²​都道府県別2,
## #   ³​cat03_code, ⁴​所在地別1, ⁵​cat04_code, ⁶​所在地別2, ⁷​area_code

データを加工

「XX_1」となっている方が大学の所在地に関する変数,「XX_2」は出身高校の所在地に関する変数です.即ち,「XX_1」は着地側,「XX_2」は発地側の位置情報です.変数valueが,都道府県ペア間の県外進学数です.変数「設置者別9」には,大学の設置者及び性別を区別する変数です.都道府県コードに対応する変数は,大学の所在地についてのみ把握できます.
 出身高校の所在地の変数「都道府県別2」について,その値を確認すると,「都道府県」が抜けていることがわかります.

unique(mig_2010$都道府県別2)
##  [1] "計"     "北海道" "青森"   "岩手"   "宮城"   "秋田"   "山形"   "福島"  
##  [9] "茨城"   "栃木"   "群馬"   "埼玉"   "千葉"   "東京"   "神奈川" "新潟"  
## [17] "富山"   "石川"   "福井"   "山梨"   "長野"   "岐阜"   "静岡"   "愛知"  
## [25] "三重"   "滋賀"   "京都"   "大阪"   "兵庫"   "奈良"   "和歌山" "鳥取"  
## [33] "島根"   "岡山"   "広島"   "山口"   "徳島"   "香川"   "愛媛"   "高知"  
## [41] "福岡"   "佐賀"   "長崎"   "熊本"   "大分"   "宮崎"   "鹿児島" "沖縄"  
## [49] "その他"

このままでは分析上扱いにくいので,変数「都道府県別2」に「都道府県」を補ったものを,新たな変数origin_nameとして追加します.

mig_2010_long <- mig_2010 %>%
  dplyr::mutate(origin_name=case_when(
    #「京都」「大阪」なら「府」を補う
    都道府県別2%in%c("京都","大阪") ~ paste0(都道府県別2,"府"),
    #「東京」なら「都」を補う
    都道府県別2=="東京" ~ "東京都",
    #「北海道」「その他」「計」なら何も補わない
    都道府県別2%in%c("北海道","その他","計") ~ 都道府県別2,
    #上に該当しなければ「県」を補う
    TRUE ~ paste0(都道府県別2,"県")
    ))

着地側の変数「都道府県1」は特に何かを補う必要もなさそうなので,変数名をdestination_nameに変更し,そのままにしておきます.また,変数「設置者別9」を「founder」に変えた上で,発着地名が「その他」「計」「全国」に該当しないレコードのみ残します.

mig_2010_long <- mig_2010_long %>%
  #着地側の変数の名前を変更
  dplyr::rename(destination_name=都道府県別1) %>%
  #設置者を示す変数の名前を変更
  dplyr::rename(founder=設置者別9) %>%
  #必要な変数のみ残す
  dplyr::select(founder,origin_name,destination_name,value) %>%
  #発着地名が「その他」「計」「全国」に該当しないレコードのみ残す
  dplyr::filter(!(origin_name%in%c("その他","計","全国")|
                    destination_name%in%c("その他","計","全国")))
head(mig_2010_long)
## # A tibble: 6 × 4
##   founder origin_name destination_name value
##   <chr>   <chr>       <chr>            <dbl>
## 1 計      北海道      北海道           14906
## 2 計      北海道      青森県             379
## 3 計      北海道      岩手県              82
## 4 計      北海道      宮城県             135
## 5 計      北海道      秋田県              49
## 6 計      北海道      山形県              74

元データから,都道府県名と都道府県コードの対応表を作ります.都道府県名は変数「都道府県別1」をそのまま用いることができますが,都道府県コードは変数area_codeの先頭2文字を取り出す必要があります.それら変数を作成した上で,都道府県名・都道府県コードの2変数についてデータをユニークにします.

pref_code <- mig_2010 %>%
  #必要な変数のみ残す
  dplyr::select(都道府県別1,area_code) %>%
  #都道府県名pref_nameの値は,都道府県別1の値そのまま
  dplyr::mutate(pref_name=都道府県別1,
                #都道府県コードpref_codeの値はarea_codeの先頭2文字
                pref_code=substr(x=area_code,start=1,stop=2)) %>%
  #都道府県名・コードでユニーク化
  dplyr::distinct(pref_name,pref_code)

都道府県名をキーに,発地・着地側に都道府県コードを結合します.

mig_2010_long <- mig_2010_long %>%
  #発地側に都道府県コードを結合
  dplyr::left_join(y=pref_code,by=c("origin_name"="pref_name")) %>%
  #都道府県コードの変数名を変更
  dplyr::rename(origin=pref_code) %>%
  #着地側に都道府県コードを結合
  dplyr::left_join(y=pref_code,by=c("destination_name"="pref_name")) %>%
  #都道府県コードの変数名を変更
  dplyr::rename(destination=pref_code)

最後に,現状縦に並んでいる設立者・性別毎のデータを,横並びに変形します.前者はlong型,後者はwide型とも呼びます.変数founderを基準に,データをwide型へ変換する際は,tidyrのpivot_wider関数を用いて以下のように実行します.Wide型に変換しない変数を引数id_colsで,新たに作られる変数の名前に変数founderの値を用いることを引数names_fromで,wide型に変形される観測値は変数valueから来ることを引数values_fromで明示します.

mig_2010_wide <- mig_2010_long %>%
  #Wide型に変換しない変数の指定
  tidyr::pivot_wider(id_cols=c(origin_name,destination_name,origin,destination),
                     #新たな変数名の元になる値が入った変数
                     names_from=founder,
                     #Wide型に変換される観測値が入った変数
                     values_from=value)
head(mig_2010_wide)
## # A tibble: 6 × 8
##   origin_name destination_name origin destination    計  国立  私立 計のうち男
##   <chr>       <chr>            <chr>  <chr>       <dbl> <dbl> <dbl>      <dbl>
## 1 北海道      北海道           01     01          14906  3612 10499       9225
## 2 北海道      青森県           01     02            379   308    24        246
## 3 北海道      岩手県           01     03             82    52    26         49
## 4 北海道      宮城県           01     04            135    66    65         96
## 5 北海道      秋田県           01     05             49    29     3         31
## 6 北海道      山形県           01     06             74    46    27         36

変数名が日本語のままだと扱いづらいので,英語で変数名を付け直します.また,進学者総数から男子の進学者数を差し引いたものを,女子の進学者数として変数に追加します.

mig_2010_wide <- mig_2010_wide %>%
  #変数名を付け直す
  dplyr::rename(total=計,
                national=国立,
                private=私立,
                male=計のうち男) %>%
  #女子の進学者数を計算
  dplyr::mutate(female=total-male)

openxlsxのwrite.xlsx関数を用いて,集計された進学者数をxlsx形式で書き出します.

openxlsx::write.xlsx(x=mig_2010_wide,
                     file="output/mig_2010.xlsx")

【参考】よく見る形のOD表を作る

上で作成したデータは,発着地ペアについてフロー量が縦に並んでいる形式です.一方,よく見るOD表は,行方向に発地側の地名,列方向に着地側の地名が並んだ正方行列の形のものだと思います.以下では,発着地ペアのデータをOD表の形式に変形する方法を示します.
 例として,進学者総数についてOD表を作成します.表の行方向には発地側都道府県名,列方向には着地側都道府県名が並ぶ形にします.この変形には ,上と同様pivot_wider関数が使えます.引数id_colsには行方向のラベルとなる発地側都道府県名origin_name,引数names_fromには変数名となる着地側都道府県名destination_name,引数values_fromには並べ替えられる進学者総数totalを指定します.

mig_2010_total_od <- mig_2010_wide %>%
  #データをOD表の形式に変形
  tidyr::pivot_wider(id_cols=c(origin_name),
                     names_from=destination_name,
                     values_from=total)
head(mig_2010_total_od)
## # A tibble: 6 × 48
##   origin…¹ 北海道 青森県 岩手県 宮城県 秋田県 山形県 福島県 茨城県 栃木県 群馬県
##   <chr>     <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
## 1 北海道    14906    379     82    135     49     74     38     93     30     86
## 2 青森県      408   2003    261    548     87     87     82     84     68     61
## 3 岩手県      236    289   1357    750    158    111    123     69     87    137
## 4 宮城県      141     82    314   6414    124    491    262     91    105     91
## 5 秋田県      158    210    225    536    935    106    103     68     81     71
## 6 山形県      115     41     74    941     59    937    192     83     75     93
## # … with 37 more variables: 埼玉県 <dbl>, 千葉県 <dbl>, 東京都 <dbl>,
## #   神奈川県 <dbl>, 新潟県 <dbl>, 富山県 <dbl>, 石川県 <dbl>, 福井県 <dbl>,
## #   山梨県 <dbl>, 長野県 <dbl>, 岐阜県 <dbl>, 静岡県 <dbl>, 愛知県 <dbl>,
## #   三重県 <dbl>, 滋賀県 <dbl>, 京都府 <dbl>, 大阪府 <dbl>, 兵庫県 <dbl>,
## #   奈良県 <dbl>, 和歌山県 <dbl>, 鳥取県 <dbl>, 島根県 <dbl>, 岡山県 <dbl>,
## #   広島県 <dbl>, 山口県 <dbl>, 徳島県 <dbl>, 香川県 <dbl>, 愛媛県 <dbl>,
## #   高知県 <dbl>, 福岡県 <dbl>, 佐賀県 <dbl>, 長崎県 <dbl>, 熊本県 <dbl>, …

openxlsxのwrite.xlsx関数を用いて,OD表をxlsx形式で書き出します.

openxlsx::write.xlsx(x=mig_2010_total_od,
                     file="output/mig_2010_total_od.xlsx")

地域属性データ

社会・人口統計体系の統計表の一覧を取得

今回重力モデルの説明変数として用いるデータは,社会・人口統計体系(統計でみる都道府県・市区町村のすがた)から取得します.社会・人口統計体系は,各地域の様々な社会・経済属性のうち基礎的なものを,都道府県・市区町村単位で集計したデータで,卒業論文等での利用頻度が高いもののひとつです.社会・人口統計体系は,社会・経済変数の生の値をまとめた基礎データと,それら変数を組み合わせて計算される各種指標をまとめた社会生活統計指標に分類されます.
 まずは,社会・人口統計体系を政府統計コードの一覧から探します.コードは「00200502」ですので,学校基本調査の場合と同じく,estat_getStatsListを用いて統計表のリストを取得します.

#社会・人口統計体系の統計表の一覧
tbl_info_si <- estatapi::estat_getStatsList(appId=appId,
                                            statsCode="00200502",
                                            searchWord="")
head(tbl_info_si)
## # A tibble: 6 × 19
##   `@id`      STAT_…¹ GOV_ORG STATI…² TITLE CYCLE SURVE…³ OPEN_…⁴ SMALL…⁵ COLLE…⁶
##   <chr>      <chr>   <chr>   <chr>   <chr> <chr> <chr>   <chr>   <chr>   <chr>  
## 1 0000010101 社会・… 総務省  都道府… A … 年度… 0       2022-0… 0       全国   
## 2 0000010101 社会・… 総務省  都道府… A … 年度… 0       2022-0… 0       都道府…
## 3 0000010102 社会・… 総務省  都道府… B … 年度… 0       2022-0… 0       都道府…
## 4 0000010102 社会・… 総務省  都道府… B … 年度… 0       2022-0… 0       全国   
## 5 0000010103 社会・… 総務省  都道府… C … 年度… 0       2022-0… 0       全国   
## 6 0000010103 社会・… 総務省  都道府… C … 年度… 0       2022-0… 0       都道府…
## # … with 9 more variables: MAIN_CATEGORY <chr>, SUB_CATEGORY <chr>,
## #   OVERALL_TOTAL_NUMBER <chr>, UPDATED_DATE <chr>, TABULATION_CATEGORY <chr>,
## #   TABULATION_SUB_CATEGORY1 <chr>, TABULATION_CATEGORY_EXPLANATION <chr>,
## #   TABLE_NAME <chr>, TABULATION_SUB_CATEGORY_EXPLANATION1 <chr>, and
## #   abbreviated variable names ¹​STAT_NAME, ²​STATISTICS_NAME, ³​SURVEY_DATE,
## #   ⁴​OPEN_DATE, ⁵​SMALL_AREA, ⁶​COLLECT_AREA

統計表のリストを,都道府県データ(項目COLLECT_AREAが「都道府県」を含む)のみに絞ります.

tbl_info_si_pref <- tbl_info_si %>%
  #項目COLLECT_AREAが「都道府県」を含むレコードに絞る
  dplyr::filter(grepl("都道府県",COLLECT_AREA))
head(tbl_info_si_pref)
## # A tibble: 6 × 19
##   `@id`      STAT_…¹ GOV_ORG STATI…² TITLE CYCLE SURVE…³ OPEN_…⁴ SMALL…⁵ COLLE…⁶
##   <chr>      <chr>   <chr>   <chr>   <chr> <chr> <chr>   <chr>   <chr>   <chr>  
## 1 0000010101 社会・… 総務省  都道府… A … 年度… 0       2022-0… 0       都道府…
## 2 0000010102 社会・… 総務省  都道府… B … 年度… 0       2022-0… 0       都道府…
## 3 0000010103 社会・… 総務省  都道府… C … 年度… 0       2022-0… 0       都道府…
## 4 0000010104 社会・… 総務省  都道府… D … 年度… 0       2022-0… 0       都道府…
## 5 0000010105 社会・… 総務省  都道府… E … 年度… 0       2022-0… 0       都道府…
## 6 0000010106 社会・… 総務省  都道府… F … 年度… 0       2022-0… 0       都道府…
## # … with 9 more variables: MAIN_CATEGORY <chr>, SUB_CATEGORY <chr>,
## #   OVERALL_TOTAL_NUMBER <chr>, UPDATED_DATE <chr>, TABULATION_CATEGORY <chr>,
## #   TABULATION_SUB_CATEGORY1 <chr>, TABULATION_CATEGORY_EXPLANATION <chr>,
## #   TABLE_NAME <chr>, TABULATION_SUB_CATEGORY_EXPLANATION1 <chr>, and
## #   abbreviated variable names ¹​STAT_NAME, ²​STATISTICS_NAME, ³​SURVEY_DATE,
## #   ⁴​OPEN_DATE, ⁵​SMALL_AREA, ⁶​COLLECT_AREA

基礎データ・社会生活統計指標から必要な統計表をダウンロード

今回の分析では,基礎データ・社会生活統計指標のそれぞれから,以下の変数を用います.

  • 基礎データ
    • C121101:1人当たり県民所得
  • 社会生活統計指標
    • #E0610202:大学収容力指数
    • #E09504:大卒者割合

1人当たり県民所得については,項目STATISTICS_NAMEに「基礎データ」,TITLEに「C」を含む統計表に含まれます.それ以外の変数は,項目STATISTICS_NAMEに「社会生活統計指標」,TITLEに「E」を含む統計表がその候補になりますので,統計表情報からそちらを抽出します.

tbl_info_si_pref_vars <- tbl_info_si_pref %>%
  #項目STATISTICS_NAMEに「基礎データ」,TITLEに「C」を含む,もしくは
  dplyr::filter((grepl("基礎データ",STATISTICS_NAME)&grepl("C",TITLE))|
                  #項目STATISTICS_NAMEに「社会生活統計指標」,TITLEに「E」を含む
                  (grepl("社会生活統計指標",STATISTICS_NAME)&grepl("E",TITLE)))

基礎データCの統計表IDは「0000010103」,社会生活統計指標Eの統計表IDは「0000010205」ですので,それぞれestat_getStatsData関数で統計表を取得します.

#基礎データCの統計表を取得
kiso_c <- estatapi::estat_getStatsData(appId=appId,
                                       statsDataId="0000010103")
#社会生活統計指標Eの統計表を取得
sihyo_e <- estatapi::estat_getStatsData(appId=appId,
                                        statsDataId="0000010205")

取得された各統計表から,必要なレコードのみを残します.具体的には,統計コードcat01_codeが上で挙げた変数コードに一致し,かつ調査年が「2010年度」に一致するもののみを残します.その上で,それらを行方向に結合します.

kiso_c_vars <- kiso_c %>%
  #1人当たり県民所得
  dplyr::filter(cat01_code=="C121101") %>%
  #2010年度の観測値
  dplyr::filter(調査年=="2010年度") %>%
  #不要な変数を削除
  dplyr::select(-`C 経済基盤`)
sihyo_e_vars <- sihyo_e %>%
  #大学収容力指数
  dplyr::filter(cat01_code=="#E0610202"|
                  cat01_code=="#E09504") %>%
  #2010年度の観測値
  dplyr::filter(調査年=="2010年度") %>%
  #不要な変数を削除
  dplyr::select(-`E 教育`)
#データを行方向に結合
vars <- rbind(kiso_c_vars,sihyo_e_vars)

データを変数毎にwide型に変形します.前もって必要な変数のみ残し,変数area_codeの先頭2文字から都道府県コードを新たな変数として作成します.また,変数コードcat01_codeに基づいて,変形後の変数名を与える変数varnamを作成します.その上で,データをlong型からwide型に変形します.

vars <- vars %>%
  #都道府県コード変数を追加
  dplyr::mutate(pref_code=substr(x=area_code,start=1,stop=2)) %>%
  #必要な変数のみ残す
  dplyr::select(cat01_code,pref_code,地域,value) %>%
  #変数名を変更
  dplyr::rename(pref_name=地域) %>%
  #変数コードに応じた変数を作成
  dplyr::mutate(varnam=dplyr::case_when(
    cat01_code=="C121101" ~ "income",
    cat01_code=="#E0610202" ~ "acom_univ",
    cat01_code=="#E09504" ~ "univ_rate"
  ))
vars_wide <- vars %>%
  #データをlong型からwide型に変形
  tidyr::pivot_wider(id_cols=c(pref_code,pref_name),
                     names_from=varnam,
                     values_from=value)
head(vars_wide)
## # A tibble: 6 × 5
##   pref_code pref_name income acom_univ univ_rate
##   <chr>     <chr>      <dbl>     <dbl>     <dbl>
## 1 00        全国        2944     121.       17.3
## 2 01        北海道      2379     118.       11.3
## 3 02        青森県      2262      68.8       9.1
## 4 03        岩手県      2275      59.8       9.7
## 5 04        宮城県      2389     132.       14.3
## 6 05        秋田県      2242      53.7       9

データを結合し,書き出します.

openxlsx::write.xlsx(x=vars_wide,
                     file="output/table_pref_vars.xlsx")

都道府県庁ポイント

取得元:国土数値情報 国・都道府県の機関データ

#Shapefileを読み込み
pref_office <- sf::read_sf(dsn="P28-13.shp") %>%
  #変数P28_003が「12001」(都道府県庁舎)のレコードのみ残す
  dplyr::filter(P28_003=="12001") %>%
  #都道府県コードの変数を作成
  dplyr::mutate(pref_code=substr(P28_001,1,2)) %>%
  #都道府県コードの変数だけ残す
  dplyr::select(pref_code) %>%
  #都道府県コードでソート
  dplyr::arrange(pref_code) %>%
  #WGS84/UTM54Nに投影変換
  sf::st_transform(crs=sf::st_crs(32654))
#GeoJSON形式で書き出し
sf::write_sf(obj=pref_office,
             dsn="output/pref_office.geojson",
             delete_dsn=TRUE)

都道府県ポリゴン

取得元:コロプレス地図(塗り分け地図) インデックス | 歴史的行政区域データセットβ版

#都道府県ポリゴンを読み込み
pref_poly <- geojsonio::geojson_sf(x="jp_pref.c.topojson") %>%
  #不整地物を補正
  sf::st_make_valid() %>%
  #WGS84/UTM54Nに投影変換
  sf::st_transform(crs=sf::st_crs(32654))
#GeoJSON形式で書き出し
sf::write_sf(obj=pref_poly,
             dsn="output/pref_poly.geojson",
             delete_dsn=TRUE)