読者です 読者をやめる 読者になる 読者になる

まだ厨二病

RとPyhtonを使ったデータ分析・統計解析らへんの話題をしていくだけ

🌏GBIFに登録された生物分布情報のマッピング: 生物多様性ウェブマッピングシステムをRで実装する

少し前(2015年12月11日)に国立環境研究所が運営する生物多様性ウェブマッピングシステム(以下、BioWM)が公開されました。

www.nies.go.jp

このサービスの紹介文をみると

生物多様性ウェブマッピングシステム(BioWM)は、GBIFでのデータ公開とその活用、生物多様性情報のオープン化の促進を目的として、生物多様性データの可視化ツールを提供しています。

とあります。こういう試みはすごい良いし、何よりもオープンソース・マップサービスやオープンソース・ソフトウェアを積極的に使用し作成したマップ成果物についてはCC BY 4.0ライセンスのもとで利用可能です

これはこれで素晴らしいのですが、性格が悪い・R脳なので、これと同じことがRでできてしまうよなという感想を抱いてしまいました。マッピング自体もリーフレットで行っているので {leaflet}で再現できそうですし。

とはいえ、具体的にどうすれば良いかということが浮かんでこなかったので、自己を尊重する、ということも兼ねてBioWMと同様の機能をRで実装してみたいと思います。

BioWMの主要な機能

  1. GBIFに登録された生物分布情報(GBIFオカレンスデータ)を抽出してマッピング
  2. ユーザーがもつ生物分布情報をマッピング(エクセルファイルからの読み込み)
  3. 国立環境研究所 生物・生態系環境研究センターの研究データのマッピング福島県東部の野生動物について)

今回は1をRでやります。2についてはそのうち...。

利用するRパッケージ

これらのパッケージを利用します。

  • 📦 {rgbif}パッケージ... GBIFが提供するAPIをRで利用しやすいようにしたパッケージ
  • 📦 {spocc}パッケージ... GBIFを始め、その他の生物分布情報データベースにアクセスし、データを取得するためのパッケージ
  • 📦 {spoccutils}パッケージ... {spocc}のユーティリティ用のパッケージで、生物分布情報をggplot2やLeaflet上へマッピングを実行する用

これらのパッケージはBioWMと同じくGBIFが提供するAPIを利用しているので、Rでも同様のことができる、という話です。開発元は信頼と実績のropensciです。なお今回は一部の関数を利用しているだけなので、その他の便利な関数について知りたい方はパッケージのヘルプをご覧ください。

生物分布情報のマッピング

BioWMで行えるマッピングは以下の4種類です。注意としてこれらのマッピングページで表示されるデータの件数は緯度経度情報が無いものもヒットする、ということがあります。

  1. 学名検索
  2. 国別
  3. 分類群別
  4. 詳細検索

順にやっていきましょう。まずは今回利用するRパッケージを読み込ませます。

# Rパッケージの読み込み
library(rgbif)
library(spocc)
library(spoccutils)

学名から

複数の種を対象にすることもできるようですが、バーダー1月号の表紙を飾っているホオジロ Emberiza cioides(スズメ目ホオジロ科)を対象にしてみましょう。

2015年12月25日現在、BioWMでのホオジロマッピング件数は4,918件となっています(以下、BioWMでのマッピングによる件数は同日のもの)。

このうち、マッピングに使われる位置情報を持ったデータ件数は、GBIFのページを見るに1422件となります。ではRでこのデータをとってきましょう。{spocc}パッケージのocc()関数を利用します。

(ebci_dat <- occ(query = "Emberiza cioides", from = "gbif", limit = 1500, has_coords = TRUE))
## Searched: gbif
## Occurrences - Found: 1,425, Returned: 1,425
## Search type: Scientific
##   gbif: Emberiza cioides (1425)

