akiyoko blog

akiyoko の IT技術系ブログです

Windows で R(統計解析ツール)を使う

f:id:akiyoko:20141107172421j:plain


gacco で 11月12日からスタートする「統計学Ⅰ:データ分析の基礎」で、統計解析ツール「R」を使用するようなので、事前に勉強しておこうと思います。


環境は、Windows 7 です。





R とは

統計解析に特化したプログラミング言語であり、その実行環境を指す場合もあります。
Windows・Linux・Mac 向けに、オープンソースの実行環境ソフトウェア(コンソール)が提供されており、誰でも自由に使うことができます。


インストール後の操作は、基本的にはプログラムをタイプして実行することになります(環境設定など一部の機能は、GUI で扱うことができます)。




インストール方法(Windows版)

1) ソフトウェアをダウンロード

The Comprehensive R Archive Network で「Download R for Windows」をクリック。

f:id:akiyoko:20141107001452p:plain


次に、「base」をクリック。

f:id:akiyoko:20141107001500p:plain


「Download R 3.1.2 for Windows」(最新版のリンク)をクリックすると、exeファイルがダウンロードできます。

f:id:akiyoko:20141107001510p:plain


2) インストール

ダウンロードした「R-3.1.2-win.exe」をダブルクリックして、インストールを実行します。


言語は「日本語」で。

f:id:akiyoko:20141107003107p:plain


f:id:akiyoko:20141107003117p:plain


次へ。

f:id:akiyoko:20141107003124p:plain


インストール先はそのまま。

f:id:akiyoko:20141107003135p:plain


マシンが64ビットなので、「32-bit Files」のチェックを外しておきました。

f:id:akiyoko:20141107003238p:plain


起動時オプションは「いいえ (デフォルトのまま)」で変更せず。

f:id:akiyoko:20141107003254p:plain


これもそのまま。

f:id:akiyoko:20141107003303p:plain


そのまま。

f:id:akiyoko:20141107003309p:plain


f:id:akiyoko:20141107003326p:plain


インストールが完了しました。

ここまで、10分足らずで完了すると思います。



起動すると、このような画面が立ち上がります。

f:id:akiyoko:20141107003728p:plain



(参考)






 

使い方

R の使い方を手っ取り早く理解するためにまず、ドットインストールの「R言語入門」(全13回)の動画をひと通り全部見てみました。


http://dotinstall.com/lessons/basic_r
http://dotinstall.com/lessons/basic_r


動画時間は全部で 35分ほど。
手を動かすのも合わせて、一時間ほどでチェックし終えることができました。


【学んだこと】

メモ書きなので、読み飛ばしていただいて結構です。


 

#01 R言語とはなにか?

作業環境(ワークスペース)をまるごとイメージ(「.RData」というファイル)で保存する

環境設定で初期作業ディレクトリを指定して、再起動

 

#02 Rコンソールを使ってみよう

ヘルプ

> help()
> help(matrix)
> ?matrix

コンソールを消すには、[編集] -> [コンソール画面を消去](あるいは、Ctrl+L)

 

#03 変数とデータ型について

変数に値(スカラ)を代入

> x <- 5

変数の保持内容を見るには、

> ls()

実行環境から変数を削除するには、

> rm(x)

データ型

  • 数値
  • 文字列
  • ベクトル
  • 行列
  • リスト
  • データフレーム
  • NULL
  • TRUE/FALSE
  • NA(欠損値)
  • NaN(非数)
  • Inf(無限大)

 

#04 数値と文字列を扱ってみよう

%/% 整数商
%% 余り
^ べき乗

cos()
sqrt() ルート
round() 四捨五入


文字列の連結

> paste("a", "b", "c", sep="")

数値 ⇔ 文字列の変換

> x <- 5
> as.character(x)

> s <- "5"
> as.numeric(s)

 

#05 ベクトルを扱ってみよう

複数のデータをまとめて扱うための「ベクトル」

ベクトルを作るときは、combineの「c」を使う

> v <- c(1, 3, 5)

添え字も使える

> v[2]
> v[2] <- 10  # 値を変更

要素数

> length(v)

連番のベクトル

> v <- 1:10

きめ細かいベクトルを作るときは、seq

> v <- seq(1, 10, by=2)

繰り返しは rep

> v <- rep(1:5, time=3)

 

#06 ベクトルの演算をしてみよう
> x <- c(1, 3, 5)
> x * 2
[1]  2  6 10

