gacco で 11月12日からスタートする「統計学Ⅰ:データ分析の基礎」で、統計解析ツール「R」を使用するようなので、事前に勉強しておこうと思います。
環境は、Windows 7 です。
R とは
統計解析に特化したプログラミング言語であり、その実行環境を指す場合もあります。
Windows・Linux・Mac 向けに、オープンソースの実行環境ソフトウェア(コンソール)が提供されており、誰でも自由に使うことができます。
インストール後の操作は、基本的にはプログラムをタイプして実行することになります(環境設定など一部の機能は、GUI で扱うことができます)。
インストール方法(Windows版)
1) ソフトウェアをダウンロード
The Comprehensive R Archive Network で「Download R for Windows」をクリック。
次に、「base」をクリック。
「Download R 3.1.2 for Windows」(最新版のリンク)をクリックすると、exeファイルがダウンロードできます。
2) インストール
ダウンロードした「R-3.1.2-win.exe」をダブルクリックして、インストールを実行します。
言語は「日本語」で。
次へ。
インストール先はそのまま。
マシンが64ビットなので、「32-bit Files」のチェックを外しておきました。
起動時オプションは「いいえ (デフォルトのまま)」で変更せず。
これもそのまま。
そのまま。
インストールが完了しました。
ここまで、10分足らずで完了すると思います。
起動すると、このような画面が立ち上がります。
(参考)
使い方
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 6x + 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
分かったこと
ここで、「R言語」とはいかなるものか、というのをおさらい。
言語としての特徴は、こんな感じです。
- 変数への代入は「<-」を使う。
- 真偽値は、「TRUE/FALSE」あるいは「T/F」で表す。
- ベクトル (Vector) は、同じデータ型の集まりで、他の言語(例えば Java 等)でいうところの「リスト」に相当する。
- イメージとしては、縦列方向に並んだデータと考える(列ベクトル:下図)。
- ベクトルを作るには、「c()」関数を使うか、連続データ「m:n」を使う。
- 添え字は「1」から開始。
- R言語の「リスト」は、異なるデータ型の集まりを表す。
- 変数も、要素が1つのベクトルとみなされる。
- 行列 (Matrix) は、「matrix()」関数でベクトルを流し込むか(列が優先)、「rbind()」で行ベクトルを連結、あるいは「cbind()」で列ベクトルを連結して作成する。
- 因子ベクトルは特定のカラムに紐付けられたデータ群にあたり、データフレームは因子ベクトルの集合。
- ヘッダ付きの表データは、データフレームで表される。
- データベース(RDB)のテーブルと考えれば分かりやすい(下図)。
- ヘッダ付きのCSVデータを「read.csv()」で読み込むと、データフレームとして扱うことができる。
- 射影(一部の列だけを抜き出す)や選択(条件にマッチする行を取り出す)こともできる。
- 射影は、データフレーム$"列名" で取得可能。
- 選択は、データフレーム[条件式,] で取得可能。
- データセットがデフォルトで用意されている(例えば、車が停車するまでに必要な距離のデータ「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関数を使って生成しました。
コンソールから、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$"体重")
「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ファイルをダウンロードできるので、いろいろと解析できそうですね。
ちなみに、簡単な処理はここで説明したコンソールを使って実行すればよいのですが、複雑な処理を実行するには、[ファイル] -> [新しいスクリプト] から、スクリプトを書くこともできるようです。