今回は環境省が調査を行っている生物調査のうち、ガンカモ類のデータを可視化していきます。
都道府県別羽数と調査地点別羽数の2種類のデータがあり、調査地点別の方は文字通り地点ごとのデータがあるためデータ数も多くなっています。
とりあえず今回は都道府県別にまとめられた方を使用します。
とはいえ1970年からデータがあるので量としてかなり多いです。
とりあえずすべてダウンロードしましたが、読み込みは一気にやっていきます。
以下にアップしてますので自由にお使いください。
# 必要なパッケージをインストールして読み込む
install.packages("readxl")
library(readxl)
library(tidyverse)
データは以下のような形式でワイド型のデータになっています。
2行目を列名としてデータを整形しつつ、すべてのファイルを結合します。
ファイル名が無駄に和暦になっているのに加え、微妙に年度毎に列名や列の順番が異なっていたりしてちょこちょこと直しているとかなり時間がかかりました。
普通にコピってまとめた方がよかったかもですが、これも練習だと思ってやっていきました。
# フォルダ内のすべてのExcelファイルのパスを取得
folder_path <- "C:/Users/ユーザー名/Download/ガンカモデータ/都道府県別" #フォルダパスを指定
file_list <- list.files(path = folder_path, pattern = "*.xls", full.names = TRUE)
# データフレームを格納するリスト
all_data <- list()
# 各Excelファイルを読み込み、処理する
for (file_path in file_list) {
# ファイル名からデータフレーム名を作成
file_name <- basename(file_path)
df_name <- substr(file_name, 1, 3) # 最初の3文字を抽出
# Excelファイルを読み込み
temp_df <- read_excel(file_path, col_names = FALSE)
# 2行目をタイトル行として設定し、3行目以降をデータとして扱う
colnames(temp_df) <- temp_df[2, ]
temp_df <- temp_df[-c(1, 2), ]
# 1列目の列名を「種類」に変更
colnames(temp_df)[1] <- "種類"
# 各ファイルに年度の列がないので結合したときにいつのデータかわからない!
#「年度」列を追加し、上記のファイル名にある年度を利用して年度をすべての行に追加
temp_df <- temp_df %>%
mutate(年度 = df_name)
# データフレームをリストに追加
all_data[[df_name]] <- temp_df
}
# すべてのデータフレームを行で結合
final_data <- bind_rows(all_data)
# 結果を確認
glimpse(final_data)
> glimpse(final_data)
Rows: 3,142
Columns: 50
$ 種類 <chr> "オオハクチョウ", "コハクチョウ", "コブハクチョウ", "アメリカコハクチョウ", "ハクチョウ類種不明", "ハクチョウ類…
$ 北海道 <chr> "3303", "327", "32", "0", "23", "3685", "0", NA, "285", "0", "10", "0", "5", "0", "0", "27", "327", "0", "0", "…
$ 青森 <chr> "4793", "6", "0", "2", "12", "4813", "0", NA, "60", "0", "0", "0", "3", "0", "0", "0", "63", "0", "0", "0", "0"…
$ 岩手 <chr> "1928", "126", "0", "6", "0", "2060", "0", NA, "0", "0", "33", "0", "0", "0", "0", "0", "33", "0", "0", "0", "0…
$ 宮城 <chr> "7822", "3083", "0", "0", "0", "10905", "0", NA, "125", "0", "12559", "0", "548", "0", "0", "0", "13232", "0", …
$ 秋田 <chr> "3179", "327", "1", "1", "0", "3508", "0", NA, "1", "0", "14", "0", "12", "0", "0", "0", "27", "0", "0", "0", "…
$ 山形 <chr> "2146", "1067", "0", "0", "0", "3213", "0", NA, "0", "0", "0", "0", "1", "0", "0", "0", "1", "0", "0", "0", "0"…
$ 福島 <chr> "866", "3101", "0", "11", "0", "3978", "0", NA, "0", "0", "0", "0", "1", "0", "0", "0", "1", "0", "0", "0", "0"…
$ 茨城 <chr> "194", "149", "66", "0", "1", "410", "0", NA, "0", "0", "0", "0", "50", "0", "0", "0", "50", "0", "0", "0", "0"…
$ 栃木 <chr> "0", "2", "0", "0", "0", "2", "0", NA, "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "11", "…
$ 群馬 <chr> "2", "38", "0", "0", "0", "40", "0", NA, "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "383"…
$ 埼玉 <chr> "0", "4", "0", "0", "0", "4", "0", NA, "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "137", …
$ 千葉 <chr> "0", "5", "2", "0", "0", "7", "0", NA, "3", "0", "20", "0", "0", "0", "0", "0", "23", "0", "0", "0", "0", "191"…
$ 東京 <chr> "0", "0", "0", "0", "0", "0", "0", NA, "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "602", …
$ 神奈川 <chr> "0", "0", "0", "0", "0", "0", "0", NA, "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "179", …
$ 新潟 <chr> "1000", "4879", "0", "0", "0", "5879", "0", NA, "3", "0", "324", "0", "1650", "0", "2", "0", "1979", "0", "0", …
$ 富山 <chr> "65", "4", "0", "0", "0", "69", "0", NA, "0", "0", "2", "0", "0", "0", "0", "0", "2", "0", "0", "0", "0", "113"…
$ 石川 <chr> "12", "220", "0", "0", "0", "232", "0", NA, "0", "1", "610", "0", "87", "0", "0", "0", "698", "1", "1", "0", "2…
$ 福井 <chr> "0", "14", "0", "0", "0", "14", "0", NA, "0", "0", "0", "0", "140", "0", "0", "0", "140", "0", "0", "0", "0", "…
$ 山梨 <chr> "7", "0", "13", "0", "0", "20", "0", NA, "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "57",…
$ 長野 <chr> "0", "295", "0", "0", "0", "295", "0", NA, "0", "0", "10", "0", "0", "0", "0", "0", "10", "0", "0", "0", "0", "…
$ 岐阜 <chr> "0", "0", "0", "0", "0", "0", "0", NA, "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "318", …
$ 静岡 <chr> "0", "0", "0", "0", "0", "0", "0", NA, "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "159", …
$ 愛知 <chr> "0", "4", "0", "0", "0", "4", "0", NA, "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "100", …
$ 三重 <chr> "0", "0", "0", "0", "0", "0", "0", NA, "2", "0", "0", "0", "0", "0", "0", "0", "2", "0", "0", "0", "0", "31", "…
$ 滋賀 <chr> "0", "191", "0", "0", "0", "191", "0", NA, "0", "0", "0", "0", "56", "0", "0", "0", "56", "0", "0", "0", "0", "…
$ 京都 <chr> "10", "20", "0", "0", "0", "30", "0", NA, "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "1", "102…
$ 大阪 <chr> "0", "0", "0", "0", "0", "0", "0", NA, "0", "0", "0", "0", "0", "0", "0", "0", "0", "12", "0", "0", "12", "341"…
$ 兵庫 <chr> "2", "4", "0", "0", "0", "6", "0", NA, "0", "0", "0", "0", "0", "0", "0", "0", "0", "6", "0", "0", "6", "166", …
$ 奈良 <chr> "0", "0", "0", "0", "0", "0", "0", NA, "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "886", …
$ 和歌山 <chr> "0", "0", "0", "0", "0", "0", "0", NA, "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "428", …
$ 鳥取 <chr> "3", "975", "0", "0", "0", "978", "0", NA, "0", "0", "97", "0", "2", "0", "1", "0", "100", "0", "0", "0", "0", …
$ 島根 <chr> "0", "145", "0", "0", "0", "145", "0", NA, "0", "0", "279", "0", "1", "0", "0", "0", "280", "1", "3", "0", "4",…
$ 岡山 <chr> "0", "0", "0", "0", "0", "0", "0", NA, "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "87", "…
$ 広島 <chr> "0", "0", "0", "0", "0", "0", "0", NA, "0", "0", "0", "0", "0", "0", "0", "0", "0", "8", "0", "0", "8", "79", "…
$ 山口 <chr> "0", "0", "0", "0", "0", "0", "0", NA, "0", "0", "0", "0", "1", "0", "0", "0", "1", "9", "0", "0", "9", "608", …
$ 徳島 <chr> "0", "0", "0", "0", "0", "0", "0", NA, "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "1", "120", …
$ 香川 <chr> "0", "0", "0", "0", "0", "0", "0", NA, "0", "1", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "40", "…
$ 愛媛 <chr> "0", "0", "0", "0", "0", "0", "0", NA, "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1783",…
$ 高知 <chr> "0", "0", "0", "0", "0", "0", "0", NA, "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "684", …
$ 福岡 <chr> "0", "0", "0", "0", "0", "0", "0", NA, "0", "0", "0", "0", "0", "0", "0", "0", "0", "108", "0", "0", "108", "25…
$ 佐賀 <chr> "0", "0", "0", "0", "0", "0", "0", NA, "0", "0", "0", "0", "0", "0", "0", "0", "0", "37", "0", "0", "37", "657"…
$ 長崎 <chr> "0", "0", "0", "0", "0", "0", "0", NA, "0", "0", "0", "0", "0", "0", "0", "0", "0", "133", "0", "0", "133", "17…
$ 熊本 <chr> "0", "0", "0", "0", "0", "0", "0", NA, "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "297", …
$ 大分 <chr> "0", "0", "0", "0", "0", "0", "0", NA, "2", "0", "0", "0", "0", "0", "0", "0", "2", "0", "0", "0", "0", "403", …
$ 宮崎 <chr> "0", "0", "0", "0", "0", "0", "0", NA, "1", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "203", …
$ 鹿児島 <chr> "0", "0", "0", "0", "0", "0", "0", NA, "0", "0", "1", "0", "0", "0", "0", "61", "62", "0", "0", "0", "0", "826"…
$ 沖縄 <chr> "0", "0", "0", "0", "0", "0", "0", NA, "0", "1", "0", "0", "9", "0", "4", "0", "14", "0", "0", "0", "0", "6", "…
$ 全国計 <chr> "25332", "14986", "114", "20", "36", "40488", "0", "0", "482", "3", "13959", "0", "2566", "0", "7", "88", "1710…
$ 年度 <chr> "h01", "h01", "h01", "h01", "h01", "h01", "h01", "h01", "h01", "h01", "h01", "h01", "h01", "h01", "h01", "h01",…
とりあえず結合できました。
各種やっていくのもなんなので今回は各年のハクチョウ類、ガン類、カモ類の合計の行だけ使っていきます。
final_data2<-final_data %>%
filter(種類 %in% c("ハクチョウ類合計", "ガン類合計", "カモ類合計"))
#列数を確認
ncol(final_data2)
# 2列目から48列までが各都道府県の集計データでワイド型になっているのでロング型に変換します。
final_data3 <- final_data2 %>%
pivot_longer(cols = 2:48,
names_to = "都道府県",
values_to = "個体数")
> head(final_data3)
# A tibble: 6 × 5
種類 全国計 年度 都道府県 個体数
<chr> <chr> <chr> <chr> <chr>
1 ハクチョウ類合計 40488 h01 北海道 3685
2 ハクチョウ類合計 40488 h01 青森 4813
3 ハクチョウ類合計 40488 h01 岩手 2060
4 ハクチョウ類合計 40488 h01 宮城 10905
5 ハクチョウ類合計 40488 h01 秋田 3508
6 ハクチョウ類合計 40488 h01 山形 3213
さて和暦がめんどくさいので西暦に変換します。
#r0、h0を変換しやすいように0を除きます
final_data4<- final_data3 %>%
mutate(和暦年度 = str_replace(年度, "r0", "r")) %>%
mutate(和暦年度 = str_replace(年度, "h0", "h"))
# 和暦を西暦に変換する関数を作成
convert_to_seireki <- function(wareki) {
# 和暦の元号と開始年を定義
gengou <- c("r" = 2018, "h" = 1988, "s" = 1925, "t" = 1911, "m" = 1867)
# 元号の最初の文字を取得
era <- substr(wareki, 1, 1)
# 和暦の年数を取得
year <- as.numeric(substr(wareki, 2, nchar(wareki)))
# 西暦に変換
seireki <- gengou[era] + year
return(seireki)
}
# 和暦を西暦に変換します
final_data5<- final_data4 %>%
mutate(西暦年度 = sapply(和暦年度, convert_to_seireki))
> head(final_data5)
# A tibble: 6 × 7
種類 全国計 年度 都道府県 個体数 和暦年度 西暦年度
<chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 ハクチョウ類合計 40488 h01 北海道 3685 h1 1989
2 ハクチョウ類合計 40488 h01 青森 4813 h1 1989
3 ハクチョウ類合計 40488 h01 岩手 2060 h1 1989
4 ハクチョウ類合計 40488 h01 宮城 10905 h1 1989
5 ハクチョウ類合計 40488 h01 秋田 3508 h1 1989
6 ハクチョウ類合計 40488 h01 山形 3213 h1 1989
#個体数が文字列になっているので数値に変換します。
final_data5$個体数 <-as.numeric(final_data5$個体数)
とりあえず北海道のデータを見てみます。
final_data5 %>%
filter(都道府県=="北海道") %>%
ggplot() +
geom_bar(aes(x =西暦年度,y = 個体数,fill=種類),stat = "identity") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1,size=7))+
labs(x = "年度") +
theme(legend.position = c( .9 , .85 ),
legend.background = element_rect(fill = "white",color = "black",size = 0.2))
final_data5 %>%
ggplot() +
geom_bar(aes(x =西暦年度,y = 個体数,fill=種類),stat = "identity") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1,size=7))+
labs(x = "年度") +
facet_wrap(~都道府県)
さすがに各県のグラフがかなり小さくなってしまいましたが、多いとこに関してはなんとなく傾向が見えます。あいうえお順なのが気になります。
折れ線バージョンも作成してみました。
final_data5 %>%
ggplot() +
geom_line(aes(x =西暦年度,y = 個体数,colour =種類),linewidth=1) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1,size=7))+
labs(x = "年度") +
facet_wrap(~都道府県)
コロプレスマップの作成もやってみます。
library(sf)
library(NipponMap)
#シェープファイルを読み込み
Nippon_map<-read_sf("shapes/jpn.shp",
crs="WGS84")
> Nippon_map
Simple feature collection with 47 features and 5 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: 127.6461 ymin: 26.0709 xmax: 148.8678 ymax: 45.5331
Geodetic CRS: WGS 84
# A tibble: 47 × 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…
2 2 02 Aomori 1373339 Tohoku (((140.8727 40.48187, 140.6595 40.4018, 140.3903 40.4843, 140.022…
3 3 03 Iwate 1330147 Tohoku (((140.7862 39.85982, 140.8199 39.86421, 140.8813 39.87221, 140.8…
4 4 04 Miyagi 2348165 Tohoku (((140.2802 38.01415, 140.2802 38.01417, 140.2805 38.02494, 140.2…
5 5 05 Akita 1085997 Tohoku (((140.7895 39.86026, 140.8253 39.6481, 140.6565 39.3879, 140.811…
6 6 06 Yamagata 1168924 Tohoku (((140.2802 38.01415, 140.2799 37.97209, 140.2801 37.97209, 140.2…
7 7 07 Fukushima 2029064 Tohoku (((140.2799 37.9721, 140.2799 37.97209, 140.2802 37.9721, 140.410…
8 8 08 Ibaraki 2969770 Kanto (((139.7322 36.08471, 139.7058 36.13276, 139.6663 36.20532, 139.6…
9 9 09 Tochigi 2007683 Kanto (((139.4263 36.33584, 139.3703 36.3661, 139.4858 36.575, 139.3311…
10 10 10 Gunma 2008068 Kanto (((139.3836 36.35887, 139.6541 36.213, 139.6508 36.21342, 139.666…
# ℹ 37 more rows
# ℹ Use `print(n = ...)` to see more rows
さてここでまた、データを結合させるために、都道府県のIDを作成します。
d_h01<-read_excel("C:/Users/ユーザー名/Download/ガンカモデータ/都道府県別/h01gankamo_2.xls", col_names = FALSE)
d_都道府県<-d_h01[c(1, 2), ]
d_都道府県 <- t(d_都道府県)
d_都道府県<-as.data.frame(d_都道府県)
d_都道府県 <- d_都道府県 %>%
na.omit()
d_都道府県 <- dplyr::select(d_都道府県, ID = V1, 都道府県 = V2)
> d_都道府県
ID 都道府県
...2 1 北海道
...3 2 青森
...4 3 岩手
...5 4 宮城
...6 5 秋田
...7 6 山形
...8 7 福島
...9 8 茨城
...10 9 栃木
...11 10 群馬
...12 11 埼玉
...13 12 千葉
...14 13 東京
...15 14 神奈川
...16 15 新潟
...17 16 富山
...18 17 石川
...19 18 福井
...20 19 山梨
...21 20 長野
...22 21 岐阜
...23 22 静岡
...24 23 愛知
...25 24 三重
...26 25 滋賀
...27 26 京都
...28 27 大阪
...29 28 兵庫
...30 29 奈良
...31 30 和歌山
...32 31 鳥取
...33 32 島根
...34 33 岡山
...35 34 広島
...36 35 山口
...37 36 徳島
...38 37 香川
...39 38 愛媛
...40 39 高知
...41 40 福岡
...42 41 佐賀
...43 42 長崎
...44 43 熊本
...45 44 大分
...46 45 宮崎
...47 46 鹿児島
...48 47 沖縄
...49 99 全国計
ガンカモデータに都道府県のIDデータを結合します。
d_都道府県<-d_都道府県 %>%
filter(!都道府県=="全国計")
d_gankamo<-
left_join(final_data5,d_都道府県,
by=c("都道府県"))
都道府県コードで北海道から順にグラフを並べてみます。
増減がわかりやすいようy軸も固定を外します。
d_gankamo %>%
ggplot() +
geom_line(aes(x =西暦年度,y = 個体数,colour =種類),linewidth=1) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1,size=7))+
labs(x = "年度") +
facet_wrap(~as.integer(ID), scales = "free_y")
ただこれだと番号だけなのでわかりにくいですね。
Nippon mapと結合します。
d_gankamo_GIS<-
left_join(d_gankamo,Nippon_map,
by=c("ID"="SP_ID"))
> d_gankamo_GIS
# A tibble: 7,614 × 13
種類 全国計 年度 都道府県 個体数 和暦年度 西暦年度 ID jiscode name population region
<chr> <chr> <chr> <chr> <dbl> <chr> <dbl> <chr> <chr> <chr> <dbl> <chr>
1 ハクチョウ類合計 40488 h01 北海道 3685 h1 1989 1 01 Hokkaido 5506419 Hokkaido
2 ハクチョウ類合計 40488 h01 青森 4813 h1 1989 2 02 Aomori 1373339 Tohoku
3 ハクチョウ類合計 40488 h01 岩手 2060 h1 1989 3 03 Iwate 1330147 Tohoku
4 ハクチョウ類合計 40488 h01 宮城 10905 h1 1989 4 04 Miyagi 2348165 Tohoku
5 ハクチョウ類合計 40488 h01 秋田 3508 h1 1989 5 05 Akita 1085997 Tohoku
6 ハクチョウ類合計 40488 h01 山形 3213 h1 1989 6 06 Yamagata 1168924 Tohoku
7 ハクチョウ類合計 40488 h01 福島 3978 h1 1989 7 07 Fukushima 2029064 Tohoku
8 ハクチョウ類合計 40488 h01 茨城 410 h1 1989 8 08 Ibaraki 2969770 Kanto
9 ハクチョウ類合計 40488 h01 栃木 2 h1 1989 9 09 Tochigi 2007683 Kanto
10 ハクチョウ類合計 40488 h01 群馬 40 h1 1989 10 10 Gunma 2008068 Kanto
# ℹ 7,604 more rows
# ℹ 1 more variable: geometry <MULTIPOLYGON [°]>
# ℹ Use `print(n = ...)` to see more rows
日本全体にすると各県が小さくなりすぎるので、東北地方に絞ってみます。
ハクチョウ類に絞ってコロプレスマップの作成します。
d_gankamo_GIS %>%
filter(region=="Tohoku") %>%
filter(種類=="ハクチョウ類合計") ->
Tohoku_map_haku
Tohoku_map_haku %>%
ggplot()+
geom_sf(data=Tohoku_map_haku, aes(fill=個体数,geometry = geometry))+
scale_fill_distiller(palette="Spectral", direction=-1)+
labs(fill="個体数",
caption="出典:NipponMap、ガンカモ類の生息調査https://www.biodic.go.jp/gankamo/gankamo_top.html")+
ggtitle("ハクチョウ類個体数")+
theme_bw()+
facet_wrap(~西暦年度, nrow = 4)+
scale_x_continuous(breaks=seq(138, 142,2))