Python vs. R どっち?

データサイエンスは時間が命。

データサイエンスや統計のためのツールはたくさんありますが、その中でもPythonRはその人気を二分していると言えるでしょう。これからデータサイエンスを始める方にとっては、どちらを選択すべきか悩ましいところです。

筆者はRから始めてPythonに移行した派です。理由は後述しますが、優劣ではなく、Pythonのほうが用途に適していたからです。それぞれの特徴を理解した上で、用途に合っている方を選択すればよいと思います。もしくは用途に合わせて使い分けることをおすすめします。

PythonもRも汎用的なプログラミング言語なので、自分でプログラムさえ書けば何でもできます。そう言ってしまえば、C/C++でもJavaでも何でもいいじゃないか、という話になりますが、実際そのとおりです。後述しますが、実行速度でいえばPythonよりもC/C++のほうが圧倒的に速いですし、NumPyやTensorFlowのようなC/C++で作られたPython用拡張モジュールも多数あります。

ツールを選択する上で重要な判断基準となるのは、何ができるかではなく、どれだけ効率的かという点です。データサイエンスは時間が命です。限りある時間を、数理モデルやアルゴリズムを考えたり、試行錯誤に使うためには、プログラミングや処理実行にかかる時間は可能なかぎり短縮すべきです。

データサイエンスや統計でPythonとRが選ばれているのは、どちらもこの領域における効率性が高いからです。ただ、そのポイントが異なるため、どちらを選択すべきかという話になります。

ビッグデータのPython、統計のR。

PythonとRの特徴を、効率性の観点から、いくつかの軸で比較します。

  Python R
プログラム実行速度 遅い 非常に遅い
プログラム汎用性 高い やや低い
プログラム可読性 高い やや低い
ライブラリ・統計解析 豊富 非常に豊富
ライブラリ・機械学習 非常に豊富 豊富
リファレンス・統計解析 豊富 非常に豊富
リファレンス・機械学習 非常に豊富 豊富
クラウド実行環境 あり なし

Pythonの特徴をRとの比較で整理します。

  • 実行速度は相対的に速い
  • プログラミング言語としての完成度が高く、汎用性と可読性に優れる
  • 統計解析系のライブラリやリファレンスの豊富さはやや劣る
  • 機械学習系のライブラリやリファレンスが非常に充実している(scikit-learn、TensorFlow、PyTorchなど)
  • クラウドでの実行環境が存在する(Google Cloud Datalab、Google Colabなど)

この特徴の違いから、Pythonはビッグデータ解析や機械学習にRは統計解析に向いていることがわかります。とりわけビッグデータ解析では、クラウド実行環境の存在が重要で、筆者がPythonに移行した最大の理由はそれです。

ビッグデータ解析では、当然のことながら大量のデータを処理する必要があります。とくにノンサンプリングでの分析が必要な場合、サンプリングによってデータ量を減らすことができないため、大量データと向き合わざるを得ません。

まず何よりも、実行速度が求められます。PythonはRより相対的に速いとはいえ遅いことにはかわりませんし、どの言語を使おうが最終的にはコンピュータの処理速度に依存します。クラウドではCPUやGPUのスケールを自由にコントロールすることが可能です。

次に、データ連携の問題があります。データベース(Database:DB)との連携が必要で、とくにDBがクラウド上にある場合は、プログラム実行環境も同じクラウド上にあれば、シームレスな連携が可能になります。たとえば、DBがGoogle BigQueryであれば、Google Cloud DatalabというクラウドのPython実行環境からBigQueryに直接クエリを実行できます。これにより、データ準備(Data Preparation)をBigQueryでSQLにより行い、データマイニング(Data Mining)1)再考するデータマイニング機械学習(Machine Learning)2)いまさら聞けない機械学習をCloud DatalabでPythonにより行うといった役割分担が容易になります。

ちなみに、ベースとなっているJupyter NotebookはRに対応していますが、Google Cloud Datalabは、いまのところRには対応しておらず、Pythonのみの対応となっています。

PythonとRだけではない?

PythonとRで迷うようであれば、Pythonをおすすめします。前述の理由もそうですが、基本的にはRにできてPythonにできないことはほとんどありません。統計解析のライブラリやリファレンスについても、現在はRのほうが充実していますが、Pythonもかなり追いついて来ています。

さらにいうと、選択肢はPythonとRだけではありません。NumPyやTensorFlowのようなC/C++で作られたPython用拡張ライブラリがあることはお伝えしましたが、高速化の要求レベルによってはC/C++を使う必要があります。

C/C++とPythonの実行速度の違いの要因はいくつかありますが、その一つが変数宣言の違いです。C/C++は静的型付き言語で、変数宣言時に型の定義が必要ですが、Pythonは動的型付き言語で、型は自動的に決定されます。自動車でいうMTとATの違いのようなもので、動的型付き言語は自動であるがゆえに、プログラミングの作業負荷が軽減される反面、最適化の自由度が失われます。なお、PythonにC/C++の型を導入することで高速化したCythonという言語もあります。

また、Pythonの扱いやすさと、C/C++にせまる実行速度を兼ね備えた言語として、Juliaが注目されています。発展途上であるため、ライブラリの充実度でPythonに劣りますが、外部ライブラリ連携でカバーできます。また、並列処理や分散コンピューティングが想定された設計で、実装しやすいという特長があります。

ちなみに、ブラウザUIの対話型プログラム実行環境であるJupyter Notebookは、かつてのiPython Notebookが改称されたものですが、その由来は「Julia + Python + R」で、PythonのみからJuliaとRにも拡張されたことを意味しています。

ビッグデータ解析領域でJuliaの普及が進めば、現在はPythonのみの対応であるGoogle Cloud Datalabも、Juliaに対応する可能性はあります。いまからデータサイエンスを始める方は、Juliaを選ぶのもひとつかもしれませんね。

脚注   [ + ]