調整平均について考えた
貯蓄額の「調整」平均が
「30代・40代の平均貯蓄額は? - 自由に使えるお金は月「1万円以下」が最多」というタイトルの気になるニュースをみつけた。調査結果報告の記事を見てみたところ,「調整平均」を出しているあたりが妙に気になったので,調べてみた。記事本文は下のリンクから。
タイトル画像:Photo by micheile || visual stories on Unsplash
この調査では,貯蓄額についての報告の最後に,次のように書かれている。
調整平均とは
まず,ここで使われている「調整平均」とは何なのか。エクセル統計のソフトを作っている会社の記事から引用すると,
つまり,両端の値を除外して求めた平均値のこと。
調整平均の例として引き合いに出されるのは,たとえばスキージャンプの「飛形点」(漢字はあっているのか?)など。5人の審判がそれぞれ20点満点で採点し,そのうち最高点と最低点を除外して,残りの3つの得点を合計したものがその選手の得点となる。何らかの理由で,高く(低く)なりすぎた点数を除外することで,公平性が高まるという考えだと思われる。(こうした仕組みについてよくご存じの方はご教授願いたい)
この「調整平均」を統計で用いるのは,もちろん,外れ値を除外して,より平均的な平均(妙な言い方だが?)を求めたいからだと考えられる。両端からデータを除外し,極限まで除外して,残ったデータが1つか2つになってしまえば,それは中央値に一致する。実際にはやらないけど。
話を戻して
最初の記事の話に戻ろう。記事では,「調整平均(上位と下位からそれぞれ10%のデータを除外して算出)は、前回調査から8万円増の291万円」としている。10%のデータを除外していると言っている。
ここで疑問。
なぜ中央値ではなくて調整平均なのか。なぜ10%調整なのか。
ちょっとしたシミュレーション
上記の問いに具体的に応える前に,Rで行ったちょっとしたシミュレーションについて書いておく。平均値と,調整平均と,中央値の関係である。
正規乱数を用意する。仮に,平均値5,標準偏差1,データサイズ500としている。これに対して,トリム割合(除外するデータの割合。5%トリムというときは,最小側と最大側からそれぞれ5%ぶんを除外するということ)を変えながら調整平均を算出すると,どのように値が変化するかをみてみた。結果は次の通り。
乱数を使っているので結果は毎回変わるのだが(Twitterに出したものとも違う),調整平均の値はトリム率によってかなり不規則に変化することがわかる。とはいえ,変化幅はきわめて小さく,前者では,4.97~5.00の範囲,後者では,4.93~4.94の範囲である。ほとんど動いていないと見るほうが正しいだろう。
ならば偏りのきつい分布ならどうか,と考えて,ポアソン分布で試してみた。lambda=2,データサイズは500である。
調整平均の変化幅は,前者が1.88~2.07,後者が1.64~2.00で,正規乱数のときよりも少し幅が大きい。そして,トリム率が0.3くらいのところで底を打って,急上昇するという形状の特徴も似ている。ポアソン分布では,このような特徴をもったプロットが現れやすいことが,シミュレーションを繰り返すとわかってきた。
貯蓄額はポアソン分布ではない
とはいっても,貯蓄額のデータはポアソン分布なのか? というツッコミは当然考えられる。では,どのような分布かを見てみよう。記事に掲載されているグラフをそのまま引用させていただく。
なるほど,真ん中がへこんでいる分布なのだな,と早合点してはいけない。なぜかというと,横軸が等間隔になっていないからである(しかも,左端は「0円」で,あえて「50万円以下」と分けてある)。横軸の設定を変えると,まったく違う分布が見えてくる。
貯蓄額分布予想とその調整平均
生データがないので,次のようにして分布の疑似再生を試みた。このデータはN=1000であるので,たとえば50万~100万の13.4%(今回調査)は134人,と単純に読み替えられる。次に,この134人が,50万~100万の間に均等に分布していると考え,一様乱数で仮のデータを作る。問題は1000万超の部分だが,仮に最高額を2000万円と設定して同様に乱数データを用意した。これをヒストグラムにすると次のようになる。(ここでは「今回調査」として提供されている数値をもとにして作成した。)
同じデータを,記事と同じように階級を分けて表示すると次のようになる。(0万円と0~50万円は1つのカテゴリになっている。)
引用した調査での貯蓄額の分布は,このように極端にゆがんだ分布であったと考えられる。では,このデータ(あくまでも仮想データだが)を使って,調整平均の変化をみるとどうなるだろうか。最初と同じように,トリム率を変えながらプロットしすると次のようになった。
調整平均の最大値は366.1,最小値は90.5であった。
最初の問いに戻って
なぜ中央値ではなくて調整平均なのか。なぜ10%調整なのか
という疑問をはじめのほうに書いた。シミュレーション結果をもとに,これについて考えたい。
まず,中央値ではなく調整平均を使う積極的な理由は,よくわからない。シミュレーションを見る限り,調整平均はトリム率を上げると単調減少しているように見える。実際のデータで,これと同じ結果が出るとは限らないが,「ほぼ単調に減少していく」という特徴が大きく変わるとも思えない。調整平均の変化が分布の形状に大きく依存することは,最初のシミュレーションから明らかだ。
したがって,「調整平均」を示すことがどうしても必要な理由が,わたしにはわからなかった。平均値と中央値を併記し,その背景についても議論していただきたいと思った。
したがって,10%である理由もわからない。以前の調査との比較のために同じ方法をとっているのだろうが,シミュレーションを見る限り,10%に設定する理由は特にないようにみえる。
Rコード
今回使ったRコードを掲載するので,興味のある方は再利用してください。
## ヒストグラムと調整平均をプロットする関数
## x : データベクトル title : プロットタイトル
trim_mean_plot <- function(x, title) {
par(mfrow=c(2,1), mar=c(3,2,1,2))
x <- sort(x)
trim_mean <- numeric(length(steps))
for (i in 1:length(steps)) trim_mean[i] <- mean(x, trim=steps[i])
hist(x, main=title)
plot(steps, trim_mean, main="")
print(paste("Min=",min(trim_mean),", Max=",max(trim_mean),sep=""))
}
# 共通に使う設定(調整平均プロットのX軸)
steps <- seq(0, 0.49, 0.01)
# Normal m=5, sd=1 正規乱数
m <- 5
sd <- 1
title <- paste("Norm(m=",m,",sd=", sd,")", sep="")
trim_mean_plot(rnorm(500, 5, 1), title)
# Pois lambda=1 ポアソン乱数
lambda <- 2
title <- paste("Pois(lambda=",lambda,")",sep="")
trim_mean_plot(rpois(500, lambda),title)
## 仮想データを作る
u0 <- rep(0, 166)
u1 <- round(runif(229, 1,51))
u2 <- round(runif(134, 50,101))
u3 <- round(runif( 74,100,201))
u4 <- round(runif( 61,200,301))
u5 <- round(runif( 26,300,401))
u6 <- round(runif( 68,400,501))
u7 <- round(runif(113,500,1001))
u8 <- round(runif(129,1000,2001))
rawdata <- c(u0, u1, u2, u3, u4, u5, u6, u7, u8)
cat_br <- c(0, 50, 100, 200, 300, 400, 500, 1000, 2000)
hist(rawdata, breaks=seq(0,2000,50), main="貯蓄額分布予想") # 50万円ごとに
hist(rawdata, breaks=cat_br, main="貯蓄額分布予想") # 記事とほぼ同じカテゴリで