LoginSignup
23
27

More than 5 years have passed since last update.

R の基本的な使い方と処理の流れ

Last updated at Posted at 2014-07-15

いままで R の基本的なデータプロッティングファイル入出力方法クリップボードからのデータ取り込み方法Python からの R 呼び出し方法などを紹介してきました。今日はチュートリアルとして、あらためて R の基本的な文法や使い方そして処理の流れを解説していきたいと思います。

R での処理の流れ

R でデータを処理する流れは主に次の通りです。

  1. データを用意する
  2. 計算をする
  3. レポーティングする

データを用意する

処理対象のデータが無ければ何もできません。 R では他のプログラミング言語と同じように変数にデータを格納します。

変数の定義と利用

# x に 10 を格納する
x <- 10
# 変数を呼ぶと格納された値が返る
x
#=> 10
x * 2
#=> 20

ベクトル空間

線形代数では n 個の数を直線に並べた形を n 次元数ベクトルと言います。また実数を成分とする n 次元数ベクトルの全体を実数体上の n 次元数ベクトル空間といい、次のように書きます。

R^n

数ベクトルについては、結合法則、交換法則、実数倍の加法性、実数の加法と実数倍の加法といった定理が公式として成り立ちます。ベクトルを定数倍する操作をスカラー乗法と言います。

  • 加法 : 集合 V の任意の 2 つの要素 a,b について、これらの和と呼ばれる V の要素 a + b が決まる
  • 実数倍 : 集合 V の任意の要素 a と実数 c について a の c 倍と呼ばれる V の要素 ca が決まる
vec <- c(10, 20, 30)
vec
#=> [1] 10 20 30

# スカラー乗法
vec * 2
#=> [1] 20 40 60

# ベクトル成分の参照
vec[1]
#=> [1] 10

行列

数ベクトル空間の間の一次写像を具体的に表すものを行列と言います。

mat <- matrix(c(10, 20, 30, 40, 50, 60), 2, 3)
mat
#=>     [,1] [,2] [,3]
#  [1,]   10   30   50
#  [2,]   20   40   60

# 行列成分の参照
mat[1,1]
#=> [1] 10
# 行
mat[1,]
#=> [1] 10 30 50
# 列
mat[,2]
#=> [1] 30 40

上の例では 3 x 2 行列を作っています。

このように m x n 行列を作るには matrix 関数を使います。

線形代数で言うような基本変形や結合法則、転置なども適用できます。

ちなみにベクトル空間 V のベクトル u_1, u_2, ... u_n があって V のどのベクトル x も

x = x_1u_1 + x_2u_2 + ... + x_nu_n

と表されるとき u_1, u_2 ... u_n は V の生成系であると言います。これらが一次独立であり V を生成するとき、これらはベクトル空間 V の基底であると言います。

なお m x n 行列はプログラミング言語の用語ではデータフレームとも言います。

計算をする

関数に引数を与えることで、その関数の戻り値を得られます。

関数を利用する

たとえば統計量を得る関数のような主要な数学関数はほとんどのものが揃っています。

関数 説明
sum 合計
mean 平均
sd 標準偏差
sum(vec)
#=> [1] 60
sum(mat)
#=> [1] 210

関数を定義する

ビルトインでも関数は用意されていますが、関数は自分で定義可能です。

# 不偏分散を求める関数 varp を定義してみる
varp <- function(x) {
  result <- var(x) * (length(x) - 1) / length(x) 
  return (result)
}

# varp を使ってみる
varp(vec)
#=> [1] 66.66667
varp(mat[1,])
#=> [1] 266.6667
varp(mat[,1])
#=> [1] 25

このように R では無名関数を変数に代入することで関数を定義できます。上の例では次のような不偏分散を求める式を定義した無名関数を varp という変数に代入しているのと同じです。すべてが無名関数だと考えればわかりやすいですね。

function(x) { var(x) * (length(x) -1) / length(x) }

クロージャ

無名関数を利用すればクロージャを作ることもできます。

# クロージャの内部で x を増加
func <- function() {
  x <- 0
  function() {
    x <<- x + 1
    return (x)
  }
}

# クロージャの外部で x を定義 
x <- 10
closure <- func()

print(x)
#=> [1] 10
print(closure())
#=> [1] 1
print(closure())
#=> [1] 2
print(closure())
#=> [1] 3
# 外部の x は変化していない
print(x)
#=> [1] 10

レポーティングする

ファイルの入出力をする

read.csv などの関数で読み込んだ CSV ファイルはデータフレームとして扱えます。反対にデータフレームを write.csv 関数で CSV ファイルに出力することもできます。このあたりは以前に R でのファイル入出力の方法で説明した通りです。

プロッティングする

これも以前にR の基本的なデータプロッティングで説明した通りです。

# プロッティングする関数を定義しておく
img <- function(x) {
  png("image.png", width = 480, height = 480, pointsize = 12, bg = "white", res = NA)
  plot(x, y)
  dev.off()
}

