2019年2月5日(火)

ひさしぶり

昨年から日記もかかずに遊び回ってこの体たらく。

きょうは漂着ゴミに関する論文を3本読んだ。自然科学系論文は短いし論旨明確でかつ共通言語たる統計解析結果が述べられていて読みやすい。

経営学はなんなんだ。数値に基づかないおとぎ話が多すぎる。素直に統計学や数学を勉強すればいいのに。経済学を少しは見習ったほうがいい。毀誉褒貶いろいろあるけれど、数学という共通言語があるおかげで議論が成立する。自然言語による議論も可能かもしれないが、残念ながら解釈が一意に定まらないうえに検証もできない。その点、統計学や数学に基づく議論は検証が可能。とくに統計学は確率的に発生する事象が多そうな経営現象を取り扱うことに向いている気がする。

研究において統計解析に依存することを「統計に逃げる」と評する諸氏もおられる。前世紀にはよくいたがまだいる。わたしはよろこんで統計に逃げる。言いたかったら言ってくれ。

終了後、Mo Oにおける活動説明用スライドをつくる。図版ばかり15枚。もうすこしレイアウトを考え直さないといけない。特に地図。これはこれで無駄にはならない。論文投稿時に活用できる。

Rmarkdownを使って地図やら写真やらをはりつけるとき

いくつか学ぶことがあったのでメモ。

  • ページを分割するときはgrid::viewport()で関数をつくって:下記コード例参照。どこかのサイトでみたコードそのままだけど、どこだかブックマークしそこねてしまった。この関数はなかなか楽しめそう。
grid.newpage() # make a grid page
pushViewport(viewport(layout=grid.layout(1, 2))) # separate the page (2*2)
vplayout <- function(x, y)
  viewport(layout.pos.row = x, layout.pos.col = y)
k1 <- survey.map + xlab("Longitude") + ylab("Latitude")
k2 <- target.map + xlab("Longitude") + ylab("Latitude")
print(k1, vp = vplayout(1,1))
print(k2, vp = vplayout(1,2))
  • 写真はknitr::include_graphics()で挿入:htmlライクに画像を読み込むではなく、Knitしたほうがいい。調整が楽でかつ挙動がRの範囲内でとてもよい。
  • 別ファイルに書いたRコードは、あまり分割する必要がない:Rで書いて結果を眺めるときには分割は必要ない。分割はおもに文書をつくるときのためにする。となればある程度まとまってセクションを読み込むので、分割する必要を認めない。なにをやっているかわかりやすくなることだけが長所だろうか。

とど

漂着ゴミ関連を2月中に仕上げてしまいたい。すなわち、

  • お客様向け説明資料作成:スライド。いろいろなところで使う。シンポジウムもこれでいこうか。
  • 調査団向け作業手順:新しく作り直すものは、ゴミひろい手順書とコアサンプリング手順書。ともにいまあるものを修正すればいい。
  • 論文:漂着ゴミ重量・種別などなど。整理したデータと解析結果を添えて。

ここまでやって2月はくれてゆく。試験採点やら結果入力やらもあるし、なんともはや。人的資源関連は3月まで延伸。タイ打ち合わせの旅はソンクラーン後になりそう。来年度のだしものは3月からじっくり考えようか。アイディアはあるけれど、いまひとつ実行可能性というかスケジュールが煮詰まらぬ。

2019年2月6日(水)

一日中

きょうも漂着ゴミ関連資料作成。

昨日から読みはじめた『ファクトフルネス』は評判通り素晴らしい。だれもが容易に入手可能なデータと逸話を根拠にグイグイと迫ってくる。おもわず読み進める

Rを使って氏が作ったグラフなども再現したい気分。

OpenMapにシェープファイルを重ねる

衛星写真に行政界を重ねた地図を書きたかった。が、衛星写真をGoogleMapsから取得できなくなった。そのうえ、シェープファイルが古くてわれらがMo Oがある場所が分割されていなかった。なんとか問題を乗り越えたからメモ。

