Octopress Blog

自分のためのまとめブログ

第17回 granpark.rb 「データ解析技術入門(R言語編)」

第17回 granpark.rb 「データ解析技術入門(R言語編)」

値代入

1
2
3
4
5
6
7
8
> a <- 5
> d <- "abc"

> a
[1] 5

> d
[1] "abc"

代入には「=」も使えるが、Rは慣例的に「<-」を使う。

ベクトル計算

「c」を使う

1
2
3
4
5
6
> a <- c(1,2,3)
> a
[1] 1 2 3
> b <- c(4,5,6)
> a+b
[1] 5 7 9

行列計算

「matrix」を使う
3行4列の行列に1から12までの数値が入っている例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
> matrix(1:12,3,4)
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

> a <- matrix(1:12,3,4)
> a
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

> a[1,]
[1]  1  4  7 10

> a[,1]
[1] 1 2 3

> a[1,1]
[1] 1

> a[1,1] * a[1,2]
[1] 4

> a[3,1] * a[1,2]
[1] 12

irisを使ったRの基本的利用方法

アヤメのガクヘン(蕚片)と花びらに関するデータ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
> iris
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1            5.1         3.5          1.4         0.2     setosa
2            4.9         3.0          1.4         0.2     setosa
...

> summary(iris)
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width  
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100 
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300 
 Median :5.800   Median :3.000   Median :4.350   Median :1.300 
 Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199 
 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800 
 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500 
       Species 
 setosa    :50 
 versicolor:50 
 virginica :50 


> sum(iris[,1])  合計
[1] 876.5

> mean(iris[,1]) 平均
[1] 5.843333

> sd(iris[,1])  標準偏差
[1] 0.8280661

> max(iris[,1]) 最大
[1] 7.9

> min(iris[,1]) 最小
[1] 4.3

> str(iris[,1])
 num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...

> str(iris) データに関する情報
'data.frame':     150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 …

data.frame…変数の型

図形描画

1
2
3
4
5
> plot(iris[,1],iris[,3])

> plot(iris)

> pairs(iris[1:4], pch=21, bg=c("red", "green3","blue"))

相関を見る

1
2
3
4
5
6
> cor(iris[,1:4])
             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length    1.0000000  -0.1175698    0.8717538   0.8179411
Sepal.Width    -0.1175698   1.0000000   -0.4284401  -0.3661259
Petal.Length    0.8717538  -0.4284401    1.0000000   0.9628654
Petal.Width     0.8179411  -0.3661259    0.9628654   1.0000000

同じ値は1になる

単回帰分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> kaiki <- lm(iris$Petal.Length ~ iris$Sepal.Length)
> kaiki

Call:
lm(formula = iris$Petal.Length ~ iris$Sepal.Length)

Coefficients:
      (Intercept)  iris$Sepal.Length 
           -7.101              1.858 

単回帰直線が
y=1.858, x=-7.101
という意味 

> plot(iris$Petal.Length ~ iris$Sepal.Length)

Rの掟

  • for, if, while, repeat, 添字操作は遅くなるのでなるべくやらない

  • 添字操作は添字集合による論理判断させる
    添字一つではなく、ある条件の集合体として操作させる
    →それによってできた添字集合は逐次の論理判断と等価

問題

1
2
3
4
5
6
7
8
9
> x <- runif(1000000)

> test1 <- function() {
+ res <- numeric(1000000)
+ for (i in 1:1000000) res[i] <- exp(x[i])
+ return(res)}
> system.time(test1())
   ユーザ   システム       経過 
     2.089      0.013      2.102 

これを速くする

答え

1
2
3
4
> x <- runif(1000000)
> system.time(res <-exp(x))
   ユーザ   システム       経過 
     0.013      0.002      0.016

できるだけコードを書かずに計算する方法を考えるとだいたい正解

Rメモ

  • C++で実装されている
  • ifやforを使いすぎるとRubyやPerlより遅くなるが、ちゃんとやるとC++くらい速い
    ifやループは使わない事に喜びをおぼえてきたら立派なR使い。
    使うべきところは使ってもよい。

  • エクセルより大きなデータを扱える

  • 拡張パッケージがいろいろある
  • メモリー容量内の範囲で使える
  • 「R」は検索しにくい(Rubyとかのほうがヒットする)
  • メガ、ギガクラスの処理はRでよい →それより大きくなるとHive

  • Rstudioを入れると、WebブラウザでRが使える →エディタや描画や関数など別窓で表示させられる
    →iPadでRが使えるらしい

その他

  • 何かを計算する場合、テールの部分の情報は必要なのかを考えると良い
    データが全部必要なのか、一部あればよいのか考慮することで計算量を少なくすることができる可能性がある