x = 1:10
x
#=> [1]  1  2  3  4  5  6  7  8  9 10
y = x^2
y
#=> [1]   1   4   9  16  25  36  49  64  81 100

# プロッティングする
img(x, y)

image.png

パッケージを使う

install.packages(パッケージ名) することによりパッケージを利用することができます。

# ミラーを指定する (この例では統計数理研究所を指定)
options(repos="http://cran.ism.ac.jp")

# パッケージをインストールする
install.packages('ggplot2')

# インストール済みパッケージの一覧を見る
library()

GNU/Linux の場合、管理者があれば /usr/local/lib/R/site-library に、書き込み権限が無ければホームディレクトリにインストールされます。どのようなパッケージがインストール済みかは library() とすると参照できます。

オススメのパッケージ

以前にもよく使う R のパッケージ一覧で紹介しましたが、データサイエンティストを目指すなら知っておきたいRパッケージ10個+αという記事も参考になりますのであわせて紹介します。一部筆者の独断でパッケージを増減しています。

パッケージ名 説明
randomForest ランダムフォレスト、強力な汎用予測モデル
plyr データ集約
reshape2 データ加工
forecast 時系列予測
stringr 文字列操作
lubridate 日付操作
sqldf SQL ライクなデータ操作
ggplot2 高度なプロッティング
qcc 品質管理
party 決定木が綺麗に描ける
gbm randomForest より汎用性の高い強力な予測モデル
survival 生存分析
caTools,Epi 予測モデルの性能評価に必要な ROC 曲線が描ける、 AUC を計算できる
XLConnect エクセルのデータを読み込める、Rオブジェクトをエクセルに保存できる
DMwR "Data Mining with R" の著者が作った強力なデータマイニンングパッケージ

またこちらの R パッケージ一覧も参考になるでしょう。こちらはパッケージ名の掲載は省略します。

CRAN ミラーのパッケージを探る

CRAN には R のパッケージが数千あり、全世界にミラーされています。日本でも筑波大学統計数理研究所会津大学東京大学兵庫教育大学のミラーが存在します。

CRAN のパッケージリストは次の Wiki を参照すると良いでしょう。
http://www.okada.jp.org/RWiki/?CRAN%A5%D1%A5%C3%A5%B1%A1%BC%A5%B8%A5%EA%A5%B9%A5%C8

また R のための検索エンジンもあります。
http://seekr.jp/

どこのミラーを使ったら良いかについてはCRAN のミラーはどこが速いか調べた記事もあるので参考にすると良いでしょう。

車輪の再発明を避け、これらを利用して適宜必要なライブラリを利用すると良いでしょう。

実践例

重回帰分析

毎度おなじみ青木先生のページの内容にしたがって重回帰分析をしてみます。あらかじめソースコードを UTF-8 でファイルに保存しておきます。

# ソースコードを読み込む
source("mreg.R")

# データを作る
dat <- matrix(c(
  1.2, 1.9, 0.9,
  1.6, 2.7, 1.3,
  3.5, 3.7, 2.0,
  4.0, 3.1, 1.8,
  5.6, 3.5, 2.2,
  5.7, 7.5, 3.5,
  6.7, 1.2, 1.9,
  7.5, 3.7, 2.7,
  8.5, 0.6, 2.1,
  9.7, 5.1, 3.6
), byrow=TRUE, nc=3)

# データの中身を確認する
dat
#=>      [,1] [,2] [,3]
#   [1,]  1.2  1.9  0.9
#   [2,]  1.6  2.7  1.3
#   [3,]  3.5  3.7  2.0
#   [4,]  4.0  3.1  1.8
#   [5,]  5.6  3.5  2.2
#   [6,]  5.7  7.5  3.5
#   [7,]  6.7  1.2  1.9
#   [8,]  7.5  3.7  2.7
#   [9,]  8.5  0.6  2.1
#  [10,]  9.7  5.1  3.6

# 関数を呼び出す
mreg(dat)
#=>       偏回帰係数  標準誤差    t 値       P 値 標準化偏回帰係数 トレランス
#  Var1      0.20462 0.0075643 27.0506 2.4192e-08          0.67067    0.98358
#  Var2      0.28663 0.0108015 26.5365 2.7638e-08          0.65793    0.98358
#  定数項    0.14918 0.0545063  2.7368 2.9050e-02                            

#  回帰の分散分析表

#         平方和 自由度  平均平方   F 値       P 値
#  回帰 6.671644      2 3.3358218 823.48 4.9319e-09
#  残差 0.028356      7 0.0040509                  
#  全体 6.700000      9 0.7444444                  

#  重相関係数 = 0.99788 
#  重相関係数の二乗 = 0.99577 
#  自由度調整済重相関係数の二乗 = 0.99456 
#  対数尤度 = 15.13807 
#  AIC = -22.27614 

まとめ

R の基本的な文法や使い方を一通り説明しました。あとは必要に応じて様々なパッケージを利用したり、先人の書いたソースコードなどを参考に、データ分析の数式を R のコードに落としてどんどん使っていきましょう。

23
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
27