シェープファイルと都市名を読み込む

ベトナム全図とソクチャン省地図用rdsファイルを読み込む。最新データはGADMにある。最近市町村分割で増えた市郡もしっかりデータになっている。シェープファイルだけでなく、rdsやkmzまである。なんという充実ぶり。ただしDIVA-GISと異なり、水路などはない。水路データもほしいが、行政界を優先しよう。

読み込むならばシェープファイルでもいいが、R(sf)と書かれたところからダウンロードするrdsが容量が小さくてよい。

maps()パッケージには、県庁所在地名データが格納されている。これを使わない手はない。すべて使う必要はないから、ハノイとホーチミンとソクチャンだけを取り出す。取り出すにはdplyr::filter()を使う。tidyverse()は動作が速くてすばらしい。そうそう、パッケージ名は書いたほうがよい。Rが名前空間を参照しやすくなり、名称が重複する関数でも間違いなく動作する。

ベトナム全図を作図する

ベトナム全図とソクチャン省地図を作図する。後ほど重ね書きするけれど、重ねるパーツをまずつくる。パーツを正確につくらないと、重ねたときに面倒になる。

ggplot2::ggplot()を使って地図を書くなら、geom_sf()が便利である。

都市位置にマーカーを置くにはgeom_point()が、都市名配置にはgeom_text_repel()が便利すぎる。

## ベトナム全図  
map.vnm.adm <- vnm.adm %>% 
  ggplot2::ggplot() +
  geom_sf(fill = grey(0.5), colour = "white", alpha = 0.5) + 
  coord_sf(datum = NA) + 
  geom_point(
    data = vnm.city,
    aes(x = long, y = lat),
    fill = "white",
    colour = "grey28",
    shape = 21,
    size = 2.5
    ) + 
  geom_text_repel(
    data = vnm.city, 
    aes(x = long, y = lat, label = name), 
    colour = "white",
    segment.size = .5, 
    size = 3
    ) + 
  theme_void()

ソクチャン省行政界地図と衛星画像とを重ねる

ソクチャン省行政界地図とOpenStreetMapによる衛星画像とを重ねるにはいろいろな方法がある。

今回は楽ができるggspatial()パッケージを使う。これを使うとrdsファイルを与えるとOpenStreetMapを適宜取得してくれる。のみならずggplot()の各変数を使える。geom_sf()にて透明度や色、行政界線太さを制御できる。geom_point()でマーカーを置くこともできる。くわしい使い方についてはいいページがあった。そこからリンクされているOpenStreetMapに関する解説ページもよかった。

bingが提供する衛星画像を利用するポイントは、type指定にある。OpenStreetMap::openmap()を使って衛星画像を作図するようにtype=“bing”とするとエラーが出る。衛星画像をタイルにして使うために参照するurlを指定する必要がある。urlはOpenStreetMap wikiにおいてあるOpenStreetMap’s standard tile layerに書いてあるurlを使えばいい。

ズームインは値を大きくするとはっきりした衛星画像を得られる。が、処理にかなり時間がかかるようになる。なんともはや。

ソクチャン市位置とMo O位置はは手打ち。手打ちで十分。

ggsn::scalebar()もすばらしい。以前はけっこう苦労した(そしてあきらめた)縮尺表示を簡単につくることができる。ほかに同じ名前の関数があるわけではなさそうだが、名前空間を宣言しないと動作しないから注意。データムにも注意。そうそう、githubにアップロードされる開発版パッケージ(devtools::install_github(‘oswaldosantos/ggsn’))を使うこと。cranよりも融通がきく。

