科学の箱

科学・IT・登山の話題

R

分散分析のcase study

投稿日:

分散分析についてcase studyをしてみる。目的はRで分散分析を実行する際の手順を明確にすること、およびそれに付随するRの関数を理解することである。

目標として以下をあげておく

  • テストデータを含めた操作をすべてRで完結させる
  • グラフィックをRで作成する
  • 分散分析を行う

まず一般的な手順を明らかにしておく

  1. データをRに読み込む
  2. クレンジング
  3. データを理解する
  4. 統計的分析を行う
  5. 考察する

まずデータを作成する。今回は以下のシナリオに基づく。

Networkパフォーマンスをスピードであらわす。スピードは大きいほどよい。このスピードに与える3要因について評価する。

  • 要因1: ルータ
  • 要因2: スイッチ
  • 要因3: ケーブル

要因1のルータでは2つの異なったルータを用意する。それぞれR1, R2とする。性能はR1>R2とする。要因2のスイッチも2つの異なったスイッチとする。それぞれS1, S2とする。性能はS2>S1とする。ケーブルもC1, C2とする。ケーブルに関しては性能に与える影響は同等とする。

上記の仮定に基づき、テストデータを作成する。

テストデータ作成は以下のように進める。

  • スイッチのspeedの平均値のみ決める。S1 は80, S2は150とする。
  • この平均値を基にして正規分布表からランダムにデータを取り出す。
  • 取り出した値について大きいほうをR1、小さいほうをR2に割り当てる。
  • 割り当てた値を平均として小さい分散でランダム値を2つ作る。これをケーブルC1, C2に割り当てる。
rnorme <- function(n, mean, sd){
   w_norm <- rnorm(n-1, mean=mean, sd=sd)
   w_norm <- c(w_norm, mean * n - sum(w_norm))
   return (w_norm)
}

s1 <- rnorme(2,80,20)
s1 <- sort(s1, decreasing=TRUE)
s1
s1 <- lapply(s1, function(x) rnorme(2,x,5))
s1
s1 <-unlist(s1)
s1


s2 <- rnorme(2,150,20)
s2 <- sort(s2, decreasing=TRUE)
s2
s2 <- lapply(s2, function(x) rnorme(2,x,10))
s2
s2 <- unlist(s2)
s2

以下が実行内容

> s1 <- rnorme(2,80,20)
> s1 <- sort(s1, decreasing=TRUE)
> s1
[1] 99.31832 60.68168
> s1 <- lapply(s1, function(x) rnorme(2,x,5))
> s1
[[1]]
[1]  92.90066 105.73599

[[2]]
[1] 60.81789 60.54547

> s1 <-unlist(s1)
> s1
[1]  92.90066 105.73599  60.81789  60.54547
> 
> 
> s2 <- rnorme(2,150,20)
> s2 <- sort(s2, decreasing=TRUE)
> s2
[1] 163.5751 136.4249
> s2 <- lapply(s2, function(x) rnorme(2,x,10))
> s2
[[1]]
[1] 174.6611 152.4891

[[2]]
[1] 151.6649 121.1849

> s2 <-unlist(s2)
> s2
[1] 174.6611 152.4891 151.6649 121.1849

このデータはフラットなのでデータの解析をするにしてもanovaを実行にするにしても不便であるのでdata.frameに変換する。

type_router <- c(rep("r1",4),rep("r2",4))
type_router
type_switch <- rep(c(rep("s1",2),rep("s2",2)),2)
type_switch
type_cable <- rep(c("c1","c2"),4)
type_cable
speed <- c(s1[1:2], s2[1:2], s1[3:4], s2[3:4])
speed

speed_test <- data.frame(router=type_router, switch=type_switch, cable=type_cable, speed=speed)
speed_test

下記は実行した内容

> type_router <- c(rep("r1",4),rep("r2",4))
> type_router
[1] "r1" "r1" "r1" "r1" "r2" "r2" "r2" "r2"
> type_switch <- rep(c(rep("s1",2),rep("s2",2)),2)
> type_switch
[1] "s1" "s1" "s2" "s2" "s1" "s1" "s2" "s2"
> type_cable <- rep(c("c1","c2"),4)
> type_cable
[1] "c1" "c2" "c1" "c2" "c1" "c2" "c1" "c2"
> speed <- c(s1[1:2], s2[1:2], s1[3:4], s2[3:4])
> speed
[1]  92.90066 105.73599 174.66112 152.48912  60.81789  60.54547 151.66489
[8] 121.18488
> 
> speed_test <- data.frame(router=type_router, switch=type_switch, cable=type_cable, speed=speed)
> speed_test
  router switch cable     speed
