小地域統計による人口変化の可視化同様に2年分のデータを用いて国勢調査の小地域(町丁・字等別,ポリゴン)に人口変化及び人口変化率を示す.ただし,今回は例えば小地域の境界線の変更によって,小地域の数(形状)が変更した場合(鹿児島市)を取り扱う.
ライブラリ:sf,tidyverse,scales
library(sf)
library(tidyverse)
#muted()利用
library(scales) 境界データのダウンロード
#2020年
Kagoshima_shi_map20<-
read_sf("A002005212020DDSWC46201/r2ka46201.shp")
#2010年
Kagoshima_shi_map10<-
read_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_pop20<-
read.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_pop10<-
read.table("tblT000572C46/tblT000572C46.txt",
header=TRUE, sep=",", skip=1,
fileEncoding="CP932")
#列名の変更(1,3列目)
Kagoshima_pop10 %>%
rename("KEY_CODE"=X, "CITYNAME"=X.2) ->
Kagoshima_pop10filiter).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_shi10<-
left_join(Kagoshima_shi_map10, Kagoshima_shi_pop10,
by=c("KEY_CODE"))
Kagoshima_shi20<-
left_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)
fig1<-
ggplot()+
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),黄色い枠が「広木」
fig2<-
ggplot()+
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)
#図を並べる
fig1+fig2+
plot_layout(ncol=2) データ結合2
小地域統計による人口変化の可視化で例とした小田原市の場合,2010年から2020年の間に(おそらく)小地域の数に変更なし.このため,2010年と2020年の国勢調査の行数(←小地域の数)が揃い,cbind()でデータを横方向に結合でき,人口変化が計算可能に.
cbind()は行数が揃っている必要がある.cbind()を試すとエラーが生じる.
sfクラスのデータ(データフレーム)を結合するst_join()を試し,この問題を解決する.結合したデータはKagoshima_shi1020と名付ける.nrow()で調べる.
2257行と返ってくる.かなり行数が増えているが,これは単純に横方向に2つのデータを結合していないことを意味する.Kagoshima_shi1020<-
st_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による地理空間データの可視化