※この投稿はR Advent Calendar 2016の6日目の記事です。
11/27のJapan.R 2016でLTしたtidyverseについて書きます。スライドは以下です。
(ちなみに、この投稿のタイトルは@siero5335さんのツイートがエモくてすてきだったので勝手に拝借しました。すみません)
tidyverseとは
単に「tidyverse」と言ったときに、この言葉が指す対象はいくつかあります。
- 概念
- パッケージ
- (GitHub上の)組織
あと、誰が運営しているのか分からない謎のTwitterアカウントとかもあるんですが、あれはたぶんただの脇役なので捨ておきましょう。以下、順番に説明していきます。
tidyverse(概念)
tidyverseというのは、R界の神として崇められるHadley Wickhamが作ったパッケージ群を指す言葉です。かつては「Hadleyverse」と呼ばれていましたが、今年半ばごろ?にHadleyはこの言葉を使い始めました。
「tidy」は、Hadley信者であれば「tidy data」という言葉を連想するかもしれません。tidy dataって??という方は以下の記事をご参照ください。
連想するかもしれませんが、tidyverseの「tidy」はデータだけにとどまりません。データ分析に使うツールのデザインをもっと「tidy」にしていこう、という野望です。
The tidy tools manifesto
ではどういうツールが「tidy」なのでしょう。Hadleyは、現時点での考えを「The tidy tools manifesto」というドキュメントにまとめています。ここには、以下の4つの点が原則として掲げられています。
1. Reuse existing data structures.
tidy dataをつくって使いましょう、という話です。パッケージ内で独自のデータ構造をつくるよりも既存のデータ構造を使いまわすことを推奨しています。
2. Compose simple functions with the pipe.
これは%>%
を使いましょう、という話です。いくつもの処理をひとつの関数に詰め込むよりも、処理ごとに関数を作って%>%
で繋ぐことができる(=つまりデータを第一引数に取る)ようにしておくほうが使い勝手がいいよね、みたいなことを言っています。
3. Embrace functional programming.
関数型言語脳になりましょう、という話です。Rは関数型言語なんだから、強情を張るのはやめてもう関数型言語脳になっちゃいなよ、と。Rは果たして関数型言語なのか?という点に関しては、黒めだかさんのアドベントカレンダーの記事にまとまっているのでぜひご参照ください。
4. Design for humans.
人間にわかりやすいようにしましょう、という話です。命名もわかりやすく、短くするよりはわかりやすさを取りましょう、みたいなことが書かれています。
tidyなツールの例
なるほど、原則はわかりました。では実際に、これらを満たすパッケージにはどのようなものがあるのでしょうか。
...ありません。
Hadleyは、The tidy tools manifestoに
Currently no packages precisely meet the design goals, and while the underlying ideas are stable, I expect their expression in prose will change substantially as I struggle to make explicit my process and thinking.
と書いています。まだまだHadleyの理想を満たすパッケージはなく、その理想自体も今後アップデートされていきます。上に挙げた4原則も、半年後くらいに見るとまったく変わっているかもしれません。
tidyverse(パッケージ)
さて、ここまでは概念としての紹介でしたが、tidyverseというパッケージがあります。これは、tidyverseに含まれるパッケージをまとめてインストールするためのパッケージです(え、さっきまでtidyverseの原則を満たすパッケージはないって言ってたじゃん??というツッコミは置いておきましょう)。library(tidyverse)
とすれば、tidyverseの主要な(すべてではない)パッケージをまとめて読み込むこともできます。
ただそれだけのパッケージなんですが、これがリリースされたことで、tidyverseは概念から実態があるものになりました。「tidyverseといえばtidyverseに入っているパッケージ」という線引きができたのです。今年の9月くらいのことです。上で紹介したThe tidy tools manifestoは、実はこのパッケージのvignetteとして書かれたものです。
tidyverseに(今のところ)含まれているパッケージ
現在のところ、以下のパッケージがtidyverseに含まれています。
データの読み込み
- readr: CSV, TSVファイル
- readxl: Excelファイル
- haven: SPSS, SAS, Stataのデータ
- httr, rvest: ウェブAPI、ウェブスクレイピング
- xml2: XMLファイル
- jsonlite: JSONファイル
- DBI: データベース
データの前処理・変形
- tibble: data.frameを扱いやすくする
- tidyr: データをtidyにする
- dplyr: データを変形する
- forcats: factorを扱いやすくする
- lubridate, hms: 時刻型を扱いやすくする
- stringr: 文字列を扱いやすくする
可視化
- ggplot2
関数型プログラミング
- purrr: 関数型プログラミング
- magrittr:
%>%
- lazyeval: 非標準評価
モデリング
- modelr: モデリング
- broom: モデルをtidyに
tidyverse(組織)
そして、いつの間にかGitHub上の組織もできました。ggplot2やtidyrなど、様々なパッケージがここに移されていっています。(dplyrとかpurrrとかはまだですね。どういう基準で移管するパッケージを選んでいるのかは謎...)
ここで気づいていただきたい点は、tidyverseに含まれているパッケージは必ずしもHadleyが作者ではない、ということです。たとえばmagrittrは@stefanbache氏、broomは@drob氏が作者です。stringrは、(デザインの基礎をつくったのはstringrですが、)今はstringiが土台になっています。Hadleyが作ったパッケージも、今は主要なメンテナが他の人に移っているものもあります。
いまやtidyverseはHadley一人の力によって支えられているのではありません。その意味で、これはやっぱりもう「hadley」verseではないと私は思うのです。
個人的にそれを実感したのは、ちょっと用事でggplot2のissueの議論を追っていた時です。hadleyの書き込みの右上を見ると「Collaborator」になっていて、ああもうほんとにhadleyひとりのtidyverseではないんだなあと感じました。
俺たちのtidyverseはこれからだ!
そうは言ってもこれからもHadleyはR界の神として君臨し続けるでしょう。そしていろんなものを作り出し、それをカジュアルに壊したりするでしょう。でも、tidyverseには、みんなのための宇宙はちゃんとみんなでつくっていこう、という意思を(ほんのりですが)感じます。めげずにGitHubにissueを報告したりpull requestを投げたりコントリビュートして、住みよいR界をつくっていきましょう!*1
明日のR Advent Calendarの担当は、アヒル口アヒルアイコンでおなじみ@berobero11さんです!
*1:英語で投げるのはちょっと...、ということであれば、私でよければへたくそな英語で代理で投げたりしますのでr-wakalangあたりにご相談ください!