R Markdownで楽々レポートづくり

第2回レポートづくりを加速せよ ~R Markdown環境の導入&チュートリアル~

前回はレポートづくりのオートメーション化がもたらすメリットについてやや概念的な説明をしました。今回はR Markdown環境を導入し、レポート作成の手順を説明します。実際に簡単なレポートづくりを体験して、R Markdownの威力を味わってください。

また、実務を想定した(とは言っても非常に単純化したものですが)2種類のチュートリアルを用意しましたので、これらのチュートリアルを通してオートメーション化されたレポートづくりを自分の仕事の中でどう活かすか想像してみてください。

なお、本連載記事に関する疑問・質問・コメントなどは著者Twitterアカウント@kohskeでも受け付けていますのでお気軽にどうぞ。

R Markdown環境の導入

R Markdownを利用するには、

  1. R
  2. {rmarkdown}パッケージ
  3. pandoc

の3つのツールを導入する必要があります。

  • PDF形式のレポートの作成に必要なLaTeX環境の導入については、PDFレポート作成の回に解説します。
  • RStudioには{rmarkdown}パッケージとpandocが入っているので、個別のインストールが面倒な場合はRStudioを使ってください。意識の高い我々は基本的に生Rで作業を進めます(バッチ処理によるレポート作成などを想定しています⁠⁠。RStudioの活用については別の回で説明します。

Rのインストール

CRANからRをインストールします。解説がWeb上に大量にあるので参考にしてください(参考: RjpWiki⁠。

{rmarkdown}パッケージのインストール

Rを起動して、コンソール上で

install.packages("rmarkdown", dependencies = TRUE)

とします。CRANのミラーサイト選択画面が表示されたら、Japanのいずれかを選ぶとよいでしょう。{rmarkdown}パッケージを使うために必要な依存パッケージも自動的にインストールされます。

pandocのインストール

pandocは様々な形式のドキュメント変換を行うツールです。pandoc公式ダウンロードサイトからインストーラパッケージをダウンロードしてインストールします。ダウンロードリンクが少しわかりにくいですが、ページを下にスクロールするとpandoc-1.13.2-windows.msi(Windows⁠⁠、pandoc-1.13.2-osx.pkg(Mac OS X)などのリンクが見つかります。OS Xの人はhomebrewなどを使ってインストールしても構いません。

インストールの確認

すべてインストールしたら、Rを起動して、コンソール上で

library(rmarkdown)
pandoc_available()

としてみてTRUEと出力されればOKです。

ダメな場合はおそらくpandocのパスの設定の問題ですが、様々な原因が考えられるので本記事コメント欄やTwitterで質問してもらえれば可能な限り回答します。

さて、準備は整いました。それではオートメーション化されたレポートづくりの世界へと旅立ちましょう。

R Markdownによるレポートの書式と作成手順

R Markdownによるレポート作成は、

  1. ドキュメントとRのコードをR Markdownファイル中に記述する。
  2. R上でrmarkdown::render()関数によりR MarkdownファイルをHTML形式(またはDOCXやPDF形式)に変換する。

という手順で進めます。

R Markdownファイルは、.Rmdという拡張子を持つテキストファイルです。この中に、ドキュメントとRのコードを記述していきます。最初は通常のレポートを書いているつもりでドキュメントを書き進めて、Rが出力する図・表・数値などを挿入したい場所にRのコードを書くのが良いでしょう。ドキュメントはMarkdownという記法で記述します。Markdown記法については次回説明します。

R Markdownファイルは、具体的には次のような内容のテキストファイルです。

# タイトルとか

`r Sys.Date()` @kohske

- レポートの説明とか
- 概要とか
- 云々

```{r}
# ここには解析コード
foo = rnorm(1000)
hist(foo)
```

さらに説明とか

- 今後の目標とか
- 人生の目標とか

```{r}
# ここにも解析コード
df = subset(mtcars, select = mpg:qsec)
knitr::kable(head(df))
```

このR Markdownファイルのファイル名をsample.Rmdとしましょう。これをHTMLレポートに変換するには、Rを起動してコンソール上で

library(rmarkdonw) # パッケージの読み込み
setwd("dir-of-sample") # 作業フォルダを変更します
render("sample.Rmd") # 変換!!
browseURL("sample.html") # ブラウザで開きます

とします。Rを起動することすら面倒な(バッチ処理をしたい)場合には、コンソールやコマンドプロンプトで

Rscript -e "rmarkdown::render('sample.Rmd');browseURL('sample.html')"

とすると良いでしょう。HTMLファイルをブラウザで開く必要がなければ、最後のbrowseURL(...)は不要です。

参考までに、上のsample.Rmdを変換して出力されるHTMLファイルsample.htmlは次のようになります。

  • 1つ目のコードの場所にヒストグラムが表示されている。
  • 2つ目のコードの場所にテーブルが表示されている。
  • 最初に日付が挿入されている。
  • ドキュメント部分がリストや見出しなどに整形されている。

といったことがわかります。

R Markdownファイルの書き方について、今回覚えてもらいたい決まり事はたった1つです。図・表・数値などを挿入したい場所には、

```{r}
# 解析コード
foo = bar
lm(hoge)
```

という形式の、3連続バッククォート```日本語キーボードではShift+@)で囲まれたブロックに、図・表・数値などを出力するコードを記述します。このブロックのことをコードチャンク最初の```の行をチャンクヘッダと呼びます。チャンクヘッダで```に続けて{r}とすることで、このブロックがRのコードとして処理されます。

ここまでの記事で、もう今日からでもレポートづくりのオートメーション化は可能です。拍子抜けするほど簡単だったかもしれませんが、シンプルなレポートづくりのオートメーション化は本当に簡単で、覚えるべきこともほとんどありません。

次に、やや実務に近い形式のレポート作成例を見てみましょう。と言っても、解析内容などが複雑になっているだけで、基本的なレポートの作成方法が複雑になるわけではありません。

チュートリアル1 ~irisの解析レポート~

サーバログや調査・実験データなどを解析して、概要やグラフなどをまとめてレポートを作成する必要がある読者は多いと思います。著者自身、本職は実験系研究者なので、実験データのレポートを(大半は自分自身で後から参照するために)日々まとめていますが、R Markdownでレポートを作成していたおかげで救われた経験が多くあります。

ここでは実験データ解析レポートの例として、⁠またirisか……と思う方もいるでしょうが)おそらく世界で最も解析されているirisデータセットの解析レポートを作成します。今回はチュートリアル用としてRに付属のデータセットを使っていますが、実務ではこのデータは自分で取得したログなり、調査・実験データなりを使うことになります。

また今回のレポートではデータ整形・可視化・分類に{reshape2}{ggplot2}{e1071}を用いているので、必要に応じてインストールしてください。R Markdownの中で未インストールの場合にインストールすることも可能ですが、今回は前もってインストールします。

install.packages(c("reshape2", "ggplot2", "e1071"))

それでは、次のようなiris.RmdというR Markdownファイルを作成しましょう。

---
title: "irisの研究"
author: '@kohske'
date: "2015年5月12日"
output: html_document
---

```{r include=FALSE}
# パッケージの読み込みなどの前処理。レポートには表示しません。
library(knitr)
library(ggplot2)
library(reshape2)
opts_chunk$set(echo=FALSE, cache=TRUE, message=FALSE)
options(width = 1000)
```

# 概要

アヤメのガクと花弁のサイズにより種の分類を行った結果を報告します。

# `iris`データについて

- データ取得日時: 1935
- データ取得場所: Gaspé Peninsula、カナダ
- データ取得者: エドガーアンダーソン博士

## データ形式

```{r}
kable(head(iris))
```

## 記述統計量など

平均、最小、最大などです。

```{r}
summary(iris)
```

# 種ごとの花びらサイズプロット

3種類のアヤメごとに大きさを箱ひげ図で可視化しました。

```{r}
d = melt(iris)
ggplot(d, aes(Species, value)) + geom_boxplot() + facet_wrap(~variable) 
```

# SVMによる分類

サポートベクターマシンによる分類結果を可視化しました。

```{r}
library(e1071) # ライブラリの読み込み
m = svm(Species ~ ., data = iris)
pair = combn(1:4, 2)
for (i in 1:ncol(pair)) {
  i1 = pair[1, i]; i2 = pair[2, i]
  o = setdiff(1:4, c(i1, i2))
  fml = as.formula(paste0(names(iris)[i1], "~", names(iris)[i2]))
  slice = list(mean(iris[[o[1]]]), mean(iris[[o[2]]]))
  names(slice) = names(iris)[o]
  plot(m, iris, fml, slice =slice)
}
```

# 結論

アヤメのガクと花弁のサイズによる種の分類を行いました。
いいと思います。

R上で以下のコマンドによりR MarkdownをHTMLに変換します。

library(rmarkdonw) # パッケージの読み込み
setwd("dir-of-sample") # 作業フォルダを変更します
render("iris.Rmd") # 変換!!
browseURL("iris.html") # ブラウザで開きます

出力されるHTMLレポートです。

このように、R Markdownの中にドキュメントとコードの両方を書くことで、レポートの図や表がどのような解析処理によって出力されたのか、その対応が一目瞭然です。解析手順について質問されても、R Markdownを確認すればすぐに正しく答えることができますし、解析内容の変更や追加を指示された時も、R Markdownファイルを編集すれば完璧です。上司や先生から「この解析、どうやったんや?」と突然聞かれても、まったく困惑する必要はありません。査読者から「この解析もやってみたらどうや?」と指摘されても、一からやり直す必要はなく、簡単に対応できます。

また、R Markdownファイルさえ保存してあれば、全く同一のレポートを誰でも作成することができます。これは再現可能性という観点から、非常に良い状況です。

前回の記事の「とても残念なレポート作成パターン」で同じようなレポートを作成したことを考えてみてください。確かにその時、レポートは完成します。そして完成したレポートだけが1週間後、1ヶ月後、1年後、手元にあったとします。さて、レポートの中の解析内容を少し変更しないといけない、そのためにはまず同じ解析処理で同じレポートを作ってみないといけない。データはどこだ、この処理は何なんだ……。

あなたはそのレポートを再現できる自信がありますか?

チュートリアル2 ~為替チャートの予測レポート~

日々変動するようなデータを毎晩毎晩レポートにまとめるような場合、レポートづくりのオートメーション化は絶大な威力を発揮します。

著者はよく海外に行くので、ここでは為替レートのレポートを作成してみましょう。海外に行く場合は円高がオトクなのですが、最近は円安傾向なので海外出張がキツイです。こういう場合は、少しでも良いレートで外貨に両替しておきたいと考えるでしょう(私自身は面倒なのでいつも出国時に空港で両替ですが⁠⁠。そこで、為替レートの時系列データから将来の変動を予測して、両替すべきタイミングを報告してくれるようなレポートを作成してみましょう。

このレポートでは{quantmod}{forecast}を使っているので、必要に応じてインストールしておきます。

install.packages(c("quantmod", "forecast"))

なお、今回の回帰モデル及び予測は超いい加減なので、絶対に実務で使わないでください。あくまでレポートづくりの参考用です。

次のようなfx.RmdというR Markdownファイルを作成しましょう。

---
title: "いつ両替すべきか"
author: '@kohske'
date: "2015年5月12日"
output: html_document
---

```{r include=FALSE}
# 下処理用チャンクなので、レポートには表示しない

library(quantmod)
library(forecast)

# 通貨ペア
target = c("USD/JPY", "EUR/JPY", "GBP/JPY", "THB/JPY")

# 過去120日分のレート取得
getFX(target, from = Sys.Date() - 120)
#save(EURJPY, USDJPY, GBPJPY, THBJPY, file = paste0("fx-", Sys.Date(), ".Rda"))

# ===== ここまでコードチャンク =====
```

# USD/EUR/GBP/THB対円の為替レート

- 左の図は過去120日の為替変動を示しています。
- 右の図は過去30日の為替変動と今後30日の為替変動予測を示しています。
- 右の図のグレイ網掛け部分は予測の信頼区間を示します。

```{r fig.height = 14, echo=FALSE}
# 左に現在まで、右にforecast()による予測を含めてプロットします
par(mfrow=c(4, 2), xpd = TRUE)
minp = list()
maxp = list()
for (tar in target) {
  # 現在までのプロット
  print(do.call(chart_Series, list(as.name(sub("/", "", tar)),
                                   pars = list(cex = 0.5, mar = c(4,2,2,2), xpd = TRUE))))
  # ARIMAモデルで回帰
  m = do.call(auto.arima, list(as.name(sub("/", "", tar))))

  # forecastで予測とプロット
  p = forecast(m, 30)
  plot(p, 30)

  # 最も円高・円安になりそうな日
  minp[[tar]] = which.min(p$mean)
  maxp[[tar]] = which.max(p$mean)
  
}
# ===== ここまでかコードチャンク =====
```

# いつ両替すべきか

```{r, results='asis', echo=FALSE}
for (tar in target) {
  cat("- ", tar, "は", format(Sys.Date()+minp[[tar]]), "に両替するのがオトクで、",
      format(Sys.Date()+maxp[[tar]]), "はダメです。\n")
  }
```

R上で以下のコマンドによりR MarkdownをHTMLに変換します。

library(rmarkdonw) # パッケージの読み込み
setwd("dir-of-sample") # 作業フォルダを変更します
render("fx.Rmd") # 変換!!
browseURL("fx.html") # ブラウザで開きます

cronに登録するなど、バッチ処理したい場合は次のようなコマンドを実行します。

Rscript -e "rmarkdown::render('fx.Rmd')"

出力されるHTMLレポートです。

このようなオートメーション化されたレポート作成では、一度R Markdownファイルを作成してしまえさえすれば、あとは日々render()でHTMLに変換するだけです。為替データもR Markdownの中で取得しているので、明日render()すれば、明日の為替に基づいたレポートを作成できます。バッチ処理をcronやタスクスケジューラに登録しておけば、日々のrender()の実行も不要です。上司には毎晩毎晩、報告レポートを作成している風を装いながら、cronを仕込んで飲みに行くことすら可能です。

前回の記事の「少しはましなレポート作成パターン」で同じようなレポートを毎日作成することを想像してみてください。⁠ドキュメントを作成して、スクリプトを実行して図をドキュメントにコピペ、オトクな日の数値をコピペ」という不毛で退屈な作業を来る日も来る日も繰り返す羽目になります。今回は4種類の通貨しか扱っていませんが、これが100種類の株式銘柄だったら、数100サイトのアクセスログだったら……。

それでもあなたは、明日もコピペを選びますか?

まとめ

今回見てきたように、R Markdownによるレポートづくりは本当に簡単に導入できます。デフォルトの設定を使ったシンプルなものなら今回の記事で充分実用レベルのレポートを作成できます。一方で、R Markdownによるレポートづくりの世界は奥が深く、コード処理やレポート出力の制御など、多岐にわたるカスタマイズができます。これらの機能を活用すれば、シンプルなデフォルトのレポートでは物足りない、もっと格好いいレポートを作りたい、自分に合ったやり方でレポートづくりをもっと効率化したい、などといった望みを叶えてくれます。

5月も終わりに差し掛かり、新社会人、新入生の方々も新しい環境に慣れてきたことでしょう。R Markdownでレポートづくりを加速して、節約できた時間で同僚や友人たちとバーベキューに出かけましょう!

Enjoy!!

次回からは

次回はR Markdownによるレポートづくりをカスタマイズするための文法・書式やMarkdown記法などを説明します。

なお、今回の記事もR Markdownで作成しているので、入稿したオリジナルの原稿である、自動変換処理などを行う前のR Markdownファイルやチュートリアル、サンプルなどをまとめて公開しておきます。

おすすめ記事

記事・ニュース一覧