それぞれの要素に対して、演算をすることになる

> x <- c(1, 3, 5)
> y <- c(2, 3, 4)
> x + y
[1] 3 6 9

ベクトル同士を足し合わせることもできる

> x > y
[1] FALSE FALSE  TRUE

左辺のベクトルの要素が右辺のベクトルに含まれているか

> x %in% y
[1] FALSE  TRUE FALSE
> union(x, y)  # 和集合
> intersect(x, y)  # 積集合
> setdiff(x, y)  # 差集合
> setequal(x, y)  # 集合が等しいか

 

#07 因子ベクトルを使ってみよう

因子ベクトルは、カテゴリ付きのベクトル
factor()
を使う

> x <- c("S","M","L","M","S")
> factor(x)
[1] S M L M S
Levels: L M S

カテゴリを順序付きで管理したいときは、
factor() でなくて、ordered() を使う

> x.or <- ordered(x, levels=c("S", "M", "L"))

 

#08 行列を扱ってみよう
> x <- matrix(1:6, nrow=3, ncol=2)  # 3x2表現
> x
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6

通常は、縦方向に流し込まれる

オプションを付ければ横に流し込まれる

> x <- matrix(1:6, nrow=3, ncol=2, byrow=TRUE)
> x
     [,1] [,2]
[1,]    1    2
[2,]    3    4
[3,]    5    6

行ごとを結合して作る方法
rbind()

> x <- rbind(c(1, 2), c(3, 4), c(5, 6))
> x
     [,1] [,2]
[1,]    1    2
[2,]    3    4
[3,]    5    6

列を結合して作る方法

> x <- cbind(c(1, 2), c(3, 4), c(5, 6))
> x
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

x + 1
1 / x

> dim(x)
[1] 2 3
> nrow(x)
[1] 2
> ncol(x)
[1] 3

 

#09 行列を編集してみよう
> x
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
> x[1, ]
[1] 1 3 5
> x[, 2]
[1] 3 4
> x[1, 2]
[1] 3

こんなことも。

> x[1, 1:2]
[1] 1 3

値の変更は、

x[1, 2] <- 10

列や行の追加削除をしたいときは、

> edit(x)

で、Rデータエディタが立ち上がる

そのままでは保存できないので、
別の変数に代入するか、

> fix(x)

から起動するとよい

 

#10 リストを扱ってみよう

異なるデータ型をまとめて扱うことができるリスト

x <- list(xxx, xxx, xxx)

取り出すときは、

x[1]

とすると、リスト形式のままなので、

x[[1]]

とすると、元のデータ型で取り出せる

 

#11 データフレームを扱ってみよう
> x <- data.frame(SIZE=c("M", "L", "S", "L", "M"), SALES=c(1, 2, 1, 3, 1))
> x
  SIZE SALES
1    M     1
2    L     2
3    S     1
4    L     3
5    M     1
> x$SIZE
[1] M L S L M
Levels: L M S

勝手に因子ベクトルになる

テキストファイルからデータフレームを取得する

> x <- read.table("sales.txt", header=TRUE, sep=",", na.strings="*")

「na.strings」は、欠損値がどんな値で入っているかを指定

 

#12 データの集計をしてみよう
> sum(x$SALES)
> max()
> min()
> mean()
> sd() 標準偏差

欠損値がある場合は、結果が「NA」になってしまうので、

> mean(x$DISTANCE, na.rm=TRUE)

とすることで、欠損値を除外することもできる。

> summary(x$SALES)

あるいは

> summary(x)

とすると、サマリを出すことが可能。

str(x)

とすると、解析に使う情報をチェックすることができる。

 

#13 グラフを描いてみよう
data()

でデフォルトで用意されているデータを見ることができる

carsを使ってみる

> str(cars)
'data.frame':	50 obs. of  2 variables:
 $ speed: num  4 4 7 7 8 9 10 10 10 11 ...
 $ dist : num  2 10 4 22 16 10 18 26 34 17 ...
> summary(cars)
     speed           dist
 Min.   : 4.0   Min.   :  2.00
 1st Qu.:12.0   1st Qu.: 26.00
 Median :15.0   Median : 36.00
 Mean   :15.4   Mean   : 42.98
 3rd Qu.:19.0   3rd Qu.: 56.00
 Max.   :25.0   Max.   :120.00
> hist(cars$speed)
> barplot(cars$speed)
> plot(cars$speed, cars$dist)

相関

