R言語

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

R言語(アールげんご)は、オープンソースフリーソフトウェア統計解析向けプログラミング言語、及びその開発実行環境である。

R言語は、ニュージーランドオークランド大学のRoss IhakaとRobert Gentlemanにより作られた。現在では、R Development Core Team(S言語開発者であるJohn M. Chambersも参画。 R Project Contributors)によって、メンテナンスと拡張がなされている。

なお、R言語仕様を実装した処理系の呼称名はプロジェクトを支援するフリーソフトウェア財団によれば GNU RGNU R - Free Software Directory)だが、他の実装形態が存在しないため当記事では日本での慣用的呼称にならい仕様・実装をまとめて適宜 “R言語” や “R” 等と呼ぶ。

R言語
Rlogo.png
パラダイム マルチパラダイム関数型オブジェクト指向命令型
登場時期 1996年
設計者 Ross Ihaka、Robert Gentleman(S言語に基づく)
開発者 R Development Core Team
最新リリース 3.0.1 / 2013年05月16日(4日前) (2013-05-16
型付け 動的型付け
主な処理系 GNU R
影響を受けた言語 S言語Scheme
プラットフォーム クロスプラットフォーム
ライセンス GNU GPL
ウェブサイト www.r-project.org
テンプレートを表示

目次

特徴 [編集]

R言語は文法的には、統計解析部分はAT&Tベル研究所が開発したS言語を参考としており、またデータ処理部分はSchemeの影響を受けている。(S言語は1998年ACMソフトウェアシステム賞を獲得した。)

ベクトル処理言語 [編集]

  • R言語は「ベクトル処理」と呼ばれる実行機構により、柔軟な処理を簡便な記法で実現する。R言語で言う「ベクトル」とは数学的用語のベクトルとはやや異なり「構造を持ったデータ集合」という「リスト」に近い意味を持つ。数学的ベクトル・行列のみならず、配列リストテーブル(データフレーム)、集合時系列、などといった複雑な構造を持ったデータも宣言無く変数に納める事ができる。
  • ベクトルは複数の要素を持ち得るが、例えばリストの要素がさらにテーブルや時系列の配列などであるといった「入れ子構造」であってよい。このおかげで複雑なデータ構造が他愛もなく構築・管理できる。
  • 予約語としてRに組込まれた演算も関数もベクトルを扱える。ユーザー定義関数をベクトル対応にするための関数もある。
  • またベクトル処理によって、演算も関数も特別な制御を要さずベクトルの全要素に作用するため、プログラム全体の制御構造が単純化して意味が明瞭になるという効用が期待できる。うまく使えば、通常他の言語で複数要素を処理する時の「目的とする計算の本質とかけ離れたアルゴリズム(例えばカウンタを使ったループ条件分岐等)」から解放され得る場合も多い。

例として『円周率モンテカルロ法で近似する計算』を挙げる。(簡約のため第一象限のみ計算して4倍する)

s <-100000
x <-runif(s)
y <-runif(s)
sum(x^2+y^2<=1)*4/s

<-』は代入(この場合『=』とも書けるが推奨はされていない)、『runif(a)』は一様乱数a個作りベクトルで返す関数、『a^2』はaの二乗、『sum(a<=b)』は関係式a<=bが真であるようなベクトル要素の個数、を意味する。ここで、ごく普通の数式によって、条件分け計算を複数回行なう指示が暗黙のうちになされることに注目されたい。プログラム全体を読めば サンプル数10万個として、一様乱数でxyのサンプルをつくり、半径1の円弧内に入ったサンプルだけを数える」という計算の本質を反映した記述ができる事が見て取れる。このままRに入力すれば計算が実行できる。代入『<-』は「付値」と呼ばれる関数でもあり、以下のように一行に書き換えても意味は同じ。

  •  sum(runif(s<-100000)^2+runif(s)^2<=1)*4/s

また、付値記号に矢印を用いると代入の向きを左右に使い分けることが出来る。

ベクトルは「論理添字(元のベクトルと要素数が等しい論理値ベクトルを用いた添字指定)」で要素の絞り込みができ、その結果をそのまま付値対象として利用出来る。

以下はFizzBuzz問題の解答例。

1:100 ->n ->Ans    # 1〜100の整数ベクトル生成。nは加工前の数列、Ansは加工後の結果用。
Ans[n %% 3==0 ->FizzSet]<-"Fizz"    # 3の倍数FizzSet相当のAns要素を文字列Fizzに置き換える。
Ans[n %% 5==0 ->BuzzSet]<-"Buzz"    # 5の倍数BuzzSet相当のAns要素を文字列Buzzに置き換える。
Ans[FizzSet & BuzzSet]<-"FizzBuzz"    # 両者の共通集合相当のAns要素を文字列FizzBizzに置き換える。
print(noquote(Ans))    # 引用符を除いてプリントする。

イテレータとしてのforはじめ各種制御命令も充実しているので、ベクトル記述とは適材適所の使い分けができる。

統計に適した解析環境 [編集]

最小限の労力で見通しよく解析するために工夫された命令体系を備えている。

高速な組込み関数群 [編集]

  • インタープリタながら、行列など複雑なデータ構造に最適化された高速な組込み関数群。(後出「処理速度」参照)
  • さらに高速計算が要求される場合、CC++FORTRANなどの外部プログラムと動的リンクしての拡張が可能。

視覚化に優れたグラフ機能 [編集]

データ互換性 [編集]

ユーザープログラムを配信・利用できるCRANネットワーク機能 [編集]

  • 世界中のRユーザが開発したRプログラム(パッケージ)が「CRAN」と呼ばれるネットワークで配信され、それらをR言語環境単独でオンラインのダウンロード・インストール・アップグレード管理可能。CRANはR言語にシームレス統合されているため、基本機能もオプションプログラムも、利用可能な機能は日々増加拡張している。CRANパッケージリスト(後出「パッケージ」「最近の展開」参照)

教育現場から実務・研究現場へ永続的に利用可能 [編集]

言語仕様 [編集]

R言語の構成には広義の関数型言語の一つであるSchemeの影響があり、リストを基本にした内部処理、遅延評価静的スコープなどの特徴を持つ。表記法にはCの影響がある。ここでは、Rの特徴的な仕様について、ごく簡単に触れる。詳細はR Language Definition (日本語)を参照されたい。以下引用符は一重でも二重でもよい。

制御構造、サブルーチン [編集]

for, if, while, repeat, switch, break といった近代的な構造化構文をサポートする。自前の関数(手続き)を定義することができ、自前の二項演算子を定義することもできる。関数はfunction関数で生成する。次に階乗を計算する自前の関数を生成し、toyfactorial として参照可能にする例を示す。

toyfactorial <- function (n) {
 if (n <= 0) return(NA)
 f <- function(i) {
 if (i == 1) return(1) else return(i * Recall(i - 1))}
 return(f(n))}

これは実用的ではないが、関数のネスト、再帰呼び出し、スコープの例として挙げる。RはPascalModula-2のように関数のネストが可能である。この例では関数内部で更に局所的な関数を生成し、fとして参照している。スコープもPascal等と同様辞書式で関数 f の中ではその外側にある toyfactorial の変数が「見える」。str は局所変数なので、関数の外側に同じ名前の変数があっても影響を与えない。ただし、Rは呼び出しスタックを遡る動的スコープも実現可能である。f の内部では自分の名前を参照することができないので、自分自身を再帰的に呼び出すためにRecall 関数を用いている。関数型の引数を利用することもでき、その場合複数の関数が互いに呼び出しあうことができ、また無名の関数をその場で定義して関数型の引数として渡すことができる。一種の複文のような用途に用いられる。NAは統計処理においては欠くことのできない特殊なデータで、データが無効であることを示す。

Rの関数はそれ自体がオブジェクトであり、ある関数自体を外から参照したり書き換えたりすることができる。関数の本体部分を返す body 関数、仮引数リストを返す formals 関数、関数に付随する環境を返す environment 関数などが用意されている。

渡された式そのものを操作することも可能で、特定の環境(名前とポインタのリスト)の下で与えられた式を評価する eval 関数、渡された式の要素を環境に応じて置き換える substitute 関数、式を文字列に分解する deparse 関数等がある。

関数呼び出しも一種のリストとして処理されており、次のようにcall 関数を用いて、関数名と引数のリストから関数呼び出しオブジェクトを生成することができる。

x <- 1:3
y <- 2:4
z <- call('plot', x, y)
eval(z)

関数はファイルから読み込むこともでき、更には「パッケージ」(ライブラリ)として一まとまりにすることもできる。

オブジェクト指向 [編集]

Rには継承メソッドの実行時ディスパッチといったオブジェクト指向プログラミングの手法が取り入られており、数多くの総称的な (generic) 関数を持つ。これは同じ関数名であっても、取り扱うオブジェクトが属しているクラスによって独自の方法で処理を行うものである。Rでは、クラスはオブジェクトに付随する属性として扱われるものの一つであり、リストとして保管されている。

データ型 [編集]

数値型複素数を含む)、文字型論理型といった基本的な型、ベクトルリスト行列といった統計処理や情報処理に必要な型を備えている。前述のように関数それ自体もデータである。データフレームは配列ないしリストの拡張版で、コラム毎に異なったデータ型を持つことができるため、の形で表現されたデータを格納/操作するのに有用である。データフレームは行列から生成することもあるが、ここでは岡田昌史他『The R Book』(ISBN 4-901676-97-0) に倣ってリストとの関連で説明する。

