本日は、割と当たり前に使っていた統計の知識でも、「なぜ」そうするのかを知らなかったという話です。統計学は、実学としての側面を持っているので、こんなことが起きるんですよね。
標準偏差と平均偏差
標準偏差と平均偏差はどちらもデータのばらつきの指標です。下の定義式を見てもらえば分かりやすいと思います。
標準偏差は、代表値からのズレを2乗したものを足し合わせて、データの個数(またはデータの個数−1)で割ったものの平方根です。
一方、平均偏差は代表値からのズレの絶対値を求めて、すべてのデータの個数(またはデータの個数−1
)で割ったものです。
平均偏差を使わないのはなぜ?
一般的にばらつきの指標は標準偏差が利用されます。平均偏差は使われるのを見たことがありません。検索サイトなどで調べると計算の便利さをとって標準偏差が用いられるとあります。確かに、絶対値は場合分けが実際の計算で場合分けが必要になるので、自乗した和の平方根を取る手続きの方が簡単です。
しかし、よく調べてみるとそれだけではないことがわかりました。以下のサイトでは、各データ要素について代表値からのずれを評価する方法として損失関数というアイデアを挙げています。実証的なデータに統計学を利用する場合、データサンプルもしくは母集団の代表値として最も妥当な値を1つ選びます。その妥当性を評価する上で、損失関数を設定する分けです。
詳しくは、ぜひリンク先を見て欲しいのですが、ここで損失関数として標準偏差のようにずれの自乗を計算するか、平均偏差のようにずれの絶対値をとるかで代表値の推定が異なることが指摘されています。ずれの自乗を計算する場合は、いわゆる最小二乗法なので、平均値が代表値となります。一方、ずれの絶対値を計算すると、最も損が少ない値はデータの中央値になるということです。
シミュレーションで確認してみる
では、簡単な数値シミュレーションをして、標準偏差と平均偏差が最も小さくなるときの代表値がそれぞれ平均値と中央値になることを確かめましょう。
検証にはR言語を使います。今回の検証では、確率分布からデータをランダムに発生させます。ここで正規分布を採用すると、平均値と中央値のずれがほとんどないと予想できるので、あえて違う確率分布(対数正規分布)を用います。
# データの生成 simData <- rlnorm(1000)
シミュレーションでは、生成したデータの最低値と最高値を計算します。最初に最低値を分布の代表値と仮定し、標準偏差と平均偏差をそれぞれ求めます。次に、最低値よりも少しだけ大きな値を代表値にします。そして、データの最大値を代表値とする場合まで、次々に繰り返します。
最後に、すべての計算結果からいつ標準偏差と平均偏差が最小になるかを調べてみましょう。
#最小値と最大値の取得 minData <- min(simData) maxData <- max(simData) #繰り返しの回数を求める numIteration<- round((maxData - minData)/0.0001) #計算結果の保存用配列を作成 ## 標準偏差用 arrSD <- NULL ## 平均偏差用 arrAD <- NULL for (i in 1:numIteration){ repData <- minData + 0.0001 * i resSD <- sqrt(sum((simData - repData)^2)/length(simData)) resAD <- sum(abs(simData - repData))/length(simData) arrSD <- c(arrSD, resSD) arrAD <- c(arrAD, resAD) }
一度手元のPCで計算してみたところ*1、minDataは0.04240865、maxDataは65.70159、numIterationは656592となりました。
標準偏差と平均偏差を保存したデータの中かからいつ値が最小になったのかを求めます。
# SDが最小となるような代表値 minData + 0.0001 * which.min(arrSD) # ADが最小となるような代表値 minData + 0.0001 * which.min(arrAD)
計算の結果、SDが最小となるような代表値は1.708909、ADが最小となるような代表値は0.9827087でした。
では、最後にこのデータの平均と中央値を計算してみます。
mean(simData) median(simData)
計算結果は、平均値が1.708862、中央値が0.9834444でした。正確な一致ではありませんが、おおよそ標準偏差が最小となるような代表値は、データの平均値であり、平均偏差が最小となるような代表値はデータの中央値であることがわかります。
*1:乱数の生成がコードに含まれています。よって計算結果は毎回異なります。