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

どらちゃんのポッケ

R・統計・技術メモなど勉強ログ置き場

R markdownを使って、pythonで分析レポートをいい感じに共有したい

RMarkdownとは?

Rstudioが開発している、分析レポート作成のためのパッケージ。Markdownを拡張して、Markdown内にRのコードを記述できるようにしたもので、HTML/PDF/Wordなどに出力が可能。

http://rmarkdown.rstudio.com/index.html

どんなことができるかは、下記を見てもらえればわかるかと思います

ざっくりRmarkdownの良さを書いておくと・・・

何かデータ分析のレポートをする時に、「Excelでピポッドテーブル作ったり、グラフを作ってレポートする」「Rやpythonでグラフや計算した結果をpptに貼り付けてレポートする」というような分析レポートの作り方をしていると、元のデータソースが更新された時に、ピポッドテーブルを作り直す/pptにコピペするなど、毎回毎回手作業が発生してしてしまいます。超めんどうくさいですよね。

最近、jupyter notebookもデータ分析共有のデファクトスタンダードになってきているとは思います。しかし、jupyter notebookはソースコードとその出力が1対1対応してしまっているので、エンジニア←→ビジネスサイドの間の共有の時に「ソースコードが邪魔で見にくい、結果だけでいい」なんてこともあるかと思います。(個人的にはjupyter notebookはエンジニア←→エンジニアの間のデータ分析の共有のツールだと思っています)

そんな時に、RMarkdownが役に立ちます。Rmarkdownであれば、ソースコードを含めることも、外すことも設定で簡単にできるので、エンジニア←→エンジニアの間の共有だけでなく、エンジニア←→ビジネスサイドの間の共有にも使えると思います。

Rmarkdownでpythonも動く!?

Twitterでこう言うツイートを見かけた。

どうやらpythonが動くらしい。公式にもpythonの動かし方が書いてある。・・・ということでやってみた。

ソースコード(.Rmd)

結果

HTMLをRPubsにあげたもの

RPubs - Publish Document

PDFにした感じ

f:id:sleeping_micchi:20161009001555p:plain

・・・という感じで、まぁpythonでも動いた

はまったこと/確認したこと

virtualenv下でのpythonをRmarkdownで使う

```{python}って書いただけでは、システムのpythonを使ってしまうっぽい。自分は、もっぱらvirtualenv環境でpythonを動作させているので、なんとかしたかった。 ```{python,engine.path = '/VIRTUALENV_PATH/bin/python3',echo=FALSE}というように、engine.pathを指定すれば、virtualenvでもいけるっぽい。

参考:r - How can I specify rmarkdown to use python3 instead python 2? - Stack Overflow

pythonのimport

importするライブラリがインストールされていれば、普通にimportって書けば動く。 ライブラリが入っていない場合は、コンパイルエラーになる。

描画作成

matplotlibを試してみたが、単純にplotしただけではRmarkdownは描画してくれなかった。一度、画像として保存して読み込むというのが1つの方法らしい

参考:RStudio with python matplotlib graph - Stack Overflow

PDFで出力する際の設定

これは、pythonだからという訳ではないけどもRmdからPDF化する時に、日本語がエラーではまった。 https://kaz-ic.net/notes/20141224-rstudio-pdf を参考にさせてもらい、以下のように修正。

output:
  html_document: default
  pdf_document:
    latex_engine: xelatex
monofont: Meiryo
mainfont: Meiryo

チャンク間のメモリ共有ができない!?

Each Python chunk in an R notebook runs in a new instance of Python

http://disq.us/p/1cjg6c1

ということなので、現状pythonの場合、複数チャンクにまたがる場合(実務のレポートの場合、ほぼ100%跨ると思う・・・)、結果をディスクに吐き出して、再度読み込むということが必要らしい。めっちゃめんどくさい・・・。

まとめ

こんだけ書きましたが、最後の最後で知った事実に衝撃を受けました。Rmarkdown+pythonを実務で使うのはまだ時期尚早っぽいなと思います。Rmarkdownでpythonを使うという変化球ではなく、同じようなことがpythonのみ実装で出来たり、jupyter拡張で出来たりしないかな?と思ったのですが、あまりいいのが見つからず・・・。

唯一、良さそうなのがpython実装のpweaveでした。ただ、githubのstarは少ない・・・。今度、時間があれば触ってみようかな。