ベクトルとリスト [編集]

ベクトル型は、データをある順序で並べたものである。2:5 または c(2, 3, 4, 5) は数値型データ2, 3, 4, 5をこの順序で並べたものである。変数a, bを同じ要素数をもつ数値型データのベクトルとすると、a + bは両ベクトルを要素毎に加算してできた、同じ要素数の数値型ベクトルを返す。a + 1はベクトルaの各要素に1を加算したベクトルを返す。c('猫', '猫', '犬')のように文字(列)型、論理型データを要素とするベクトルを作ることもできる。

リスト型は、様々な型のデータを並べたものである。ベクトルのリストやリストのリストも可能である。list 関数によって生成することができる。

f1 <- c('猫','猫','犬')
f2 <- c(1, 2, 3)
f <- list(field1=f1, field2=f2)

文字型データを要素とするベクトル f1、数値型データを要素とするベクトル f2 から、リスト f が生成される。field1, field2 はリストの要素を指す「タグ」である。LISP風のdotted pair listも実装されているので必要に応じて用いることができる。

データフレーム [編集]

さて、上記の2つのベクトルf1, f2の要素数は等しい。このような場合、リストをデータフレームに変換することができる。

df <- data.frame(f, row.names=c('たま ', 'みけ', 'ぽち'))

