近年、データサイエンティストが用いる言語として、R言語よりもPython言語の人気が出てきている。たとえばプログラミング言語ランキングで有名なTIOBE Indexでは常にPythonがRを上回る状況だ。最近、あまりにも「Python優位」の風潮があるため、一石を投じる目的で本記事を執筆する。
目次
なぜPythonの方が人気なのか?
Pythonの人気が出ることには、必然的な理由がある。Rが統計(近年ではデータサイエンス)に特化した言語であり、Pythonはデータサイエンス以外の分野でも使われる汎用言語であるためだ。要するに、Rは特化型、Pythonはなんでもできる言語だということだ。
逆に、なぜR言語という選択肢が出てくるのか?
今、プログラミングを学ぶならPythonという声がいたるところで聞こえてくるほどにPythonが人気だ。そんな中でなぜ逆にR言語という選択肢が登場するのだろうか? これは、過去の大学教員や統計実務家の事情が関係している。統計学は因果関係を証明する非常に強力なツールといえるものであり、アカデミックな(学術的な)論文等では当然のごとく統計学が利用されてきた。そして、その大学教員がよく使っていたのが、R言語なのである。筆者も大学時代に確率・統計学を頻繁に利用する金融工学のゼミに所属していたが、その際にゼミの教授から利用をすすめられたのがRだったのである。まだPythonが今ほどの人気がなかったとき、Rは統計的な計算をするための人気言語だったのだ。そしてRを用いて統計を学んだ学生が社会に出て、データを扱う仕事においてRが使用されることも多くなるという具合だ。その流れで、現在のデータサイエンスにおいてRが用いられるのは、自然の流れである。その自然の流れに割り込んできたのがPythonなのだ。
R言語には特有の癖がある。だからこそ実は使いやすい
また、R言語の文法には癖があり、もともと他の言語を使用していた人にとってはPythonの方が使いやすいだろう。しかしこのR言語の癖こそ、私がノンプログラマーにRをすすめる最大の理由である。特に、普段EXCELで作業をしており、プログラミング言語には一切触れたことがないような人には特におすすめだ。さらに、今後積極的にプログラミングを行っていきたいわけでもない人にこそR言語は最適といえる。R言語はノンプログラマーにこそおすすめの言語なのである。逆に、プログラミングをいろいろなことに活用したいという人にはPythonを推奨する。
個人的な意見だが、私はPythonを含む多くのプログラミング言語の文法に関して"醜い"と感じるときがある。それはデータの要素にアクセスする瞬間だ。たとえば、[1,2,3,4,5]という5つの数字を格納するデータXがあるとする。データの1番目の要素にアクセスしようとしたとき、私たちはもちろん1という数字が返ってくることを期待する(1,2,3,4,5の1番目は1である)。それを実現するコードを書いてみようと思う。そのためにX[1]というコードを書く。これは、Xの1番目の要素にアクセスするという意味だ。
R:X[1]と打つと1を返す
ノンプログラマーにとっては自然な解釈が可能だろう。
同様の発想でPythonも書いてみる。
Python:X[1]と打つと2を返す
さて、Pythonではおかしなことが起きた。1が返ってくると思いきや、数字の2が返ってきたのだ。プログラマーにとっては至極当たり前のことであるが、Pythonではデータの要素が0番から始まるのである。したがって、Pythonで1を得たいなら
Python:X[0]と打つと1を返す
私たちは生まれてから、1番、2番と数字を数えている。0番、1番とは数えない。ノンプログラマーにとっては、R言語の方が直感的に感じるはずだ。実は、筆者はR言語を最初に学んだため、初めてPythonに触れたときは非常に驚いた記憶がある。今となっては、Rが異質なだけだったと理解している。
しかし、ここまではまだいい。仮に、ノンプログラマーと仮定したあなたが、Pythonは0番から始まると理解したとしよう。次に、あなたは最初の4つの要素を取得しようと思った。R言語の場合、
R:X[1:4]と打つと1,2,3,4となる
ここであなたは、「Pythonは0番から始まる。だからX[0:3]と打てばいい。1,2,3,4と4つの数字が返ってくる」と思うはずだ。実際に打ってみよう
Python:X[0:3]と打つと1,2,3
そう。Pythonでは4が返ってこないのだ。この時点で、頭に多くのクエスチョンマークがつくはずだ。Pythonでは次のようにしなければならない。
Python:X[0:4]と打つと1,2,3,4
直感的に考えると、意味がわからない。実は、これは<=と<の違いだ。Rでは1番目以上4番目以下の要素を取得することになるが、`Pythonでは0以上4未満の要素を取得するとなる。個人的には、なぜ<(未満)なんだろう、という疑問は今も消えない。 まだ他にもある。それはX[-1]と打つときだ。RとPythonではX[-1]の意味が異なる。それはともかく、何が出力されるか見てみよう。
R:X[-1]と打つと、2,3,4,5を返す
R言語だと、X[-1]は1番目の要素を除外したものとなる。X[-1]を、Rの場合は直感的に理解できるはずだ。
一方Pythonでは、X[-1]を直感的に理解できない。
Python:X[-1]と打つと、5を返す
Pythonでは、X[-1]が最後の要素を返したのだ。
あなたの賢い頭にはまた大量の疑問符が生じるはずだ。Rと挙動が異なり、X[-1]が最後の要素を取り出すということは別にかまわない。しかし、「1番目の要素は0から始まるはずだ」と。最後の要素が欲しいなら、X[-0]とするべきではないかと。最初の要素にアクセスするときは0を使ったのに、最後の要素にアクセスするには1を使わねばならないのだ。
以上から、もともと発想が数学寄りの筆者にはPythonの文法の方が醜く思えるのだ。Pythonの文法を眺めると、非対称、アンバランスと感じてしまう。プログラマーにとっては不自然なR言語の文法こそ直感的と思わないだろうか?
RとPythonのインストールから使い始めるまで
Rの場合、普通にソフトをインストールする感覚で問題なくインストールできる(コード補完などの機能があるRStudioという開発環境を入れる方がベターで、これも簡単にインストールできる)。しかしPythonの場合、インストール方法がかなりややこしい。何も考えずインストールすると往々にして失敗する。筆者はAnacondaを使った。Pythonの環境構築からデータサイエンスに必要なライブラリのインストールまでできる。Rは、時間がないビジネスパーソンが迷いなく導入できる点もありがたい。Pythonのインストールには、「よし頑張ってインストールするぞ!」という覚悟が必要なのである。おそらく、インストールの段階で挫折する可能性があるのもPythonだ。ノンプログラマーの最初の難関は、言語をインストールして環境構築をすることだ。「仮想って何?」のような事態に頭を抱えるはずだ。Rはインストールでつまづくことはない。
Rは関数的、Pythonはオブジェクト的
ノンプログラマーには、「関数的」、「オブジェクト的」という言葉の意味がわからないかもしれない。まずは例を見ていただこう。最初のいくつかの要素にアクセスしたいとき、headという関数(メソッド)を使う。ここでは、関数とメソッドは似たようなものだと思ってくれて問題ない。これはRとPythonの両方に存在する。Xというデータに対して、このheadを適用してみよう。
R言語:head(X)と打つと先頭から5番目までのデータを表示してくれる
Python:X.head()と打つと先頭から5番目までのデータを表示してくれる
数学の授業で、f(x)という関数を習ったはずだ。R言語の場合、headもそれと同じようなものと考えてよい。fの代わりにhead(x)とするだけだ。一方、X.head()のheadはメソッドと呼ばれるものだ。関数とメソッドは厳密には同種ともいえるが、メソッドはプログラミングで用いられる概念なだけに、ノンプログラマーにとっては馴染みのない用語だ。メソッドを理解するにはクラスやオブジェクト指向を理解しなければならないが、ノンプログラマーの大きな壁として「オブジェクト指向って結局何?」というものがある。この段階で挫折する人も多い。一方関数的なR言語の場合、学校で習ったy=f(x)という関数の延長で理解することができる。
R言語のデメリット
もちろんR言語にも欠点が多数ある。以下のような短所がよく指摘される。
①遅い
②ビッグデータのような大規模データを扱いづらい
③システム開発ができるような汎用性に欠ける
筆者もそう思う。以下のような、その遅さをカバーできる方法も確立されているが、工夫をしなければやはり遅い。
①forループを使わない
②forループしたいならRcppを使う(RからC++を呼び出し、遅い部分をC++で記述)
②ベクトル演算(計算を速くするための工夫で、ベクトル同士の計算にすると速くなる)
③dplyrという高速なパッケージでデータ加工・整理する
大規模データを扱うためにffやbigmemoryなどのパッケージがあるものの、Rでメモリにのらないレベルの大容量データを扱うのは手間がかかる。というか筆者はRで大規模データを扱うのは避けたい。
統計学やデータサイエンス以外に汎用性がないのもR言語の物足りないところであるのは事実だ。Pythonなど他の言語ならデータサイエンス以外の用途にも用いれるため、「うらやましい」と感じてしまう。筆者がPythonを習得したのもそのためだ。
そもそも大規模データを扱う想定がされていなかった統計学
ただ、R言語について擁護するなら、そもそも統計学では学問的な経緯からビッグデータを扱うことは想定されていないのだ。統計学とは、「少ないデータから知見を導く」ための学問だからだ。昔はデータのコストが高く、少ないデータからなんとか知恵を得ようとしてきたのが統計学だ。小数の住民のサンプルを取って、そこから地域全体の傾向を導くというようなことを、統計学はやってきたのだ。ところが時代は変わり、今ではインターネットなどがありほぼ無限といえるデータを低コストで収集できる。こうして関心はビッグデータに移り、そして統計学でよく用いられたR言語がPythonにのっとられるという事態になった。
まとめとR言語のメリット
ここまで、R言語に偏った主張を展開してきた。Pythonユーザーの方にはもちろん反論があると思う。そしてその指摘は、正しいはずだ。というか、筆者も日常的にはもうPythonしか利用していない。
最後にまとめておく。「『EXCELからステップアップしたい』とか『データサイエンスに触れてみたい』と考えてはいるものの、別にプログラマーになりたいわけじゃない」と思う人にはRをすすめる。
【R言語のメリット】
①インストールが簡単。そもそもノンプログラマーはインストール段階でつまづく。
②最初の要素は0番ではなく1番であり、そのほかにもRは私たちの普通の直感通りに扱える。
③オブジェクト指向など、挫折しやすい要素がない。
なによりも、「他の言語よりも圧倒的に挫折しない」という点においてRを推薦したい。
一方、「データサイエンスだけでなく、汎用的なプログラミングまで習得したい」という人にはPythonをすすめたい。Pythonは当然ながら汎用プログラミング言語としての良さがある。ブラウザやキーボード操作などのPC作業を自動化することや、アプリケーションを作ることもできる。非常に盛り上がっている言語であるから、豊富なライブラリがあり、難しい操作を簡単に行える非常に役立つ言語である。
しかし、その便利さを享受するには覚悟が必要である。インストールに挫折せず、プログラミング特有の勉強をしっかり行って、自在に扱えるまでには長い時間を要する。プログラミング学習の挫折率は非常に高いという現実を受け入れなければならない。
さて、あなたはここまでの話を受けて、どちらを選択するだろうか? あなたの選択が楽しみだ。