「最新国勢調査結果」 →「e-Stat API」 →「R言語」

# APIの利用準備

手こずるだろうと思い、手を付けなかった「R言語」での取り込み。
知見不足なので、スマートにはできず。
せっかく実行したので、メモとして残しておきます。
効率のよい方法は今後見つけることとします。

[以前同様](https://qiita.com/tex_owleyes/items/92de6ebf4b18a925b5bc)「e-Stat」の APIを使います。

~~~
http://api.e-stat.go.jp/rest/3.0/app/getSimpleStatsData?cdTab=020&appId=＜自分のアプリケーションID＞&lang=J&statsDataId=0003410379&metaGetFlg=Y&cntGetFlg=N&explanationGetFlg=Y&annotationGetFlg=Y&sectionHeaderFlg=1&replaceSpChars=0
~~~

R言語で **「readr」** パッケージを使ってインポートします。

~~~R
library(readr)

api_csv <- "http://api.e-stat.go.jp/rest/3.0/app/getSimpleStatsData?cdTab=020&appId=＜自分のアプリケーションID＞&lang=J&statsDataId=0003410379&metaGetFlg=Y&cntGetFlg=N&explanationGetFlg=Y&annotationGetFlg=Y&sectionHeaderFlg=1&replaceSpChars=0"
pop_data <- read_csv(api_csv)
tail(pop_data) #確認
# A tibble: 6 × 1
  RESULT                                                       
  <chr>                                                        
1 "020,人口,120,女,47000,沖縄県,1995000000,1995年,人,648703,\""
2 "020,人口,120,女,47000,沖縄県,2000000000,2000年,人,670343,\""
3 "020,人口,120,女,47000,沖縄県,2005000000,2005年,人,693092,\""
4 "020,人口,120,女,47000,沖縄県,2010000000,2010年,人,709490,\""
5 "020,人口,120,女,47000,沖縄県,2015000000,2015年,人,728947,\""
6 "020,人口,120,女,47000,沖縄県,2020000000,2020年,人,744668,\""
Warning message:
One or more parsing issues, see `problems()` for details 
~~~

# 使わない項目を外す＆列分割

そのままでは、行の最初の部分は説明に相当するので、可視化には使いません。
**pop_data[25:35,]** で25行目から35行目までを見ると、26行目までが説明部分だと確認。
**pop_data[-1:-26,]** で外します。

~~~R
pop_data[25:35,]
# A tibble: 11 × 1
   RESULT                                                                                       
   <chr>                                                                                        
 1 "NOTE,-,当該数値がないもの"                                                                  
 2 "VALUE"                                                                                      
 3 "tab_code,表章項目,cat01_code,男女_時系列,area_code,地域_時系列,time_code,時間軸（調査年）,u…
 4 "020,人口,100,総数,00000,全国,1920000000,1920年,人,55963053,\""                              
 5 "020,人口,100,総数,00000,全国,1925000000,1925年,人,59736822,\""                              
 6 "020,人口,100,総数,00000,全国,1930000000,1930年,人,64450005,\""                              
 7 "020,人口,100,総数,00000,全国,1935000000,1935年,人,69254148,\""                              
 8 "020,人口,100,総数,00000,全国,1940000000,1940年,人,73114308,\""                              
 9 "020,人口,100,総数,00000,全国,1945000000,1945年,人,71998104,\""                              
10 "020,人口,100,総数,00000,全国,1950000000,1950年,人,84114574,\""                              
11 "020,人口,100,総数,00000,全国,1955000000,1955年,人,90076594,\""     
~~~

ただ、この時点では1列のデータフレームです。
後で分割します。

~~~R
pop_data2 <- pop_data[-1:-26,]
head(pop_data2)
# A tibble: 6 × 1
  RESULT                                                                                        
  <chr>                                                                                         
1 "tab_code,表章項目,cat01_code,男女_時系列,area_code,地域_時系列,time_code,時間軸（調査年）,un…
2 "020,人口,100,総数,00000,全国,1920000000,1920年,人,55963053,\""                               
3 "020,人口,100,総数,00000,全国,1925000000,1925年,人,59736822,\""                               
4 "020,人口,100,総数,00000,全国,1930000000,1930年,人,64450005,\""                               
5 "020,人口,100,総数,00000,全国,1935000000,1935年,人,69254148,\""                               
6 "020,人口,100,総数,00000,全国,1940000000,1940年,人,73114308,\""     
~~~

1行目を列名とします。
「rown」（ベクトル）に収納しておきます。
列をカンマで分割します。
1行ずつ **「str_split」** で分割。
リスト（list）型で返されるので、**「unlist」** でリスト型を外し、「rown」と **「rbind」** で結合できるようにしました。

~~~R
nrow(pop_data2) #行数確認
[1] 3151

rown <- c("tab_code","表章項目","cat01_code","男女_時系列","area_code","地域_時系列","time_code","時間軸（調査年）","unit", "value", "annotation")

library(dplyr)
library(stringr)

x <- 2
for (i in 2:3151) {
  row_bind <- str_split(pop_data2[x,], ",") %>% unlist()
  rown <- rbind(rown, row_bind)
  x <- x + 1
}

head(rown)
         [,1]       [,2]       [,3]         [,4]          [,5]        [,6]         
rown     "tab_code" "表章項目" "cat01_code" "男女_時系列" "area_code" "地域_時系列"
row_bind "020"      "人口"     "100"        "総数"        "00000"     "全国"       
row_bind "020"      "人口"     "100"        "総数"        "00000"     "全国"       
row_bind "020"      "人口"     "100"        "総数"        "00000"     "全国"       
row_bind "020"      "人口"     "100"        "総数"        "00000"     "全国"       
row_bind "020"      "人口"     "100"        "総数"        "00000"     "全国"       
         [,7]         [,8]               [,9]   [,10]      [,11]       
rown     "time_code"  "時間軸（調査年）" "unit" "value"    "annotation"
row_bind "1920000000" "1920年"           "人"   "55963053" "\""        
row_bind "1925000000" "1925年"           "人"   "59736822" "\""        
row_bind "1930000000" "1930年"           "人"   "64450005" "\""        
row_bind "1935000000" "1935年"           "人"   "69254148" "\""        
row_bind "1940000000" "1940年"           "人"   "73114308" "\""             

nrow(rown)
[1] 3151
~~~

# データフレーム変換＆列名配置

行列を **「as.data.frame」** でデータフレームに変換します。
データ型を確認し、後で人口値（value）を数値型に変換します。
その前に、列名がまだ1行目の値として収録されています。

~~~R
class(rown) #型を確認
[1] "matrix" "array" 

rown_df <- as.data.frame(rown)
class(rown_df)
[1] "data.frame"

str(rown_df) #データフレームの構造概要確認
'data.frame':	3151 obs. of  11 variables:
 $ V1 : chr  "tab_code" "020" "020" "020" ...
 $ V2 : chr  "表章項目" "人口" "人口" "人口" ...
 $ V3 : chr  "cat01_code" "100" "100" "100" ...
 $ V4 : chr  "男女_時系列" "総数" "総数" "総数" ...
 $ V5 : chr  "area_code" "00000" "00000" "00000" ...
 $ V6 : chr  "地域_時系列" "全国" "全国" "全国" ...
 $ V7 : chr  "time_code" "1920000000" "1925000000" "1930000000" ...
 $ V8 : chr  "時間軸（調査年）" "1920年" "1925年" "1930年" ...
 $ V9 : chr  "unit" "人" "人" "人" ...
 $ V10: chr  "value" "55963053" "59736822" "64450005" ...
 $ V11: chr  "annotation" "\"" "\"" "\"" ...
~~~

このため、1行目を **「colnames」** で列名としました。

~~~R
colnames(rown_df) <- rown_df[1,]
> head(rown_df)
           tab_code 表章項目 cat01_code 男女_時系列 area_code 地域_時系列  time_code
rown       tab_code 表章項目 cat01_code 男女_時系列 area_code 地域_時系列  time_code
row_bind        020     人口        100        総数     00000        全国 1920000000
row_bind.1      020     人口        100        総数     00000        全国 1925000000
row_bind.2      020     人口        100        総数     00000        全国 1930000000
row_bind.3      020     人口        100        総数     00000        全国 1935000000
row_bind.4      020     人口        100        総数     00000        全国 1940000000
           時間軸（調査年） unit    value annotation
rown       時間軸（調査年） unit    value annotation
row_bind             1920年   人 55963053          "
row_bind.1           1925年   人 59736822          "
row_bind.2           1930年   人 64450005          "
row_bind.3           1935年   人 69254148          "
row_bind.4           1940年   人 73114308          "
~~~

残った1行目を **[-1,]** と指定して削除します。
ようやく、作りたかったデータフレームの形になってきました。

~~~R
rown_df2 <- rown_df[-1,]
head(rown_df2)
           tab_code 表章項目 cat01_code 男女_時系列 area_code 地域_時系列  time_code
row_bind        020     人口        100        総数     00000        全国 1920000000
row_bind.1      020     人口        100        総数     00000        全国 1925000000
row_bind.2      020     人口        100        総数     00000        全国 1930000000
row_bind.3      020     人口        100        総数     00000        全国 1935000000
row_bind.4      020     人口        100        総数     00000        全国 1940000000
row_bind.5      020     人口        100        総数     00000        全国 1945000000
           時間軸（調査年） unit    value annotation
row_bind             1920年   人 55963053          "
row_bind.1           1925年   人 59736822          "
row_bind.2           1930年   人 64450005          "
row_bind.3           1935年   人 69254148          "
row_bind.4           1940年   人 73114308          "
row_bind.5           1945年   人 71998104          "

str(rown_df2)
'data.frame':	3150 obs. of  11 variables:
 $ tab_code        : chr  "020" "020" "020" "020" ...
 $ 表章項目        : chr  "人口" "人口" "人口" "人口" ...
 $ cat01_code      : chr  "100" "100" "100" "100" ...
 $ 男女_時系列     : chr  "総数" "総数" "総数" "総数" ...
 $ area_code       : chr  "00000" "00000" "00000" "00000" ...
 $ 地域_時系列     : chr  "全国" "全国" "全国" "全国" ...
 $ time_code       : chr  "1920000000" "1925000000" "1930000000" "1935000000" ...
 $ 時間軸（調査年）: chr  "1920年" "1925年" "1930年" "1935年" ...
 $ unit            : chr  "人" "人" "人" "人" ...
 $ value           : chr  "55963053" "59736822" "64450005" "69254148" ...
 $ annotation      : chr  "\"" "\"" "\"" "\"" ...
~~~

# 数値型変換＆エラー削除

人口値（value）を **「as.numeric」** で数値型に変換をしたところ、エラー（Warning）が出ました。

~~~R
rown_df2$value <- as.numeric(rown_df2$value)
Warning message:
NAs introduced by coercion 
~~~

原因は数値型にできない文字列「-」が入っていたため。
**「str_replace」** で「NA値」に変換しました。

~~~R
rown_df2$value <- str_replace(rown_df2$value, "-", NA_character_)
rown_df2$value <- as.numeric(rown_df2$value)
str(rown_df2)
'data.frame':	3150 obs. of  11 variables:
 $ tab_code        : chr  "020" "020" "020" "020" ...
 $ 表章項目        : chr  "人口" "人口" "人口" "人口" ...
 $ cat01_code      : chr  "100" "100" "100" "100" ...
 $ 男女_時系列     : chr  "総数" "総数" "総数" "総数" ...
 $ area_code       : chr  "00000" "00000" "00000" "00000" ...
 $ 地域_時系列     : chr  "全国" "全国" "全国" "全国" ...
 $ time_code       : chr  "1920000000" "1925000000" "1930000000" "1935000000" ...
 $ 時間軸（調査年）: chr  "1920年" "1925年" "1930年" "1935年" ...
 $ unit            : chr  "人" "人" "人" "人" ...
 $ value           : num  55963053 59736822 64450005 69254148 73114308 ...
 $ annotation      : chr  "\"" "\"" "\"" "\"" ...
~~~

# X軸準備＆グラフ作成

上記「value」はY軸値になり、X軸は年号（国勢調査は5年毎）になります。
X軸を連続値にするために、今回は数値型に変換します。
**「str_replace」** で「年」を「””」に変換し、**「as.numeric」** で数値型にしました。

~~~R
rown_df3 <-
  rown_df2 %>%
  mutate(YYYY = str_replace(rown_df2$"時間軸（調査年）", "年", "")) #括弧内の処理結果を収納する列を追加

head(rown_df3)
           tab_code 表章項目 cat01_code 男女_時系列 area_code 地域_時系列  time_code
row_bind        020     人口        100        総数     00000        全国 1920000000
row_bind.1      020     人口        100        総数     00000        全国 1925000000
row_bind.2      020     人口        100        総数     00000        全国 1930000000
row_bind.3      020     人口        100        総数     00000        全国 1935000000
row_bind.4      020     人口        100        総数     00000        全国 1940000000
row_bind.5      020     人口        100        総数     00000        全国 1945000000
           時間軸（調査年） unit    value annotation YYYY
row_bind             1920年   人 55963053          " 1920
row_bind.1           1925年   人 59736822          " 1925
row_bind.2           1930年   人 64450005          " 1930
row_bind.3           1935年   人 69254148          " 1935
row_bind.4           1940年   人 73114308          " 1940
row_bind.5           1945年   人 71998104          " 1945

rown_df3$YYYY <- as.numeric(rown_df3$YYYY)

str(rown_df3$YYYY)
 num [1:3150] 1920 1925 1930 1935 1940 ...
~~~

地域別にデータが配置されているので、**rown_df3[rown_df3$地域_時系列 == "全国",]** で日本全体の調査結果をピックアップします。
**「ggplot」** ＆ **「geom_line」** で折れ線グラフを描きます。
**「colour」** で「総数」「男性値」「女性値」を凡例とする3本のグラフを並べました。

~~~R
library(ggplot2)

rown_df4 <- rown_df3[rown_df3$地域_時系列 == "全国",]

ggplot(
  data = rown_df4,
  aes(x = YYYY, y = value, colour = 男女_時系列)) +
  geom_line() +
  theme_gray (base_family = "HiraKakuPro-W3") #Macの文字化けを回避するテーマ設定
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/ba0deff2-d9c8-257d-f87b-2d6760f2a502.png)

**了**