dfはデータフレーム型変数であり、各ROW(以下「行」)に「たま」「みけ」「ぽち」のラベルがつく。

もうすこし大きな表、例えば

性別 月齢 愛らしさ
たま 1 5
しろ 2 4
くろ 1 5
みけ 3 5
ぶち 12 3
とら 18 2
みゃぁ 30 4
猫じゃ 80 0
ぽち 2 5
ころ 10 5
たろ 40 3
じろ 40 3
じんぺい 50 2
わん 60 4
のらくろ 100 5

を例えば「犬猫」という名前の変数にデータフレームとして付値(手続型言語の代入に相当する)すると、その内容は

> 犬猫
種 性別 月齢 愛らしさ
たま 猫 ♀ 1 5
しろ 猫 ♂ 2 4
くろ 猫 ♂ 1 5
みけ 猫 ♀ 3 5
ぶち 猫 ♂ 12 3
とら 猫 ♂ 18 2
みゃぁ 猫 ♀ 30 4
猫じゃ 猫 ♂ 80 0
ぽち 犬 ♀ 2 5
ころ 犬 ♀ 10 5
たろ 犬 ♂ 40 3
じろ 犬 ♂ 40 3
じんぺい 犬 ♂ 50 2
わん 犬 ♀ 60 4
のらくろ 犬 ♂ 100 5

