Rについて
概要
Rはデータをプログラムで様々に解析したりグラフ表示などを行える一般的に統計解析ソフトウェアと言われるものです。画像処理や生物学や地理情報システムなど様々に利用されています。
ライセンスはGPLで、Windows/Mac/Linuxで動作します。
Rはエクセルと比べると、GUI操作ではなくプログラミングを基本としているので処理内容が文書化され再現が容易になり、処理の自由度や拡張性も高いです。Maximaと比べると、数式の処理機能は非常に限られますが、データの扱いは非常に簡単に行えます。
数百MBとかの大量のデータを扱うには処理能力が不十分なようです。
Rの情報はネット上や書籍に豊富にあります。説明が長くなり過ぎるので外部リンクを多用しました。詳細は参考資料などをご覧ください。
インストール
R本体のインストールはCRANから環境に応じたインストール用のバイナリを入手して簡単に行えます。Mac OS X 10.9 (Mavericks)以降用のバイナリを使えばX11も不要です。
起動・終了
Rのアイコンをクリックすると起動し、プロンプト>
が表示され、関数やプログラムを入力できるようになります。
上下のカーソルキーにより、前後の実行済み操作をプロンプトに表示できます。
ちなみに、RはOS環境によってメニューやキー操作や表示内容が微妙に違っています。
メニューから終了を選択するか、プロンプトにquit()
またはq()
と入力すると、作業スペースを保存するか聞かれます。
作業ディレクトリ設定
データを読み書きする作業ディレクトリの設定は、次のようにおこないます。
> setwd("c:/rdata") # 作業ディレクトリの設定`#`以降はコメント > getwd() # 作業ディレクトリの表示 [1] "c:/rdata"
終了時の作業スペースも作業ディレクトリに保存されます。
パッケージ
Rはパッケージと言う単位で、関数やデータを管理しています。
CRANを見ると5879パッケージが入手可能です。例えばAvailable CRAN Packages By Nameをご覧ください。
現在インストール済みのパッケージ一覧はlibrary()
により表示できます。次のものが表示されました。
base、boot、class、cluster、codetools、compiler、datasets、foreign、graphics、grDevices、grid、KernSmooth、lattice、MASS、Matrix、methods、mgcv、nlme、nnet、parallel、rpart、spatial、splines、stats、stats4、survival、tcltk、tools、translations、utils
CRANからパッケージをインストールするには、install.packages("パッケージ名")
とします。
インストールされているパッケージのヘルプを見るには、help(package="パッケージ名")
とします。
現在読み込んでいるパッケージはsearch()
により表示できます(Rオブジェクトも表示されます)。次の内容が表示されました。
.GlobalEnv、tools:RGUI、package:stats、package:graphics、package:grDevices、package:utils、package:datasets、package:methods、Autoloads、package:base
インストールされているパッケージを読み込むにはlibrary(パッケージ名)
とします。
自分で、パッケージを作る事もできます。パッケージを作る - RjpWikiを見て下さい。
初期状態で読み込まれているdatasetsパッケージには、100以上のデータセットが含まれています。一覧は、Documentation for package ‘datasets’やDocumentation for package ‘datasets’ - RjpWikiをご覧ください。
ヘルプ
ヘルプはhelp(関数名)
、?関数名
、help.search(機能名)
(関数名や機能名は例えばcos
など)で表示したり、help.start()
によりブラウザのヘルプを起動したりで見られます。
R commander
R commander(Rcmdr)によりGUI操作もできます。RjpWiki等から検索してみて下さい。
理系ジンは使った事がありません。
基礎的な演算
基礎的な演算は次のようになります。変数には、<-
で代入します。関数は、関数名に引数を渡して呼び出します。
> (1+2)*3/4 # 加減乗除 [1] 2.25 > r2 <- sqrt(2) # 関数呼び出し、変数に代入 > r2 [1] 1.414214 > r2^2 [1] 2
詳しくは、R-Tips 03. 簡単な計算をご覧下さい。
真TRUE
、偽FALSE
やその演算のかつ&
、または|
があります。無限大Inf
、-Inf
や、非数NaN
もあります。
> tf.1 <- 1<0 > tf.1 [1] FALSE > tf.2 <- 2>=2 > tf.2 [1] TRUE > !tf.1&tf.2 [1] TRUE > > 1/0 [1] Inf > 0/0 [1] NaN > -1/0 [1] -Inf
R-Tips 09. データの型もご覧下さい。
文字列処理機能も色々あります。
> substr("1234567890",1,3) [1] "123"
ベクトル
配列をベクトル(vector)と言います。c
関数により作ります。演算子:
でも1刻みのベクトルが作れます。
> v <- c(1,2,3) > v [1] 1 2 3 > length(v) [1] 3 > vc <- c("1",2,TRUE) > vc [1] "1" "2" "TRUE" > is.vector(vc) [1] TRUE > 1.2:10.1 # 初期値:最大値 [1] 1.2 2.2 3.2 4.2 5.2 6.2 7.2 8.2 9.2 > exp(-2:2) [1] 0.1353353 0.3678794 1.0000000 2.7182818 7.3890561
ベクトル用の関数は、R-Tips 14. ベクトル計算を見て下さい。
行列・リスト
行や列を持つベクトルを行列(matrix)と言います。リスト(list)は、ベクトルや行列をまとめて扱うものです。
> v <- seq(1, 30, by=5) > v [1] 1 6 11 16 21 26 > m23 <- matrix(v, ncol=3) > m23 [,1] [,2] [,3] [1,] 1 11 21 [2,] 6 16 26 > m32 <- matrix(v, nrow=3) > m32 [,1] [,2] [1,] 1 16 [2,] 6 21 [3,] 11 26 > l <- list(data23=m23, data32=m32) > l $data23 [,1] [,2] [,3] [1,] 1 11 21 [2,] 6 16 26 $data32 [,1] [,2] [1,] 1 16 [2,] 6 21 [3,] 11 26 > l$data23 [,1] [,2] [,3] [1,] 1 11 21 [2,] 6 16 26 > names(l) [1] "data23" "data32" > l$data23[,2] [1] 11 16 > l$data23[2,] [1] 6 16 26
行列を扱う様々な機能があります。詳しくは、R-Tipsを見て下さい。
データフレーム
データフレーム(data frame)はRで最も一般的なデータ形式で、同じ長さのベクトルを持つリストのようなものです。
例えば次の、初期状態で読み込まれているdatasetsパッケージのiris
のようなものです。
> iris Sepal.Length Sepal.Width Petal.Length Petal.Width Species 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3.0 1.4 0.2 setosa 3 4.7 3.2 1.3 0.2 setosa (省略) 149 6.2 3.4 5.4 2.3 virginica 150 5.9 3.0 5.1 1.8 virginica
データフレームの読み書き
例えば、データフレームiris
をファイル出力するには次のようにします。
> write.table(iris, "iris.csv", sep=",", quote=F)
これで次のiris.csv
ファイルが生成されます。
Sepal.Length,Sepal.Width,Petal.Length,Petal.Width,Species 1,5.1,3.5,1.4,0.2,setosa 2,4.9,3,1.4,0.2,setosa (省略) 150,5.9,3,5.1,1.8,virginica
データファイルを読み込むには、次のようにします。これで変数ir
にiris
と同じデータが入ります。
> ir <- read.table("iris.csv", header=T, sep=",")
関数の定義
関数の定義は次のようにおこないます。
関数名 <- function(引数1,...,引数n)関数本体 関数名 <- function(引数1,...,引数n) { 関数本体 }
例:
> myplus <- function(x, y){ + return(x+y) + } > myplus(2,3) [1] 5
プログラムの制御
条件分岐
if(条件式){条件式が真の場合実行する式} else{条件式が偽の場合実行する式} #省略可
繰り返し
for(i in 初期値:最大値){繰り返される式}
例:
> x <- 0 > for(i in 1:10){x <- x+i} > x [1] 55
他に、while
、repeat
、next
、break
、switch
も使えます。
グラフの作成
後の「データ解析例」や、R-Tipsのグラフィック篇をご覧下さい。
グラフの保存
表示したグラフの保存は、Windows版では、メニューの[ファイル][別名で保存]から、Metafile、Postscript、PDF、Png、Bmp、TIFF、Jpegのファイルを保存でき、Mac版では、メニューの[ファイル][別名で保存]で、pdfファイル(変更できるかも)を保存できます。
プロンプトで次のように入力しても保存できます。この方が便利だと思います。
> デバイス関数() > グラフを描画 > dev.off()
デバイス関数には、bitmap
、bmp
、jpeg
、pdf
、pictex
、png
、postscript
などがあります。
データ解析例
初期状態で使えるデータフレームiris
を使ってデータ解析やグラフ描画の説明をします。
先ず、summary
関数を使い統計量の要約を見ます。1st Qu.は25%点、3rd Qu.は75%点です。
> summary(iris) Sepal.Length Sepal.Width Petal.Length Petal.Width Species Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100 setosa :50 1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300 versicolor:50 Median :5.800 Median :3.000 Median :4.350 Median :1.300 virginica :50 Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199 3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800 Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
Species別に統計量の要約を見ます。
> by(iris,iris$Species, summary) iris$Species: setosa Sepal.Length Sepal.Width Petal.Length Petal.Width Species Min. :4.300 Min. :2.300 Min. :1.000 Min. :0.100 setosa :50 1st Qu.:4.800 1st Qu.:3.200 1st Qu.:1.400 1st Qu.:0.200 versicolor: 0 Median :5.000 Median :3.400 Median :1.500 Median :0.200 virginica : 0 Mean :5.006 Mean :3.428 Mean :1.462 Mean :0.246 3rd Qu.:5.200 3rd Qu.:3.675 3rd Qu.:1.575 3rd Qu.:0.300 Max. :5.800 Max. :4.400 Max. :1.900 Max. :0.600 --------------------------------------------------------------------------------------------------------------------------------------------- iris$Species: versicolor Sepal.Length Sepal.Width Petal.Length Petal.Width Species Min. :4.900 Min. :2.000 Min. :3.00 Min. :1.000 setosa : 0 1st Qu.:5.600 1st Qu.:2.525 1st Qu.:4.00 1st Qu.:1.200 versicolor:50 Median :5.900 Median :2.800 Median :4.35 Median :1.300 virginica : 0 Mean :5.936 Mean :2.770 Mean :4.26 Mean :1.326 3rd Qu.:6.300 3rd Qu.:3.000 3rd Qu.:4.60 3rd Qu.:1.500 Max. :7.000 Max. :3.400 Max. :5.10 Max. :1.800 --------------------------------------------------------------------------------------------------------------------------------------------- iris$Species: virginica Sepal.Length Sepal.Width Petal.Length Petal.Width Species Min. :4.900 Min. :2.200 Min. :4.500 Min. :1.400 setosa : 0 1st Qu.:6.225 1st Qu.:2.800 1st Qu.:5.100 1st Qu.:1.800 versicolor: 0 Median :6.500 Median :3.000 Median :5.550 Median :2.000 virginica :50 Mean :6.588 Mean :2.974 Mean :5.552 Mean :2.026 3rd Qu.:6.900 3rd Qu.:3.175 3rd Qu.:5.875 3rd Qu.:2.300 Max. :7.900 Max. :3.800 Max. :6.900 Max. :2.500
データ解析は特に初期段階では、プログラムで判断までおこなうよりは、データを適切に可視化して人が判断しながら解析する事が多いと思います。
(初期状態でインストール済みの)latticeパッケージを読み込みます。有用なグラフィック機能が使えるようになります。
> library(lattice)
latticeパッケージのhistogram
関数で、Species毎にヒストグラムを描き、各データ(Sepal.Length、Sepal.Width、Petal.Length、Petal.Width)の分布を見てみます。
> png("iris.Sepal.Length.png") > histogram(~Sepal.Length | Species, data=iris) > dev.off() null device 1
同様に他のヒストグラムも見てみます。
> histogram(~Sepal.Width | Species, data=iris)
> histogram(~Petal.Length | Species, data=iris)
> histogram(~Petal.Width | Species, data=iris)
全体的に平均値辺りの数が多いなど気が付きます。
次に、各データ(Sepal.Length、Sepal.Width、Petal.Length、Petal.Width)の関連を見ます。
先ず、データ2つずつの散布図を見ます。データは4種類で2つずつの関連を見るので、縦横を無視して実質$_4 C _2 = 6$通りの散布図を見ます。Species毎に色分けします。
plot
関数を使えばまとめてみれます。
> plot(iris, col=as.integer(iris$Species))
latticeパッケージのxyplot
関数やsplom
関数でも散布図が表示できます。
グラフを見るとSpecies毎に分布がかたまっていると分かります。
各データ(Sepal.Length、Sepal.Width、Petal.Length、Petal.Width)の相関係数を求めてみます。
> cor(iris[,-5]) # iris[, -5]はSpeciesを除いたデータフレーム Sepal.Length Sepal.Width Petal.Length Petal.Width Sepal.Length 1.0000000 -0.1175698 0.8717538 0.8179411 Sepal.Width -0.1175698 1.0000000 -0.4284401 -0.3661259 Petal.Length 0.8717538 -0.4284401 1.0000000 0.9628654 Petal.Width 0.8179411 -0.3661259 0.9628654 1.0000000
Petal.LengthとPetal.Widthに高い相関がある事がわかります。
相関係数も、Species毎に分けて求めると良さそうですが、事前にファイルを分ける処理が必要なはずなので、理系ジンの時間の都合上省略します。
その他の機能の紹介
連立方程式を解く
連立方程式$x+y=-1,x-y=1$を解く
> A<-matrix(c(1,1,1,-1),nrow=2) > A [,1] [,2] [1,] 1 1 [2,] 1 -1 > kv <- matrix(c(-1, 1), nrow = 2) > kv [,1] [1,] -1 [2,] 1 > solve(A, kv) [,1] [1,] 0 [2,] -1
ちなみに、Maximaの場合は次のようになります。
(%i1) solve([x+y=-1,x-y=1], [x,y]); (%o1) [[x=0,y=−1]]
微分・積分
> f <- expression(a*x^3+b*x^2+c*x+d) > f expression(a * x^3 + b * x^2 + c * x + d) > D(f,"x") a * (3 * x^2) + b * (2 * x) + c > ff <- deriv(~ 3*x^2+2*x+1,"x",func=T) > ff(-2) [1] 9 attr(,"gradient") x [1,] -10
> integrate(sin, 0, pi) 2 with absolute error < 2.2e-14 > f <- function(x) x^2+2*x*3 > integrate(f, 0, 1) 3.333333 with absolute error < 3.7e-14 > integrate(dnorm, -Inf, Inf) 1 with absolute error < 9.4e-05
積分は数値的におこないます。広義積分もできます。最後の値は誤差です。
バッチ処理
バッチ処理は、Rscript - RjpWikiをご覧ください。他のプログラミング言語などからRを利用してデータ処理できます。
データベース
多くのデータベースと連携できます。データベースとR - RjpWikiをご覧下さい。
TeX
TeXとの連携は、LaTeX - RjpWikiをご覧下さい。
理系ジンの意見
Rはデータファイルの読み書きが容易におこなえます。機能に拡張性があり統計解析の機能も充実しており、データの解析に非常に役立ちそうです(機能が豊富過ぎて記事を書くのが大変でした)。一方、Maximaの様な数式処理の機能はかなり限られています。
理系ジンで今後記事を書くときに、必要だったり有用だったりする場合MaximaやRを使いたいと思います。
しばらく気分を変えて、JavaScriptプログラミングなどの記事を書いていこうと思います。記事は数ページに抑えようと思います。
参考資料
- The R Project for Statistical Computing:CRAN、マニュアル、関連プロジェクト等
- CRAN:本体・パッケージのダウンロード
- R言語(Wikipedia):リンク集が充実
- RjpWiki:情報量豊富、検索が便利
- R-Tips:項目別の分かり易い説明
- バイオスタティスティクス
- 実践! Rで学ぶ統計解析の基礎(@IT)
- Rによる統計処理