occ()関数の引数queryに対象の種名を渡し、データのソースをfrom引数で指定することで生物分布情報を取得します。今回はlimit引数でデータの取得件数を初期値の500から変更し、1500件までに設定しました。また、データは位置情報を含んでいるものだけを対象するよう、has_coordsによって指定しました。

Leafletによるマッピングをするにはmap_leaflet()を使います。

ebci_dat %>% map_leaflet(zoom = 5, centerview = c(35.39, 139.44))

f:id:u_ribo:20151225125029p:plain

ブログに埋め込みできないので図のみを表示しています。実際のLeafletによる実例はRPubsのページにあります。日本を中心にして少しズームしました。

国別

BioWMではアジア地域の国々のデータに限定しています。日本でのデータ件数は3,912,475件となっています。

種のマッピングと同様、occ()を使いましたが、今回はqueryには何も渡さずに検索時のオプションであるgbifopts引数においてcountryで取得する国を指定することで、日本国内でのデータのみを抽出しました。同様に大陸 continent を指定するオプションもあります。

occ(query = "", from = "gbif", gbifopts = list(country = "JP"))
## Searched: gbif
## Occurrences - Found: 3,912,475, Returned: 500
## Search type: Scientific
##   gbif: (500)

BioWMと同じ件数のデータが該当しました。正常にデータが抽出できているようです。ただ、GBIFのoccurrence searchで取得できる件数の上限は200,000件まで(occ()の初期値は500)なので、実際にデータをマッピングするためにはoccurrence downloadを利用する必要があります。

# Download keyを取得
occ_download("country = JP")
# しばし待ってから実行 
#   key引数に渡す<Download key>は先ほど取得したもの
occ_download_get(key = "<Download key>")

http://www.gbif.org/user/download のページにアクセスして、ダウンロード可能な状況かを確認してから実行すると良いでしょう(ここまでくると、Rでやるのではなくて手作業でダウンロードしてきた方が早かったりする。データ数が多い場合は特に)。

分類群別

分類群別にマッピングするページでは、「界」「門」「綱」の分類階級で生物分布情報をマッピングすることができます。例えば顕花植物門のデータ件数は154,752,923件となっています。先ほどと同様、occ()を使います。

(taxon_key <- name_backbone(name ="", phylum = "Magnoliophyta")$phylumKey)
## [1] 49
occ(query = "", from = "gbif", gbifopts = list(taxonKey = taxon_key))
## Searched: gbif
## Occurrences - Found: 154,752,923, Returned: 500
## Search type: Scientific
##   gbif: (500)

検索時のオプションであるgbifoptsでは、分類群によって異なるtaxonKeyを指定しました。taxonKeyはname_backbone()によって調べることができます。GBIFの検索ツールでは顕花植物門 MagnoliophytaのtaxonKeyは49となっているので、それを指定しました。

きちんと検索する対象の件数があっていますね。

詳細検索

APIのパラメータを指定することで、より細かな条件で生物分布情報の抽出ができます。 {rgbif}でもAPIパラメータを網羅しているので、詳細検索と同じ機能を実現できます。

そのためには国別表示や分類群別表示で行ったようにocc()関数内のgbifopts引数において、リスト形式でパラメータ名とパラメータの値を渡します。指定可能なパラメータの例として、緯度、経度、採集日・観察日といったものがあります(occ_options()を参考に)。

所感

  • R上でやりましたが、BioWMのサービスのように何十万件、何百万件のデータを表示するのは厳しい感じです。せいぜい種のマッピングくらい。
  • ダウンロードしたデータのマッピングは次回にお預けしました(BioWMの機能と同じ感じなので)。
  • BioWMにより近づけるためにはShinyアプリにするというのは一つのアイデアかもしれません。そういえば、そんなアプリを以前見かけた記憶がありますが、ブックマークなどから見つけることができませんでした。
    • うまくやればできると思います。誰かが作ってくれるかな。

最後に類似のShinyアプリを紹介します。生物分布情報のマッピングに興味がある方はご参考ください。

Finnish Breeding Bird Atlas