六本木で働くデータサイエンティストのブログ

元祖「銀座で働くデータサイエンティスト」です / 道玄坂→銀座→東京→六本木

「データ分析をやるならRとPythonのどちらを使うべき?」への個人的な回答

f:id:TJO:20190625130900p:plain
(Background image by Pixabay)

最近また「データ分析をやるならRとPythonのどちらでやるべきか」という話題が出ていたようです。


言語仕様やその他の使い勝手という点では、大体この記事に書いてあることを参考にすれば良いと思います。その上で、人には当然ながら趣味嗜好がありますので、個々人が好みだと思う方を使えば良い話ではあります。


とは言え、僕自身もクソコードの羅列ながらこのブログにR & Pythonのコードを載せているということもあるので、便乗して今回の記事では僕個人の意見と感想も書いてみようと思います。いつもながらど素人の意見(特にPythonは本業ではない)なのと、自分がメインに使っているRでもtidyverseをほとんど使わないなど割とout-of-dateな使い方をしているということもあり、読んでいておかしなところなどあればどしどしご指摘くださると有難いですm(_ _)m

単純にプログラミングという点ではPythonの方がRよりも使いやすい


両方書いてみれば分かりますが、何だかんだでPythonは初めから汎用のスクリプト言語として整備されていて、実際アプリなどソフトウェア開発にも頻繁に用いられています。それゆえ、例えば一連のデータ分析作業をバッチ処理にしてシステム上で回すというケースでは、Pythonの方が使いやすいです。これに対して、Rでも似たようなことは当然出来ますが、正直なところ結構まだるっこしいものを感じます。そして、何よりもRの方がPythonよりもメモリを食いやすいという印象があります(同じ容量のデータに対して同じような操作を行った場合、Rだと落ちるがPythonでは落ちないということが多い)。


ただ、Rで何かしらのデータ操作を行う際はapply系の関数を使う、ベクトル・行列単位の演算を使う、分散処理などHPC系パッケージを使う、などの方法で高速化&軽量化を図ることも出来るので、そこはやり方次第という側面もないわけではありません。


「説明」を目的とする統計学的な処理はRの方がPythonよりも使いやすい


これはデータの持ち方とか分析手法以前のプリミティブな話まで含めますが、分析結果の解釈など「説明」を目的とする統計学的処理はRの方がやりやすいです。ほぼデフォルトでデータフレーム型でデータを持つことが多いRに対して、Pandasを使わないとその辺の処理が難しくなるPythonとでは雲泥の差があります。


また、細かいことですが例えばt検定ひとつとっても、Rは与えられたデータの形によってオリジナルのStudentのt検定とWelchの検定とを自動的に使い分けてくれますが、Pythonはいちいち自分で指定しないといけません。t検定でもカイ二乗検定でも、Rだと検定結果は分かりやすいレポート形式のオブジェクトで出してくれますが、Pythonで同じことをやろうとするとちょっとコードを書く必要があります。他にも、あまり注目されていませんがグラフ・ネットワーク分析もRの方がパッケージが充実していてやりやすい印象があります。


他にも例えば、あるオブジェクトをプロットしたい場合、Pythonだといちいちmatplotlibをインポートしておいて色々引数やら何やら指定する必要があったりしますが、Rなら大抵のオブジェクトにplotメソッドが付いているので、ただplot(オブジェクト)と打てばおしまいです。線形回帰やロジスティック回帰など「回帰計数の値・p値を見て色々検討してみたい」という分析をやる場合でも、Rなら特にパッケージを使う必要もなくlm, glm関数を使ってモデルを推定し、summary関数を使って一覧を出せば済む話です(Pythonでも可能ですがstatsmodelsパッケージが必要です)。

まさにこんな感じで、Pythonだと結構な行数書かなければならない分析処理が、Rだとたったの5行で済んだりします。これがあるので、僕の場合はRをなかなか手放せないという。


そして、JuPyter Notebook以降あまり差がなくなった感もありますが、かつてはちょっとしたデータを読み込んでちょっとだけプロットして、その結果を見てからその後のもっと細かい統計処理をどうするか決める、というような器用な操作は、Pythonと違って対話的処理に優れたRの独擅場でした。なので、例えば「バルクでCSVファイルに格納されたデータを都度貰ってはその度ごとにデータの性質を精査し、その性質に応じてカスタマイズされた分析処理をする」みたいなケースではRの方がやりやすいと思っています。



あとは完全に番外編ですが、非定常過程(非線形時系列)を含む計量経済学的な時系列分析については今でもRの方がパッケージの揃えが圧倒的に豊富なので、ここだけはRを使った方が有利です。


「予測」を目的とする機械学習的な処理はPythonの方がRよりも使いやすい


一方で、商品推薦やアドテクやユーザー別にターゲティングした施策など「受け取ったデータに応じて事前に学習データを用いて作った機械学習モデルに何かしらの値を返させる」タイプの分析処理は、個人的にはPythonの方がやりやすいと感じます。


Pythonの方が良いと思う理由は色々ありますが、主要なところを挙げると「そもそもsklearn以下機械学習のためのパッケージが非常に豊富」「Pythonの方が機械学習コミュニティにおける存在感が遥かに強く最先端の手法もPythonで先に実装が出ることが多い」と言ったところでしょうか。例えば、t-SNEやLightGBMは事実上Python実装しかありません。これに限らず、機械学習の研究者コミュニティでも新規手法の実装はGitHubPythonコードで出ることが多く、結果的に機械学習のトレンドを追いかけていると自然とPythonを使う機会が多くなるように思います。


