理系ジン

しばらくPythonに力を入れる予定です。

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

データファイルを読み込むには、次のようにします。これで変数iririsと同じデータが入ります。

> 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

他に、whilerepeatnextbreakswitchも使えます。

グラフの作成

後の「データ解析例」や、R-Tipsのグラフィック篇をご覧下さい。

グラフの保存

表示したグラフの保存は、Windows版では、メニューの[ファイル][別名で保存]から、Metafile、Postscript、PDF、PngBmpTIFFJpegのファイルを保存でき、Mac版では、メニューの[ファイル][別名で保存]で、pdfファイル(変更できるかも)を保存できます。

プロンプトで次のように入力しても保存できます。この方が便利だと思います。

> デバイス関数()
> グラフを描画
> dev.off()

デバイス関数には、bitmapbmpjpegpdfpictexpngpostscriptなどがあります。

データ解析例

初期状態で使えるデータフレーム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 

f:id:rikeizine:20140914234644p:plain

同様に他のヒストグラムも見てみます。

> histogram(~Sepal.Width | Species, data=iris)

f:id:rikeizine:20140914234803p:plain

> histogram(~Petal.Length | Species, data=iris)

f:id:rikeizine:20140914234838p:plain

> histogram(~Petal.Width | Species, data=iris)

f:id:rikeizine:20140914234859p:plain

全体的に平均値辺りの数が多いなど気が付きます。

次に、各データ(Sepal.Length、Sepal.Width、Petal.Length、Petal.Width)の関連を見ます。

先ず、データ2つずつの散布図を見ます。データは4種類で2つずつの関連を見るので、縦横を無視して実質$_4 C _2 = 6$通りの散布図を見ます。Species毎に色分けします。

plot関数を使えばまとめてみれます。

> plot(iris, col=as.integer(iris$Species))

f:id:rikeizine:20140914235003p:plain

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プログラミングなどの記事を書いていこうと思います。記事は数ページに抑えようと思います。

参考資料