のように、本来のデータをよく表現するものとなっている。それだけでなく、「猫」「犬」「♀」「♂」などの文字データは内部的に因子ないしカテゴリに変換されている。データフレームから特定のデータコラムを抽出するには 変数名$タグ名、例えば 犬猫$月齢 とする。特定のデータ行だけを抽出するには subset 関数または要素の指定 [ ] を用いる。例えば

猫 <- subset(犬猫, 犬猫['種'] == '猫')
犬 <- 犬猫[犬猫['種'] == '犬',]
t.test(猫$愛らしさ, 犬$愛らしさ)

は「愛らしさ」の平均値を猫と犬の間でt検定する(この例ではp-value = 0.6537)。

機能 [編集]

Rには標準状態でも統計、検定、解析向けの強力な関数が備わっており、必要に応じて新たな関数を定義することができ(CやFORTRANなどによって記述し、外部でコンパイルした関数を呼び出すこともできる)、自分でプログラムを書かなくても、多くのパッケージを利用することができる。これに加えて、便利な入出力機能、グラフ作成機能を備えている。

データ入出力 [編集]

ベクトルを読み込む scan 関数、簡易にデータフレームを読み込むことのできる read.table 関数等、テキストファイル入出力用のさまざまな関数が用意されている。また、市販の統計解析パッケージSPSSSAS等の独自形式バイナリデータを直接扱うこともできる。画像をバイナリデータとして読むこともでき、読み込み後は行列として扱うことができるので、画像処理にも用いうる。パイプやソケット(ポート番号参照)を扱う関数も用意されている。

データのプロット [編集]

plot 関数によって多彩なプロットができる。plotは総称的な関数であり、引数として渡されたデータの種類によって、自動的に様々なグラフを描き分ける。他にヒストグラムを描画する関数、イメージを描画する関数など高レベルの描画関数がある。これらはデフォルトでも機能するが、細かなパラメタを指定することもできる。加えて、単に線を引いたり点を打ったりする低レベルの描画関数も用意されているため、好みのグラフを生成することができる。プロットは画面に対して行われるだけでなく、PDFSVGPSPNGといった形式の出力を直接行うこともできる。

デフォルト状態でのRのプロット例

図に、デフォルトでのプロット例を示す。上から順にplot(犬猫$種, 犬猫$性別)plot(sin(seq(0, 2 * pi, 0.1)))image(x <- -50:50, x, x %*% t(x))の実行結果である。seq関数は等差級数からなるベクトルを生成する。%*%は行列の積を計算する演算子、t転置行列を生成する関数である。最初の例では先に扱った動物種毎の性比を表示、次の例では正弦関数(自動的にベクトルの添字が横軸となり、ベクトル生成式が縦軸のラベルとなっている)を表示し、最後の例では、引数を評価する中でベクトルを生成してxに代入し、積を計算し、その各要素の値を色の濃さで表現している。

ワークスペースの保存 [編集]

現在の作業状況に名前を付けて保存し、後に再利用することができる。コマンドを発行するコンソールの内容も保存できるので、どのような処理を行って結果を得たかを確実に記録し、再現することができる。発見的操作を伴う研究用途では極めて重要な要素である。

その他 [編集]

日本語対応 [編集]

日本語に対応しており、関数名、変数名、コメントなどに日本語を使うことが出来る。

プログラムの入手 [編集]

CRAN(例えばCRAN(筑波大学ミラーサイト))からダウンロード・インストールすればただちに利用開始できる。動作環境はマルチプラットフォームに対応し、WindowsMac OS XUnixLinuxで動作する。 アップデートは精力的に継続され、ソースコードもCRANにて公開されている。

2011年9月1日時点での最新版は『R-2.13.1』最新版の新機能・バグフィックス等の一覧

具体的なインストール方法については、RjpWiki“R のインストール”外部リンクも参照)などが参考になる。

パッケージ [編集]