> cor(cars$speed, cars$dist)
[1] 0.8068949

 
f:id:akiyoko:20141107033130p:plain






 

分かったこと

ここで、「R言語」とはいかなるものか、というのをおさらい。


言語としての特徴は、こんな感じです。

  • 変数への代入は「<-」を使う。
  • 真偽値は、「TRUE/FALSE」あるいは「T/F」で表す。
  • ベクトル (Vector) は、同じデータ型の集まりで、他の言語(例えば Java 等)でいうところの「リスト」に相当する。
    • イメージとしては、縦列方向に並んだデータと考える(列ベクトル:下図)。
    • ベクトルを作るには、「c()」関数を使うか、連続データ「m:n」を使う。
    • 添え字は「1」から開始。
    • R言語の「リスト」は、異なるデータ型の集まりを表す。
    • 変数も、要素が1つのベクトルとみなされる。

f:id:akiyoko:20141107013227p:plain

  • 行列 (Matrix) は、「matrix()」関数でベクトルを流し込むか(列が優先)、「rbind()」で行ベクトルを連結、あるいは「cbind()」で列ベクトルを連結して作成する。

f:id:akiyoko:20141107031937p:plain

f:id:akiyoko:20141107031952p:plain

  • 因子ベクトルは特定のカラムに紐付けられたデータ群にあたり、データフレームは因子ベクトルの集合。
  • ヘッダ付きの表データは、データフレームで表される。
    • データベース(RDB)のテーブルと考えれば分かりやすい(下図)。
    • ヘッダ付きのCSVデータを「read.csv()」で読み込むと、データフレームとして扱うことができる。
  • 射影(一部の列だけを抜き出す)や選択(条件にマッチする行を取り出す)こともできる。
    • 射影は、データフレーム$"列名" で取得可能。
    • 選択は、データフレーム[条件式,] で取得可能。

f:id:akiyoko:20141107171430p:plain

  • データセットがデフォルトで用意されている(例えば、車が停車するまでに必要な距離のデータ「cars」など)。
  • 総じて、「列」(縦方向)が優先される。


 
よく使いそうな関数をいくつかピックアップしてみました。

関数 概要
c() ベクトルを作成する
matrix() 行列を作成する
rbind() 行ベクトルを連結する
cbind() 列ベクトルを連結する
nrow() データの行数を求める
ncol() データの列数を求める
rownames() 各行の名前を求める
unique() 重複を排除する
read.csv() CSVファイルを読み込む


(参考)




 

実際に使ってみる

次のような 50人分の身長・体重・性別を記録した擬似データが、「C:\temp」の下に格納してあるとします。


measures.csv

性別,身長,体重
M,169.2,50.8
F,157.6,58
F,166.9,56.2
F,161.9,57.4
M,172.1,53.1
M,167.5,68.1
M,165.7,57.5
F,161.8,57.7
F,161.7,60.2
M,168,44.5
F,155.9,57
M,172.7,52.9
F,159,45.4
F,162.2,69.9
F,156.4,44
F,143.3,42.1
M,167.3,60
F,154.2,51.8
F,159.6,42.1
M,173.3,79.7
M,173.3,63.4
M,180.4,80.1
F,153.9,37.7
M,166.7,47.3
F,158.3,47.1
F,168.3,57.4
F,162.6,53.7
F,158.1,45.7
F,163.1,66.8
F,169.9,59.5
M,178.3,62.9
F,160,57.5
M,166.2,57.2
M,166.7,36.8
M,165.9,66.1
M,169,71.4
F,156.4,32.4
M,167.9,65.2
M,171.2,46.3
M,185.9,64.3
F,169.5,61.3
F,156.7,47.6
M,173.8,60.6
M,173.8,62
M,163.2,56.8
F,157.9,34.2
F,149.5,45.3
F,169.6,60.6
F,157.3,47
M,169.6,55.9


ちなみにこのデータは、下のような Excel関数を使って生成しました。

f:id:akiyoko:20141107173501p:plain




コンソールから、CSVファイルを読み込みます。

> measures <- read.csv("c:/temp/measures.csv")

> measures
   性別  身長 体重
