2012/08/19

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

ケトレーの話では、「平均人」というものが出てきた。
平均人は、対象の個性を測るための架空の擬似人格のようなものであった。
そして、個性というのは、この平均人からの距離(偏差)であった。

データの「真ん中」を見極めることと、
個性の強さとも言える「バラツキ」を評価すること、
この2つの基本的操作は、データ解析において、最も重要なことである。
特に、データの個性を表す「バラツキ」はデータ解析において基本中の基本。

近年、文系分野の研究者が「見様見真似」で難しい分析を行なっているの見かける。
確かに、私自身、そうした時期があったし、そういった悪しき癖は残っている。
しかしながら、基本的な事だけでも、重要なことは分かる。

最初に考えるべきことは、データの「真ん中」である。「バラツキ」はその後。
データの「真ん中」が分からないと、「バラツキ」を計るための基準も定まらない。
本当は「バラツキ」について考えたいのだが、まずは「真ん中」の話から。

そもそも、データの「真ん中」とは何か?

多くの人は、「平均」という言葉を思い浮かべるのではないか?
なるほど、確かに、平均というのは良い考えである。
実際、ケトレーは、平均という概念が、データ全体を説明するものと考えた。

では、平均とは何か?魚の値段を例に考えてみる。
まぁ、魚である必要は無いのだが、私は魚介類が好きなのだ。

仮に、魚屋さんで400円のお刺身、200円の目刺し、600円の鰈の一夜干し、
この3つの品目が並んでいたとする。
適当だが、妥当な値段である。まぁ、良い。単なる実験データ。

ふむ。では、この3つの品目の値段の平均は?電卓を使っても良い。
もちろん、Rで計算しても良い。計算式は、自分で立てられるだろう。

答えは、400円。さすがに、この計算は大丈夫であろう。
この程度の計算ができないと困る。「文系」とかそういう問題では無い。

では、どような計算を行ったのか?数式を見ながら考えてみる。
おそらく、以下のような計算を考えたはずである。



あるいは、以下のように考えた人もいるはず。



2つ目の式は、品目3つを一つの単位(つまり全体を「3」)としていて、
したがって、値段全体を単位一つ分として考えた場合の、
単位一つ分の値段理屈上どうなるかを考えている。どこかで聞いたような?

確か、「文系のための「逆行列」(1)」の話。

なるほど、1/3 を掛けるというのは、
対象数に合致するような単位に換算するために、
対象数の逆数をかけているのだった。

要するに、3つの品目に個性が無く、全て同じ値段だったら?というわけである。
したがって、400円という単位が3つで全体が説明できる

ところで、上記の場合は、たった三品であったが、
品目が多くなると、式が長すぎて書くのも、見るのも面倒。
そこで、上記の式を抽象化し、より一般的なものに書き直してみる



まず、品目の変数をxと置く。右下の数字と記号は何であったか?
これは「添字」と呼んだ。何番目の対象かを示していて、
不特定番目の対象を「i」番目、
最後番目の対象を「n」番目としている。
したがって、全体の個数(総数)は当然「n」個。

なるほど、これで、対象がいくら増えたとしても、
この長さの式で平均を書き表すことができる。

だが、やはりまだ長い。しかも、「・・・」という記号は美しくない
ということで、自称「文系」が苦手とする「Σ(シグマ)」を使って表現する。



イコールで分けられた3つの式は同じ。
左端は、nで割るというイメージ。自称文系には、解りやすいが見難い。
真ん中は、nの逆数を掛けるというイメージ。理屈っぽい式。教科書はこの形式。
右端は、慣例的な表現で、「エックスバー」と読む。玄人向け。計算式を省略。
上に「-」が付いているものは、何かの平均を表す。

さて、ここで、シグマの見方を復習しておく。
Σという記号は、「足し算の繰り返し」を表す。
Σの記号の「」についてあるのが、添字の記号とその開始番号
Σの記号の「」についてあるのが、添字の最後(総数)を表している。

一回目の足し算が終わる度に、iの値が1〜nまで一つずつ繰り上がる。
そして、i=nとなったときに、足し算の計算が終了する。
その結果を総数nで割ると考えるか、総数nの逆数で掛けると考えるかで、
式の表現は異なる。ただし、結果は同じ。

エックスバー」による表現は、非常によく出てくる。
平均というのは、誰もが理解している(という前提)ので、
慣例的にこの表現を使う。説明無しに登場することも多い
この意味が解らないと、教科書の内容をサッパリ理解できない。

以上で基本的な「平均」の話は終わり。

さて、ここからは、「R」を使って平均の計算をやってみる。
今度は、「魚の卸売価格」を例に考えてみる。
私は、魚介類が好きでなのである。

まずは、コンソールを立ち上げて、データ読み込みのコマンドを入力。実行はまだ

データの読み込みは、read.table() 関数を使うのだった。

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

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

次に、今回の例で用いるデータをコピーした後、上のコマンドを実行する。

Oroshi_Kg, Taka, Naka, Yasu
Tai, 1336, 3150, 1217, 53
Chinu, 226, 630, 513, 105
Sawara, 212, 1575, 1259, 840
Yazu, 4834, 840, 315, 179
Suzuki, 618, 1575, 1146, 525
Akou, 21, 4725, 3129, 1575
Kochi, 28, 2100, 874, 210
Okoze, 28, 5250, 2635, 210
Ainame, 29, 3150, 621, 315
Hage, 1205, 1890, 383, 210
Konoshiro, 21, 2100, 1100, 105
Sayori, 12, 5250, 3916, 1260
Anago, 1637, 2625, 1721, 630
Mebaru, 330, 4200, 1680, 315
Tachiuo, 1211, 2310, 930, 105
Hamo, 1622, 3938, 592, 53
Karei, 41, 6300, 3178, 525
Hirame, 540, 2100, 1496, 210
Aji, 5149, 3150, 789, 210
Saba, 5413, 3675, 625, 53
Ika, 2414, 2888, 1083, 105
Tako, 1844, 1890, 1180, 525
Ebi, 560, 7350, 1420, 525
KurumaEbi, 222, 8925, 6508, 2625
Koiwashi, 1316, 1155, 617, 328
ObaIwashi, 2716, 499, 267, 175
Mentai, 678, 1155, 859, 394
Hamachi, 4772, 998, 632, 105
Isaki, 268, 2625, 1465, 840

