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

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

2010-05-13

[][] Linux Business Initiative(LBI) ビジネス講演会 で講演してきました −「業務プロセス改革とデータマイニング Linux Business Initiative(LBI) ビジネス講演会 で講演してきました −「業務プロセス改革とデータマイニング」 - hamadakoichi blog を含むブックマーク  Linux Business Initiative(LBI) ビジネス講演会 で講演してきました −「業務プロセス改革とデータマイニング」 - hamadakoichi blog のブックマークコメント

2010/05/07 "2010年度 Linux Business Initiative (LBI) ビジネス講演会"で講演を行ってきました。「業務プロセス改革とデータマイニング」。

Linux Business Initiative - イベント案内 | 2010-05-07 (金) 2010年度総会および LBIビジネス講演会


尖った技術開発をされている企業の 代表取締役・役員の方々約30名に対し、質疑応答も含め 80分の講演をさせて頂きました。たくさんのご質問を頂け、双方向の進行を行うことができました。

懇親会でも「講演すごく面白かったです。ぜひもっと聞きたい」と多くの方々から言って頂けたり、「濱田さんの講演を聞くために来ました」と言って頂ける方もいて、心から感謝しています。あるシステム開発・運用ビジネスをされている代表の方から「ぜひ自社の業務改革をしたい」ともお話し頂けました。現在の世界の活動において広く横たわる課題。それらを解決し、より適切な活動、より適切な未来、の実現に役立てたらと思っています。

"さらに多くの活動をよりよく出来る"と私は信じています。そして"世界中の活動をよりよい形にしていきたい"。私はそう考え続け、行動を続けています。よりよい世界、よりよい未来の実現へ向けて。今後ともよろしくお願い致します。

f:id:hamadakoichi:20100514042505j:image

f:id:hamadakoichi:20100514042548j:image

講演AGENDA

講演資料

※公開資料、社内レビュー・承認済み。

リンク

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