1     M 169.2 50.8
2     F 157.6 58.0
3     F 166.9 56.2
4     F 161.9 57.4
5     M 172.1 53.1
6     M 167.5 68.1
7     M 165.7 57.5
8     F 161.8 57.7
9     F 161.7 60.2
10    M 168.0 44.5
11    F 155.9 57.0
12    M 172.7 52.9
13    F 159.0 45.4
14    F 162.2 69.9
15    F 156.4 44.0
16    F 143.3 42.1
17    M 167.3 60.0
18    F 154.2 51.8
19    F 159.6 42.1
20    M 173.3 79.7
21    M 173.3 63.4
22    M 180.4 80.1
23    F 153.9 37.7
24    M 166.7 47.3
25    F 158.3 47.1
26    F 168.3 57.4
27    F 162.6 53.7
28    F 158.1 45.7
29    F 163.1 66.8
30    F 169.9 59.5
31    M 178.3 62.9
32    F 160.0 57.5
33    M 166.2 57.2
34    M 166.7 36.8
35    M 165.9 66.1
36    M 169.0 71.4
37    F 156.4 32.4
38    M 167.9 65.2
39    M 171.2 46.3
40    M 185.9 64.3
41    F 169.5 61.3
42    F 156.7 47.6
43    M 173.8 60.6
44    M 173.8 62.0
45    M 163.2 56.8
46    F 157.9 34.2
47    F 149.5 45.3
48    F 169.6 60.6
49    F 157.3 47.0
50    M 169.6 55.9


サマリを出します。

> summary(measures)
 性別        身長            体重      
 F:27   Min.   :143.3   Min.   :32.40  
 M:23   1st Qu.:158.5   1st Qu.:47.02  
        Median :166.1   Median :57.10  
        Mean   :164.8   Mean   :55.17  
        3rd Qu.:169.6   3rd Qu.:61.12  
        Max.   :185.9   Max.   :80.10  

> str(measures)
'data.frame':   50 obs. of  3 variables:
 $ 性別: Factor w/ 2 levels "F","M": 2 1 1 1 2 2 2 1 1 2 ...
 $ 身長: num  169 158 167 162 172 ...
 $ 体重: num  50.8 58 56.2 57.4 53.1 68.1 57.5 57.7 60.2 44.5 ...


列の抽出(射影)をしてみます。

> measures[, 1]
 [1] M F F F M M M F F M F M F F F F M F F M M M F M F F F F F F M F M M M M F M M M F F M M M F F F F M
Levels: F M
> measures$"性別"
 [1] M F F F M M M F F M F M F F F F M F F M M M F M F F F F F F M F M M M M F M M M F F M M M F F F F M
Levels: F M

> measures$"身長"
 [1] 169.2 157.6 166.9 161.9 172.1 167.5 165.7 161.8 161.7 168.0 155.9 172.7 159.0 162.2 156.4 143.3 167.3 154.2
[19] 159.6 173.3 173.3 180.4 153.9 166.7 158.3 168.3 162.6 158.1 163.1 169.9 178.3 160.0 166.2 166.7 165.9 169.0
[37] 156.4 167.9 171.2 185.9 169.5 156.7 173.8 173.8 163.2 157.9 149.5 169.6 157.3 169.6
> sum(measures$"身長")
[1] 8239.3
> mean(measures$"身長")
[1] 164.786
> sd(measures$"身長")
[1] 7.967383

> measures$"体重"
 [1] 50.8 58.0 56.2 57.4 53.1 68.1 57.5 57.7 60.2 44.5 57.0 52.9 45.4 69.9 44.0 42.1 60.0 51.8 42.1 79.7 63.4 80.1
[23] 37.7 47.3 47.1 57.4 53.7 45.7 66.8 59.5 62.9 57.5 57.2 36.8 66.1 71.4 32.4 65.2 46.3 64.3 61.3 47.6 60.6 62.0
[45] 56.8 34.2 45.3 60.6 47.0 55.9
> sum(measures$"体重")
[1] 2758.5
> mean(measures$"体重")
[1] 55.17
> sd(measures$"体重")
[1] 10.62343


行の抽出(選択)をします。

> measures[1, ]
  性別  身長 体重
1    M 169.2 50.8

> measures[measures$"性別" == "M", ]
   性別  身長 体重
1     M 169.2 50.8
5     M 172.1 53.1
6     M 167.5 68.1
7     M 165.7 57.5
10    M 168.0 44.5
12    M 172.7 52.9
17    M 167.3 60.0
20    M 173.3 79.7
21    M 173.3 63.4
22    M 180.4 80.1
24    M 166.7 47.3
31    M 178.3 62.9
33    M 166.2 57.2
34    M 166.7 36.8
35    M 165.9 66.1
36    M 169.0 71.4
38    M 167.9 65.2
39    M 171.2 46.3
40    M 185.9 64.3
43    M 173.8 60.6
44    M 173.8 62.0
45    M 163.2 56.8
50    M 169.6 55.9

