偏差と分散の問題

データの分布のばらつきを測る偏差(deviation)と分散(variance)について勉強します。“数学チュートリアル やさしく語る 確率統計 西岡康夫(著)”の1.8節 分散の例題を基にした問題をRで解きます。例題に絶対平均偏差を計算する問を加えています。

問題
あるプロスポーツのAとBの2チームの主力選手10名ずつについて、その年収(単位: 百万円)を調査すると以下の通りであった。
チームA
32 33 28 27 34 22 37 23 34 30
チームB
22 18 42 17 43 38 20 12 40 48
このデータについて次の問いに答えよ。
(1)チームA、チームBの年収の平均値を求めよ。
(2)チームA、チームBの年収の絶対平均偏差を求めよ。
(3)チームA、チームBも年収の分散を求めよ。
(4)チームA、チームBの年収の標準偏差を求めよ。

問(1)平均値の答え

AとBの年収のデータをそれぞれ変数dataAdataBに代入します。

# input team A's data
dataA <- c(32, 33, 28, 27, 34, 22, 37, 23, 34, 30)
dataA
##  [1] 32 33 28 27 34 22 37 23 34 30
# input team B's data
dataB <- c(22, 18, 42, 17, 43, 38, 20, 12, 40, 48)
dataB
##  [1] 22 18 42 17 43 38 20 12 40 48

AとBのデータの平均値を計算します1

# mean of data A
mA <- mean(dataA)
mA
## [1] 30
# mean of data B
mB <- mean(dataB)
mB
## [1] 30

AとBどちらの平均値も同じです。

問(2)絶対平均偏差の答え

偏差とは、あるデータの平均からの差のことです。偏差はデータの分布のようすを表していて、偏差が大きければデータは平均値から遠くに分布していて、偏差が小さければデータは平均値から近くに分布しています。

絶対平均偏差(MAD: mean absolute deviation)は偏差の大きさを表す数値です。あるデータが\(n\)個の変量\(x\)から成っているとき、MADは次のように定義されます。\(\bar{x}\)は変量\(x\)の平均値です。

\[ MAD = \frac{\sum_{k=1}^n{|x_k - \bar{x}|}}{n} \]

データAとBの偏差をそれぞれ計算します。

devA <- dataA - mA
devA
##  [1]  2  3 -2 -3  4 -8  7 -7  4  0
devB <- dataB - mB
devB
##  [1]  -8 -12  12 -13  13   8 -10 -18  10  18

データAとBのMADをそれぞれ計算します。

# MAD of data A
madA <- sum(abs(devA)) / length(dataA)
madA
## [1] 4
# MAD of data B
madB <- sum(abs(devB)) / length(dataB)
madB
## [1] 12.2

MADはlsrパッケージのaad関数だけで計算することができます2

# install lsr package
if (!require("lsr")) {
  install.packages("lsr", repos="http://cran.rstudio.com/")
  library(lsr)
}
## Loading required package: lsr
## Warning in library(package, lib.loc = lib.loc, character.only = TRUE,
## logical.return = TRUE, : there is no package called 'lsr'
## Installing package into 'C:/Users/maeda/Documents/R/win-library/3.4'
## (as 'lib' is unspecified)
## package 'lsr' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\maeda\AppData\Local\Temp\RtmpcLlP37\downloaded_packages
aad(dataA)
## [1] 4
aad(dataB)
## [1] 12.2

問(3)分散の答え

分散\(s^2\)は偏差の2乗の和です。MADとは異なり計算に絶対値を用いずに、偏差の大きさを表しています。

\[ s^2 = \frac{\sum_{k=1}^n(x_k - \bar{x})^2}{n} \]

データAとBの分散をそれぞれ計算します。

# variance of data A
varA <- sum(devA^2) / length(dataA)
varA
## [1] 22
# variance of data B
varB <- sum(devB^2) / length(dataB)
varB
## [1] 160.2

ここでの分散とは標本分散のことです。Rのvar関数は不偏分散(unbiased variance)という母分散の推定値を計算する関数です3。Rに標本分散を計算する組み込み関数はありません。

標本分散\(s^2\)と不偏分散\(v^2\)は次のような関係にあります4\(n\)は標本の大きさ(データの個数)です。

\[ v^2 = \frac{n}{n-1} s^2 \]

したがって、分散(標本分散)をvar関数(不偏分散)から計算するには次のようにします。\((n-1)/n\)をvar関数にかけます。

var(dataA) * (length(dataA) - 1) / length(dataA)
## [1] 22
var(dataB) * (length(dataB) - 1) / length(dataB)
## [1] 160.2

問(4)標準偏差の答え

標準偏差(standard deviation)\(s\)は、分散の平方根です。

\[ s = \sqrt{s^2} = \sqrt{\frac{\sum_{k=1}^n(x_k - \bar{x})^2}{n}} \]

問(3)で求めた分散からデータAとBそれぞれの標準偏差を計算します。

# standard deviation of data A
sdA <- sqrt(varA)
sdA
## [1] 4.690416
# standard deviation of data B
sdB <- sqrt(varB)
sdB
## [1] 12.65701

sd関数は不偏標準偏差を計算する関数ですので、標本標準偏差を計算するには次のようにします。分散とほとんど同様ですが、平方根の\(\sqrt{(n-1)/n}\)をsd関数にかけます。

sd(dataA) * sqrt((length(dataA) - 1) / length(dataA))
## [1] 4.690416
sd(dataB) * sqrt((length(dataB) - 1) / length(dataB))
## [1] 12.65701

MADと標準偏差の比較

チームAとBの年収の平均値、MAD、標準偏差を表にまとめます。(単位: 百万円)

データ 平均値 MAD 標準偏差
チームA 30 4 4.69
チームB 30 12.2 12.66

AとBで平均値は同じでもMADと標準偏差が異なります。この例では、MADは標準偏差より小さいです。

統計的決定理論~平均値・中央値・最頻値って何?~ - tsujimotterのノートブック標準偏差と平均偏差の使い分け - jnobuyukiのブログを読みますと、MADが小さくなると中央値に近づき、標準偏差が小さくなると平均値に近づくとのことです。どちらも元は平均値からの偏差なのに不思議です。

MADは絶対値の計算を含み、分散と標準偏差は絶対値の計算を含みません。数学チュートリアル やさしく語る 確率統計 西岡康夫(著)の第1章では、絶対値の計算には手間がかかるからこれまで偏差の大きさの評価には標準偏差が使われてきたが、計算機の進歩に伴いMADも使われるようになったとあります。

MADと標準偏差の大小関係や使い分けについて今はよくわかりません。正しく理解するには、初歩的な統計学の理解では足りないようです。統計学の学習を進めてから再度ここに戻ってこようと思います。


  1. 過去の記事の代表値(平均値、中央値、最頻値)をRで計算するでは、平均値をmean関数を使わずに計算しています。

  2. ちなみに、Rのmad関数はmedian absolute deviationを計算する関数です。ここで言っているMADはmean (average) absolute deviationで、Rではlsrパッケージをインストールして使えるaad関数で計算できます。

  3. 私の分散の計算結果とvar関数の計算結果が違うのは何でだろうと疑問に思いました。同じ疑問を持つ人がいるもので、r - Why is the var() function giving me a different answer than my calculated variance? - Stack Overflowに母分散の推定について書かれていました。

  4. 詳しい説明は基本統計量の算出 - R-Source母分散と不偏分散 - 産業技術総合研究所にあります。