59. 基本統計量の算出


基本統計量

四則演算や初等数学関数は既に扱ったので,ここでは基本的な統計量を求める関数を紹介する.まず,10人 の患者から成る 2 グループ x,y にそれぞれ異なる睡眠薬を飲ませ,睡眠時間の増加を示すデータを準備する.

 
 x <- c(0.7,-1.6,-0.2,-1.2,-0.1,3.4,3.7,0.8,0.0,2.0)   # グループ 1 の睡眠時間の増加を示すデータ
 y <- c(1.9, 0.8, 1.1, 0.1,-0.1,4.4,5.5,1.6,4.6,3.4)   # グループ 2 の睡眠時間の増加を示すデータ

データを読み込ませた後は,次に紹介する関数で基本統計量を求めることになる.

関数

ave(x)

fivenum(x)

IQR(x)

max(x)

mean(x)

median(x)

min(x)

意味

平均(因子)

5数要約

4分位偏差

最大値

平均

中央値

最小値

 

関数

quantile(x)

range(x)

sd(x)

sum(x)

var(x,y)

weighted.mean(x)

意味

クォンタイル点

範囲

不偏標準偏差

総和

不偏分散

重み付け平均

5 数要約,4 分位偏差,クォンタイル点,範囲はそれぞれ

を出力する.また,平方和,歪度及び尖度はそれぞれ

 
  sum((x-mean(x))^2)                             # 平方和
 mean((x-mean(x))^3)/(sd(x)^3)                   # 歪度
 mean((x-mean(x))^4)/(sd(x)^4)                   # 尖度

で求めることが出来,データが正規分布に近い場合は「歪度が0付近・尖度が3付近」になっている.パッケージ e1071 の中には,歪度と尖度を求める関数 skewness(),kurtosis() が用意されている.

以下に例を示す.ちなみに,関数 summary() で要約統計量が得られる.

 
 quantile(x)                                     # x のクォンタイル点

    0%    25%    50%    75%   100% 
-1.600 -0.175  0.350  1.700  3.700 

 summary(y)                                      # y の要約統計量

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 -0.100   0.875   1.750   2.330   4.150   5.500 

度数分布表

度数分布表を描いた後,pie(result) や barplot(result) で円グラフや棒グラフを描くことが出来る.

 
 breaks <- seq(-2, 4, 2)               # 度数分布表の区間を指定する
 ( result <- table(cut(x, breaks)) )   # 結果を result に代入

(-2,0]  (0,2]  (2,4] 
     5      3      2

標本分散と不偏分散,標本標準偏差と不偏標準偏差

データの不偏分散を求める関数 var() は不偏分散を求める関数であって,標本分散を求める関数ではないことに注意.すなわち,データ x のデータ数を n,平均を求める関数を E() とすると,var(x) は以下を求めている.

よって,標本分散を求める場合は var() の結果を (n-1)/n 倍する必要がある.標本標準偏差を求める場合も同様である.

 
 var(x)                                                   # 不偏分散 

[1] 3.200556

 variance <- function(x) var(x)*(length(x)-1)/length(x)   # 標本分散を求める関数を定義
 variance(x)

[1] 2.8805

 sd(x)                                                    # 不偏標準偏差 

[1] 1.789010

 sqrt(variance(x))                                        # 標本標準偏差 

[1] 1.697204

分散共分散行列・相関行列

2 次元以上のデータに対する不偏共分散(または不偏共分散行列)も関数 var() で求めることが出来る.引数は 1 次元データを 2 つ与えても,行列を与えても,どちらでも良い.この関数 var() は不偏共分散,不偏共分散行列を求める関数であって,普通の共分散,共分散行列を求める関数ではないことに注意.よって,標本共分散を求める場合は var() の結果を (n-1)/n 倍する必要がある.

また,相関係数(または相関行列)は関数 cor() で求めることが出来る.引数は 1 次元データを 2 つ与えても,行列を与えても,どちらでも良い.

 
 var(x, y)

[1] 2.848333

 cor(x, y)

[1] 0.7951702

ところで,偏相関行列は以下の関数を定義することで求めることが出来る.

 
 my.cor <- function(x) {
   tmpcor <- cor(x)
   if (det(tmpcor) != 0)  sol <- solve(tmpcor)
   else { library(MASS);  sol <- ginv(tmpcor) }
   d <- diag(sol)
   sol <- -sol/sqrt(outer(d,d))
   rownames(sol) <- paste("Var", 1:ncol(x))
   colnames(sol) <- paste("Var", 1:ncol(x))
   return(sol)
 }
 sampledata <- matrix(c(1:9), ncol=3, byrow=T)
 my.cor(sampledata)

      Var 1 Var 2 Var 3
Var 1    -1    -1    -1
Var 2    -1    -1    -1
Var 3    -1    -1    -1

データの規準化

各列が変量となっているデータ行列 x の各変量の単位が異なる場合に,各変量を平均が 0 ,分散が 1 になるように変換することがある.これを規準化または標準化という.関数 scale(x) を用いることで,データ行列 x を標準化することが出来る.標準化は平均を 0 にするためのセンタリング (それぞれの変量からその変量の平均を引く) ,分散を 1 にするためのスケーリング (それぞれの変量をその変量の標準偏差で割る) の 2 つの操作によって行なわれる.なお,センタリングを行なった前後で標準偏差は変わらない.

 
 scale(x)

             [,1]
 [1,] -0.02794842
 [2,] -1.31357592
 ................
[10,]  0.69871059

attr(,"scaled:center")

[1] 0.75

attr(,"scaled:scale")

[1] 1.789010

関数 scale() に center=F と指定することによってセンタリングを抑制することが出来,scale=F と指定することによってスケーリングを抑制することが出来る.