> measures[measures$"身長" > 170, ]
   性別  身長 体重
5     M 172.1 53.1
12    M 172.7 52.9
20    M 173.3 79.7
21    M 173.3 63.4
22    M 180.4 80.1
31    M 178.3 62.9
39    M 171.2 46.3
40    M 185.9 64.3
43    M 173.8 60.6
44    M 173.8 62.0


その他いろいろ。

> nrow(measures)
[1] 50
> names(measures)
[1] "性別" "身長" "体重"
> colnames(measures)
[1] "性別" "身長" "体重"
> rownames(measures)
 [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "20" "21" "22"
[23] "23" "24" "25" "26" "27" "28" "29" "30" "31" "32" "33" "34" "35" "36" "37" "38" "39" "40" "41" "42" "43" "44"
[45] "45" "46" "47" "48" "49" "50"

> cor(measures$"身長", measures$"体重")
[1] 0.5910777


グラフを出力してみます。

> plot(measures$"身長", measures$"体重")

 
f:id:akiyoko:20141107165424p:plain


「BMI」の列を追加してみます。

> measures$"BMI" <- measures$"体重" / (measures$"身長" / 100) ^ 2

> measures
   性別  身長 体重      BMI
1     M 169.2 50.8 17.74447
2     F 157.6 58.0 23.35154
3     F 166.9 56.2 20.17547
4     F 161.9 57.4 21.89869
5     M 172.1 53.1 17.92804
6     M 167.5 68.1 24.27267
7     M 165.7 57.5 20.94223
8     F 161.8 57.7 22.04036
9     F 161.7 60.2 23.02377
10    M 168.0 44.5 15.76672
11    F 155.9 57.0 23.45215
12    M 172.7 52.9 17.73663
13    F 159.0 45.4 17.95815
14    F 162.2 69.9 26.56902
15    F 156.4 44.0 17.98785
16    F 143.3 42.1 20.50169
17    M 167.3 60.0 21.43677
18    F 154.2 51.8 21.78517
19    F 159.6 42.1 16.52785
20    M 173.3 79.7 26.53757
21    M 173.3 63.4 21.11019
22    M 180.4 80.1 24.61271
23    F 153.9 37.7 15.91711
24    M 166.7 47.3 17.02119
25    F 158.3 47.1 18.79572
26    F 168.3 57.4 20.26486
27    F 162.6 53.7 20.31109
28    F 158.1 45.7 18.28321
29    F 163.1 66.8 25.11126
30    F 169.9 59.5 20.61248
31    M 178.3 62.9 19.78554
32    F 160.0 57.5 22.46094
33    M 166.2 57.2 20.70780
34    M 166.7 36.8 13.24270
35    M 165.9 66.1 24.01644
36    M 169.0 71.4 24.99912
37    F 156.4 32.4 13.24560
38    M 167.9 65.2 23.12843
39    M 171.2 46.3 15.79696
40    M 185.9 64.3 18.60596
41    F 169.5 61.3 21.33640
42    F 156.7 47.6 19.38514
43    M 173.8 60.6 20.06195
44    M 173.8 62.0 20.52542
45    M 163.2 56.8 21.32593
46    F 157.9 34.2 13.71709
47    F 149.5 45.3 20.26823
48    F 169.6 60.6 21.06788
49    F 157.3 47.0 18.99505
50    M 169.6 55.9 19.43391

 

使ってみた感想・まとめ

コンソールの動作は軽快で、手軽に使うことができました。
R言語については、ベクトルや行列の概念が把握できれば、すぐに理解できると思います。

棒グラフや散布図、ヒストグラムなどのグラフも簡単に出力できるし、デフォルトのデータセットがいくつか用意されているのも、まさに至れり尽くせりのツールだという印象でした。


次のステップとしては、
政府統計の総合窓口 GL01010101
のサイトから、国勢調査等のCSVファイルをダウンロードできるので、いろいろと解析できそうですね。


ちなみに、簡単な処理はここで説明したコンソールを使って実行すればよいのですが、複雑な処理を実行するには、[ファイル] -> [新しいスクリプト] から、スクリプトを書くこともできるようです。





参考


初心者向けで評価も高いです。