Rの用語で「パッケージ」とは、R言語のプログラムを配布用の形式に保存したものを言う。関数やデータセット、リファレンスマニュアルなどがひとまとめにされた、いわば出来合いのアプリケーション・関数ライブラリ・データベースなどと言える。 Rにはあらかじめいくつかの標準パッケージが添付されており、たとえば3層ニューラルネット(nnet)等がすぐに利用できる。

CRAN(The Comprehensive R Archive Network)という配信の仕組みを使い、インターネット越しに随時パッケージの一覧検索・ダウンロード・インストール・作業領域へのロード・アップデート、をR言語システムが管理する。パッケージ間で関数を引用しあう依存関係も自動的に処理され、ユーザーが気を配らなくて良い。(この点はaptに近い仕組みともいえる。Perlユーザーは"CPAN シェル"類似と思えば分かりやすい。)ユーザーから見ると、CRANはR言語とシームレスに統合された機能の一部になっている。 世界中のRユーザーが、作成したパッケージをCRANで公開しており、これらは自由に使用できる。CRANはR資産の知識共有メカニズムとも言え、CRANによってR言語の機能は日々強化されている。R言語本体のみでも機能は潤沢だが、第一線ユーザー達の実務経験が反映した豊富なパッケージ群は大きな助力となりうる。

2011年1月9日時点で、CRAN上のパッケージ総数は2,737と発表されている。

パッケージ一覧は下記参照。
CRAN - Contributed Packages 最新情報を反映。個別のマニュアルを備える。(英文)
CRANパッケージリスト(翻訳) RjpWiki。翻訳一覧。
CRAN Task Views 膨大なパッケージをジャンル分けして紹介している。(英文)

CRANのミラーサイト(負荷分散のためのサイト)は世界各地にあり、日本では

が存在する。

パッケージのダウンロードは上記ページから自由に手動で出来るが、相互依存関係の解決やインストール・アップデート・ロード管理は人手で行なうと煩わしいので、そのための機能を備えているRのシステムに一元管理させるのが推奨される。
パッケージ管理をR自体が行なうためには、あらかじめいずれかのCRANサイトを手元のRシステムに登録設定しておく必要がある。設定は一度行なえば良い。→ CRAN国内ミラーの使い方

パッケージを用いなければ、上記設定をしなくてもR言語を使うことは出来るし、オフラインのみでRを使用しても問題は無い。パッケージが必要になった時に改めてCRANに接続するようにすれば良い。

ちなみにユーザー自身がパッケージを作成するためのツールキットは、標準パッケージとしてR言語に添付されている。

CUIとGUI [編集]

R言語は以下の標準インタフェース画面を通じて用いる。

  • コマンド入力や出力をCUIで行う「コンソールウィンドウ」
  • コマンドやデータの文字列を編集し、それらをコンソールへ入力する「Rエディタ」
  • ロードしたオブジェクトを管理する「ワークスペースブラウザ」
  • データテーブルをスプレッドシート状の形式で編集できる「データエディタ」
  • CRANからパッケージをインストールするための「パッケージインストーラ」
  • インストール済みパッケージのロード管理をする「パッケージマネージャ」
  • 各パッケージに含まれているデータセットをブラウズできる「データマネージャ」
  • 基本設定を行う「環境設定」

厳密に言えばこの方式はマルチウインドウのGUIと言えなくはないが、R言語を操作する「コンソールウィンドウ」は「命令をテキスト入力して使うCUI」である。この点についてユーザーの間でも商業ソフトに見られるようなマウスオペレーションを望む声は多く、それに呼応して「R Commander」というGUIがCRANからパッケージとして提供されている。


R以外のGUIを利用する方法として、GNUの時系列解析環境であるgretlがあり、そのGUIを通じてRを操作出来る。

また、データ分析プロセスをフローチャート式に描くことでプログラムできる「R AnalyticFlow」というソフトウェアも企業から無償提供されている。(外部リンク参照)

処理速度 [編集]

