ブログトップ 記事一覧 ログイン 無料ブログ開設

hamadakoichi blog このページをアンテナに追加 RSSフィード

2010-04-15

[][][] R言語プログラミングクラスター分析 - 混合分布モデル  R言語プログラミング: クラスター分析 - 混合分布モデル - hamadakoichi blog を含むブックマーク  R言語プログラミング: クラスター分析 - 混合分布モデル - hamadakoichi blog のブックマークコメント

4/17(土)の第3回 データマイニング+WEB 勉強会@東京 (Tokyo.Webmining#3)での私の一つ目のトーク「1. R言語による クラスター分析 - 活用編 (60分)」の一部関連内容です。当日は、全体像も含め分かる形の講義資料で話します。

当日、USTREAM配信も行う予定ですので、興味のある方はぜひご覧下さい。

第3回 データマイニング+WEB 勉強会@東京 (Tokyo.Webmining#3) : ATND

※内容記述に関して粗い部分も、追って洗練します。

混合分布モデル

混合分布モデルは、クラスタリングの問題を確率モデルで解く方法。データが発生する確率が複数の確率の線形和で書かれる分布を混合分布と呼ばれる。データの発生メカニズムが確率モデルでうまくモデル化できるとき、強力な手法。

アルゴリズム方程式の詳細は「第3回 データマイニング+WEB 勉強会東京」でお話しします。また時間を見つけ、本エントリにも追記しようと思います。

R言語プログラミング

Rでは混合分布モデルによるクラスタリングを行う関数がmclustパッケージ内に用意されている。

Mclust(x,G,modelNames= c("EII", "VII", "EEI", "VEI"))

[引数]

  • x : データセットを表す行列
  • G : クラスタ数Kを指定
  • modelName : 分散共分散行列のモデル指定 ("EII", "VII", "EEI", "VEI", など)
ソース
install.packages("mclust")
library(mclust) #混合分布を扱うパッケージ mclust (Model-Based Clustering)の読み込み

x <- iris[,1:4] #解析データ:iris 1-4列のデータ
mc <- Mclust(x,G=3,modelNames="EII") #混合分布モデルクラスタリングの実行。クラスタ数は3に指定。

result <- mc$classification #クラスタリング結果の抽出
result #クラスタリング結果の表示

answer <- iris[,5]     #クラスタリング正解:品種(iris 5列目)

ctbl <- table(answer, result) #正解と結果のクロス表を作成
ctbl #クロス表の表示

calcEntropy(ctbl) #エントロピー(Entropy)の算出
calcPurity(ctbl)  #純度 (Purity)の算出 

関数 calcEntropy(ctbl) (エントロピー(Entropy)の算出)、calcPurity(ctbl) (純度 (Purity)の算出)の関数定義はhttp://d.hatena.ne.jp/hamadakoichi/20100324/p1:こちら]にソースを載せてあります。

実行結果
> install.packages("mclust")
library(mclust) #混合分布を扱うパッケージ mclust (Model-Based Clustering)の読み込み

x <- iris[,1:4] #解析データ:iris 1-4列のデータ
> > > > mc <- Mclust(x,G=3,modelNames="EII") #混合分布モデルクラスタリングの実行。クラスタ数は3に指定。

> > result <- mc$classification #クラスタリング結果の抽出
result #クラスタリング結果の表示
>   [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 [38] 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 [75] 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 3 3 3 3 2 3 3 3 3
[112] 3 3 2 2 3 3 3 3 2 3 2 3 2 3 3 2 2 3 3 3 3 3 2 3 3 3 3 2 3 3 3 2 3 3 3 2 3
[149] 3 2
> 
answer <- iris[,5]     #クラスタリング正解:品種(iris 5列目)
> > 
ctbl <- table(answer, result) #正解と結果のクロス表を作成
> > ctbl #クロス表の表示

            result
answer        1  2  3
  setosa     50  0  0
  versicolor  0 48  2
  virginica   0 14 36
> > calcEntropy(ctbl) #エントロピー(Entropy)の算出
[1] 0.2308662
> calcPurity(ctbl)  #純度 (Purity)の算出 
[1] 0.8933333
> 
> 
> #得られたパラメータの確認
> pa <- mc$parameters 
> pa$pro  #混合分布の各分布の線形係数
[1] 0.3333984 0.4145337 0.2520679
> pa$mean #平均ベクトル
                  [,1]     [,2]     [,3]
Sepal.Length 5.0060180 5.904618 6.850026
Sepal.Width  3.4278187 2.748371 3.075408
Petal.Length 1.4623007 4.402018 5.735305
Petal.Width  0.2461665 1.432578 2.076464
> pa$variance$sigma #分散共分散行列
, , 1

             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length    0.1330945   0.0000000    0.0000000   0.0000000
Sepal.Width     0.0000000   0.1330945    0.0000000   0.0000000
Petal.Length    0.0000000   0.0000000    0.1330945   0.0000000
Petal.Width     0.0000000   0.0000000    0.0000000   0.1330945

, , 2

             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length    0.1330945   0.0000000    0.0000000   0.0000000
Sepal.Width     0.0000000   0.1330945    0.0000000   0.0000000
Petal.Length    0.0000000   0.0000000    0.1330945   0.0000000
Petal.Width     0.0000000   0.0000000    0.0000000   0.1330945

, , 3

             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length    0.1330945   0.0000000    0.0000000   0.0000000
Sepal.Width     0.0000000   0.1330945    0.0000000   0.0000000
Petal.Length    0.0000000   0.0000000    0.1330945   0.0000000
Petal.Width     0.0000000   0.0000000    0.0000000   0.1330945

分散共分散行列のモデル比較

ソース

#分散共分散行列のモデル比較

#関数:クラスターの評価(Entropy, Purity)
evalhclust <- function(result, answer){
	ct <- table(answer, result) #クロス表の作成
	cat("Entropy: ", calcEntropy(ct), "\n") #エントロピー
	cat("Purity : ", calcPurity(ct), "\n")  #純度
}

x <- iris[,1:4] #解析データ:iris 1-4列のデータ
mc.eii <- Mclust(x,G=3,modelNames="EII") #混合分布モデルクラスタリングの実行。EIIモデル。
mc.vii <- Mclust(x,G=3,modelNames="VII") #混合分布モデルクラスタリングの実行。VIIモデル。
mc.vei <- Mclust(x,G=3,modelNames="VEI") #混合分布モデルクラスタリングの実行。VEIモデル。
mc.vvv <- Mclust(x,G=3,modelNames="VVV") #混合分布モデルクラスタリングの実行。VVIモデル。

#評価
ans <- iris[,5] #
evalhclust(mc.eii$classification,ans) #EIIモデル。
evalhclust(mc.vii$classification,ans) #VIIモデル。
evalhclust(mc.vei$classification,ans) #VEIモデル。
evalhclust(mc.vvv$classification,ans) #VVVモデル。

実行結果

> #分散共分散行列のモデル比較
> 
> #関数:クラスターの評価(Entropy, Purity)
> evalhclust <- function(result, answer){
+ 	ct <- table(answer, result) #クロス表の作成
+ 	cat("Entropy: ", calcEntropy(ct), "\n") #エントロピー
+ 	cat("Purity : ", calcPurity(ct), "\n")  #純度
+ }
> 
> x <- iris[,1:4] #解析データ:iris 1-4列のデータ
> mc.eii <- Mclust(x,G=3,modelNames="EII") #混合分布モデルクラスタリングの実行。EIIモデル。
> mc.vii <- Mclust(x,G=3,modelNames="VII") #混合分布モデルクラスタリングの実行。VIIモデル。
> mc.vei <- Mclust(x,G=3,modelNames="VEI") #混合分布モデルクラスタリングの実行。VEIモデル。
> mc.vvv <- Mclust(x,G=3,modelNames="VVV") #混合分布モデルクラスタリングの実行。VVIモデル。

> > #評価
ans <- iris[,5] #
> > evalhclust(mc.eii$classification,ans) #EIIモデル。
Entropy:  0.2308662 
Purity :  0.8933333 
> evalhclust(mc.vii$classification,ans) #VIIモデル。
Entropy:  0.2308662 
Purity :  0.8933333 
> evalhclust(mc.vei$classification,ans) #VEIモデル。
Entropy:  0.1355387 
Purity :  0.96 
> evalhclust(mc.vvv$classification,ans) #VVVモデル。
Entropy:  0.09863442 
Purity :  0.9666667 

EII、VII、VEIのモデルの中では、VEIモデルが最も良い。全てのパラメータを推定するVVVモデルは、さらによい結果が得られることが分かります。

※Entropyは小さく、Purityは大きい、ほうが良いクラスタリング。詳細は次エントリを参照: 「はじめてでもわかる R言語によるクラスター分析」

関連リンク:データマイニング+WEB勉強会東京 (Tokyo.Webmining)

参考文献

Rで学ぶクラスタ解析

Rで学ぶクラスタ解析

Rによるデータサイエンス データ解析の基礎から最新手法まで

Rによるデータサイエンス データ解析の基礎から最新手法まで

[][][] R言語プログラミングクラスター分析 - k-means  R言語プログラミング: クラスター分析 - k-means - hamadakoichi blog を含むブックマーク  R言語プログラミング: クラスター分析 - k-means - hamadakoichi blog のブックマークコメント

4/17(土)の第3回 データマイニング+WEB 勉強会@東京 (Tokyo.Webmining#3)での私の一つ目のトーク「1. R言語による クラスター分析 - 活用編 (60分)」の一部関連内容です。当日は、全体像も含め分かる形の講義資料で話します。

当日、USTREAM配信も行う予定ですので、興味のある方はぜひご覧下さい。

第3回 データマイニング+WEB 勉強会@東京 (Tokyo.Webmining#3) : ATND

※内容記述に関して粗い部分も、追って洗練します。

k-means

k-meansは、クラスター分析の非階層的手法で代表的な手法。

現実のクラスタリングでもk-meansが使われることが多く、実用的な手法。

※階層的手法の対極にある「非階層的手法」(分割最適化手法とも呼ばれる)。詳細は次エントリを参照:「はじめてでもわかる R言語によるクラスター分析」

アルゴリズム詳細は「第3回 データマイニング+WEB 勉強会東京」でお話しします。また本エントリにも追記しようと思います。

R言語プログラミング

Rでは k-means によるクラスタリングを行う関数 kmeans()が標準で用意されている。

kmeans(x, centers, iter.max = 10, nstart = 1, 
       algorithm = c("Hartigan-Wong", "Lloyd", "Forgy", "MacQueen"))

[引数]

  • x : データセットを表す行列
  • centers :1)クラスタ数Kを指定する場合:初期値となる代表点はデータセットからランダムに取り出される。

2)クラスタの代表点ベクトルを指定する場合:クラスタ数 K はこの代表点の個数から算出される。

[任意引数(省略可能)]

  • iter.max : 繰り返しの最大回数。デフォルトは N=10。
  • nstart : ランダムに初期値を設定する場合のパラメータ。初期値を変更したい場合に用いる。
  • algorithm : 利用するアルゴリズムを Hartigan-Wong", "Lloyd", "Forgy", "MacQueen"の中から選べる。デフォルトは "Hartigan-Wong"(通常、この"Hartigan-Wong"が最も良い結果を出すといわれている)。
ソース
x <- iris[,1:4] #解析データ:iris 1-4列のデータ
km <- kmeans(x,3) #k-meansの実行。クラスタ数は3に指定。

result <- km$cluster #クラスタリング結果の抽出
result #クラスタリング結果の表示

answer <- iris[,5]     #クラスタリング正解:品種(iris 5列目)

ctbl <- table(answer, result) #正解と結果のクロス表を作成
ctbl #クロス表の表示

calcEntropy(ctbl) #エントロピー(Entropy)の算出
calcPurity(ctbl)  #純度 (Purity)の算出 

関数 calcEntropy(ctbl) (エントロピー(Entropy)の算出)、calcPurity(ctbl) (純度 (Purity)の算出)の関数定義はhttp://d.hatena.ne.jp/hamadakoichi/20100324/p1:こちら]にソースを載せてあります。


実行結果
> x <- iris[,1:4] #解析データ:iris 1-4列のデータ
> km <- kmeans(x,3) #k-meansの実行。クラスタ数は3に指定。
> 
> result <- km$cluster #クラスタリング結果の抽出
> result #クラスタリング結果の表示
  [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 [38] 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
 [75] 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 2 2 2 2 3 2 2 2 2
[112] 2 2 3 3 2 2 2 2 3 2 3 2 3 2 2 3 3 2 2 2 2 2 3 2 2 2 2 3 2 2 2 3 2 2 2 3 2
[149] 2 3
> 
> answer <- iris[,5]     #クラスタリング正解:品種(iris 5列目)
> 
> ctbl <- table(answer, result) #正解と結果のクロス表を作成
> ctbl #クロス表の表示
            result
answer        1  2  3
  setosa     50  0  0
  versicolor  0  2 48
  virginica   0 36 14
> 
> calcEntropy(ctbl) #エントロピー(Entropy)の算出
[1] 0.2308662
> calcPurity(ctbl)  #純度 (Purity)の算出 
[1] 0.8933333

結果はWard法の結果と同程度のよい結果を得られる。

※Entropyは小さく、Purityは大きい、ほうが良いクラスタリング。詳細は次エントリを参照: 「はじめてでもわかる R言語によるクラスター分析」

関連リンク:データマイニング+WEB勉強会東京 (Tokyo.Webmining)

参考文献

Rで学ぶクラスタ解析

Rで学ぶクラスタ解析

Rによるデータサイエンス データ解析の基礎から最新手法まで

Rによるデータサイエンス データ解析の基礎から最新手法まで

2010-03-24

[][][] R言語プログラミングクラスター分析 - 階層的クラスタリング  R言語プログラミング: クラスター分析 - 階層的クラスタリング - hamadakoichi blog を含むブックマーク  R言語プログラミング: クラスター分析 - 階層的クラスタリング - hamadakoichi blog のブックマークコメント

第2回データマイニング+WEB勉強会東京「はじめてでもわかる R言語によるクラスター分析」の内容に関する、ソースコードも以下に記載します。

※記載しているソースは、R Console上や EclipseでR-Scriptとして、貼り付けそのまま実行可能です。(Rのインストール・環境設定はこちらで、RをEclipseで実行するための方法はこちら)


講義の全体内容・構成は次をご覧下さい。

R勉強会: 第2回データマイニング+WEB 勉強会@東京 (Tokyo.Webmining) を開催しました - 「はじめてでもわかる R言語によるクラスター分析-

Slideshare:はじめてでもわかる R言語によるクラスター分析


クラスター分析と評価

エントロピー(Entropy)と純度(Purity)の算出関数
#関数:エントロピー(Entropy)算出, ct:クロス集計表
calcEntropy <- function(ct){
	-sum( (apply(ct,1,sum)/sum(ct))
	   * apply(ct,1,calcEntropy0))/log(ncol(ct))
}
calcEntropy0<-function(pv){
	p1<-pv/sum(pv)
	p2<-p1[p1 !=0]
	sum(p2*log(p2))
}

#関数:純度 (Purity)算出
calcPurity <-function(ct){
	sum(apply(ct,1,max))/sum(ct)
}
クラスター分析の実行と評価
x <- iris[,1:4] #解析データ:iris 1-4列のデータ
d <- dist(x) #距離行列の作成
hc <- hclust(d); #Clusterを求める。完全連結法"complete"(Default)

op <- par(mfrow=c(1,1))
plot(hc) #デンドログラムの表示

result <- cutree(hc,3) #クラスタリング結果:3つのクラスターに分割
answer <- iris[,5]     #クラスタリング正解:品種(iris 5列目)
		
ctbl <- table(answer, result) #正解と結果のクロス表を作成
ctbl #クロス表の表示

calcEntropy(ctbl) #エントロピー(Entropy)の算出
calcPurity(ctbl)  #純度 (Purity)の算出
実行結果

f:id:hamadakoichi:20100325063732j:image:w550

> > ctbl #クロス表の表示

            result
              1  2  3
  setosa     50  0  0
  versicolor  0 23 27
  virginica   0 49  1
> > calcEntropy(ctbl) #エントロピー(Entropy)の算出
[1] 0.2390843
> calcPurity(ctbl)  #純度 (Purity)の算出
[1] 0.84

クラスター比較

#階層的クラスタリング手法
x  <- iris[1:10,1:4] #解析データ:iris 1-4列のデータ 10行分(見やすさのため限定)
d  <- dist(x) #初期距離行列の作成:ユークリッド距離
d2 <- dist(x)^2 #ユークリッド平方距離

hc.aver <- hclust(d,"average") #群平均法
hc.sngl <- hclust(d,"single") #単連結法
hc.comp <- hclust(d) #完全連結法(Default):"complete"指定と同じ
hc.ward <- hclust(d2,"ward") #ウォード法
hc.cntr <- hclust(d2,"centroid") #重心法
hc.medi <- hclust(d2,"median") #メディアン法

op <- par(mfrow=c(2,3)) #Graphic parameter設定:2行3列画面表示
plot(hc.aver, main="群平均法") 
plot(hc.sngl, main="単連結法")
plot(hc.comp, main="完全連結法")
plot(hc.ward, main="ウォード法")
plot(hc.cntr, main="重心法")
plot(hc.medi, main="メディアン法")
par(op)#作業前のGraphic Parameterに戻す
実行結果

f:id:hamadakoichi:20100325083456j:image:w550

エントロピー・純度 比較

指定数のクラスタ算出・評価 関数
#関数:クラスタリング手法 methでの、clsnum数のクラスタ を算出
calchclust <- function(x, clsnum, meth="complete"){
	#methデフォルトは完全連結法("complete")
	
	d2 <- dist(x)^2 #ユークリッド平方距離
	switch(meth, #初期距離行列の設定			
			"ward"		= d <- d2,  #ウォード法  の場合:ユークリッド平方距離
			"centroid"    = d <- d2,  #重心法    の場合:ユークリッド平方距離
			"median"	= d <- d2,  #メディアン法 の場合:ユークリッド平方距離
			d <- dist(x) #デフォルト: ユークリッド距離
	)
	hc <- hclust(d, method = meth) #meth手法でのクラスタリング
	return(cutree(hc,k=clsnum))    #クラスターを clsnum個に分割し返す
}

#関数:クラスターの評価(Entropy, Purity)
evalhclust <- function(result, answer){
	ct <- table(answer, result) #クロス表の作成
	cat("Entropy: ", calcEntropy(ct), "\n") #エントロピー
	cat("Purity : ", calcPurity(ct), "\n")  #純度
}
エントロピー・純度 比較。
x <- iris[,1:4] #解析データ:iris 1-4列のデータ

#各手法でのクラスタリング
hcc.aver <- calchclust(x,clsnum=3,meth="average") #群平均法
hcc.sngl <- calchclust(x,clsnum=3,meth="single") #単連結法
hcc.comp <- calchclust(x,clsnum=3) #完全連結法(Default):"Complete"指定と同じ
hcc.ward <- calchclust(x,clsnum=3,meth="ward") #ウォード法
hcc.cntr <- calchclust(x,clsnum=3,meth="centroid") #重心法
hcc.medi <- calchclust(x,clsnum=3,meth="median") #メディアン法

#評価
ans <- iris[,5] #
evalhclust(hcc.aver,ans) #群平均法
evalhclust(hcc.sngl,ans) #単連結法
evalhclust(hcc.comp,ans) #完全連結法(Default):"Complete"指定と同じ
evalhclust(hcc.ward,ans) #ウォード法
evalhclust(hcc.cntr,ans) #重心法
evalhclust(hcc.medi,ans) #メディアン法
実行結果
> #評価
> ans <- iris[,5] #クラスタリング正解:品種(iris5列目)
> evalhclust(hcc.aver,ans) #群平均法
Entropy:  0.1799098 
Purity :  0.9066667 
> evalhclust(hcc.sngl,ans) #単連結法
Entropy:  0.05095645 
Purity :  0.9866667 
> evalhclust(hcc.comp,ans) #完全連結法(Default):"Complete"指定と同じ
Entropy:  0.2390843 
Purity :  0.84 
> evalhclust(hcc.ward,ans) #ウォード法
Entropy:  0.2150906 
Purity :  0.8933333 
> evalhclust(hcc.cntr,ans) #重心法
Entropy:  0.1799098 
Purity :  0.9066667 
> evalhclust(hcc.medi,ans) #メディアン法
Entropy:  0.1738730 
Purity :  0.9133333 

関連

はじめてでもわかる R言語によるクラスター分析

Slideshare:はじめてでもわかる R言語によるクラスター分析

Google Group

Google グループ

推薦文献:

Rで学ぶクラスタ解析

Rで学ぶクラスタ解析

R言語でのクラスター分析に関し詳しく書かれています。

クラスター分析に関し理論的な内容も含め、分かりやすく書かれています。タイトルにファジクラスタリングとありますが、全体的にかかれています。

Rによるデータサイエンス データ解析の基礎から最新手法まで

Rによるデータサイエンス データ解析の基礎から最新手法まで

クラスター分析以外にもR言語でのデータマイニングの項目が広く取り上げられています。

2010-02-09

[][][] R言語プログラミング: 基本統計量の算出  R言語プログラミング: 基本統計量の算出 - hamadakoichi blog を含むブックマーク  R言語プログラミング: 基本統計量の算出 - hamadakoichi blog のブックマークコメント

統計解析・データマイニング言語である R言語の 基本統計量の算出関数について、ソースコードを用い紹介する。記載しているソースは、R Console上や EclipseでR-Scriptとして、そのまま実行可能である。

R Consoleでの実行例  (Rのインストール・環境設定はこちら)

f:id:hamadakoichi:20100211041940j:image

EclipseでのR-Scriptとしての実行例  (RをEclipseで実行するための方法はこちら)

f:id:hamadakoichi:20100211041941j:image:w550

基本統計量 算出関数

統計量(Statistics)とは、統計的な性質を要約した数量。基本統計量とは通常よく使用される統計量で、合計、平均、中央地、分散、四分位数などを示す。

基本統計関数
合計sum
算術平均mean
最大値max
最小値min
範囲(最大値-最小値)range
中央値median
分散var
標準偏差sd
分位数quantile
統計要約summary

data <-c(1:10) # 1-10の数値Vectorを作成
data # dataを表示

sum(data) #合計
mean(data) #算術平均
max(data) #最大値
min(data) #最小値
range(data) #範囲(最大値-最小値)
median(data) #中央値
var(data) #分散
sd(data) #標準偏差
quantile(data) #分位数
summary(data) #統計要約

実行結果

> data <-c(1:10) # 1-10の数値Vectorを作成
> data # dataを表示
 [1]  1  2  3  4  5  6  7  8  9 10
> 
> sum(data) #合計
[1] 55
> mean(data) #算術平均
[1] 5.5
> max(data) #最大値
[1] 10
> min(data) #最小値
[1] 1
> range(data) #範囲(最大値-最小値)
[1]  1 10
> median(data) #中央値
[1] 5.5
> var(data) #分散
[1] 9.166667
> sd(data) #標準偏差
[1] 3.027650
> quantile(data) #分位数
   0%   25%   50%   75%  100% 
 1.00  3.25  5.50  7.75 10.00 
> summary(data) #統計要約
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00    3.25    5.50    5.50    7.75   10.00 

四分位数

データを小さい値から大きい値へ順に並べたとき

  • 第1四分位数:小さいほうから 25%点
  • 第2四分位数(中央値):小さいほうから 50%点
  • 第3四分位数:小さいほうから 75%点

Apply関数

Apply関数を用いることにより、データセットの各行ごと・列ごとに、上記各種の基本統計量を算出することができる。

関数

apply(X, MARGIN, FUN, ...)

Xはデータ、MARGINは、行単位の算出の場合は"1"、列単位の算出の場合は"2"を指定。FUNは、統計量の関数や計算式を与える。

iris のデータ(よく使用されるあやめデータ)で4つの列のそれぞれの統計量を求めるプログラムを以下に示す。

第2引数MARGINの値"2"は列単位の算出を表し、FUNでは各種用いる統計関数を指定している。

apply(iris[,1:4],2,sum) #合計
apply(iris[,1:4],2,mean)#算術平均
apply(iris[,1:4],2,max) #最大値
apply(iris[,1:4],2,min) #最小値
apply(iris[,1:4],2,range) #範囲(最大値-最小値)
apply(iris[,1:4],2,median) #中央値
apply(iris[,1:4],2,var) #分散
apply(iris[,1:4],2,sd) #標準偏差
apply(iris[,1:4],2,quantile) #分位数
apply(iris[,1:4],2,summary) #統計要約

実行結果

> apply(iris[,1:4],2,sum) #合計
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
       876.5        458.6        563.7        179.9 
> apply(iris[,1:4],2,mean)#算術平均
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
    5.843333     3.057333     3.758000     1.199333 
> apply(iris[,1:4],2,max) #最大値
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
         7.9          4.4          6.9          2.5 
> apply(iris[,1:4],2,min) #最小値
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
         4.3          2.0          1.0          0.1 
> apply(iris[,1:4],2,range) #範囲(最大値-最小値)
     Sepal.Length Sepal.Width Petal.Length Petal.Width
[1,]          4.3         2.0          1.0         0.1
[2,]          7.9         4.4          6.9         2.5
> apply(iris[,1:4],2,median) #中央値
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
        5.80         3.00         4.35         1.30 
> apply(iris[,1:4],2,var) #分散
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
   0.6856935    0.1899794    3.1162779    0.5810063 
> apply(iris[,1:4],2,sd) #標準偏差
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
   0.8280661    0.4358663    1.7652982    0.7622377 
> apply(iris[,1:4],2,quantile) #分位数
     Sepal.Length Sepal.Width Petal.Length Petal.Width
0%            4.3         2.0         1.00         0.1
25%           5.1         2.8         1.60         0.3
50%           5.8         3.0         4.35         1.3
75%           6.4         3.3         5.10         1.8
100%          7.9         4.4         6.90         2.5
> apply(iris[,1:4],2,summary) #統計要約
        Sepal.Length Sepal.Width Petal.Length Petal.Width
Min.           4.300       2.000        1.000       0.100
1st Qu.        5.100       2.800        1.600       0.300
Median         5.800       3.000        4.350       1.300
Mean           5.843       3.057        3.758       1.199
3rd Qu.        6.400       3.300        5.100       1.800
Max.           7.900       4.400        6.900       2.500

関連文献:

Rによるデータサイエンス データ解析の基礎から最新手法まで

Rによるデータサイエンス データ解析の基礎から最新手法まで

Rによる統計解析

Rによる統計解析

R: The R Project for Statistical Computing

[][][] R言語プログラミング: 基本演算子・初等関数  R言語プログラミング: 基本演算子・初等関数 - hamadakoichi blog を含むブックマーク  R言語プログラミング: 基本演算子・初等関数 - hamadakoichi blog のブックマークコメント

統計解析・データマイニング言語である R言語

  • 基本演算(算術演算子、比較演算子、論理演算子)
  • 初等関数

ソースコードを用い紹介する。記載しているソースは、R Console上や EclipseでR-Scriptとして、そのまま実行可能である。

R Consoleでの実行例  (Rのインストール・環境設定はこちら)

f:id:hamadakoichi:20100217042344j:image

EclipseでのR-Scriptとしての実行例  (RをEclipseで実行するための方法はこちら)

f:id:hamadakoichi:20100217043023j:image:w550

算術演算子

算術演算は、integer(整数), numerical(実数), complex(複素数)のScalar、および、Vector(ベクトル), matrix(マトリクス), data.frame(データフレーム), array(配列), list(リスト)に対し、適用可能である。

(※Rのデータ型については次を参照: R言語プログラミング: データ型・操作

演算演算子
加算+a+b
減算-a-b
乗算 *a*b
除算/a/b
べき算^a^b
整数除算%/%a%/%b
剰余%%a%%b

Vector(ベクトル)の場合の例を以下に示す。

a<-c(5,6,7,8) # vector a
b<-c(1,2,3,4) # vector b

a+b #加算
a-b #減算
a*b #乗算
a/b #除算
a^b #べき算
a%/%b #整数除算(商)

実行結果

> a<-c(5,6,7,8) # vector a
> b<-c(1,2,3,4) # vector b
> 
> a+b #加算
[1]  6  8 10 12
> a-b #減算
[1] 4 4 4 4
> a*b #乗算
[1]  5 12 21 32
> a/b #除算
[1] 5.000000 3.000000 2.333333 2.000000
> a^b #べき算
[1]    5   36  343 4096
> a%/%b #整数除算(商)
[1] 5 3 2 2
> a%%b #剰余
[1] 0 0 1 0

算術演算に関する優先順位規則は以下。

  1. 括弧
  2. べき算
  3. 整数除算と剰余
  4. 乗算と除算
  5. 加算と減算

比較演算子

演算演算子第1引数第2引数返り値
より大きい>a>b比較可能ベクトル比較可能ベクトル比較可能ベクトル
より小さい<a<b比較可能ベクトル比較可能ベクトル比較可能ベクトル
以上>=a>=b比較可能ベクトル比較可能ベクトル比較可能ベクトル
以下<=a<=b比較可能ベクトル比較可能ベクトル比較可能ベクトル
等しい==a==b比較可能ベクトル比較可能ベクトル比較可能ベクトル
等しくない!=a!=b比較可能ベクトル比較可能ベクトル比較可能ベクトル
a<-c(1,3,4,7) # vector a
b<-c(2,3,5,6) # vector b

a>b  #より大きい
a<b  #より小さい
a>=b #以上
a<=b #以下
a==b #等しい
a!=b #等しくない

実行結果

> a<-c(1,3,4,7) # vector a
> b<-c(2,3,5,6) # vector b
> 
> a>b  #より大きい
[1] FALSE FALSE FALSE  TRUE
> a<b  #より小さい
[1]  TRUE FALSE  TRUE FALSE
> a>=b #以上
[1] FALSE  TRUE FALSE  TRUE
> a<=b #以下
[1]  TRUE  TRUE  TRUE FALSE
> a==b #等しい
[1] FALSE  TRUE FALSE FALSE
> a!=b #等しくない
[1]  TRUE FALSE  TRUE  TRUE

論理演算子

演算演算子第1引数第2引数返り値
否定!!(x)論理値ベクトル論理値ベクトル論理値ベクトル
論理積&&x && y論理値ベクトル論理値ベクトル論理値
論理和|x || y論理値ベクトル論理値ベクトル論理値
ベクトル化論理積 &x & y論理値ベクトル論理値ベクトル論理値ベクトル
ベクトル化論理和|x | y論理値ベクトル論理値ベクトル論理値ベクトル
排他的論理和xorxor(x,y)論理値ベクトル論理値ベクトル論理値ベクトル
x<-c(TRUE,TRUE,FALSE,FALSE) # 論理値 vector x
y<-c(FALSE,TRUE,TRUE,TRUE)  # 論理値 vector y

x # xを表示
y # yを表示

!x   #否定
x && y #論理積
x || y #論理和
x & y  #ベクトル化論理積
x | y  #ベクトル化論理和
xor(x, y) #排他的論理和

実行結果

> x<-c(TRUE,TRUE,FALSE,FALSE) # 論理値 vector x
> y<-c(FALSE,TRUE,TRUE,TRUE)  # 論理値 vector y
> 
> x # xを表示
[1]  TRUE  TRUE FALSE FALSE
> y # yを表示
[1] FALSE  TRUE  TRUE  TRUE
> 
> !x   #否定
[1] FALSE FALSE  TRUE  TRUE
> x && y #論理積
[1] FALSE
> x || y #論理和
[1] TRUE
> x & y  #ベクトル化論理積
[1] FALSE  TRUE FALSE FALSE
> x | y  #ベクトル化論理和
[1] TRUE TRUE TRUE TRUE
> xor(x, y) #排他的論理和
[1]  TRUE FALSE  TRUE  TRUE

※if文の引数ベクトルのときは、第一成分目のみが判定に用いられる。

初等関数

またRには次の初等関数も用意されている。

Vectorの場合の実行例もともに示す。

演算演算子
絶対値absabs(a)
自然指数expexp(a)
平方根sqrtsqrt(a)
自然対数loglog(a)
常用対数log10log10(a)
四捨五入roundround(a,3)
三角関数cos,sin,tancos(a),cos(a),tan(a)
逆三角関数acos,asin,atanacos(a),asin(a),atan(a)
a<-c(-2,-1,1,2)
abs(a) #絶対値
exp(a) #自然指数

b<-c(1,2,3,4)
sqrt(b) #平方根
log(b) #自然対数
log10(b) #常用対数

c<-c(0.1,0.12,0.123,0.1234)
round(c,2) #四捨五入

d<-c(0,pi/2,pi)
sin(d)#正弦関数
cos(d)#余弦関数
tan(d)#正接関数

e<-c(0,0.5,1)
asin(e)#逆正弦関数
acos(e)#逆余弦関数
atan(e)#逆正接関数

実行結果

> a<-c(-2,-1,1,2)
> abs(a) #絶対値
[1] 2 1 1 2
> exp(a) #自然指数
[1] 0.1353353 0.3678794 2.7182818 7.3890561
> 
> b<-c(1,2,3,4)
> sqrt(b) #平方根
[1] 1.000000 1.414214 1.732051 2.000000
> log(b) #自然対数
[1] 0.0000000 0.6931472 1.0986123 1.3862944
> log10(b) #常用対数
[1] 0.0000000 0.3010300 0.4771213 0.6020600
> 
> c<-c(0.1,0.12,0.123,0.1234)
> round(c,2) #四捨五入
[1] 0.10 0.12 0.12 0.12
> 
> d<-c(0,pi/2,pi)
> sin(d)#正弦関数
[1] 0.000000e+00 1.000000e+00 1.224606e-16
> cos(d)#余弦関数
[1]  1.000000e+00  6.123032e-17 -1.000000e+00
> tan(d)#正接関数
[1]  0.000000e+00  1.633178e+16 -1.224606e-16
> 
> e<-c(0,0.5,1)
> asin(e)#逆正弦関数
[1] 0.0000000 0.5235988 1.5707963
> acos(e)#逆余弦関数
[1] 1.570796 1.047198 0.000000
> atan(e)#逆正接関数
[1] 0.0000000 0.4636476 0.7853982

関連文献:

Rによるデータサイエンス データ解析の基礎から最新手法まで

Rによるデータサイエンス データ解析の基礎から最新手法まで

Rによる統計解析

Rによる統計解析

Rによるやさしい統計学

Rによるやさしい統計学

no title

R: The R Project for Statistical Computing

2010-02-07

[][][] R言語プログラミング: データ結合  R言語プログラミング: データ結合 - hamadakoichi blog を含むブックマーク  R言語プログラミング: データ結合 - hamadakoichi blog のブックマークコメント

統計解析・データマイニング言語である R言語のデータ結合をソースコードを用い紹介する。記載しているソースは、R Console上や EclipseでR-Scriptとして、そのまま実行可能である。

R Consoleでの実行例  (Rのインストール・環境設定はこちら)

f:id:hamadakoichi:20100208220412j:image

EclipseでのR-Scriptとしての実行例  (RをEclipseで実行するための方法はこちら)

f:id:hamadakoichi:20100208220410j:image:w650


R のデータの結合

RにはVector, Data.Frame, Matrix を 結合する関数がよいされている。

行(row)方向に結合する関数として rbind、列(column)方向に結合する関数として cbindがある。

ソースコード

ma<-matrix(1:6,2,3) # 1-6の2×3行列
ma # maの表示
mb<-matrix(7:12,2,3) # 7-12の 2×3行列
mb # mbの表示

mc<-cbind(ma,mb) # 列の結合
mc # mcの表示
mr<-rbind(ma,mb) # 行の結合
mr # mrの表示

実行結果

>ma<-matrix(1:6,2,3) # 1-6の2×3行列
> ma # maの表示
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
> mb<-matrix(7:12,2,3) # 7-12の 2×3行列
> mb # mbの表示
     [,1] [,2] [,3]
[1,]    7    9   11
[2,]    8   10   12
> 
> mc<-cbind(ma,mb) # 列の結合
> mc # mcの表示
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    3    5    7    9   11
[2,]    2    4    6    8   10   12
> mr<-rbind(ma,mb) # 行の結合
> mr # mrの表示
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
[3,]    7    9   11
[4,]    8   10   12
> 


ソースコード(data.frameとvectorとの結合)

df<-data.frame(cbind(1:3,4:6)) # 1-3, 4-6 の要素を持つ、3×2のdata.frame
df
v<-c(1:3) # 1-3の vector 
v
dfr <- rbind(df,v) # 行の結合: data.frame と vector
dfr
dfc <- cbind(df,v) # 列の結合: data.frame と vector
dfc

実行結果

>df<-data.frame(cbind(1:3,4:6)) # 1-3, 4-6 の要素を持つ、3×2のdata.frame
> df
  X1 X2
1  1  4
2  2  5
3  3  6
> v<-c(1:3) # 1-3の vector 
> v
[1] 1 2 3
> dfr <- rbind(df,v) # 行の結合: data.frame と vector
> dfr
  X1 X2
1  1  4
2  2  5
3  3  6
4  1  2
> dfc <- cbind(df,v) # 列の結合: data.frame と vector
> dfc
  X1 X2 v
1  1  4 1
2  2  5 2
3  3  6 3
> 

ソースコード (data.frameとmatrixとの結合)

m<-matrix(7:12,3,2) # 9-16の 3×2 Matrix 
m
dfr <- rbind(df,m) # 行の結合: data.frame と Matrix
dfr
dfc <- cbind(df,m) # 列の結合: data.frame と Matrix
dfc

実行結果

df<-data.frame(cbind(1:3,4:6)) # 1-3, 4-6 の要素を持つ、3×2のdata.frame
> df # df の表示
  X1 X2
1  1  4
2  2  5
3  3  6
> m<-matrix(7:12,3,2) # 9-16の 3×2 Matrix 
> m # m の表示
     [,1] [,2]
[1,]    7   10
[2,]    8   11
[3,]    9   12
> 
> dfr <- rbind(df,m) # 行の結合
Error in match.names(clabs, names(xi)) : 
  names do not match previous names
> dfr # dfcの表示
Error: object 'dfr' not found
> dfc <- cbind(df,m) # 列の結合
> dfc # dfcの表示
  X1 X2 1  2
1  1  4 7 10
2  2  5 8 11
3  3  6 9 12
> 		
> m<-matrix(7:12,3,2) # 9-16の 3×2 Matrix 
> m
     [,1] [,2]
[1,]    7   10
[2,]    8   11
[3,]    9   12
> dfr <- rbind(df,m) # 行の結合: data.frame と Matrix
Error in match.names(clabs, names(xi)) : 
  names do not match previous names
> dfr
Error: object 'dfr' not found
> dfc <- cbind(df,m) # 列の結合: data.frame と Matrix
> dfc
  X1 X2 1  2
1  1  4 7 10
2  2  5 8 11
3  3  6 9 12
> 

複数の行列の引数がある場合、それらは同じ行または列のを持たねばならない。もし引数が全て vector なら、結果の数行または列数は最長のベクトルの長さとなる。より短いベクトルの値はこの長さに達するまで繰り返される。完全に繰り返されない場合には警告が出る。

ソースコード

a<-c(1:2) # 1-2のvector 
a # a を表示
b<-c(1:8) # 1-8のvector
b # b を表示

c<-cbind(a,b) #短いベクトル a の値は繰り返し使用される。
c # c を表示

実行結果

a<-c(1:2) # 1-2のvector 
> a # a を表示
[1] 1 2
> b<-c(1:8) # 1-8のvector
> b # b を表示
[1] 1 2 3 4 5 6 7 8
> 
> c<-cbind(a,b) #短いベクトル a の値は繰り返し使用される。
> c # c を表示
     a b
[1,] 1 1
[2,] 2 2
[3,] 1 3
[4,] 2 4
[5,] 1 5
[6,] 2 6
[7,] 1 7
[8,] 2 8
> 

文献:

Rによるデータサイエンス データ解析の基礎から最新手法まで

Rによるデータサイエンス データ解析の基礎から最新手法まで

Rによる統計解析

Rによる統計解析

R: The R Project for Statistical Computing

2010-01-26

[][][] R言語プログラミング: データ入出力  R言語プログラミング: データ入出力 - hamadakoichi blog を含むブックマーク  R言語プログラミング: データ入出力 - hamadakoichi blog のブックマークコメント

統計解析・データマイニング言語である R言語のデータの入出力をソースコードを用い紹介する。記載しているソースは、R Console上や EclipseでR-Scriptとして、そのまま実行可能である。


Rのインストール・環境設定はこちら

RをEclipseで実行するための方法はこちら

エディタによる入力と編集

データ入力、編集のための関数 edit, fix が用意され、表計算風のエディタで編集できる。edit では代入手続きをとらないと結果が保存されないが、fix では編集結果が直接保存される。

edit

関数 edit の使用法を示す。次のコードを実行すると以下のデータ編集画面が開き、データ編集できる。

price <- matrix(0,2,4) # 要素が 0 の 2行4列の行列を定義する
productname <- c("A", "B", "C", "D")
cityname <- c("Tokyo","London")
colnames(price)<- productname # price のラベルを productnameにする 
rownames(price)<- cityname # price のラベルを citynameにする 
price[1,] <- c(105,202,155,91) # 1 行目に Vector を 入力
price[2,] <- c(107,199,154,99) # 2 行目に Vector を 入力

price2<-edit(price)

price  # price を表示
price2 # price2 を表示

編集画面

f:id:hamadakoichi:20100127013632j:image:w350

編集画面ではセル単位で編集可能。データの編集を終え、edit を終了すると編集画面から戻り、price2へ値が代入される。


以下に実行結果を示す。実行結果に示されているように、edit関数引数 price は更新されない。編集結果を保存するためには代入の手続き(price2への代入)が必要である。

実行結果

price <- matrix(0,2,4) # 要素が 0 の 2行4列の行列を定義する
> productname <- c("A", "B", "C", "D")
> cityname <- c("Tokyo","London")
> colnames(price)<- productname # price のラベルを productnameにする 
> rownames(price)<- cityname # price のラベルを citynameにする 
> price[1,] <- c(105,202,155,91) # 1 行目に Vector を 入力
> price[2,] <- c(107,199,154,99) # 2 行目に Vector を 入力
> 
> price2<-edit(price) # editで 編集し、結果をprice2へ代入

price  # price を表示
price2 # price2 を表示
> >          A   B   C  D
Tokyo  105 202 155 91
London 107 199 154 99
>           A   B   C  D
Tokyo   105 202 155 91
London  107 199 154 99
NewYork 103 201 153 NA
> 

fix

関数 fix では、引数に編集した結果が直接更新されるので代入の手続きは必要ない。

上記例で fix 関数を使う場合のソース、編集画面で同様の操作を行た場合の、実行結果も示す。fix関数引数 price が更新されている。

ソースコード

price <- matrix(0,2,4) # 要素が 0 の 2行4列の行列を定義する
productname <- c("A", "B", "C", "D")
cityname <- c("Tokyo","London")
colnames(price)<- productname # price のラベルを productnameにする 
rownames(price)<- cityname # price のラベルを citynameにする 
price[1,] <- c(105,202,155,91) # 1 行目に Vector を 入力
price[2,] <- c(107,199,154,99) # 2 行目に Vector を 入力

fix(price) # fixで 編集

price  # price を表示

実行結果

> price <- matrix(0,2,4) # 要素が 0 の 2行4列の行列を定義する
> productname <- c("A", "B", "C", "D")
> cityname <- c("Tokyo","London")
> colnames(price)<- productname # price のラベルを productnameにする 
> rownames(price)<- cityname # price のラベルを citynameにする 
> price[1,] <- c(105,202,155,91) # 1 行目に Vector を 入力
> price[2,] <- c(107,199,154,99) # 2 行目に Vector を 入力
> 
> fix(price) # fixで 編集

price  # price を表示
> >           A   B   C  D
Tokyo   105 202 155 91
London  107 199 154 99
NewYork 103 201 153 NA
> 
変数型の変換

関数 fix や 関数 edit を用いて作成した Data Frameの変数型を変換する方法を示す。

関数 fix を用いて編集画面を開き、ラベルを左クリック(例では"A")すると、変数エディタが開く。

数値にしたいときは numeric、質的データにしたいときは character を指定する。

f:id:hamadakoichi:20100127030221j:image:w450

データファイル読み込み

Rにはテキストファイルを読み込む関数として、read.table, read.csv, scan 等がある。

パス表記

Rではパスを指定するときフォルダを "/" で区切り表記する。例えば、C:\Work\RTest\price.txt を読み込むときは、C:/Work/RTest/price.txt 。

関数 read.table による読み込み

関数 read.table は小、中規模のデータをRに読み込むのに適している。

C:\Work\RTest\price.txt にある次の内容のテキストファイルを読み込む例を挙げる。

f:id:hamadakoichi:20100127035635j:image

データが「スペース」または「タブ」で区切られている場合は、次のように記述する。

data <-read.table("C:/Work/RTest/price.txt",header=T,row.names=1) # read.tableでテキストデータ読込み
data # 表示

実行結果

> data <-read.table("C:/Work/RTest/price.txt",header=T,row.names=1) # read.tableでテキストファイルタ読込み
> data # 表示
         A   B   C  D
Tokyo  105 202 155 91
London 107 199 154 99
> 

引数 header=T (またはTRUE)は、データの第1行が列のラベルであることを示す。

row.names=1 は第1列が行のラベルであることを示す。

行、あるいは列のラベルがない場合は、対応する引数を省略する。


また、データが次のように", (カンマ)"で区切られている場合は、sep="," を追加する。

f:id:hamadakoichi:20100127035636j:image

data <-read.table("C:/Work/RTest/price.txt",header=T,row.name=1,sep=",") # read.tableでデータ読込み
data # 表示

実行結果

> data <-read.table("C:/Work/RTest/price_c.txt",header=T,row.names=1,sep=",") # sep=","でカンマ区切りのテキストファイル読込み
> data # 表示
         A   B   C  D
Tokyo  105 202 155 91
London 107 199 154 99
> 
形式指定が異なる場合

形式指定が異なる場合は、次のような実行結果となる。

data <-read.table("C:/Work/RTest/price_c.txt",header=T,row.names=1) # 指定と異なる形式(カンマ区切り)ファイルを読み込む
data # 表示

data <-read.table("C:/Work/RTest/price.txt",header=T,row.names=1,sep=",") # 指定と異なる形式(スペース区切り)ファイルを読み込む
data # 表示

実行結果

> data <-read.table("C:/Work/RTest/price_c.txt",header=T,row.names=1) # 指定と異なる形式(カンマ区切り)ファイルを読み込む
> data # 表示
data frame with 0 columns and 2 rows
> 
> data <-read.table("C:/Work/RTest/price.txt",header=T,row.names=1,sep=",") # 指定と異なる形式(スペース区切り)ファイルを読み込む
> data # 表示
data frame with 0 columns and 2 rows

関数 read.csv による読み込み

csv形式(,区切りで拡張子csv)を読み込むときは、関数read.csvを使う。

f:id:hamadakoichi:20100127074750j:image

read.csvの使用法は read.tableと同じ。CSVなので sep="," を指定する必要はない。

data <-read.csv("C:/Work/RTest/price.csv",header=T,row.names=1) 
data # 表示

実行結果

> data <-read.csv("C:/Work/RTest/price.csv",header=T,row.names=1) 
> data # 表示
         A   B   C  D
Tokyo  105 202 155 91
London 107 199 154 99

関数 scan による読み込み

関数 scan は大規模のデータセットを R に読み込むのに適している。

大量のデータを read.table, read.csv に比べ効率よく読み込むことができる。

次のデータを例に上げ説明する。

f:id:hamadakoichi:20100127061948j:image

関数 scan を使うとデータが1行に読み込まれる。関数 scan で読み込んだファイルを2行3列に行列に変更したいときは、関数 matrixと組み合わせる。読み込んだデータは通常、列方向順につめられるが、byrow=T (またはTURE)を指定すると、行方向に詰められる。

data<-scan("C:/Work/RTest/scandata.txt")
data

m<-matrix(data,3,4)
m
m2<-matrix(data,3,4,byrow=T)
m2

実行結果

> data<-scan("C:/Work/RTest/scandata.txt")
Read 12 items
> data
 [1]  1  2  3  4  5  6  7  8  9 10 11 12
> 
> m<-matrix(data,3,4)
> m
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
> m2<-matrix(data,3,4,byrow=T)
> m2
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12
> 

数値、文字が混在しているデータを scanで読み込むときは、列ごとにデータの属性を指定する必要がある。

例として次のデータを考える。

f:id:hamadakoichi:20100127063209j:image


data<-scan("C:/Work/RTest/scandata_mix.txt",list(name=" ",a=0,b=0,c=0,d=0)) # listで各列のデータ形式を指定
data # 読込みデータの表示

df<-data.frame(data) # Data Frame へ変換
df # Data farme 表示

実行結果

> data<-scan("C:/Work/RTest/scandata_mix.txt",list(name=" ",a=0,b=0,c=0,d=0)) # listで各列のデータ形式を指定
Read 3 records
> data # 読込みデータの表示
$name
[1] "A" "B" "C"

$a
[1] 1 5 9

$b
[1]  2  6 10

$c
[1]  3  7 11

$d
[1]  4  8 12

> 
> df<-data.frame(data) # Data Frame へ変換
> df # Data farme 表示
  name a  b  c  d
1    A 1  2  3  4
2    B 5  6  7  8
3    C 9 10 11 12
他Softwareファイル形式

パッケージ foreign を用いると SAS、SPSS, Stata, S-PLUSのファイル形式も読み込むことができる。

データの出力

Rのテキストファイル出力の関数として、write, wite.table, sink等が用意されている。

関数 Write による出力

write を次のように用いる。通常の出力では、データの並びの方向が異なる。転置関数 tを用いることにより方向をあわせることができる。ncolumns で出力するデータ列数を指定している。

data <- matrix(1:8,2,4) # 要素が 1から8 の 2行4列の行列
data # data を表示

write(data,"C:/Work/RTest/dataout.txt",ncolumns=4) # 通常出力
write(t(data),"C:/Work/RTest/dataout_t.txt",ncolumns=4) # 転置し出力

実行結果

> data <- matrix(1:8,2,4) # 要素が 1から8 の 2行4列の行列
> data # data を表示
     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8
> 
> write(data,"C:/Work/RTest/dataout.txt",ncolumns=4) # 通常出力
> write(t(data),"C:/Work/RTest/dataout_t.txt",ncolumns=4) # 転置し出力
> 

出力ファイル

f:id:hamadakoichi:20100127070812j:image

append=T (TRUE) を指定すると、既存ファイルに、追加で書き込みを行えます。


data <- matrix(1:8,2,4) # 要素が 1から8 の 2行4列の行列
data2 <- matrix(9:16,2,4) # 要素が 9から16 の 2行4列の行列
data  # dataを表示
data2 # data2を表示

write(t(data),"C:/Work/RTest/dataout_add.txt",ncolumns=4) # dataを出力
write(t(data2),"C:/Work/RTest/dataout_add.txt",ncolumns=4,append=T) # data2を追加出力

実行結果

> data <- matrix(1:8,2,4) # 要素が 1から8 の 2行4列の行列
> data2 <- matrix(9:16,2,4) # 要素が 9から16 の 2行4列の行列
> data  # dataを表示
     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8
> data2 # data2を表示
     [,1] [,2] [,3] [,4]
[1,]    9   11   13   15
[2,]   10   12   14   16
> 
> write(t(data),"C:/Work/RTest/dataout_add.txt",ncolumns=4) # dataを出力
> write(t(data2),"C:/Work/RTest/dataout_add.txt",ncolumns=4,append=T) # data2を追加出力

出力ファイル

f:id:hamadakoichi:20100127072108j:image

関数 write.table による出力

write.tableは Data Frame を出力する関数。文字列は " "で囲まれ、数値データはそのまま出力される。書式はwriteの書式と同じ。csv形式でファイルを出力する関数 write.csvも同様。

関数 sink による出力

関数 sink はコンソールに返される内容をファイルとして出力する関数。sink を用いる場合、出力を始める指示コマンドと、出力を終了する指示コマンドが必要である。write

と同様に、引数 append = TRUE も用いると、既存ファイルへ追加出力することができる。

data <- matrix(1:8,2,4) # 要素が 1から8 の 2行4列の行列
data2 <- matrix(9:16,2,4) # 要素が 9から16 の 2行4列の行列

sink("C:/Work/RTest/sinkout.txt") # ファイル sinkout.txt にデータ出力開始
data; data2 # dataと data2を表示
sink() # データ出力終了

実行結果

> data <- matrix(1:8,2,4) # 要素が 1から8 の 2行4列の行列
> data2 <- matrix(9:16,2,4) # 要素が 9から16 の 2行4列の行列
> 
> sink("C:/Work/RTest/sinkout.txt") # ファイル sinkout.txt にデータ出力開始
> data; data2 # dataと data2を表示
> sink() # データ出力終了

出力ファイル

f:id:hamadakoichi:20100127072109j:image

参考文献:

Rによるデータサイエンス データ解析の基礎から最新手法まで

Rによるデータサイエンス データ解析の基礎から最新手法まで

Rによる統計解析

Rによる統計解析

404 Not Found

R: The R Project for Statistical Computing