このデータは多次元データになっている。
このデータにおいては、対象が魚の名前で、属性がそれぞれ、
卸売数量(Kg):Oroshi_Kg、高値:Taka、中値:Naka、安値:Yasu、
となっている。つまり、四次元のデータとして表現されていることになる。

ところで、データのことを事前に知っておくことは重要である。

このデータの出典は、広島市中央卸売市場の水産物市況(2012/08/18)から
欠損データを抜いたもの。すでに、ある程度要約されているデータである。

高値、中値、安値、というのは魚の値段のおおよその基準。
魚には大小があって、大小によって値段も、可能な調理の幅も異なる。
高値は、大きくて色々な用途に使えるもの。そして、高い。
中値は、一般的なサイズで、多くの人が目にして、買って、家庭で調理するもの。
安値は、小ぶりなもので、利用の用途が限られるようなもの。
このデータでは、(おそらく)それぞれの値の平均。詳細は不明。

この話に関しては、以下のページに解りやすい説明があった。
http://www.shonai-nippo.co.jp/square/feature/food/sf48.html

少し話が逸れたが、まずは、卸売数量の平均を求めてみる。
Rでは、mean()関数で平均を計算できる。非常に、簡単。

mean(X$Oroshi_Kg)

このコマンドでは、Xという変数の属性名を「$」記号を挟んで指定している。
あるいは、次ようにして求めることもできる。

mean(X[,1])

この表記は、Xの「1列目」という考え方で指定している。
ちなみに、大カッコ(「[ , ]」)のカンマの右側は行数左側は列数を表す。
以下は、実行結果。

> mean(X$Oroshi_Kg)
[1] 1355.276
> mean(X[,1])
[1] 1355.276

同じことを行なっているので、計算結果は同じ。これは当然。
同様に、他の変数の平均も計算してみる。

mean(X$Taka)
mean(X$Naka)
mean(X$Yasu)

以下は、上記コマンドの実行結果。

> mean(X$Taka)
[1] 3035.103
> mean(X$Naka)
[1] 1453.448
> mean(X$Yasu)
[1] 458.9655

ついでなので、以下のコマンドも実行してみる。
なお、大文字と小文字に注意すること。
Rのコマンドは大文字と小文字を区別する。

colMeans(X)

どのような結果が出てくるか?以下は実行結果。
4つの変数の平均を同時に計算できる。

> colMeans(X)
Oroshi_Kg       Taka       Naka       Yasu 
1355.2759 3035.1034 1453.4483  458.9655 

このコマンドは「列平均(Column Means)」を計算する関数であり、
colMeans()関数と呼ぶ。複雑な分析を行うようになると頻繁に登場する。
今の段階で覚えておくと良い。

今回のデータでは、全く意味は無いが、行平均(Row Means)」もある。
これは、rowMeans()関数で計算できる。
あくまで練習。これもやってみる。実行結果は以下の通り。

> rowMeans(X)
      Tai     Chinu    Sawara      Yazu    Suzuki      Akou     Kochi     Okoze 
  1439.00    368.50    971.50   1542.00    966.00   2362.50    803.00   2030.75 
   Ainame      Hage Konoshiro    Sayori     Anago    Mebaru   Tachiuo      Hamo 
  1028.75    922.00    831.50   2609.50   1653.25   1631.25   1139.00   1551.25 
    Karei    Hirame       Aji      Saba       Ika      Tako       Ebi KurumaEbi 
  2511.00   1086.50   2324.50   2441.50   1622.50   1359.75   2463.75   4570.00 
 Koiwashi ObaIwashi    Mentai   Hamachi     Isaki 
   854.00    914.25    771.50   1626.75   1299.50 

となる。各対象(魚)について、卸売数量、高値、中値、安値、の平均が出ている。
全く意味は無い。このような無意味なことはやってはいけない。

そもそも、卸売数量と、他の3つの属性は単位が異なっていて比較できないし、
高値、中値、安値というのは、各対象の何かの代表的な値であって、
しかも、中値がある意味でデータの「真ん中」を示している。
あくまで、コマンドの実行例として割りきる。

さて、今回は、「平均」というデータの真ん中について考えた。
ふむ。納得できた。だが、ここで一つの疑問が湧いてくる。
すなわち、平均以外の方法はあり得るのか?という疑問である。

なるほど。確かに、平均という考え方は的を得ているように思えるが、
何か、重大な問題を見落としているようにも思える。何が問題なのか?
この疑問については、次回に考えてみることにしよう。

2 件のコメント:

  1. 以下のデータのAjiの行の最後に"Min"という単語がくっついていますが?
    Oroshi_Kg, Taka, Naka, Yasu
    Tai, 1336, 3150, 1217, 53
    Chinu, 226, 630, 513, 105
    .
    .
    .
    Aji, 5149, 3150, 789, 210Min

    返信削除
    返信
    1. 気づきませんでした。今、修正しておきました。
      コメントありがとうございます。

      削除