インタプリタ言語であることから、R言語の処理速度は不当に低く評価されることが多い。しかしS言語商用版であるS-PLUSよりも多くの場合高速であるばかりか、汎用行列系言語のスタンダードとも言えるMATLAB、その派生語GNU OctaveScilabよりも総合的に高速であるという評価例がある。(外部リンク参照)

R言語の特徴にもあるとおり、「統計計算に特化した情報処理」機能を充分生かしてこそ高い生産性を発揮できる。生産性の最たる「計算速度」への効果に関しては、基本的な作法がいくつも提唱されている。

Rプログラムの高速化を目指すときは、R言語に組み込みの関数群が充分に高速化されているので、これらを活用すべきである。組み込み関数と同じ機能を新たにコーディングすることは避けなければならない。

ベクトルをまとめて扱える関数がある場合では、それを用いる。ベクトル要素ごとにわけて処理すると、速度は低下する。論理判断を含んだループ処理をするのは、多くの場合、間違った方法でである。それにかえて論理添字集合の操作で一挙に答えを出すといった方法が推奨される。(R言語に限らず行列系言語いずれにおいても、高速化するには「forやrepeatといったループ系の命令を無駄に使わず、極力ベクトル化(あるいは行列化)する」ことが基本である。)

持続可能な統計環境 [編集]

教育課程から実務への移行や職務環境の変化が生じると、利用可能な計算資源というものは変わってしまう。

R言語の登場以前は、学術論文など社会的信頼性を要求される統計データの処理環境といえば高額なプロプライエタリソフトウェアばかりが前提とされた。だがこれでは継続的な予算がつかなくなれば環境のサポートやアップデートは停止してしまい、極端な話、予算がもとから無い立場に異動してしまうと在来の統計処理が何も出来なくなる事態になりかねない。

統計家にとっては、いままで習得し錬成した手法と蓄積したデータとその運用方法は、たとえ環境が変化しようとも継承できなくては困る。この意味から、他に多く存在するプロプライエタリの、つまり「生かすも殺すも版権保持者の都合次第」というような統計処理ツールと比べ、R言語のようなオープンソースで、それゆえCRANパッケージ等によって日々機能拡張しうる、つまり「フリーソフトウェアの精神に則り永続的で世界規模な集合知に支えられ、無償でありながら高い信頼に値する」統計環境というのは、統計家の長期的な生産性に大きく寄与する「持続可能な統計環境」と言える。

最近の展開 [編集]

CRANパッケージ数の飛躍的な増大に見られるとおり、統計学を超えて学問分野や業界を問わず、金融工学時系列分析機械学習データマイニングバイオインフォマティクスなど、柔軟なデータ解析や視覚化そして知識共有の需要に応えうるR言語の普及は世界的な広がりを見せている。

近年、生命科学分野のためのRパッケージプロジェクト『Bioconductor』が立ち上がり、すでに多くのゲノムスケール関連パッケージが配布されている。ゲノムスケールデータの諸情報、すなわち大規模遺伝子発現プロファイル、質量分析データ、タンパク質相互作用データなどを解析するプログラムやデータをRパッケージとしてユーザーに配布する仕組みである。2008年時点で、Bioconductorの日本国内ミラーサイトは統計数理研究所にある。

また現在では、かつてSAS一辺倒だったFDA(アメリカ食品医薬品局)への薬事申請や報告の際にもRが用いられている。RjpWiki / RとFDA(アメリカ食品医薬品局)への薬の申請にかかわる資料

SPSSでは2009年より製品名をPASW Statisticsと改め、R言語との連携強化を発表した。SPSSのインタフェースからRの機能を使える。データ分析のスタンダードツール PASW Statistics 18|SPSS Japan

2009年7月、SAS InstituteR Interface Coming to SAS/IML StudioによってSASからR言語へのインタフェースを提供することを発表した。公式ページには、新たな統計手法はたいていの場合まっさきにR言語上で実装されるという現状をふまえSASユーザーの要望に応えてインタフェースの提供を行なう、との旨が述べられている。SAS9.2ライセンス保有者ならば、無償でダウンロード可能。SAS Institute Inc. Software Downloads SAS SAS/IML Studio 3.2

外部リンク [編集]