フリーソフトウェアであるR
とオープンデータを使って、自分の興味のある自治体のデータを可視化してみます。R
のインストールや基本的な操作方法については、こちらを参照してください。
R
の特徴は、package
と呼ばれる拡張機能が充実している点です。以下で最初にpackage
を読み込みます。
# 下記コマンドによるインストールは一度だけ必要
# install.packages("package名")
# libraryによる読み込みは毎回必要
library(tidyverse)
library(sf)
library(NipponMap)
library(patchwork)
library(readxl)
library(RColorBrewer) #カラーパレット
library(ggrepel)
今回の対象地域は、岐阜県高山市とする。
# シェープファイルの入手
Nippon_map<-read_sf(system.file("shapes/jpn.shp", package = "NipponMap")[1],
crs = "+proj=longlat +datum=WGS84")
# 岐阜を指定する
Nippon_map$gifuDummy<-ifelse(Nippon_map$jiscode==21,1,0)
#北海道と沖縄の移動 (ジオメトリの直接変更)
Nippon_map$geometry[1]=Nippon_map$geometry[1]+c(-11, -4)
Nippon_map$geometry[47]=Nippon_map$geometry[47]+c(12, 5)
#地図の描画
ggplot()+
geom_sf(data=Nippon_map, aes(fill=factor(gifuDummy)))+
ggtitle("岐阜県の場所")+
annotate("segment", x=129, xend=134.2, y=37, yend=37,
color="gray", size=1)+
annotate("segment", x=134.2, xend=138.5, y=37, yend=41,
color="gray", size=1)+
annotate("segment", x=139.8, xend=141, y=32.2, yend=32.2,
color="gray", size=1)+
annotate("segment", x=138.5, xend=139.8, y=31, yend=32.2,
color="gray", size=1)+
labs(fill="",
caption="出典:NipponMap")+xlab("")+ylab("")+
scale_fill_brewer(palette = "Blues")+
theme_gray (base_family = "HiraKakuPro-W3")+
theme(legend.position = 'none')->p1
ggplot()+
geom_sf(data=Nippon_map, aes(fill=population))+
scale_fill_distiller(palette="YlGnBu", direction=1)+
annotate("segment", x=129, xend=134.2, y=37, yend=37,
color="gray", size=1)+
annotate("segment", x=134.2, xend=138.5, y=37, yend=41,
color="gray", size=1)+
annotate("segment", x=139.8, xend=141, y=32.2, yend=32.2,
color="gray", size=1)+
annotate("segment", x=138.5, xend=139.8, y=31, yend=32.2,
color="gray", size=1)+
labs(fill="人",
caption="出典:NipponMap")+
ggtitle("都道府県別人口")+
theme_gray (base_family = "HiraKakuPro-W3")->p2
ggplot()+
geom_col(data=Nippon_map,aes(x=jiscode,y=population/1000000),
color=factor(Nippon_map$gifuDummy))+
geom_hline(yintercept=mean(Nippon_map$population)/1000000,
linetype=2,alpha=0.7,size=0.5,color='red')+
theme_gray (base_family = "HiraKakuPro-W3")+
ggtitle("都道府県別の人口")+
xlab("都道府県番号")+ylab("人口 (単位:100万人)")->p3
p1 + p2
p3
都道府県番号は、こちらを参照のこと。
日本のデジタル化された地図情報は国土交通省が公開している「国土数値情報」で入手することができる。はじめに岐阜県の地図をここから入手しよう。
国土数値情報 >> 国土数値情報ダウンロードサービス >> 2. 政策区域 >> 行政地域 >> 行政区域 (ポリゴン) >> 岐阜県
と進んでダウンロードしよう。以下の例ではshape/Gifuというフォルダに保存している。
setwd("~/R/ForTeaching/shape/Gifu")
gifumap <- read_sf("N03-22_21_220101.shp",
crs = "+proj=longlat +datum=WGS84") # 岐阜のシェープファイル
# 岐阜を指定する
gifumap$gifuDummy<-ifelse(gifumap$N03_004=="高山市",1,0)
gifumap$gifuDummy[1]<-0
ggplot(gifumap) +
geom_sf(aes(fill=factor(gifuDummy)))+
scale_fill_brewer(palette = "Blues")+
theme_gray (base_family = "HiraKakuPro-W3")+
geom_text(aes(x=137.3, y=36.12), size=5,
label="高山市", family = "HiraKakuPro-W3")+
ggtitle("岐阜県")+ xlab("")+ylab("")+
theme(legend.position = 'none')->gifuTmap
gifuTmap
setwd("~/R/ForTeaching/shape/Gifu")
gifumap2 <- read_sf("r2ka21.shp",
crs = "+proj=longlat +datum=WGS84") #岐阜県のシェープファイル
#一般調査区の抽出
gifumap2 %>%
filter(HCODE==8101)->
gifumap2
sf_use_s2(FALSE)
# 市町村別の人口マップ
gifumap2 %>%
group_by(CITY)%>%
summarise(Population=sum(JINKO), Areatotal=sum(AREA))%>%
ggplot()+
geom_sf(aes(fill=(Population/1000)))+
scale_fill_distiller(palette="YlGnBu", direction=1)+
labs(fill="単位:千人")+
ggtitle("岐阜県の市町村別人口(2020年、単位:1000人)")+
theme_gray (base_family = "HiraKakuPro-W3")
# 人口のグラフ
gifumap2 %>%
group_by(CITY_NAME)%>%
summarise(Population=sum(JINKO)) %>%
ggplot()+
geom_col(aes(reorder(x=CITY_NAME,X=Population),y=Population/1000),
fill="royalblue")+
theme_gray (base_family = "HiraKakuPro-W3")+
ggtitle("岐阜県の人口(市町村別)")+
xlab("市町村")+ylab("人口 (単位:千人)")+coord_flip()
# 町丁別
ggplot(gifumap2) + geom_sf(aes(fill=JINKO))+
scale_fill_distiller(palette="YlGnBu", direction=1)+
theme_gray (base_family = "HiraKakuPro-W3")+
labs(fill = "単位:人")+
ggtitle("国勢調査(2020年)における岐阜県の人口 (町丁・字等別)")
次に高山市のデジタル白地図情報を入手する。
総務省統計局 >> 小地域 >> 国勢調査 >> 2020年 小地域 >> 世界測地系緯度経度・Shapefile >> 岐阜県 >> 高山市
setwd("~/R/ForTeaching/shape/Gifu")
takayamamap <- read_sf("r2ka21203.shp",
crs = "+proj=longlat +datum=WGS84")
ggplot(takayamamap) + geom_sf(aes(fill=JINKO))+
scale_fill_distiller(palette="YlGnBu", direction=1)+
theme_gray (base_family = "HiraKakuPro-W3")+
labs(fill = "単位:人")+
ggtitle("国勢調査(2020年)における高山市の人口 (町丁・字等別)")
国勢調査からみた高山市人口構造を可視化する。
国勢調査のデータは、総務省統計局のe-statから入手する(ここ。国勢調査の「都道府県・市区町村別の主な結果」の令和2年のエクセルをダウンロードした。
ダウンロードした2020年データをローカルの/e-stat/というフォルダに保存し、10行目に以下のような表タイトルを追加している。
setwd("~/R/ForTeaching/e-stat")
PopAll<-readxl::read_excel("major_results_2020.xlsx",skip=9,sheet=1)
PopAll |>
filter(prefname=="21_岐阜県" & cityname!="21000_岐阜県") |>
select(cityname,V6) |>
ggplot()+
geom_col(aes(reorder(x=cityname,X=as.double(V6)),y=as.double(V6)),
fill="royalblue")+
geom_hline(yintercept=-0.7,
linetype=2,alpha=0.7,size=0.5,color='red')+
xlab("")+ylab("5年間の人口増減率(%)")+
ggtitle("国勢調査2020年")+
theme_gray (base_family = "HiraKakuPro-W3")+
coord_flip()
赤線は全国平均(-0.7%)である。
setwd("~/R/ForTeaching/e-stat")
PopAll |>
filter(prefname=="21_岐阜県" & cityname!="21000_岐阜県") |>
select(cityname,V14,V15,V16) |>
pivot_longer(cols = c(V14,V15,V16),
names_to = "year_range",
values_to = "ratio") |>
ggplot()+
geom_col(aes(x=reorder(cityname, desc(cityname)),
y=as.double(ratio),fill=year_range),
position = position_fill(reverse = TRUE))+
scale_y_continuous(labels = scales::percent) +
xlab("")+ylab("人口構成")+
ggtitle("国勢調査2020年 (年齢3区分人口構成)")+
theme_gray (base_family = "HiraKakuPro-W3")+
coord_flip()+
labs(fill="")+
theme(legend.position = "bottom",
legend.justification = "left") +
scale_fill_discrete(breaks=c("V14","V15","V16"),
labels=c('15歳未満', '15-64歳', '65歳以上'))
setwd("~/R/ForTeaching/e-stat")
# 産業分類に見合う数のパレットの色を準備
#getPal = colorRampPalette(brewer.pal(21, "Set1"))
workerAll<-c(1986273, 141248, 20456, 4857375, 10439466, 317856,
2518801, 3680454, 10319934, 1616884, 1520345,
2561028, 3670432, 2318199, 3310184, 8818261,
489988, 4539980, 2341272)
industry_typeAll<-c("A.農業,林業",
"B.漁業",
"C.鉱業,採石業,砂利採取業",
"D.建設業",
"E.製造業",
"F.電気・ガス・熱供給・水道業",
"G.情報通信業",
"H.運輸業,郵便業",
"I.卸売業,小売業",
"J.金融業,保険業",
"K.不動産業,物品賃貸業",
"L.学術研究,専門・技術サービス業",
"M.宿泊業,飲食サービス業",
"N.生活関連サービス業,娯楽業",
"O.教育,学習支援業",
"P.医療,福祉",
"Q.複合サービス事業",
"R.サービス業(他に分類されないもの)",
"S.公務(他に分類されるものを除く)")
indTypeDB<-as.data.frame(cbind(industry_typeAll,workerAll))
indTypeDB$workerAll<-as.numeric(indTypeDB$workerAll)
ggplot(indTypeDB) +
aes(x="", y=workerAll, fill=industry_typeAll) +
geom_col(position = position_fill(reverse = TRUE))+
scale_y_continuous(labels = scales::percent)+
xlab("")+ylab("")+
coord_flip()+
guides(fill = guide_legend(ncol=4))+
labs(fill="")+
theme(axis.title = element_text(size=20),
axis.text = element_text(size=18),
legend.text = element_text(size=13))+
ggtitle("国勢調査2020年 (全国の産業大分類別就業者数の割合)")+
theme_gray (base_family = "HiraKakuPro-W3")+
theme(legend.position="bottom")
setwd("~/R/ForTeaching/e-stat")
#岐阜県
PopAll2<-readxl::read_excel("major_results_2020.xlsx",skip=9,sheet=2)
PopAll2 |>
filter(prefname=="21_岐阜県" & cityname!="21000_岐阜県") |>
select(cityname,V56,V58:V75) |>
pivot_longer(cols = c(V56,V58:V75),
names_to = "industry_type",
values_to = "worker") |>
ggplot()+
geom_col(aes(x=reorder(cityname, desc(cityname)),
y=as.double(worker),fill=industry_type),
position = position_fill(reverse = TRUE))+
scale_y_continuous(labels = scales::percent)+
xlab("")+ylab("")+
ggtitle("国勢調査2020年 (岐阜県の産業大分類別就業者数)")+
theme_gray (base_family = "HiraKakuPro-W3")+
coord_flip()+
labs(fill="産業分類")+
theme(legend.position = "right") +
scale_fill_discrete(breaks=c("V56","V58","V59","V60","V61","V62",
"V63","V64","V65","V66","V67","V68",
"V69","V70","V71","V72","V73","V74","V75"),
labels=c("A.農業,林業",
"B.漁業",
"C.鉱業,採石業,砂利採取業",
"D.建設業",
"E.製造業",
"F.電気・ガス・熱供給・水道業",
"G.情報通信業",
"H.運輸業,郵便業",
"I.卸売業,小売業",
"J.金融業,保険業",
"K.不動産業,物品賃貸業",
"L.学術研究,専門・技術サービス業",
"M.宿泊業,飲食サービス業",
"N.生活関連サービス業,娯楽業",
"O.教育,学習支援業",
"P.医療,福祉",
"Q.複合サービス事業",
"R.サービス業(他に分類されないもの)",
"S.公務(他に分類されるものを除く)"))
国土数値情報からダウンロードできる「土地利用細分メッシュデータ」は 100mメッシュで、小地域の土地利用状況を可視化するのに適している。このデータは、衛星画像を用いて土地利用の現況が判読されている。
国土数値情報 >> 土地利用細分メッシュデータ >> ダウンロードするデータの選択 >>(日本地図から)「5336」「5337」「5436」「5437」をクリック >> 世界測地系 平成28年
一部のメッシュデータは令和3年もあるが、ここでは平成28年に統一した。
gifu_lU_map1<-
read_sf("shape/Gifu/L03-b-16_5436.shp",
options = "ENCODING=CP932", stringsAsFactors=FALSE)
gifu_lU_map2<-
read_sf("shape/Gifu/L03-b-16_5437.shp",
options = "ENCODING=CP932", stringsAsFactors=FALSE)
gifu_lU_map3<-
read_sf("shape/Gifu/L03-b-16_5336.shp",
options = "ENCODING=CP932", stringsAsFactors=FALSE)
gifu_lU_map4<-
read_sf("shape/Gifu/L03-b-16_5337.shp",
options = "ENCODING=CP932", stringsAsFactors=FALSE)
## 以下は、「土地利用細分メッシュデータによる土地利用状況の可視化」を参照
## https://shinichiro-iwata.github.io/geospatial-data-visualization/land-use-subdivision-mesh-visualization.html
##
##
#土地利用種別とコードの対応関係
my_list<-
c("田・その他農用地"="0100",
"田・その他農用地"="0200",
"森林"="0500",
"荒れ地"="0600",
"建物用地"="0700",
"道路・鉄道"="0901",
"道路・鉄道"="0902",
"その他の用地"="1000",
"河川池・湖沼・海浜"="1100",
"河川池・湖沼・海浜"="1400",
"河川池・湖沼・海浜"="1500",
"ゴルフ場"="1600")
gifu_lU_map1 %>%
mutate(土地利用種別=fct_recode(土地利用種, !!!my_list))->
gifu_lU_map1
gifu_lU_map2 %>%
mutate(土地利用種別=fct_recode(土地利用種, !!!my_list))->
gifu_lU_map2
gifu_lU_map3 %>%
mutate(土地利用種別=fct_recode(土地利用種, !!!my_list))->
gifu_lU_map3
gifu_lU_map4 %>%
mutate(土地利用種別=fct_recode(土地利用種, !!!my_list))->
gifu_lU_map4
# 土地利用は以下の色で区別
my_color=c("#DEF5E5FF",
"#ADE3C0FF",
"#6CD3ADFF",
"#366DA0FF",
"#7C7B78FF",
"#3E356BFF",
"#35264CFF",
"#AADC32FF")
4枚のメッシュデータを統合して、緯度経度で範囲を指定して、高山市の白地図と一緒にプロットする。
ggplot()+
geom_sf(data=gifu_lU_map1,
aes(color=土地利用種別, fill=土地利用種別),
size=0.01)+
geom_sf(data=gifu_lU_map2,
aes(color=土地利用種別, fill=土地利用種別),
size=0.01)+
geom_sf(data=gifu_lU_map3,
aes(color=土地利用種別, fill=土地利用種別),
size=0.01)+
geom_sf(data=gifu_lU_map4,
aes(color=土地利用種別, fill=土地利用種別),
size=0.01)+
scale_color_manual(values=my_color, guide="legend")+
scale_fill_manual(values=my_color)+
geom_sf(data=takayamamap, fill="NA",
color="#FCFDBFFF", size=0.8)+
labs(caption="出典:国土交通省国土数値情報")+
ggtitle("高山市周辺の土地利用状況(2016年)")+
coord_sf(xlim= c(136.75, 137.65), ylim=c(35.88, 36.4))+
theme_gray (base_family = "HiraKakuPro-W3")+
theme(axis.title = element_text(size=14),
axis.text = element_text(size=14),
title=element_text(size=16),
legend.text = element_text(size=14),
legend.title = element_text(size=14))+
theme(legend.position="bottom")
ほぼ全てが森林・・・。
次に高山市の廃棄物処理施設をプロットする。使用するデータは一般廃棄物処理の施設立地のデータで以下でダウンロードできる。
国土数値情報 >> 3. 地域 >> 廃棄物処理施設 (ポイント) >> 岐阜県(平成24年)
なお、国土数値情報で公開されているデータの最新版は、平成24年である。
setwd("~/R/ForTeaching/shape/Gifu")
# 産業廃棄物のデータの読み込み
GifuIndWaste<-read_sf("P15-12_21_IndustrialWasteDisposalFacilities.shp",
options = c("encoding=CP932"),
crs="WGS84")
# 一般廃棄物のデータの読み込み
GifuMswWaste<-read_sf("P15-12_21_GeneralWasteDisposalFacilities.shp",
options = c("encoding=CP932"),
crs="WGS84")
gifuTmap+geom_sf(data=GifuMswWaste, size=2,aes(color=P15_004))+
theme(legend.position = 'right')+
labs(color="施設のタイプ")+ggtitle("岐阜県内の一般廃棄物処理施設")+
guides(fill=FALSE)
gifuTmap+geom_sf(data=GifuIndWaste, size=2)+
ggtitle("岐阜県内の産業廃棄物処理施設")+
guides(fill=FALSE)
一般廃棄物のデータは環境省の「一般廃棄物処理実態調査」で毎年市町村別に公表されている。
一般廃棄物処理実態調査 >> 統計表一覧 >> 令和2年度 >> 処理状況 >> 全体集計結果
とアクセスし、災害ゴミ以外の6つのファイルをダウンロードして、R2_01.xlsxという形で保存している。
setwd("~/R/ForTeaching/MSW")
#岐阜県
mswDB<-readxl::read_excel("R2_01.xlsx",skip=6,sheet=1)
# V9=一人当たりごみ排出量=合計(ごみ総排出量)*10^6/総人口/365
mswDB |>
ggplot(aes(x=as.numeric(V9), fill=factor(V40))) +
geom_histogram(bins=80, position="stack")+
xlim(0,3000)+
labs(fill="岐阜県ダミー",
caption="出典:環境省「一般廃棄物処理実態調査」,令和2年度")+
theme_gray(base_family = "HiraKakuPro-W3")+
theme(axis.title = element_text(size=20),
axis.text = element_text(size=20),
title=element_text(size=18),
legend.text = element_text(size=20),
legend.title = element_text(size=20))+
ylab("")+xlab("一日一人当たりごみ排出量(単位:g)")+
ggtitle("1日一人当たり一般廃棄物排出量のヒストグラム (全国)")
全国平均の一人1日あたりの一般廃棄物の排出量は、898g/日となっている。一方、岐阜県は、821g/日であり、岐阜県の平均的な一般廃棄物の排出量は全国平均を下回っている。
#mswDB |>
# filter(prefname=="岐阜県") |>
# mutate(gifuAv=mean(as.numeric(V9), na.rm=TRUE))->mswDBgifu
mswDB |>
filter(prefname=="岐阜県") |>
ggplot() +
geom_col(aes(reorder(x=cityname,X=as.numeric(V9)),y=as.numeric(V9),
fill=factor(V41)))+
geom_hline(yintercept=mean(as.numeric(mswDB$V9),na.rm=TRUE),
linetype=2,alpha=1,size=1.5,color='red')+
geom_hline(yintercept=821,
linetype=2,alpha=1,size=1.5,color='black')+
theme_gray (base_family = "HiraKakuPro-W3")+
ylab("一日一人当たりごみ排出量(単位:g)")+xlab("")+
geom_text(aes(x=3, y=750), size=5,
label="岐阜県平均", family = "HiraKakuPro-W3")+
geom_text(aes(x=3, y=955), size=5,
label="全国平均", family = "HiraKakuPro-W3",color="red")+
scale_fill_brewer(palette = "Set2")+
labs(caption="出典:環境省「一般廃棄物処理実態調査」,令和2年度")+
theme(axis.title = element_text(size=16),
axis.text = element_text(size=16),
title=element_text(size=18),
legend.text = element_text(size=20),
legend.title = element_text(size=20),
legend.position = "none")+
ggtitle("1日一人当たり一般廃棄物排出量 (岐阜県)")+
coord_flip()
高山市の一般廃棄物の一人当たり排出量は、岐阜県平均のみならず、全国平均を上回っている。
# 全国
mswDB |>
ggplot() +
geom_point(aes(x=as.numeric(V10),y=as.numeric(V11)))+
xlim(0,1000)+ylim(0,1000)+
theme_gray (base_family = "HiraKakuPro-W3")+
xlab("家庭系廃棄物")+ylab("事業系廃棄物")+
ggtitle("家庭系と事業系(全国)")+
theme(axis.title = element_text(size=14),
axis.text = element_text(size=14),
title=element_text(size=14))+
labs(caption="出典:環境省「一般廃棄物処理実態調査」,令和2年度")->mswP1
# 全国 (一人当たり廃棄物とリサイクル率)
mswDB |>
ggplot() +
geom_point(aes(x=as.numeric(V9),y=as.numeric(V34)))+
theme_gray (base_family = "HiraKakuPro-W3")+
xlim(0,2000)+
xlab("一日一人当たりごみ排出量(単位:g)")+ylab("リサイクル率")+
ggtitle("一般廃棄物とリサイクル率(全国)")+
theme(axis.title = element_text(size=14),
axis.text = element_text(size=14),
title=element_text(size=14))+
labs(caption="出典:環境省「一般廃棄物処理実態調査」,令和2年度")->mswP2
mswP1 + mswP2
次にこれを同じデータを岐阜県についてみてみよう。赤点線と青点線は全国平均を示している。
# 岐阜県
mswDB |>
filter(prefname=="岐阜県") |>
ggplot() +
geom_point(aes(x=as.numeric(V10),y=as.numeric(V11)))+
geom_hline(yintercept =220, linetype=2,alpha=1,size=0.5,color='red')+
geom_vline(xintercept = 678,linetype=2,alpha=1,size=0.5,color='blue')+
geom_label_repel(aes(x=as.numeric(V10),y=as.numeric(V11),
label = cityname), size = 3, family = "HiraKakuPro-W3")+
theme_gray (base_family = "HiraKakuPro-W3")+
xlab("家庭系廃棄物")+ylab("事業系廃棄物")+
ggtitle("家庭系と事業系(岐阜県)")+
theme(axis.title = element_text(size=14),
axis.text = element_text(size=14),
title=element_text(size=14))+
labs(caption="出典:環境省「一般廃棄物処理実態調査」,令和2年度")
# 岐阜県 (一人当たり廃棄物とリサイクル率)
mswDB |>
filter(prefname=="岐阜県") |>
ggplot() +
geom_point(aes(x=as.numeric(V9),y=as.numeric(V34)))+
geom_hline(yintercept =20.7, linetype=2,alpha=1,size=0.5,color='red')+
geom_vline(xintercept = 898,linetype=2,alpha=1,size=0.5,color='blue')+
geom_label_repel(aes(x=as.numeric(V9),y=as.numeric(V34),
label = cityname), size = 3, family = "HiraKakuPro-W3")+
theme_gray (base_family = "HiraKakuPro-W3")+
xlab("一日一人当たりごみ排出量(単位:g)")+ylab("リサイクル率")+
ggtitle("一般廃棄物とリサイクル率(岐阜県)")+
theme(axis.title = element_text(size=14),
axis.text = element_text(size=14),
title=element_text(size=14))+
labs(caption="出典:環境省「一般廃棄物処理実態調査」,令和2年度")