Rによるやさしい統計学で統計学を0から勉強する(1日目)
コンピュータビジョンにしろ音声認識にしろデータマイニングにしろ、多変量データから統計学的なアプローチで何らかの決定を導き出す、というのが近年の大きな技術トレンドの1つだと思います。OpenCVを色々触っているうちに、やっぱそうだよな、と改めて思い知っている今日この頃です。
という訳で、もうすっかり応用数学とか忘れてしまってるんだけど… ソフトウェアエンジニアとしては、ここらで勉強し直さないと今後生きて行けない気がしてきたので、まずはちまちまと統計学を0から勉強したいと思います。
まずはこの本で勉強していく。
ところで本屋に行って思ったですが、Rの本ってたくさん出てますね。知らなかった。。
1章 Rと統計学
とにかく触ってみるよ。
インストール
HomebrewにてRをインストール。
% brew install gfortran
% brew install R
% sudo ln -s "/usr/local/Cellar/r/2.15.1/R.framework" /Library/Frameworks
(↑RStudioを使う際に必要)
RStudioは、http://rstudio.org/から取得してアプリケーションフォルダに突っ込むだけ。
こんな感じのIDEでプログラミングできます。
基本的な操作
四則演算。
> 3+5 [1] 8 > 10-3 [1] 7 > 2*3 [1] 6 > 20/4 [1] 5 > sqrt(16) [1] 4 > 2^2 [1] 4
変数の代入。
> a <- 2 * 3 > a [1] 6
データセット。
> height <- c(173,178,180,183,182) > height [1] 173 178 180 183 182
平均を出したりサマリーを取得したり。
> mean(height) [1] 179.2 > summary(height) Min. 1st Qu. Median Mean 3rd Qu. Max. 173.0 178.0 180.0 179.2 182.0 183.0
データセットの行列表現。
> m <- matrix(c(1,2,3,4,5,6),3,2) > m [,1] [,2] [1,] 1 4 [2,] 2 5 [3,] 3 6 > mean(m) [1] 3.5 > summary(m) V1 V2 Min. :1.0 Min. :4.0 1st Qu.:1.5 1st Qu.:4.5 Median :2.0 Median :5.0 Mean :2.0 Mean :5.0 3rd Qu.:2.5 3rd Qu.:5.5 Max. :3.0 Max. :6.0
外部のCSVファイルの読み込み。
data <- read.csv("data.csv")
関数の作成。ここではデータセットの標準偏差を求めるvarp()を作成する。var()は不偏分散を求める組み込み関数。
> varp <- function(x) { v <- var(x) * (length(x)-1) / length(x) v } > varp(height) [1] 12.56 > varp(m) [,1] [,2] [1,] 0.8333333 0.8333333 [2,] 0.8333333 0.8333333
プロットで図にする。
> plot(height)
> plot(m)
第2章 1つの変数の記述統計
1つの変数をどう記述するかという観点から学んで行く。
変数の種類
- 量的変数:単に数値で表わされる変数
- 質的変数:「好き/嫌い」「男/女」のようにデータを分類するための変数
分散、標準偏差とは
分散、標準とは散布度を数値表現したもの。散布度とはデータの散らばり具合のこと。
- 分散(標本分散) = sum(データn - 平均)^2 / N
- 不偏分散 = sum(データn - 平均)^2 / (N - 1)
- 標準偏差 = sqrt(分散)
関数をそれぞれ作成してみる。
# 不偏分散は組み込み関数 var() が存在 # 分散(標本分散) > varp <- function(x) { v <- var(x) * (length(x)-1) / length(x) v } # 標準偏差 > vars <- function(x) { v <- sqrt(varp(x)) v }
ちなみに標準偏差についてもsd()という関数が用意されているが、不偏分散から得られた標準偏差なので、上記のvars()とは結果が異なる。
> test <- c(10,13,8,15,8) > vars(test) [1] 2.785678 > sd(test) [1] 3.114482
標準化と偏差値
- 標準化:平均と標準偏差がある特定の値に収まるように、全てのデータを同じ式を使って変換すること。(正規化とほぼ同じ意味?)
- 標準得点(z得点)= (データ - 平均値) / 標準偏差
- 偏差値 = 標準得点 * 10 + 50
つまり、偏差値は平均を50、標準偏差を10に調整された値のこと。作って試してみる。
> psycho_test <- c(13,14,7,12,10,6,8,15,4,14,9,6,10,12,5,12,8,8,12,15) # 標準得点 > zscore <- function(x) { (x - mean(x)) / vars(x) } # 偏差値 > devvalue <- function(x) { 10 * zscore(x) + 50 } > zscore(psycho_test) [1] 0.9004503 1.2006005 -0.9004503 0.6003002 0.0000000 -1.2006005 [7] -0.6003002 1.5007506 -1.8009007 1.2006005 -0.3001501 -1.2006005 [13] 0.0000000 0.6003002 -1.5007506 0.6003002 -0.6003002 -0.6003002 [19] 0.6003002 1.5007506 > devvalue(psycho_test) [1] 59.00450 62.00600 40.99550 56.00300 50.00000 37.99400 43.99700 [8] 65.00751 31.99099 62.00600 46.99850 37.99400 50.00000 56.00300 [15] 34.99249 56.00300 43.99700 43.99700 56.00300 65.00751 > mean(devvalue(psycho_test)) [1] 50 > vars(devvalue(psycho_test)) [1] 10
次は、「第3章 2つの変数の記述統計」から。