@uents blog

Code wins arguments.

Rによるやさしい統計学で統計学を0から勉強する(1日目)

コンピュータビジョンにしろ音声認識にしろデータマイニングにしろ、多変量データから統計学的なアプローチで何らかの決定を導き出す、というのが近年の大きな技術トレンドの1つだと思います。OpenCVを色々触っているうちに、やっぱそうだよな、と改めて思い知っている今日この頃です。

という訳で、もうすっかり応用数学とか忘れてしまってるんだけど… ソフトウェアエンジニアとしては、ここらで勉強し直さないと今後生きて行けない気がしてきたので、まずはちまちまと統計学を0から勉強したいと思います。

まずはこの本で勉強していく。

Rによるやさしい統計学
山田 剛史 杉澤 武俊 村井 潤一郎
オーム社
売り上げランキング: 33339

ところで本屋に行って思ったですが、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つの変数の記述統計」から。