1     r1     s1    c1  92.90066
2     r1     s1    c2 105.73599
3     r1     s2    c1 174.66112
4     r1     s2    c2 152.48912
5     r2     s1    c1  60.81789
6     r2     s1    c2  60.54547
7     r2     s2    c1 151.66489
8     r2     s2    c2 121.18488

傾向を調べるために2変数で傾向を調べる。まず2変数でまとめたテーブルを作成する。

agg_rs <- aggregate(speed_test$speed, speed_test[,c("router","switch")], mean)
colnames(agg_rs) <- c("router", "switch", "speed")
agg_rc <- aggregate(speed_test$speed, speed_test[,c("router","cable")], mean)
colnames(agg_rc) <- c("router", "cable", "speed")
agg_sc <- aggregate(speed_test$speed, speed_test[,c("switch","cable")], mean)
colnames(agg_sc) <- c("switch", "cable", "speed")

agg_rs
agg_rc
agg_sc

それぞれのテーブルは以下のようになる。

> agg_rs
  router switch     speed
1     r1     s1  99.31832
2     r2     s1  60.68168
3     r1     s2 163.57512
4     r2     s2 136.42488
> agg_rc
  router cable     speed
1     r1    c1 133.78089
2     r2    c1 106.24139
3     r1    c2 129.11255
4     r2    c2  90.86517
> agg_sc
  switch cable     speed
1     s1    c1  76.85927
2     s2    c1 163.16300
3     s1    c2  83.14073
4     s2    c2 136.83700

テーブルだけ見てもよくわからないので要因効果図を作成してみる。

library(ggplot2)

g_rs <- ggplot(agg_rs, aes(x=router, y=speed, group=switch, color=switch)) + geom_line() + geom_point(size=3) + ylim(0,200)
g_rc <- ggplot(agg_rc, aes(x=router, y=speed, group=cable, color=cable)) + geom_line() + geom_point(size=3) + ylim(0,200)
g_sc <- ggplot(agg_sc, aes(x=switch, y=speed, group=cable, color=cable)) + geom_line() + geom_point(size=3) + ylim(0,200)

require(gridExtra)
grid.arrange(g_rs, g_rc, g_sc, main=textGrob("Compare performance between three factos(router, switch and cable)", gp=gpar(cex=1)), ncol=3)

プロット結果は以下のようになった。

compare

この結果を分析してみる。

図1よりR1とR2を比較するとスピードはR1のほうが常に上である。またS1とS2ではS2のほうがよい。交互作用は見られない。図2からR1 > R2である。ケーブルの違いによるSpeedへの影響は見られない。図3からS2>S1である。ケーブルの違いによるSpeedへの影響は見られない。

メタ情報

inarticle



メタ情報

inarticle



-R
-,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

rvestで読み込むcssを調べる方法

rvestで対象とするhtmlのブロックは下記のように取得できる。 http://blog.rstudio.com/2014/11/24/rvest-easy-web-scraping-with-r/ …

no image

主成分分析

Rで提供されているirisを使って主成分分析を実施する。 主成分分析の手順 データが分離できるか検証する 主成分負荷量と寄与率を求める 新しい変数に名前を付ける 変量プロット 主成分プロット 今回はR …

no image

Rによるやさしい統計学/4-母集団と標本

言葉の定義 推測統計、推定、点推定、区間推定、検定 標本、標本統計量、推定量、標本抽出、確率変数、確率分布、標本誤差 標本分布、標本統計量、平均、標準偏差、標準誤差 4.5 標本分布 標本平均の標本分 …

no image

Rに関するmemo

グループ毎に度数分布を作成する by(housing$VAL, housing$SERIALNO, length) グループで平均値を計算するための式 DT[,mean(pwgtp15),by=SEX …

no image

oneway.test, aov, anovaの違い

RではANOVAを実行する際にoneway.test, aov, anovaを利用できる。違いが判らない。調べてみるとなんかややこしそうなのでとりあえず資料だけ集めてみた。 ONEWAY BETWEE …

2014年5月
« 4月   6月 »
 1234
567891011
12131415161718
19202122232425
262728293031  

side bar top



アーカイブ

カテゴリー