2012/08/20

文系のための「データの観察」(2)

データの「真ん中」とは何か?その疑問について再び考える。
平均」というのは、確かに「真ん中」のようである。納得できる。
しかし、本当に「平均」だけで良いのか?少々疑問が残る。

どういうことであるか?日本人の「職種別平均収入」で考えてみる。
今回は、「前フリ」無しで、最初から R を立ち上げる。

そろそろ、データの読み込み方は大丈夫だろう。説明を省く。
自信の無い人は、これまでの投稿を確認。やり方は、書いてある。

まずは、一つ目のデータを準備する。
上から順に、薬剤師、精錬工、技術士、機械工、自動車組立工、
製紙工、電気工、看護師、営業用バス運転者、社会保険労務士、
と並んでいて、その横に各業種の平均収入が入っている。
参考データはあるが、色々と変更を加えているので、ほぼ架空のデータ
給料の単位は、「万円」となっている。そのようなデータを用意した。
なお、このデータは、後の操作がしやすいように、収入順で並んでいる

salary
pharmacist, 496.6
refining engineer, 494.3
professional engineer, 489
machinary engineer, 487.8
auto assemblyman, 477.6
paper making engineer, 471.5
electronic engineer, 465.9
clinical nurse, 465.2
bus driver, 450.1
specialist in social insurance, 446.8

このデータを「X1」という変数に格納する。

# Windows  と Linux の人は以下のコマンド
X1 <- read.table("clipboard", sep=",", header=TRUE)

# Mac の人は以下のコマンド
X1 <- read.table(pipe("pbpaste"), sep=",", header=TRUE)

では、実際にこのデータを使って分析を行なってみる。
平均収入はどのようになっているのか?以下が出力結果。

> mean(X1$salary)
[1] 474.48

なるほど、納得できる。これらの職種間の平均収入は、474.48万円である。
元のデータを観察してみると、なんとなく、納得のいく数値である。

では、次に別のデータを用意してみる。
今度は、先のデータに加えて、パイロット、大学教授、医者、
の3つの職業を加えた。このデータを変数「X2」に入れる。
このデータも、収入順に並んでいるこのことは後に重要

salary
pilot, 1295.5
professor, 1133.2
doctor, 1101.2
pharmacist, 496.6
refining engineer, 494.3
professional engineer, 489
machine engineer, 487.8
auto assemblyman, 477.6
paper making engineer, 471.5
electronic engineer, 465.9
clinical nurse, 465.2
bus driver, 450.1
specialist in social insurance, 446.8

データを変数にセットするコマンドは以下の通り。

# Windows  と Linux の人は以下のコマンド
X2 <- read.table("clipboard", sep=",", header=TRUE)

# Mac の人は以下のコマンド
X2 <- read.table(pipe("pbpaste"), sep=",", header=TRUE)

X1と同様に、平均を出してみる。以下は、出力結果。

> mean(X2$salary)
[1] 636.5154

うん?636.515万円?この結果を見て「違和感」を感じる。3つ加えただけ。
先程に比べて、値が大きすぎる。これは、本当に全体の「真ん中」と言えるか?
追加した3つの職種によって、平均は一気に引き上げられた。ここで疑問が生まれる。
これらは、むしろ、「外れ値」として考えた方が良いのでは無いか?と。

何か、新しい政策を考える際に、安易に収入の平均を用いると、
トンデモナイことが起きる。実態に合わない政策が決定されるかもしれない。
吟味せずに、数値データを扱うことは、極めて危険なことである。

などと、問題点を指摘していても仕方ない。別の方法が必要である。
どうするべきか?

そこで登場するのが、2つ目の「真ん中」の概念。
平均」ではなく、データの「真ん中」番目を見てはどうか?
なるほど。確かに、これも「真ん中」である。

では、最初にX2の対象数を数えてみる。Rを使って。
nrow()関数を覚えているだろうか?

> nrow(X2)
[1] 13

したがって、このデータの場合は、7番目が「真ん中」番目である。
今回は総数が奇数なので、上から数えても、下から数えても「7番目」である。
試しに、7番目のデータを見てみる。予め収入順で並んでいるので楽
7行目を指定するので、以下のような結果が出る。

> X2[7,]
[1] 487.8

通常は、下から数えることになっている。これを「中央値」と呼ぶ。
R では、中央値を出す関数を持っている。median()関数である。
この関数は、値が並んでいなくても使える