実務面でのあるあるとしては、「デプロイしようと思った場合予めPythonが入っているシステムの方がRが入っているシステムよりずっと多い」という点があります。何だかんだでRは事実上のデータ分析に特化した言語なので、システムによってはRが入っていないこともあったりします。これに対して、元々システムやソフトウェア開発に使われる汎用スクリプト言語だったPythonは大体どこでも入っていることが多く、デプロイする際もそのまま上げられるので便利です(自分のクソコードをそのまま上げるわけにはいかないことが大半ですが)。これはどんな言語でも同じだと思われそうですが、機械学習の場合は本番システムにアウトプットを提供して利用してもらうということが多いので、この辺のメリットは大きいです。


後は、純粋に機械学習の方が扱うデータの量というか行数が統計分析に比べると遥かに多いということがままあるので、メモリ管理が弱くてすぐ落ちるRよりはそうそう落ちないPythonの方が有利という部分もあると思っています。


ベイジアンは以前とは異なりRとPythonとで差がなくなってきているが、まだRの方が比較的楽


確率的プログラミングに代表されるようなベイジアン系の分析フレームワークは、かつてはBUGS / JAGS / Stanを擁するRの牙城で、PythonはPyMCで何とか頑張っていますという状況でした*1。ところが最近はEdwardやTensorFlow Probability (TFP)のようなベイジアンフレームワークが登場したことにより、PythonでもRと同じくらいにはベイジアンを回せるようになってきたように見受けられます。

ということで、現状ではどちらを選んでもあまり変わらないかもしれません。が、最初の「統計分析はRの方が使いやすい」の流れはここでも生きている印象で、RStanとTFPを使ってみた印象ではRStanの方が(自分が慣れているのもありますが)例えばMCMCサンプルの抽出やパラメータの推定に関してもかなり楽*2という感想です。ただし、Deep Bayesian Networkみたいに全結合層のところを確率的プログラミングでやりたいというような場合は、PythonでEdwardやTFPを使った方が良いでしょう。


Deep LearningはむしろRで使えるフレームワークが殆どなくPythonが必須に近い


最もRとPythonとで大きな差がついているのが、Deep Learningです。一応Rにも{mxnet}や{keras}や{h2o}のようなパッケージはありますが、事実上Pythonでしか使えないDeep Learningフレームワークばかりというのが現状です。特に現在におけるDeep Learningフレームワークデファクトスタンダードとも言うべき、TensorFlow / PyTorch / Chainerは全てPython向け実装がメインで、基本的にRからは呼び出せません*3

実際、僕もTensorFlowでDeep Learningにまつわる諸手法を試すシリーズでは(TensorFlowなので当たり前ですが)Pythonのみで、しかもJuPyter Notebookでやっています。


またそもそも、GitHubやweb記事から紙の書籍に至るまで「Deep Learningと言えばPython」という有様なので、ここでわざわざRで無理にやる理由が見つからないというのもあります。事実上唯一のRで動くフレームワークたるMXNetも、Mac OS向けR版パッケージは両方のバージョンが上がったら入らなくなるというバグがあったりして、RでDeep Learningをやるというのはそれ自体が大変ストレスフルな上に、年々Deep Learning分野におけるRの存在感はゼロに近付いていっている印象があります。


ということで、たかだか試験的にコードを写経して動かすという程度でも、プロトタイプを書くという程度でも、それこそプロダクトの本番コードを書くというレベルでも、Deep Learningを扱うのにR / Pythonのどちらか選べと言われたら迷わずPythonを選びましょう。


統計分析・機械学習であってもソフトウェア開発を本業にするならC++など速い言語が必須


と、いう感じで色々論ってきましたが。統計分析・機械学習のどちらをメインで扱うにせよ、ソフトウェア開発(OSSも含む)を本業にするならR / Python「だけ」でやっていくのは色々と足りない部分が多くなるはずで、どうしてもC++など速い言語で直接実装できる必要があるように思われます。理由は簡単で、R / Pythonともデータ分析用のパッケージの大半はC / C++などで書かれており、何なら新たにパッケージを開発するならまずC / C++で書いてからラッパーをR / Python向けに書くということになりがちだからです。

例えばprimitivは友人の某氏が開発しているDeep Learningの独自フレームワークですが、これもC++で書かれています。また他にも、有名どころだとPythonにはC系で高速化するためのフレームワークとしてCythonがあって分野によっては多用されますし、Rでも{Rcpp}パッケージで直接C++コンパイルして回すようなケースがチラホラあります。


勿論、純粋に高速化のために分散処理も含めてスクラッチに近い状況から要件に合わせて書き起こすみたいなことも往々にしてあるわけで、そういう場合はそれこそ高速化できるアルゴリズムを駆使してC / C++などでゴリゴリ書く必要が出てくることでしょう*4


ということで、統計分析や機械学習を仕事で使いながらもガチでソフトウェア開発を行いたいという人は、C / C++といった速い言語を習得しておくことをお薦めしておきます。


最後に


そんなわけで、結論から言うと「その時々のテーマと必要に応じてRとPythonを巧みに使い分けるべし、そのためにも両方とも習得しておこう」というのが僕の個人的な回答です。


とまぁ色々論ってきましたが、統計分析がメイン&C++書けない勢としては、時々Pythonでシステムのプロトタイプを書きつつ、普段はRでお茶を濁すというのが最適な生存戦略になっております。。。ということでお後がよろしいようで。

*1:PyStanもあるにはありましたが、文字列を扱うのが苦手なPythonでStanコードを読み込ませるのは殆ど恐怖だった記憶が

*2:というかTFPはTensorFlowのテンソル操作を強いられるのでむしろつらい

*3:一応TensorFlowだけRのインタフェースがあるがほぼ使えないと思った方が無難

*4:どこだかのソフトウェアエンジニアの機械学習実装もそんな感じだとか