map.sat.vnm.st <- 
  ggplot(vnm.st) + 
  annotation_map_tile(zoomin = 0, # 衛星画像疎密を調整する。デフォルトは-2らしい
                      type = "http://ecn.t3.tiles.virtualearth.net/tiles/a${q}.jpeg?g=1"
                      ) + 
  geom_sf(alpha = 0.3, colour = "white", size = 0.5) +
  labs(caption = "\U00a9 OpenStreetMap contributors") +
  theme_minimal() + 
  geom_point(
    aes(x = 105.974167, y = 9.606667), # ソクチャン市位置
    colour = "grey28",
    fill = "white",
    stroke = 2,
    shape = 21,
    size = 7
  ) + 
  geom_point(
    aes(x = 106.1823113, y = 9.4390963), # Mo O位置
    fill = "#35a16b",
    colour = grey(.3),
    shape = 21,
    stroke = 2,
    size = 7
  ) + 
  annotate("text", 
           label = "Soc Trang", 
           x = 106.075, 
           y = 9.6, 
           size = 5, 
           colour = "white"
           ) +
  annotate("text", 
           label = "Mo O mudflat", 
           x = 106.3, 
           y = 9.4390963, 
           size = 5, 
           colour = "white"
           ) +
  annotate("text", 
           label = "The Mekong Delta", 
           x = 106, 
           y = 9.85, 
           size = 5, 
           colour = "grey28", 
           angle = 315
           ) +
  ggsn::scalebar(x.min = 106.0,
                 x.max = 106.4,
                 y.min = 9.1,
                 y.max = 9.2,
                 dist_unit = "km",
                 dist = 20, 
                 st.size = 4,
                 st.dist = 0.25,
                 height = 0.25,
                 model = "WGS84", 
                 transform = TRUE,
                 location = "bottomright",
                 box.fill = c("grey30", "white"), 
                 box.color = "white",
                 st.color = "white"
  ) +
  north(data = vnm.st, location = "topright") # 方位マーク

描画する

いよいよ表示。衛星画像上にソクチャン省行政界を載せて、ベトナム全図と縮尺表示と方位マークを加えた地図ができあがり。x軸とy軸は緯度経度。OpenStreetMapを使ってるよ、という表示も足して。これでだいたい満足。

viewpoint()を使うと複数地図を自由に簡単に配置できる。すばらしい。

どういうわけかスライドにするとベトナム全図が作図領域外にとびだす。htmlを書くときは何事もないというに。なんででしょ。

クリックすると大きくなるよ♪

print(map.sat.vnm.st + xlab("Longitude") + ylab("Latitude"))
print(map.vnm.adm, vp = viewport(width=0.3, height=0.25, x=0.2, y=0.25))

とど

漂着ゴミ関連を2月中に仕上げてしまいたい。すなわち、

  • 調査団向け作業手順:新しく作り直すものは、ゴミひろい手順書とコアサンプリング手順書。ともにいまあるものを修正すればいい。
  • 論文:漂着ゴミ重量・種別などなど。整理したデータと解析結果を添えて。

2019年2月11日(月)

きょうは建国記念日

ということで休日。

確定申告を済ませた。納税額は900円。900円を確定させるためにかかった手間は90,000円くらいだろうか。助かることに、e-taxが簡便になり入力も計算も楽になった。今後はWeb版で十分。アプリケーション版は消去しよう。ただし、マイナンバーカードがなければ利便性は半減する。マイナンバーカードとマイナンバーカードに記載された個人情報をもとにして個人認証するから、カードとFeliCaカードリーダーは必須。個人認証に関する手続きはオンラインにて1時間程度でできるがやはり準備は必須。必要なソフトウェアもいくつかある。準備は必須。

Windowsを入れ替える

このごろノートPCに入れてあるWinが調子悪かった。明らかに無駄なファイルやアプリケーションが多い。動作も緩慢になった気がする。痛いことに、Rにてライブラリをインストールできない事態が立て続けて発生した。以前からリモートセンシング関係のライブラリはインストールしにくい(マシンを選ぶ)ことがあったが、今回はちとおかしい。そろそろ潮時と判断、Winごと入れ替えることにした。

