まだ厨二病

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

2017年のRとの付き合い方: 分析環境編

ギョームでRを使い始めてから一年経っていないのだけど、それなりにスタイルが確立してきた気がするし、新年なので、現状で理想的だと思われる分析環境を整理しておく。ちなみに私のギョームは主にデータの前処理や地理空間データのマッピング、簡易アプリケーションの作成で、巷のデータサイエンティスト的なものとは違う。いわゆるにわかデータサエンティストである。とはいえ、ここであげる分析環境の整備や実行はデータサイエンティストや研究者のギョームにも有効だと思っている。

分析環境編とコーディングスタイル編について分けて書く。最初はまだ不確定なところもあり、今年から本格的に取り組もうというものもあるが分析環境についてまとめておく。これらの具体的な利用方法については、まだ未確定なものもあるが、このブログで後々書いていければと思う。

分析環境

大事にしたいのはモダンな技術と再現性の確保。以前集計したり出力したデータをもう一度だして、みたいなことを言われた時、コードが残っていても再現できないと辛いので兎にも角にも再現性を優先したい。そのためには環境の整備が大事。

R

Rは飯盒炊飯、RStudioはシステムキッチン

気に入っているエディタがあるならともかく、生Rを使うのはなんの得があるのか私にはわからないのでRStudioの導入を勧める。

また、Exploratoryは私自身はRStudioに対する愛が強すぎてあまり使えていないのだけど、営業メンバーやインターンできている学生なんかには導入を進めている。テキストファイルだけでなく、えくせるやデータベースからのデータ取得、GUI操作によるdplyrをはじめとしたR関数の実行、plotlyベースのグラフ作成・出力機能など、かなり良い。ただ導入の敷居がやや高いと感じており、これ使うといいよ、ってだけでは使ってもらえていない。多少時間をかけてRやExploratoryの操作説明をする必要がある。

  • RSudioおよびRStudio Server
    • ローカルコンピュータ (MaxOS)...ギョームに支障が出る可能性もあるが、最新版を使いたいのでストーキングにより常に最新のビルドを利用するようにしている。分析用には後述のDockerを使ってlocalhostにRStudio Serverを立ち上げるという方法もあり。
    • クラウド (Ubuntu)... AWSのEC2を使えるので、そちらにRStudio ServerとShiny Serverを導入する。
  • Shiny Server... Rを使ったウェブアプリケーションの実行環境。AWSのEC2で起動。nginxによるBasic認証を設定している。社内管理ツールとしての機能も取り入れている。
  • Exploratory

あとExploratoryは、開発者メンバーに日本人が多くいて応援したいというのもある。ブログも最新のパッケージを取り入れたデータ分析を行っており、参考になるものが多いのでチェックしておくと良いだろう。

blog.exploratory.io

blog.exploratory.io

バージョン管理

  • GitHub... 会社のチームアカウントを作ったはいいものの、OSSとなるものがないので追加していきたい
  • Bitbucket... こっちがメインになっている。git操作の基礎的なものはRStudioのgit連携機能で事足る。

ちなみに今年になってからほとんどGitHubには芝を生やしていない。反省。

コンテナ管理

  • Docker... まだ導入段階。テスト的に導入しているが、まだ確立していない。クライアントごとにコンテナを分けておくのが適当か

R用のDockerコンテナは整備されていて、上記のRStudio ServerやShiny Serverを立ち上げるためのコンテナもある。また、Qiitaにも書いたが{liftr}というパッケージを使うとDocker上で分析作業を行いやすくなる。

qiita.com

その他

  • ドキュメント管理
    • Qiita Team... 個別の記事よりもプロジェクトとして記事を編集することの方が多い気がする。仕様変更上等、という感じで適当に書いて適当なタイミングでざっと書き直したり。
  • 継続的インテグレーション
    • Wercker... 検討中。プライベートリポジトリでも良い、Dockerコンテナの中で実行するので相性が良い。
  • 分散処理
    • Spark... {sparklyr}を使うと良いらしいが、Sparkが必要な規模のデータを扱うことがないので一応あげておくだけ

パッケージ

各種のテーマに沿って、よく使っているパッケージをあげた。

全般

library(tidyverse)で高速テキストファイル読み込みパッケージの{readr}やデータ操作用の{dplyr}{tidyr}関数型プログラミングを実行する{purrr}などをさっと読み込むことができるので便利。ただ、パッケージの関数について知識がないとどの関数がどのパッケージのものなのか、どういう働きを持っているのかがわかりにくいので、安易に初心者をtidyverseな世界に陥れてはいけない気がしている。

  • tidyverse... 俺たちのtidyverseはこれからだ!!
  • magrittr... 元々はパイプ処理を取り込むために使っていたが、use_series()set_colnames()extract()といったパイプ処理と相性の良い関数を利用するために使うことが多い。
  • foreach... 可能な限りpurrrを使うようにしているがループ処理をしたいときにやはり便利。{pforeach}のおかげでスムーズに{foreach}への移行ができた。
  • mailR... Rからメールを送るやつ。crontabで定期実行させるコードに取り入れ、エラーや処理結果を伝えるために使うことが多い。

文章作成

RMarkdownによる多様なドキュメント形式の出力は、Jupyterに劣らない、それ以上に素晴らしいものである。また、Shinyのようなインタラクティブな操作を必要としないダッシュボード作成には{flexdashboard}による静的なHTMLファイル作成が適している。また最近では{crosstalk}というパッケージもあるのでこれを使えば良いという話でもある。

  • rmarkdown
  • knitr
  • flexdashboard

作図

定番の{ggplot2}とそれらの拡張パッケージを多く使う。配色には{viridis}{colormap}に出会ってから迷うことが無くなった。またギョーム上、地図を描画するということが多いので{leaflet}は欠かせない。

{plotly}は静的なHTMLファイルの中であっても利用者が必要に応じてグラフを切り替えられるので flexdashboardによるダッシュボードと相性が良いように思える。ただ色の指定が若干面倒。

  • ggplot2
  • leaflet
  • viridis
  • colormap
  • plotly

アプリケーション作成

Shinyでアプリケーションを作るのは本当に楽しい。生のShinyにcssを導入させても良いが面倒なので小洒落たデザインになる{shinydashboard}でアプリを作ることが多い。ツールボックスやガジェットが用意されているので、特に管理用ツールなんかはこっちが適している。

  • shiny
  • shinydashboard

パッケージ作成

再現性を確保するためには分析ファイルの中に関数を書くよりもパッケージ化しておいた方が応用が効くしGitを使って管理しやすいのでそのようにする。これらのパッケージはいずれも開発には欠かせない。また{testthat}{assertr}はパッケージ作成のためにも便利であるが、出力された値が予想通りのものなのかを検証するのに便利なので、分析業務一般でも重宝する。

  • devtools
  • config
  • testthat
  • assertr

uribo.hatenablog.com

地理空間データの処理

  • sf... 流行り物
  • ggmap
  • lawn... turf.jsのラッパー
  • spdplyr
  • mapshaper

notchained.hatenablog.com

このほか、自社用パッケージを作ってそれをギョームで使いまわしている。ライセンスとか、ギョームに差し障りのないものはOSS化してCRANにあげるようにしている。去年は趣味の延長で作ったものもあるが2つのパッケージをCRANにあげた。今年もパッケージを作っていきたい。

CRAN - Package jpmesh

CRAN - Package jpndistrict