小地域統計による人口変化の可視化同様に2年分のデータを用いて国勢調査の小地域(町丁・字等別,ポリゴン)に人口変化及び人口変化率を示す.ただし,今回は例えば小地域の境界線の変更によって,小地域の数(形状)が変更した場合(鹿児島市)を取り扱う.
ライブラリ:sf
,tidyverse
,scales
library(sf)
library(tidyverse)
#muted()利用
library(scales)
境界データのダウンロード
#2020年
<-
Kagoshima_shi_map20read_sf("A002005212020DDSWC46201/r2ka46201.shp")
#2010年
<-
Kagoshima_shi_map10read_sf("A002005212010DDSWC46201/h22ka46201.shp")
一般調査区の抽出
水面調査区(海上ポリゴン)が目立つため,一般調査区のみ抽出(filiter()
).
%>%
Kagoshima_shi_map20 filter(HCODE==8101) ->
Kagoshima_shi_map20
%>%
Kagoshima_shi_map10 filter(HCODE==8101) ->
Kagoshima_shi_map10
データ結合の準備
後ほど,KEY_CODE
列を用いて境界データと統計データを結合する.ただし,境界データはKEY_CODE
が文字データ型,統計データは数値データ型のため結合できない.
KEY_CODE
を数値データ型(as.numeric()
)に変更.#KEY_CODEを数値データ型に
%>%
Kagoshima_shi_map20 mutate(KEY_CODE=as.numeric(KEY_CODE)) ->
Kagoshima_shi_map20
%>%
Kagoshima_shi_map10 mutate(KEY_CODE=as.numeric(KEY_CODE)) ->
Kagoshima_shi_map10
統計データのダウンロード
read.table
で読込.
Kogoshima_pop#
と名付ける.header=TRUE
は列名が含まれていることを意味する.仮に列名がなければFALSE
.ダウンロードしたデータは2列にわたって列名がある.sep=","
はデータがカンマで区切られていることを意味する.skip=1
は1番最初の行を削除することを意味する.後ほど,1行目にあった情報(KEY_CODE
,CITYNAME
)を再度加える.fileEncoding="CP932"
のオプションを加える(例えばskip=1
の後に).ここでは,加えておく.#2020年(文字化け防止のため,オプションを加えておく)
<-
Kagoshima_pop20read.table("tblT001081C46/tblT001081C46.txt",
header=TRUE, sep=",", skip=1,
fileEncoding="CP932")
#列名の変更(1,3列目)
%>%
Kagoshima_pop20 rename("KEY_CODE"=X, "CITYNAME"=X.2) ->
Kagoshima_pop20
#2010年
<-
Kagoshima_pop10read.table("tblT000572C46/tblT000572C46.txt",
header=TRUE, sep=",", skip=1,
fileEncoding="CP932")
#列名の変更(1,3列目)
%>%
Kagoshima_pop10 rename("KEY_CODE"=X, "CITYNAME"=X.2) ->
Kagoshima_pop10
filiter
).Kagoshima_shi_pop#
と名付ける.%>%
Kagoshima_pop20 filter(CITYNAME=="鹿児島市") ->
Kagoshima_shi_pop20
%>%
Kagoshima_pop10 filter(CITYNAME=="鹿児島市") ->
Kagoshima_shi_pop10
人口総数
小地域の人口は「人口総数」の列に含まれているが,文字データ型情報.
numeric
)情報に変更(mutate
)する.再び
Kagoshima_shi_pop_#
と名付ける.
NA
に強制変換(Warning message
(警告メッセージ)が出現するが問題ない).%>%
Kagoshima_shi_pop20 mutate(人口総数=as.numeric(人口総数)) ->
Kagoshima_shi_pop20
%>%
Kagoshima_shi_pop10 mutate(人口総数=as.numeric(人口総数)) ->
Kagoshima_shi_pop10
データ結合1
各年の境界データと統計データを結合.Kagoshima_shi#
と名付ける.
<-
Kagoshima_shi10left_join(Kagoshima_shi_map10, Kagoshima_shi_pop10,
by=c("KEY_CODE"))
<-
Kagoshima_shi20left_join(Kagoshima_shi_map20, Kagoshima_shi_pop20,
by=c("KEY_CODE"))
可視化
各年の人口総数を可視化.
summarise()
で1つのポリゴンにする.ncol=2
).そのためにライブラリpatchwork
を呼び出す.#広木の選別
%>%
Kagoshima_shi20 filter(KEYCODE1>="201329001" & KEYCODE1<="201329003") %>%
summarise() ->
Hiroki
#2010年の人口(fig1)
<-
fig1ggplot()+
geom_sf(data=Kagoshima_shi10, aes(fill=人口総数))+
scale_fill_viridis_c(option="G", direction=-1)+
labs(fill="人")+
ggtitle("2010年")+
coord_sf(datum=NA)+
theme_bw()+
theme(legend.position="bottom")
#2020年の人口(fig2),黄色い枠が「広木」
<-
fig2ggplot()+
geom_sf(data=Kagoshima_shi20, aes(fill=人口総数))+
scale_fill_viridis_c(option="G", direction=-1)+
geom_sf(data=Hiroki, fill="NA", color="yellow", size=0.35)+
labs(fill="人")+
ggtitle("2020年")+
coord_sf(datum=NA)+
theme_bw()+
theme(legend.position="bottom")
#図を並べるため
library(patchwork)
#図を並べる
+fig2+
fig1plot_layout(ncol=2)
データ結合2
小地域統計による人口変化の可視化で例とした小田原市の場合,2010年から2020年の間に(おそらく)小地域の数に変更なし.このため,2010年と2020年の国勢調査の行数(←小地域の数)が揃い,cbind()
でデータを横方向に結合でき,人口変化が計算可能に.
cbind()
は行数が揃っている必要がある.cbind()
を試すとエラーが生じる.
sf
クラスのデータ(データフレーム)を結合するst_join()
を試し,この問題を解決する.結合したデータはKagoshima_shi1020
と名付ける.nrow()
で調べる.
2257
行と返ってくる.かなり行数が増えているが,これは単純に横方向に2つのデータを結合していないことを意味する.<-
Kagoshima_shi1020st_join(Kagoshima_shi10, Kagoshima_shi20)
nrow(Kagoshima_shi1020)
## [1] 2257
データクリーニング
可能な限り,同一の小地域の人口変化を調べたい.
KEY_CODE
が2010年と2020年で異なる地域もあるため,ここでは小地域を識別する列の一つであるKEYCODE1
を利用.KEYCODE1
は文字型データのため数値型データに変更.KEYCODE1
は同じはず.そこで,2020年のKEYCODE1
(KEYCODE1.y
)から2010年のKEYCODE1
(KEYCODE1.x
)を差し引き(差をd
とする),その値(d
)が0
になるデータだけを抜き出す.nrow()
で調べる.行数が374
行と返ってくる.この過程でいくつかの小地域が落ちた可能性がある.#数値型データに変更
%>%
Kagoshima_shi1020 mutate(KEYCODE1.x=as.numeric(KEYCODE1.x),
KEYCODE1.y=as.numeric(KEYCODE1.y)) ->
Kagoshima_shi1020
#識別番号の差
%>%
Kagoshima_shi1020 mutate(d=KEYCODE1.y-KEYCODE1.x) ->
Kagoshima_shi1020
#識別番号が等しい小地域だけ選別
%>%
Kagoshima_shi1020 filter(d=="0") ->
Kagoshima_shi1020
nrow(Kagoshima_shi1020)
## [1] 374
人口変化
diff_pop
と名付ける.#人口変化
%>%
Kagoshima_shi1020 mutate(diff_pop=人口総数.y-人口総数.x) ->
Kagoshima_shi1020
完成図
完成図の可視化.
scale_color_gradient2()
:中間値(初期値は0
)より大きな値と小さな値で色を塗り分けることを可能にする関数.
0
を灰色,負を青,正を赤に設定.ただし,muted()
は色を落ち着かせる際に利用.muted()
利用のため,scales
パッケージを呼び出す(library
).muted()
は指示しなくても問題ない.その場合は単にlow=blue
と指示.利用しない場合はscales
パッケージを呼び出す必要もない.labs()
に出典を含め,theme()
で左寄せにする.#人口変化の可視化
ggplot()+
geom_sf(data=Kagoshima_shi1020, aes(fill=diff_pop))+
scale_fill_gradient2(low=muted("blue"),
mid="gray92",
high=muted("red"))+
labs(fill="人",
caption="出典:国土交通省国土数値情報
総務省統計局平成22年,令和2年国勢調査")+
ggtitle("人口変化(2010年ー2020年)")+
theme_bw()+
theme(plot.caption=element_text(hjust=0))
Rによる地理空間データの可視化