> median(X2$salary)
[1] 487.8

なるほど。この結果を見てみると、平均よりも中央値の方が実態に合っている。
そのように思える。では、X1の場合と比較してみる。

> median(X1$salary)
[1] 474.55
> median(X2$salary)
[1] 487.8

若干、値が高くなっているが、平均よりも安定している。
データの「真ん中」を決める際に、安定感が無い指標は良いとは言えない。
したがって、中央値の方が、より適切にデータの「真ん中」を示していると言える。

ただし、データの総数が非常に大きく、
また、データが真ん中に向かって「綺麗な釣鐘状」に存在する場合、
平均値と中央値は近づく。そのような場合には、平均でも良いということになる。

ところで、気づいた人も居るハズ。X1のデータの総数は、偶数であった

奇数の場合は、ちょうど「真ん中」というのがあって決めやすいが、
偶数の場合は、「真ん中」が2つあって簡単に決めることができない。


実は、中央値というのは、奇数(odd)偶数(even)で取り方が異なる。
どうするべきか?議論が分かれるところである。


上を採用する方法、下を採用する方法も考え得る。
あるいは、上下2つの値の平均を採用するという方法もある。

どの方法が正しいかを述べることは困難であるが、
やはり、「真ん中」という意味では、平均を取る方法が適切に思える。
なお、R の median()関数 も偶数の場合には平均を取っている。

基本的な説明は以上であるが、やはり、数理的なことも理解しておいた方が良い。
もう少し、詳しく、「中央値」について考えてみる。



数式に慣れていない人は卒倒するかもしれない。落ち着きが必要。

ここで、Qという変数が登場する。これは、Quantile (分位数)の頭文字。
分位数というのは、あるデータをある数で等分すること

なるほど、「中央値」というのは、全体を2つに等分するので、
二分位数」ということか。もっとも、そんな言い方はしないが。
とにかく、そのように考えると、Qの「添字」である「1/2」の意味が解る。

さて、イコールを挟んで右側、つまり、右舷を見てみる。厄介に見えるかもしれない。
二段に分かれている。上には「if n is odd」、下には「if n is even」と書いてある。
なるほど、上の方は奇数の場合で、下の方は偶数の場合であるか。

大体、分かってきた。ここで、ちょっとした疑問がある。
何故、「x」ではなく、「x'」となっているのか?疑問に思わない人もいるかも。

そもそも、元のデータの変数が「x」だったして、
元のデータ「x」が今回のように、昇順に並んでいるとは限らない
そのような場合には、必ず、並び替え(ソーティング)が必要となる。
「x'」というのは、要するに、元のデータを並び替えただけのもの

さて、後は簡単である。添字は、データの「何番目」であるかを表す。
したがって、次のことが言える。

  • 奇数の場合には、「総数nに1を足して2で割った数」番目が「中央値」となる。
  • 偶数の場合には、「総数を2で割った」番目と、「それより一つ上」番目を足して、さらに、その合計を「2で割った値」が「中央値」となる。

解りにくいかもしれない。X2の場合は、総数が13であった(n=13)。
つまり、奇数。したがって、(13+1) ÷ 2 = 7番目の値が中央値となる。

では、X1の場合はどのようになるのか。確か、総数は10であった(n=10)。
今度は、偶数。だから、二段目の式を当てはめることになる。
10÷2番目と(10÷2)+1番目、つまり、5番目と6番目の値を足して割った数が中央値
この場合は、少々厄介であるか。Rで確認してみる。以下、実行結果。

> X1[5,]
[1] 477.6
> X1[6,]
[1] 471.5
> (X1[5,]+X1[6,])/2
[1] 474.55
> median(X1$salary)
[1] 474.55

確かに、正しく計算されていて、上に提示した式とも合致している。
R を用いると、数式上の表現と、実際の処理を比較できるので良い。

さてさて、以上のことで、データの「真ん中」ということが整理できた。
平均と中央値という2つの決め方がデータの「真ん中」なのである。

本当にそれで良いのか?まだ、「真ん中」の決め方があるかもしれない。
では、どのような方法があるか?確か、外れ値に影響されないことが重要だった
例えば、最も頻繁に登場する値を「真ん中」として考えられないだろうか?
ふむふむ。これは検討の余地がありそうである。この話はいずれ。

0 件のコメント:

コメントを投稿