今回はデータを地図に可視化する練習です。
こちらのサイトを参考にしながらやっていきます。
NipponMapを活用して都道府県別データを日本地図に可視化していきます。
まずは必要なライブラリを追加。
install.packages("NipponMap")
library(sf)
library(tidyverse)
library(NipponMap)
ダウンロード>R>win-library>Rのバーション)>NipponMap
にshapesと示されるフォルダがあるので,これをコピーし, 作業ディレクトリにコピーしておきます。
シェイプファイルのデータを読み込み、ggplotで描画。
Nippon_map<-read_sf("shapes/jpn.shp", crs="WGS84")
ggplot()+
geom_sf(data=Nippon_map)
データの中身をチェック。
> head(Nippon_map)
Simple feature collection with 6 features and 5 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: 139.5506 ymin: 37.7308 xmax: 148.8678 ymax: 45.5331
Geodetic CRS: WGS 84
# A tibble: 6 × 6
SP_ID jiscode name population region geometry
<chr> <chr> <chr> <dbl> <chr> <MULTIPOLYGON [°]>
1 1 01 Hokkaido 5506419 Hokkaido (((139.7707 42.3018, 139.8711 42.6623, 140.1895 42.8243, 140.3062 42.7741, 14…
2 2 02 Aomori 1373339 Tohoku (((140.8727 40.48187, 140.6595 40.4018, 140.3903 40.4843, 140.0229 40.4172, 1…
3 3 03 Iwate 1330147 Tohoku (((140.7862 39.85982, 140.8199 39.86421, 140.8813 39.87221, 140.8819 39.87228…
4 4 04 Miyagi 2348165 Tohoku (((140.2802 38.01415, 140.2802 38.01417, 140.2805 38.02494, 140.2804 38.02509…
5 5 05 Akita 1085997 Tohoku (((140.7895 39.86026, 140.8253 39.6481, 140.6565 39.3879, 140.8112 39.1752, 1…
6 6 06 Yamagata 1168924 Tohoku (((140.2802 38.01415, 140.2799 37.97209, 140.2801 37.97209, 140.2795 37.7786,…
ggplotで人口分布の可視化します。
ggplot()+
geom_sf(data=Nippon_map, aes(fill=population))
カラーパレットを変更し、タイトルやキャプションを追加します。
ggplot()+
geom_sf(data=Nippon_map, aes(fill=population))+
scale_fill_distiller(palette="YlGnBu", direction=1)+
labs(fill="人",
caption="出典:NipponMap")+
ggtitle("都道府県別人口")+
theme_bw()
次に65歳以上高齢者人口割合データを可視化します。データはこちらのリンクからダウンロードします。
データをダウンロードして作業ディレクトリに保存し読み込み。
Elderly_pop<-read.csv("FEI_PREF_240812113558.csv",
sep=",", skip=1,
header=TRUE,
fileEncoding="CP932" )
データをチェック。
> Elderly_pop %>%
+ head()
調査年.コード 調査年 地域.コード 地域 X.項目 X.A03503_65歳以上人口割合... 注釈
1 2022100000 2022年度 1000 北海道 NA 32.8 NA
2 2022100000 2022年度 2000 青森県 NA 34.8 NA
3 2022100000 2022年度 3000 岩手県 NA 34.6 NA
4 2022100000 2022年度 4000 宮城県 NA 28.9 NA
5 2022100000 2022年度 5000 秋田県 NA 38.6 NA
6 2022100000 2022年度 6000 山形県 NA 34.8 NA
3列目と6列目は使用するので列名を変更します。
Elderly_pop %>%
rename(SP_ID=3,
Elderly_pop_rate=6) ->
Elderly_pop
データをNippon_mapと結合するために修正します。
県のIDを1000で割り、文字列型に変更します。
Elderly_pop %>%
mutate(SP_ID=SP_ID/1000) %>%
mutate(SP_ID=as.character(SP_ID)) ->
Elderly_pop
#Nippon_mapと結合
Elderlry_map<-
left_join(Nippon_map, Elderly_pop,
by=c("SP_ID"))
追加データを可視化します。
ggplot()+
geom_sf(data=Elderlry_map,
aes(fill=Elderly_pop_rate))+
scale_fill_viridis_c(option="G", direction=-1)+
labs(fill="%",
caption="NipponMap
出典:総務省都道府県・市区町村のすがた")+
ggtitle("65歳以上人口割合(2022年度)")+
theme_bw()
さて、使い方がなんとなくわかったので、以前の投稿でも使用したプロ野球のデータの中で出身地のデータを可視化してみます。
まずはデータのダウンロードと読み込みです。
install.packages('openxlsx')
library(openxlsx)
#ピッチャーのデータを読み込み。
datP<-read.xlsx("C:/Users/ユーザー名/Downloads/pitcher_data.xlsx",sheet="Sheet1")
#使用する列をセレクト
datP_出身地<-datP %>%
select("選手名","出身地")
#バッターのデータを読み込み。
datH<-read.xlsx("C:/Users/ユーザー名/Downloads/hitter_data.xlsx",sheet="Sheet1")
#使用する列をセレクト
datH_出身地<-datH %>%
select("選手名","出身地")
#データを結合
dat_出身地<- rbind(datP_出身地,datH_出身地)
選手のかぶりを除き集計します。
dat出身地集計<- dat_出身地%>%
distinct(選手名, .keep_all=T) %>%
group_by (出身地) %>%
summarise(人数=n()) %>%
data.frame()
データをチェック。
> dat出身地集計
出身地 人数
1 アメリカ 277
2 アンティル 1
3 イタリア 1
4 インドネシア 1
5 オランダ 2
6 オーストラリア 5
7 カナダ 6
8 キュラソー 1
9 キューバ 36
10 コロンビア 1
11 タイ 1
12 ドミニカ共和国 94
13 ニカラグア 1
14 パナマ 3
15 パナマ共和国 1
16 ブラジル 8
17 プエルトリコ 10
18 ベネズエラ 47
19 メキシコ 11
20 三重 29
21 京都 53
22 佐賀 31
23 兵庫 101
24 北海道 48
25 千葉 84
26 台湾 25
27 和歌山 31
28 埼玉 76
29 大分 29
30 大阪 161
31 奈良 32
32 宮城 27
33 宮崎 22
34 富山 13
35 山口 10
36 山形 13
37 山梨 8
38 岐阜 27
39 岡山 31
40 岩手 15
41 島根 9
42 広島 51
43 徳島 18
44 愛媛 18
45 愛知 68
46 新潟 18
47 東京 92
48 栃木 26
49 沖縄 43
50 滋賀 21
51 熊本 32
52 石川 23
53 神奈川 117
54 福井 20
55 福岡 101
56 福島 15
57 秋田 19
58 群馬 38
59 茨城 42
60 長崎 18
61 長野 10
62 青森 9
63 静岡 41
64 韓国 12
65 香川 17
66 高知 12
67 鳥取 3
68 鹿児島 30
なんとか日本のデータにしぼり、結合できるように修正していきます。
#漢字の行だけに絞ります。
dat_jp<-dat出身地集計[20:68, ]
#韓国と台湾を除きます。
dat_jp<-subset(dat_jp,!出身地=="台湾")
dat_jp<-subset(dat_jp,!出身地=="韓国")
#県が入っていないので文字を足します。
dat_JP<-dat_jp %>%
mutate(都道府県=paste0(出身地,"県"))
#道・都・府を修正します。
dat_JP["都道府県"]<-lapply(dat_JP["都道府県"], gsub, pattern="北海道県", replacement = "北海道")
dat_JP["都道府県"]<-lapply(dat_JP["都道府県"], gsub, pattern="東京県", replacement = "東京都")
dat_JP["都道府県"]<-lapply(dat_JP["都道府県"], gsub, pattern="京都県", replacement = "京都府")
dat_JP["都道府県"]<-lapply(dat_JP["都道府県"], gsub, pattern="大阪県", replacement = "大阪府")
先ほど使用した65歳以上の人口のデータから使用する列だけを抜き出します。
Elderlry_map %>%
rename(都道府県=9) %>% #列名の変更
select(1,2,3,4,5,6,9)->
baseball_map
baseball_map
これに出身地のデータを結合します。
baseball_map<-
left_join(baseball_map,dat_JP,
by=c("都道府県"))
データを可視化します。
ggplot()+
geom_sf(data=baseball_map,
aes(fill=人数))+
scale_fill_viridis_c(option="G", direction=-1)+
labs(fill="人数",
caption="NipponMap
出典:プロ野球データフリーク")+
ggtitle("出身地別プロ野球選手数(2009-2023年の合計)")+
theme_bw()
やはり単純に人口の多いところが多く見えます。
今度は人口あたりでも見てみます。
baseball_map<-baseball_map %>%
mutate(人口あたりの選手割合=人数*100/population)
ggplot()+
geom_sf(data=baseball_map,
aes(fill=人口あたりの選手割合))+
scale_fill_viridis_c(option="G", direction=-1)+
labs(fill="%",
caption="NipponMap
出典:プロ野球データフリーク")+
ggtitle("人口あたりのプロ野球選手の割合")+
theme_bw()
西日本が人口比で多いですね。特に和歌山や佐賀で多いのはちょっと驚きでした。
見てみます。
> dat_和歌山<-subset(dat_出身地,出身地=="和歌山") %>%
+ distinct(選手名, .keep_all=T)
> dat_和歌山
選手名 出身地
1 吉見祐治(よしみゆうじ) 和歌山
2 中川虎大(なかがわこお) 和歌山
3 小林樹斗(こばやしたつと) 和歌山
4 森浦大輔(もりうらだいすけ) 和歌山
5 黒原拓未(くろはらたくみ) 和歌山
6 玉置隆(たまきゆたか) 和歌山
7 岡本洋介(おかもとようすけ) 和歌山
8 岡田俊哉(おかだとしや) 和歌山
9 山本哲哉(やまもとてつや) 和歌山
10 平井諒(ひらいりょう) 和歌山
11 大久保勝信(おおくぼまさのぶ) 和歌山
12 富山凌雅(とみやまりょうが) 和歌山
13 西口文也(にしぐちふみや) 和歌山
14 益田直也(ますだなおや) 和歌山
15 南昌輝(みなみまさき) 和歌山
16 東妻勇輔(あづまゆうすけ) 和歌山
17 八木彬(やぎあきら) 和歌山
18 土屋朋弘(つちやともひろ) 和歌山
19 巽真悟(たつみしんご) 和歌山
20 津森宥紀(つもりゆうき) 和歌山
21 西村天裕(にしむらたかひろ) 和歌山
22 山本芳彦(やまもとよしひこ) 和歌山
23 小久保裕紀(こくぼひろき) 和歌山
24 中谷仁(なかたにじん) 和歌山
25 濱中治(はまなかおさむ) 和歌山
26 筒香嘉智(つつごうよしとも) 和歌山
27 西川遥輝(にしかわはるき) 和歌山
28 坂口真規(さかぐちまさき) 和歌山
29 山崎晃大朗(やまさきこうたろう) 和歌山
30 三家和真(みけかずま) 和歌山
31 林晃汰(はやしこうた) 和歌山
なかなかそうそうたるメンバーですね~。