作業は数年ぶりであったが、予想よりは楽だった。Windowsインストールについては、AppleがBootcampについてよい解説ページを作ってくれていた。検索すればすぐに見つかるので、リンクはしない。必要なアプリケーション再インストールもさほど苦労なく終わった。懸案だったRパッケージも難なくインストールできた。FOR-RESTによる記載通り。あとは研究室で\(\LaTeX\)をインストールしながら、Google drive中身をダウンロードさせるだけ。これらの作業は時間もかかるしネットワークに対する負荷も大きいうえに時間もかかるから、さすがに研究室で復旧させたほうがいい。

2019年2月24日(日)

Rパッケージをインストールしなおす

同じような話を以前に書いたけれど、少し進展したのでつづき。

紆余曲折あって、しょっぱなからtidyverse()を使うことに。理由は以下の通り。

  • 実行速度が早そう:forループはbase()だけで、特別なパッケージをインストールしなくてもよい。が、やはりforループは避けたい。
  • tidyverse()をRがきれいな状態でインストールしたい:このごろはtidiverse()に含まれるパッケージを頻用する。ないと大変不自由である。しかしこのパッケージ群、既存パッケージを衝突することがある。意外とストレスフルだから、衝突しそうなパッケージをインストールするまえにインストールしてしまえ。
  • tidyverse()を使いたくてしかたがない:好みの問題。コードが短く高い可読性を有して書けるような気がする。今回のようにあまり長くないコードでつかう必然性はあるやらないやら。

というわけではじまりはじまり。

はじめにtidyverse()をインストールする。ミラーサイトを指定すれば、インストール時の手間がひとつ省ける。Rstudioから実行しても文句を言われなくなるおまけつき。インストールしたらライブラリをロードするのを忘れずに。

# 1. 必要なパッケージをインストールしてロード
## ミラーサイト指定
## なくてもいい。インストール時に適当に選んでも可。
options(repos = "http://cran.us.r-project.org")
## パッケージインストール。
## あとで重複するパッケージもあるが気にしない。
## パッケージ数も依存パッケージも多いtidyverse関連をRがきれいなうちに
## インストールするほうがいいということにしよう。
install.packages("tidyverse")
## パッケージをロード
library(tidyverse)

つぎに、古いRからパッケージ一覧を取得する。取得した一覧を、readr::write_csv()を用いて出力する。base::write.csv()に比べて若干速い気がする。パッケージが多ければ多いほど速くなるでしょう。

# 2. 古いほうからパッケージ一覧を取得、csvファイルに書き出す
## 一覧取得
packages <- .packages(all.available = TRUE)
## 書き出す
readr::write_csv(data.frame(x = packages), "packages.csv")

あたらしいRとRtoolsをインストールしたら、必要なパッケージをインストールする。まずはtidyverse()をインストールしてロードする。パッケージリストもロードする。

ポイントはmap()を使うこと。パッケージリストに含まれるパッケージをほぼ全自動でインストールしてくれる。あとは待つだけ。インストールできなかったパッケージは、使うときにでも個別にインストールする。

# 3. 新しいほうへパッケージ一覧を読み取ってインストール
## パッケージインストール。
## あとで重複するパッケージもあるが気にしない。
## パッケージ数も依存パッケージも多いtidyverse関連をRがきれいなうちに
## インストールするほうがいいということにしよう。
install.packages("tidyverse")
## パッケージをロード
library(tidyverse)
## 一覧読取
packages <- readr::read_csv("packages.csv")
## インストール
## sf()などいくつかインストールできないかもしれないが気にしない。
## あとでインストールしなおせばいい。
## なかにはCRANでなくgithubあたりを使うパッケージもある。
## そういうのは個別にインストールする。
## 終了後はRを再起動。そうしないとアレがないコレがない攻撃をくらうことがある。
purrr::map(packages, install.packages)

ちょっと面倒だけれども、できあがり。