...

こちらからダウンロードしてください

by user

on
Category: Documents
11

views

Report

Comments

Transcript

こちらからダウンロードしてください
「やさしい確率・情報・データマイニング(第 2 版)」
●解析ツールについての解説
R のインストールと使い方 .......................................................................................... 2
A.1 システムのインストール ................................................................................... 3
A.2 システムの起動 ................................................................................................. 3
A.3 ヘルプで調べる ................................................................................................. 5
A.4 パッケージのインストール ............................................................................... 6
A.5 データと変数 ..................................................................................................... 7
A.5.1 データの種類 .............................................................................................. 7
A.5.2 データのまとまりを扱う ............................................................................ 9
A.5.3 行列とデータフレーム .............................................................................. 12
A.5.4 値を取り出す ............................................................................................ 12
A.6 ファイルからのデータの入出力 ...................................................................... 15
A.7 プログラミングの初歩 .................................................................................... 17
A.7.1 関数を使う ................................................................................................ 17
A.7.2 分岐処理 ................................................................................................... 19
A.7.3 全要素の処理(ループと apply) ............................................................. 19
1
R のインストールと使い方
データマイニングでは,多くの計算処理や手続きを実行する必要がある.商品とな
っているツールは,高額なものが多く個人での購入は難しいだろう.一方でフリーソ
フトとして提供されているものもあり,よく利用されている.個人で扱う程度のデー
タ量なら,処理速度の点でも何ら問題ない.表 1 に典型的なツールの特徴をまとめて
いる.
ここでは,第 5 章で使っている R について,インストール方法と簡単な使い方の説
明をする.これらは,バージョンアップなどの改良が行われたり,情報を提供してい
るホームページが移動したりすることもある.ここで説明する内容と違っている場合
もあることをご了解いただきたい.インターネット上で検索してみると多くの情報が
あるので,それらも参考にしていただきたい.
表1
データマイニングに利用可能なツールの特徴
ツール
特
徴
・ プログラム言語なので少し学習が必要だが,パッケージを組み込む
R
(フリー)
ことでデータマイニングに利用できる.多数公開されている他分野
のパッケージも利用できる.利用者独自のシステムを実現できる豊
富な仕組みをもつ.
・ マニュアルは英語.日本語の解説書や情報が容易に入手できる.
・ データマイニング専用ツールなのですぐに利用できるが,専用ツー
ルなので他分野のツールとの連携には工夫が必要となる.
Weka
(フリー)
・ プログラミングによりツール自体の機能を拡張する機能はないが,
Weka が実装している各種アルゴリズムを Java から呼び出す方法が
公開されている.これを使って利用者独自のシステム化も可能.
・ マニュアルは英語である.Web 上に日本語の情報もあるが,やや不
足ぎみである.日本語の書籍も不足している.
・ 有償の表計算ソフトであるが,安価であり広く使われている.類似
のフリーソフトもある.日本語での情報も豊富にある.
Microsoft
Excel
(有償)
・ データ分析の機能やデータ可視化の機能も提供されており,データ
マイニングツールとしても利用できる.VBA によりプログラミング
することで,独自機能を実現したり既存機能の改良ができる.
・ Linux 上では,そのままでは動かないので,類似ソフトを使うか仮
想マシンでの実行となる.
2
A.1 システムのインストール
R とはデータ処理や統計解析のためのソフトウェアであり,フリーソフトとして無
償で利用できる.一種のプログラム言語なので,最初に少し学習が必要となる.提供
されている機能を使うだけではなく,さらに高度な機能を利用者が容易に実現するこ
ともできる.さまざまな人々が R を利用しており,開発した機能をパッケージとして
提供している.それらは CRAN(The Comprehensive R Archive Network)というと
ころからフリーでダウンロードして使うことができる.データマイニングに関するパ
ッケージも提供されているので,R をデータマイニングツールとして使うことができ
る.
CRAN には下記のミラーサイトが日本にある.これらのページにアクセスすると
(ページは英文で書かれている),一番上の目立つところに「Download and Install R」
と書かれた部分がある.Windows や Mac, Linux などの環境に応じて,ダウンロード
するようになっているので,自分の環境に応じたものを選択する.本書では Windows7
上で 32bit 版の R-2.15.1 を利用している.
http://essrc.hyogo-u.ac.jp/cran/
http://cran.md.tsukuba.ac.jp/
http://cran.ism.ac.jp/
R に関する情報交換を目的としたサイト(岡田先生のご尽力で運営されている)も
下記 URL で公開されており,日本語で多くの情報を得ることができる.このサイト
から「R のインストール」を選択することもできる.R に関する日本語の入門書や専
門書は多数出版されているので,情報入手に困ることは少ないと思われる.
http://www.okada.jp.org/RWiki/
A.2 システムの起動
インストール時に「デスクトップ上にアイコンを作成する」を選択していれば,デ
スクトップ上に R のアイコンが作成されている.大きな R の特徴的なアイコンなので,
すぐに分かるはずである.それをダブルクリックすれば起動することができる.アイ
コンを作成していない場合には,デスクトップ画面左下の「スタート」を左クリック
して,
「すべてのプログラム」→ 「R」→ 「R.2.15」を選択すれば起動する.ただし,
インストールしたバージョンにより,R i386 2.15.0 や R x64 2.15.0 などとなってい
るので注意すること.起動した直後は図 1 のようになり,白い画面(コンソール画面)
から,ユーザがコマンド等を入力すると,システムからの応答もその画面上に表示さ
れる.
3
図 1 起動直後の R(コンソール画面)
この画面上でたとえば,1+2 と入力して ENTER キーを押すと,下記のように 3 が
出力される.3 の前に出ている[1]は,これが 1 番目のデータという意味である.後に
学ぶベクトルのような,データが並んだものを出力するときには,何番目ということ
が意味をもってくる.C 言語や Java などと異なり,R ではコンパイルという作業を
することなく,入力したコマンドが直ちに実行され結果が出力されるので,思いつい
た処理をすぐに行って確認することができる.1 ! 2 のような誤ったものを入力すると,
エラーであることが表示される.
> 1+2
[1] 3
>1!2
エラー:
予想外の '!' です
( "1!" の)
上記の足し算のように,短い入力で完結する場合にはコンソールウィンドウに直接
タイプすればよいが,ある程度の量のコマンドを組み合わせた作業の場合には,途中
で入力ミスなどによりエラーとなると,最初からやり直しとなってしまい面倒である.
それを防ぐためにメモ帳(Windows の場合)などを利用するとよい.メモ帳は,デス
クトップ左下の「スタート」→「すべてのプログラム」→「アクセサリ」→「メモ帳」
で起動できる.ここに R に入力する一連のコマンドを入力して,それをコピーして R
のコンソール画面にペーストするだけでよい.もしエラーがあれば,メモ帳で修正し
て再度コピー&ペーストを行う.メモ帳へ入力したものに名前を付けて保存しておけ
ば,後に類似の操作を行いたい場合に再利用することができる.メモ帳等なんらかの
方法で作成したファイルの内容を読み込む source()という機能も用意されている.こ
れを使うときには,後に述べるように,読み込むファイルがあるディレクトリ(フォ
4
ルダ)の場所に注意すること.プログラム言語として利用する場合にはこのような使
い方が便利である.
入力の途中で ENTER キーを押したときには,その入力を完成させるように促すメ
ッセージ + が表示されるので続いて入力を行えばよい.
> 1-2-
# 最後の数値を入れずに ENTER を押した
+3
# この+は R からのメッセージ.足し算記号ではない
[1] -4
# 入力完了したので計算結果を表示
> (1+2+3
# 最後のカッコ ) 入力前に ENTER を押した
+)
# R からのメッセージに答えて ) を入力
[1] 6
# 入力完了したので計算結果を表示
A.3 ヘルプで調べる
R にはヘルプを出力する機能も組み込まれている.help に続けて知りたい項目(見
出し語)を入力すれば,ブラウザ上に説明が表示される(ただし,ほとんどの場合は
英語).この help では,見出し語となっている項目しか検索できないが,
help.search(“文字列”)とすれば,説明中に文字列を含む項目の説明を調べることがで
きる.
> help(help)
# help が見出し語となっている説明の表示(図 2)
> help.search("help")
# 引用符を付けて呼び出す.help を含む説明が表示される(図 3)
上記の実行例で,# 以降の部分はコメント(注釈)であり,R は#から行の終わりま
でを無視する.R のプログラムを作るときには,後で分かるように,適宜コメントを
入れておくのがよい.これ以降,本書でも説明のためにコメントを使う.
図 2 help により調べた結果(見出しが一致するもののみ出力)
5
図 3 help.search により調べた結果(より広く検索して出力)
A.4 パッケージのインストール
先に述べたようにさまざまな拡張機能がパッケージとして提供されている.これら
は,R の熱心な利用者により維持されているものである.本書でのデータマイニング
体験のためには,これらのいくつかをインストールする必要がある.上記の図 1 に示
す起動直後の画面で,一番上のメニューバーのところにある「パッケージ」を選択し,
さらに「CRAN ミラーサイトの設定」を選択する.
図 4 パッケージのインストールを選択
その後メニューが示されるので,日本国内からであれば Japan(Hyogo),
Japan(Tsukuba),Japan(Tokyo)の中からいずれか(自分の場所に近いもの)を選択
する.次に再び,メニューバーの「パッケージ」を選択して,
「パッケージのインスト
ール」を選択すると利用可能なパッケージの選択メニューが示される.ここから必要
なパッケージを選択すればインストールが開始され,下記のような出力が表示される.
> utils:::menuInstallPkgs()
(出力表示一部省略)
#パッケージインストール選択で表示され自動的に開始する
# いろいろなメッセージが表示されるが省略している
ダウンロードされたパッケージは、以下にあります
C:¥Users¥(ここには実際にパッケージを置く場所の情報が入る)¥downloaded_packages
パッケージのインストールは,このようにメニューから選択することもできるが,
6
以下のようにすることもできる.ミラーサイトの指定をしていない場合には,サイト
を選択するためのウィンドウが表示される.
> install.packages("ここにパッケージ名を書く")
# 一度に複数のインストール可能.ヘルプ参照
データマイニングに関連するパッケージには,たとえば表のようなものがある.イ
ンストール済のパッケージを利用する方法は第 5 章の例題で説明する.
表2
データマイニング関連など本書で利用する R パッケージ
パッケージ名
arules
arulesViz
概要
association rules の意味であり,相関ルールのマ
イニング機能を提供している.
相関ルールマイニングの結果を可視化して解析す
るための機能を提供している.
データの出現順番にも意味をもたせたシーケンス
arulesSequences
として,相関ルールマイニングを実行する機能を
提供している.
rminer
qcc
quantmod
ニューラルネットワークなどのマイニング機能が
提供されている.
quality control chart の意味であり,統計的品質
管理で用いる機能が提供されている.
quantitative financial modeling framework の意
味であり,金融分野での機能である.
パッケージのインストールは R 自体の初期化や再インストールを行わない限り,一
回だけでよい.ただし,R を起動するごとにパッケージを利用するという宣言をする
必要がある.このためには以下のように,library(パッケージ名)とすればよい.
> library(qcc)
# インストール済のパッケージを利用することを宣言
要求されたパッケージ MASS をロード中です
Package 'qcc', version 2.2
(出力表示省略)
A.5 データと変数
A.5.1 データの種類
R では数値だけでなく文字や文字列などの型のデータを扱うことができる.文字列
7
は引用符 ” で囲まれたものである(引用符は ’ を使っても同じであるが本書では ”
で統一している).1 は数値データであるが,”1”のように引用符で囲むと 1 という文
字を示す文字型となる.数値と文字とは,全く異なるものとなる.人間の目には類似
でも,R にとっては別物なので注意すること.
論理型は正しい(TRUE)と間違い(FALSE)に対応する 2 値のみを取り,かつ(AND),
または(OR),~でない(NOT)などの論理演算を適用することができる.論理積と
論理和は各々2 つの記号(&と&&,|と||)があるが,後に説明するように,ベクト
ルというデータに対して適用したときに違いがある.
その他に,因子型(factor)や複素数型(complex)もある.Web でも調べられる
ので,興味ある読者への課題としておく.
表 3 論理演算の種類と記号
論理演算
記号と利用例
かつ(論理積,AND)
&または&&,x&y,x&&y
または(論理和,OR)
|または||,x|y,x||y
~でない(否定,NOT)
!,!x
排他的論理和(XOR)
xor,xor(x,y)
変数とは通常のプログラム言語と同様に,データを記憶しておくための場所である.
ただし,C 言語や Java などとは異なり,R では変数名宣言や型宣言は不要である.
最初に代入するときに自動的に型が決定される.変数にデータを代入したり,変数間
で演算したり,変数を関数に渡して処理を行ったりすることができる.以下の例のよ
うに,変数への代入は<-という記号を使う.このような記号はキーボードにはなく,
不等号<に続けてマイナス-をタイプしたものである.この例では,x と y には数値
の 1,2 を代入しているので足し算(+)という演算を行うことができる.v と w は文
字としての 1 や 2 なので,足し算が定義されておらずにエラーとなっている.
> x <- 1
# 変数 x に数値の1を代入
> y <- 2
# 変数 y に数値の 2 を代入
>x+y
# x+y の計算
[1] 3
# 最初の[1]は出力の 1 番目という意味
> v <- "1"
# 変数 x に文字の1を代入
> w <- "2"
# 変数 y に文字の 2 を代入
> v+w
# 文字には足し算はないのでエラーとなる
以下にエラー v + w :
二項演算子の引数が数値ではありません
8
> m <- TRUE
# 変数 m に論理型の TRUE(真)を代入
> n <- FALSE
# 変数 n に論理型の FALSE(偽)を代入
>m&n
# TRUE かつ(論理積) FALSE の論理演算なので結果は FALSE
[1] FALSE
>m|n
[1] TRUE
# TRUE または(論理和) FALSE の論理演算なので結果は TRUE
A.5.2 データのまとまりを扱う
データ処理では,いくつかのデータをひとかたまりとして扱うと便利なことが多い.
R ではベクトル,行列,配列,データフレームなどとして,まとめて扱うことができ
るようになっている.これらの概要や主な操作は以下のようになる.
表 4 代表的な R のデータ構造と概要
種類
概要
ベクトル
行列
特徴
同じ型のデータを並べたもの.
各要素に一斉に演算や関
(数学のベクトルと類似)
数の適用が可能.
同じ型のデータを 2 次元上に並べ
行列上の数学演算が多数
たもの.(数学の行列と類似)
利用可能なので,数値的な
統計解析が容易に可能.
データフレーム
行列と同様にデータの 2 次元上の
エクセルなどのテーブル
並びだが,データの型が異なって
形式のデータとの親和性
いてもよいもの.
が高く現実問題への対応
能力が高い.
R のベクトルは同じ型のデータを並べたものであり,数学での場合と同様である.
関数 c()を使って以下のように生成できる(c は combine からきている).
> x <- c(1,2,3)
# 数値の 1,2,3 からなるベクトル
>x
# x を表示
[1] 1 2 3
> y <- c(4,5,0)
# 数値の 4,5,0 からなるベクトル
>y
# y を表示
[1] 4 5 0
> v <- c("a", "b", "c") # 文字の a,b,c からなるベクトル
>v
# y を表示
9
[1] "a" "b" "c"
> w <- c(1, "a", 3)
# 文字 a を含むベクトル
>w
# ベクトルの要素は同じ型なので 1,3 は文字と解釈される
[1] "1" "a" "3"
# 要素全部が文字となっている
ベクトルの四則演算・冪,論理演算,数学関数
上の例では x と y は 3 要素の数値ベクトルとなる.数値ベクトルには,四則演算や
べ き
冪 が要素ごとに演算するものとして定められている.x+y とすればベクトル 5,7,3 が
得られる.ベクトルの長さが違う場合には,短い方のベクトルを巡回延長して長さを
合わせてから演算する.各自で実験して確認されたい.
数学関数(三角関数,指数関数,整数部分取り出しや小数点以下の処理関数など)
を func()とすれば,func(x)とすることで x の要素ごとにこの数学関数を適用した結果
のベクトルが得られる.たいていの場合,ベクトルに演算や操作を行うとその結果も
期待した通りのベクトルとなるようになっている.この機能により,R ではベクトル
として表されているデータに対して,一気に処理を行うことができる.
論理演算は,等しい(==),等しくない(!=),大小比較(<,<=,>,>=)がある
が,これをベクトルに適用すると要素ごとにその論理演算を適用した結果のベクトル
となる.ただし,結果のベクトルの要素は真偽を表す論理値である TRUE,FALSE
である.ベクトルと実数値を比較すると,各要素をその実数値と比較した結果の論理
値ベクトルが解となる.長さが異なる場合については,四則演算等と同様に短い方が
巡回延長される.各自実験して確認されたい.
> x <- c(1,2,3)
> y <- c(4,5,0)
>x+y
# ベクトルの四則演算は要素ごとに行う
[1] 5 7 3
> cos(x)
[1]
# ベクトルへの関数適用は要素ごとに計算される
0.5403023 -0.4161468 -0.9899925
> log(x)
# ベクトルへの関数適用は要素ごとに計算される
[1] 0.0000000 0.6931472 1.0986123
>x<y
# ベクトル間の比較は要素ごとになされ結果が論理ベクトルとなる
[1] TRUE TRUE FALSE
> x <= 2
# ベクトルと数値(スカラー)の比較は要素ごとになされる
[1] TRUE TRUE FALSE
10
表 3 の論理演算では論理積(論理和)には&(|)と&&(||)の 2 種類があることを示
している.&や|のように記号を 1 つだけ書くものはベクトルを対象として,要素ごと
に論理演算して結果を論理ベクトルとする.一方,&&や||では結果が単一の(すな
わちスカラーの)論理値となる.もしも&&や||にベクトルのデータを与えて演算す
ると,最初の要素だけを対象として結果をスカラーの論理値として返すので注意する
こと.&&や||は後に学ぶ条件分岐(if)での条件チェックに用いることが多い.
> (x < y) & (x <= 2)
# x,y は上の例で作ったベクトル
[1]
# 要素ごとの論理演算結果がベクトルに
TRUE
TRUE FALSE
> (x < y) && (x <= 2)
# 最初の要素だけ比較して結果はスカラー論理値に
[1] TRUE
ベクトル向けの関数と統計処理用の関数
ベクトルはデータの並びなので,その上での操作をする関数が定義されている.
rev(x)は x の並びを逆にするものであり,sort(x)では昇順のソートを行い,length(x)
では並んでいるデータ個数を出力する.x[1]のようにすれば,カッコ内の数値番目の
データが取り出される.ただし,最初を 1 として数える.x が数値のベクトルのとき
には,統計的な計算を行う関数がある.総和 sum(x),平均値 mean(x),最大値および
最小値 max(x),min(x)など豊富に提供されている.summary(x)とすることで,x に
対するいくつかの統計量を求めることもできる.
> x <- c(12,11,10,9,8,7,6,5,4,3,2,1)
# ベクトル x を定義
> length(x)
# x の長さを得る
[1] 12
> x[1]
# x の一番目(最初)の要素を得る
[1] 12
> sort(x)
[1]
1
# x を昇順にソート.降順にソートも可能
2
3
4
5
6
7
8
9
10
> summary(x)
12
# x の統計量を求める
Min.
1st Qu.
Median
Mean
1.00
3.75
6.50
6.50
> sum(x)
11
3rd Qu.
9.25
Max.
12.00
# x の和を求める
[1] 78
なお summary(x)での出力は Min.(最小値),1st Qu.(第 1 四分位値),Median(中
央値),Mean(平均),3rd Qu.(第 3 四分位値),Max.(最大値)を表している.こ
れらの意味については第 5 章の最初で学ぶ.
11
A.5.3 行列とデータフレーム
R での行列は数学での行列と同様である.データを行と列の 2 次元に並べたもので
あるが,すべてのデータは同じ型でなければならない.数値の行列に対しては,数学
での行列演算に対応するものが提供されているので便利である.
データフレームとは,異なる型のデータをまとめて扱うためのもので,テーブル形
式をもったものである.形の上では行列と似ているが,格納されているデータ型が異
なっていてもかまわないことと,データフレームの列には一意の名前(ラベル)が付
けられ,名前により列を操作できることが異なっている.実際のデータ処理を行う場
合には,データフレームがつかわれることが多いので,その処理について説明する.
データフレームの作成
列の名前を与え,その名前の列に入るデータベクトルを指定することで作成するこ
とができる.列(縦)方向のデータをベクトルとして与えて,データフレームを作る
関数 data.frame()が準備されていて,その一般的な書き方は次の通りである.この関
数は読み込んだ結果をデータフレームとして返すので,それを適切な名前の変数に格
納しておけば,その後の処理が楽になる.
data.frame(列名 1 = ベクトル 1, ... ,列名 n = ベクトル n)
次が実行例であるが,このデータフレームは図 5 のテーブルと同じである.
v1 <- c("sunny", "sunny", "overcast", "rainy")
v2 <- c(34.1, 33.5, 35.0, 25.0)
v3 <- c("high","high","high","high")
v4 <- c(FALSE, TRUE, FALSE, FALSE)
v5 <- c("no", "no", "yes", "yes")
frm_tst <- data.frame(SKY=v1, TEMP=v2, HUMID=v3, WIND=v4, PLAY=v5)
SKY
TEMP
HUMID
WIND
PLAY
sunny
34.1
high
FALSE
no
sunny
33.5
high
FALSE
no
overcast
35.0
high
FALSE
yes
rainy
25.0
high
FALSE
yes
図 5 テーブル形式のデータがデータフレームとなる
A.5.4 値を取り出す
ベクトル,行列,データフレームなどでデータの集まりを表現することができるが,
12
その一部だけを取り出したいことがよくある.R ではそのための方法が充実しており,
データベース操作の言語に匹敵する機能をもっている.
ベクトルの場合には,先に例を示したように,C 言語や Java などの配列と同じよう
に指定した位置の要素を取り出すことができる.位置を 1 つだけ指定するのではなく,
複数指定してそれらをベクトルとして取り出すこともできる.それだけでなく,以下
の例のように条件を与えてそれを満たす要素からなるベクトルを得ることができる.
subset(データ名,条件)
データ名[条件]
>x
# x はベクトルのデータが入っている
[1] 1 2 3
> x[1]
# 1 番目の要素だけを取り出す
[1] 1
> x[c(2,3)]
# 1 番目と 3 番目(ベクトルで指定)を取り出しベクトルに
[1] 2 3
> subset(x, x>1)
# 1 より大きい要素だけ取り出したベクトルを得る
[1] 2 3
> subset(x, (x>1) & (x<3))
# 条件は論理演算を組み合わせてもよい
[1] 2
> x[x>1]
# subset の代わりに[]で条件を指定してもよい
[1] 2 3
> x[(x>1) & (x<3)]
# []中の条件は論理演算を組み合わせてもよい
[1] 2
データフレームや行列の場合には,行や列の番号を指定することで,その行(また
は列)だけを取り出すことができる.1 行(列)だけでなく複数行(列)を取り出す
こともできる.以下のように指定すれば,指定した部分を含む部分的なデータを取り
出すことができる.行や列の指定をせずに空欄としておけば,すべての行(列)を取
り出すことを意味する.
データフレーム名[指定する行,指定する列]
> frm_tst[3, ]
SKY
3
# 3 行目の全部の列を取り出す.コンマに注意
TEMP
overcast
> frm_tst[ ,2]
HUMID
35
high
WIND
PLAY
FALSE
yes
# 2 列目の全部の行を取り出す.コンマに注意
[1] 34.1 33.5 35.0 25.0
> frm_tst[c(1,3),]
# 1 行目と 3 行目の取り出し.取り出す場所をベクトルで指定
13
SKY
TEMP
HUMID
WIND
PLAY
1
sunny
34.1
high
FALSE
no
3
overcast
35.0
high
FALSE
yes
行や列に名前が付いている場合には,その名前を使って操作することができる.デ
ータフレーム名$列名(たとえば,frm_tst$SKY)のように列名を指定して,その列
だけを抜き出すことができる.また,ベクトルの場合と同様に subset により条件式を
満たすデータを取り出すこともできる.カッコを用いて条件を指定してよいことも同
じである.その結果は元のデータフレームの一部からなるデータフレームとなる.ベ
クトルも場合もデータフレームの場合も,このように取り出した結果を変数に格納す
ることも自由にできる.
> frm_tst$SKY
[1] sunny
# 列名が SKY のところだけを取り出す
sunny
overcast
rainy
Levels: overcast rainy sunny
# 3 つの値は因子型として格納されている
> frm_tst$TEMP
# 列名が TEMP のところだけを取り出す
[1] 34.1 33.5 35.0 25.0
> subset(frm_tst, SKY=="sunny")
SKY
# SKY の値が sunny の行だけを抜き出す
TEMP
HUMID
WIND
PLAY
1
sunny
34.1
hight
FALSE
no
2
sunny
33.5
hight
TRUE
no
> subset(frm_tst, TEMP > 34.0)
SKY
# TEMP の値が 34 より大の行だけを抜き出す
TEMP
HUMID
WIND
PLAY
1
sunny
34.1
hight
FALSE
no
3
overcast
35.0
hight
FALSE
yes
> frm_tst[frm_tst$TEMP>34, ]
SKY
TEMP
HUMID
# 条件を満たす行だけ取り出す.コンマに注意
WIND
PLAY
1
sunny
34.1
high
FALSE
no
3
overcast
35.0
high
FALSE
yes
データを取り出すための仕組みは他にもいろいろとあるが,指定した部分を除外する
方法と連続した数値を生成する方法は覚えておくと便利である.
> frm_tst[-1, ]
SKY
# -を付けることで「1 以外」という意味を表す
TEMP
HUMID
WIND
PLAY
2
sunny
33.5
high
FALSE
no
3
overcast
35.0
high
FALSE
yes
25.0
high
FALSE
yes
4
rainy
14
> frm_tst[1:2, ]
# m:n により m から n までの連続した数を生成する
SKY
TEMP
HUMID
WIND
PLAY
1
sunny
34.1
high
FALSE
no
2
sunny
33.5
high
FALSE
no
A.6 ファイルからのデータの入出力
データマイニングでは,データベースソフトで管理されている大量のデータを扱う
ことが多い.そのため, R ではデータベースにあるデータを読み込む機能が提供され
ている.ここでは,本書レベルでの実験を容易にするために,エクセル等を使ってテ
キスト形式で保存されているデータファイルから,一度にデータフレームへ読み込む
方法を学ぶ.このような場合には,csv,ssv,tsv などの形式でデータファイルを準
備しておいて,それを R で読み込む方法が便利である.csv とは,データ間がコンマ
で区切られた形式であり(comma separated values),ssv や tsv は各々スペース
(space),タブ(tab)でデータが区切られた形式である.エクセルなど表計算ソフ
トや MySQL などのデータベースソフトでは,データをこれらの形式で出力すること
ができる.
このようなファイルの読み込み方法はいくつかあるが,本書では次の方法だけを示
しておく.たいていの場合には,これで間に合うはずである.
read.rable(ファイル名,区切り記号,ヘッダーの有無,行名の有無)
最初の引数には,引用符で囲んでファイル名を与える.R の作業フォルダの場所に
ファイルがあるなら,このようにファイル名だけでよい.現在の作業別のフォルダの
場所は,getwd()と入力すれば表示される.作業フォルダとは別の場所にファイルがあ
る場合には,フルパス名で指定するかまたは図 6 のように,あらかじめ R 側でファイ
ルのある場所に作業フォルダの場所を移動しておく方法もある.コンソール画面左上
の「ファイル」から「ディレクトリの変更」を選択すると,どこに移動するかを選ぶ
ウィンドウが表示される.ディレクトリとは Linux 等の Unix 系の OS で使われる用
語で,Windows でのフォルダとほぼ同じ意味である.コンソール画面から setwd(“移
動するディレクトリ(フォルダ)のフルパス”)を入力してもよい.これらの機能の詳
細は先に学んだ help を使って確認できる.
15
図 6 作業フォルダ(ディレクトリ)の変更
区切り記号はデータを区切っている記号を示すものであり,sep=”,”のように書く.ヘ
ッダーの有無は,最初の 1 行目がデータか列名かを示すものである. header=T ある
いは header=TRUE としておくと,先頭行は列名として扱われる.header=F または
header=FALSE とするか,この指定を省略すれば先頭行もデータであり列名はファイ
ルに入っていないと見なされる.その場合には,自動的に生成された列名が付く.
SKY, TEMP, HUMID, WIND, PLAY
sunny, 34.1, high, FALSE, no
sunny, 33.5, high, FALSE, no
overcast, 35, high, FALSE, yes
rainy, 25, high, FALSE, yes
図 7 csv ファイルに格納されたデータの例
# 図 8 の csv ファイルをデータフレームに読み込む
> tsttbl <- read.table("ファイル名", sep=”,”,header=TRUE)
図 8 のデータでは,先頭行は上の例と同じく列名であるが,各行の最初(第 1 列目)
にそのデータの名前が入っている(事例 1~事例 4).行の名前なので,これらもデー
タそのものとは区別する必要がある.このようなデータを読込む場合には,ファイル
の最初の列に入っている情報が行の名前であるという指定 row.names=1 とすればよ
い.なお,エクセルなどから csv 形式に変換するとき,値が入っていないセルは図 8
の第 1 行第 1 列目のように空欄となる.
16
,SKY,TEMP,HUMID,WIND,PLAY
事例 1,sunny,34.1,high,FALSE,no
事例 2,sunny,33.5,high,FALSE,no
事例 3,overcast,35,high,FALSE,yes
事例 4,rainy,25,high,FALSE,yes
図 6 第 1 列目が行名の csv ファイル
> tsttbl2 <- read.table("ファイル名", sep=",", header=TRUE, row.names=1)
> tsttbl2
SKY
TEMP
HUMID
WIND
PLAY
事例 1
sunny
34.1
high
FALSE
no
事例 2
sunny
33.5
high
FALSE
no
(出力表示一部省略)
R で作成したデータフレームを write.table()でファイルに出力することもできるの
で,処理をした結果のデータを保存しておくことができる.使い方は read.table()と
類似であるが,保存すべきデータフレーム名も与えなければならない.
write.rable(データ名,ファイル名,区切り記号,列名の有無,行名の有無)
> write.table(tsttbl, file="tstcsv.csv", sep=",", col.names=TRUE, row.names=TRUE)
ここで学んだ入出力の方法が分かればかなりの程度のことまではできるようになる
だろう.さらに進んだ内容については,参考書を見ていただきたい.
A.7 プログラミングの初歩
R の豊富な機能を本章で紹介することは不可能なので,データマイニングのための
データ処理に限定してごく一部の機能だけに集中する.第 4 章の最初に学ぶように,
データマイニングではデータ前処理として,データをある基準に従って書き換えたり,
まとめたりすることが多い.そのために最低限度必要な機能を学ぶ.
A.7.1 関数を使う
数学で使う関数のようなものであり f(x1,...,xn)のように呼び出すと何らかの処理を
行って,関数の値(返却値)が求められるものである.付録.5 でいくつかの数学関数
の例を見たが,それらも関数である.R では利用者が自由に関数を定義して使うこと
ができる.そのための関数定義は
関数名 <- function(引数 1,...,引数 n) { 関数の本体定義 }
17
のように書く. 返却値をはっきりさせたいなら return(返却値)のように書いてもよい
が,return がないときには最後に実行された文の値が返却値となる.なお文が 1 つだ
けのときには,上の関数定義のカッコ{}を省略してよい.
> f1 <- function(x) { x*3 }
# 関数定義を与える.入力を 3 倍するだけの関数
> f1
# 関数 f1 は上記定義そのものである
function(x) { x*3 }
> f1(5)
# 関数に()で囲んで引数を付けると関数呼び出しになる
[1] 15
> f1(c(1,2,3,4,5))
[1]
3
6
9
12
# ベクトルを関数に渡すと返却値もベクトルとなる
15
上の実行例から分かるように,ベクトルのデータを関数に与えた場合,その関数の
中で行っている処理や演算がベクトルに対応したものであれば,関数の返却値もベク
トルとして得られる.
2 つ以上の引数を取る関数の場合も同様に定義して,呼び出すことができる.引数
については,何も指定をしなければ,関数定義で書かれている順番に与えられたもの
として解釈される.しかし,多くの引数を取る関数を作るときには,その順番を正し
く覚えておくことが難しくなる.そこで,引数名=値のように指定すれば順番とは無
関係にその引数への値として解釈してくれる.その他,本書では省略するが,多くの
引数をもつ関数を簡潔に扱うための仕組みが提供されている.
> f2 <- function(x,y) { x-y }
# 関数定義を与える
> f2(10,5)
# 関数に()で囲んで引数を付けると関数呼び出しになる
[1] 5
# 引数名を指定しないと定義の順番で解釈される
> f2(y=10,x=5)
# 引数名を指定して呼び出すこともできる
[1] -5
> f2(y=c(1,2,3), x=c(4,5,6))
[1]
3
3
# ベクトルを関数に渡すと返却値もベクトルとなる
3
R は関数型とよばれるプログラム言語であり,関数を集めて目的のプログラムを完
成させる.複数の処理を続けて行うときには,対応する関数を重ねて呼び出せばよい.
> f1(f1(f1(5)))
# ((5×3)×3)×3 を計算している
[1] 135
> f2(f1(5), f1(f1(5))) # (5×3) – (5×3)×3 を計算している
[1] -30
18
A.7.2 分岐処理
データをある値と比較して,それ以上なら"large",以下なら"small"と出力する関数
を考えよう.このような処理は,第 5 章で学ぶようなデータの離散化を行う場合によ
く使われる.このためには,値を比較した結果に応じて処理を分けるという条件分岐
を使う.他のプログラム言語と同様に if を使うことができ,以下のように書く.ただ
し,条件不成立のときに特に実行することがなければ else の部分を書かなくてもよい.
条件が成立したときや不成立のときに実行する部分に,さらに別の条件で分岐するた
めの if を使ってもよく,その段数をいくらでも重ねてかまわない.条件式の部分には,
その評価結果が真(TRUE)か偽(FALSE)かに定まるものを書く.
if(条件式) {条件成立の場合に実行する部分} else {不成立の場合に実行する部分}
> myreplace <- function(x) { if (x >= 5) "large" else "small" } # 5 以上かどうかで分岐
> myreplace(10)
[1] "large"
この関数 myreplace にベクトルを与えると次のようになる.警告が出ていることに
注意されたい.if の条件式の部分であるが,条件式を評価した結果が TRUE や FALSE
が複数並んだ論理ベクトルで得られると,条件式が成立しているのか不成立なのか決
められない.したがって,単一の(スカラーの)論理値でなければならない.もしも
論理ベクトルとなってしまうと,この警告にあるように,論理ベクトルの最初の論理
値だけを見て条件が成立がどうかを判定する.このように,関数の作り方によっては,
ベクトルに対して期待と違う動き方をするかもしれないので注意が必要である.
> myreplace(c(3,5,7,9))
# この関数にベクトルを与えてみる
[1] "small"
# 関数の返却値はベクトルにならない
警告メッセージ:
In if (x >= 5) "large" else "small" :
条件が長さが 2 以上なので,最初の一つだけが使われます
> c(3,5,7,9) >= 5
[1] FALSE
TRUE
# 結果は論理ベクトルなので,最初の FALSE のみが if で使われる
TRUE
TRUE
A.7.3 全要素の処理(ループと apply)
関数はたいていの場合にはベクトルに対して期待通りに動いてくれるが,先に見た
ように if などが使われているとうまくいかないこともある.ここでは,値が 5 以上か
どうかで large か small にデータを置き換える関数がベクトルに対して正しく動くよ
うにする方法を考える.C や Java など通常のプログラム言語に慣れた読者であれば,
for などのループ(繰り返し)を使って,ベクトルのすべての要素を取り出しながら
19
処理を適用するという方法をまず思いつくことだろう.つまり以下のような骨格をも
つプログラムである.
for ベクトルの最初から 1 個ずつ要素を取り出す
取り出した要素に処理を適用する
最後の要素に到達するまで上記処理を繰り返す
R でも for という繰り返し機能があり,
for(繰り返しの条件) {繰り返し実行する部分}
のように書くことができる.
>x
# x は長さ 4 のベクトルとして定義されている
[1] 3 5 7 9
> for(i in 1:length(x)) print("aa")
# x の長さ(4)だけ""aa""の表示を繰り返す
[1] "aa"
[1] "aa"
[1] "aa"
[1] "aa"
このように for を使って small や large への置き換えを機能を実現してみよう.置
き換え結果を入れるデータ領域を最初に準備しておく必要がある.この例では
character という関数を使って変数 xr を x の長さと同じ分の文字データを格納できる
ように確保している.その後に,for を使って x の第 i 番目の要素を取り出し,それが
5 以上かどうかで larage か small かを決め,その結果を xr の第 i 番目のデータとし
て代入している.これが x の最後の要素まで繰り返されるので,全データに対する置
き換えが完成する.
> xr <- character(length(x))
# 置き換え結果を入れるデータ領域を作っておく
> for(i in 1:length(x)) { if(x[i] >= 5) xr[i] <- "large" # 要素数だけ繰り返す
+ else xr[i] <- "small" }
# +は R が出力した入力を促す記号
> xr
# 以下のようにきちんと置き換わる
[1] "small" "large" "large" "large"
このように for を使って全部の要素に対する操作を行うという方法は R では避けるべ
きだとされている.データをベクトルのような形で表しておいて,ベクトルに対する
操作という形式で全部の要素への操作を完了させることが R では一般的であり,これ
を実現するための機能が備わっている.その 1 つである sapply は以下のように使う.
sapply(ベクトルデータ,適用する関数)
こうすることで,ベクトルデータの全要素に対して関数が適用され,その結果がベ
クトルとして得られる.R の場合には,sapply を使った方が for よりも簡潔で見やす
20
く書けるだけでなく,実行速度も高速である.これ以外にも,複数のベクトルデータ
の全要素に対して関数を適用する mapply なども提供されている.
# 先の例と同じ myreplace 関数を使う
> myreplace <- function(x) { if (x >= 5) "large" else "small" } # 5 以上かどうかで分岐
>x
# x は長さ 4 のベクトルとして定義されている
[1] 3 5 7 9
> > sapply(x,myreplace)
# x の全要素に myreplace が適用される
[1] "small" "large" "large" "large"
ここで説明したことは,R の機能のごく一部だけであり,第 5 章の学習に必要なこ
とのみである.この付録のインストール説明の部分で述べたように,Web 上にも多く
の情報が公開されており,日本語の書籍も多数出版されている.さらに学びたい読者
は,それらの資料を参考にしていただきたい.
21
Fly UP