ソフトウェアの品質を学びまくる

ソフトウェアの品質、ソフトウェアテストなどについて学んだことを記録するブログです。

『R』勉強会 第2回は、相関分析など - その1

 ヤマハの小池さん主催の「(ソフトウェア品質技術者のための)R勉強会」の第2回が行われましたので、復習をかねてエントリを書きます。なお、当日のつぶやきまとめはコチラにあります。

 今回のテーマは、『例題で学ぶ統計的方法』の第7話「散布図と相関係数」、第8話「回帰曲線」。「ソフトウェア品質技術者」がもっとも使う道具がこの2つと言えるかも知れません。ともに、基本は知ったつもりでいながら、学んだところが大きかったです。
例題で学ぶ統計的方法 [改訂版]

例題で学ぶ統計的方法 [改訂版]

 

散布図を書いてみる

まずは全データで。

 何はともあれ、演習で使ったデータセット(Anscombe のデータ)をで、散布図を書いてみましょう。データセットの44点をプロットしたのが、下のグラフ。

2-1_d83e4e29

 「ぼんやり、右肩あがり」程度しか、傾向は見いだせませんね。

層別で。

 実は上のグラフは4種類のデータをいっしょくたにしたものなので、描き分けてみます。グラフ描画のダイアログで「層別」を選択し、平滑線も入れて出力した結果が、以下。

2-2_fcbb696a

 分けると、傾向が見えました。赤○と青+は、右肩上がり。緑△は2次曲線。水色×は、Y軸に垂直な傾向がありますね。

データのサブセットを作る。

 では、この青+のみのプロットをしてみましょう。データを絞ってグラフを描く方法は(少なくとも)2つあります。
  1. データセットに条件を与えて新しいサブデータセットを定義してから、グラフを描く
  2. グラフを描くときに、条件を与えて対象データを絞る
 絞ったデータ自体を何度も使いたいなら、①がいいでしょうね。手順は、メニューの [データ] - [アクティブデータセット] - [アクティブデータセットの部分集合の抽出] から。
 ダイアログは、入力した値を覚えておいてくれないので、一度実行したら、コマンドを直接叩く方が早いでしょう。下のコマンドは、初めに使っていたデータセット Ans01 から、変数 layer の値が 「c」であるものを選び、さらに変数 layer 自体は省いたデータセット Ans02 を定義しています。
 
> Ans02 <- subset(Ans01, subset=layer=="c", select=c(x,y))
 この Ans02 で散布図、および最小二乗直線を描くと、

2-3_e83ad48f

 不自然なほどきれいな直線に乗っている。が、どうも右上の点は、傾向から外れているように見える・・・。

外れ値を除去してみる

 さて、全体の傾向から外れているからといって、それが「間違っている」「意味がない」ということにはなりませんが、全体の傾向をより精度よく調べるために、これを外したい。
 ただ、「外す」には何らかの指標がほしいものです。恣意的に外すべきではない。ではどんな方法があるでしょうか。
 簡単なのは、トリム平均というものです。最大と最小の付近の値を取り除いてから平均値をとる。Excel だと TRIMMEAN という関数があって、上下何パーセントを除くかを指定することができます。

四分位(クオンタイル)点からの判定

 野中先生に教えていただいた1つの目安は、「箱ひげ図を見て、四分位範囲の1.5倍を超えたらはずれ値の候補とする」というものです。

2-4_093c49bc

 上の図のように、箱ひげ図は散布図のオプションとして出力できるので、まずはざっくりとはつかめますね。y軸でいうと、箱の上辺が第3四分位、下辺が第1四分位でその幅が四分位範囲です。この幅の1.5倍以上、上辺より上にある、または下辺より下にある場合、はずれ値とみなせるかも、と*1
 
 四分位範囲の正確な値は、メニューから、[統計量] - [要約] - [アクティブデータセット]。これで数値データセットの基本統計量を出力するコマンドです。
> summary(Ans02)
x y
Min. : 4.0 Min. : 5.40
1st Qu.: 6.5 1st Qu.: 6.25
Median : 9.0 Median : 7.10
Mean : 9.0 Mean : 7.50
3rd Qu.:11.5 3rd Qu.: 8.00
Max. :14.0 Max. :12.70
 なお、四分位点を求めるには、以下。
> quantile(Ans02[,"y"])
0% 25% 50% 75% 100%
5.39 6.25 7.11 7.98 12.74

> quantile(Ans02[,"y"],0.75)
75%
7.98
 今回、y の上の方の外れ値を外すことを考えるので、データセット Ans02 に対する四分位範囲(InterQuartile Range)を求めてみましょう。この表現にたどり着くまでに、試行錯誤で2時間以上かかりました。本当に疲れた。
> IQR(Ans02[,"y"])
[1] 1.75
 「第3四分位点から見て、四分位範囲の1.5倍より大きい値」は、
> quantile(Ans02[,"y"],0.75) + IQR(Ans02[,"y"])*1.5
75%
10.625
 この表現を使って、散布図と最小二乗直線を描いてみます。
 この式を、グラフ作成時のデータ絞り込み条件に使ってもいいし、別の変数に代入して、その変数を絞込み条件に使うこともできます。下のコマンドでは、直接絞り込んでいます。
> scatterplot(y~x, reg.line=lm, smooth=FALSE, labels=FALSE, boxplots='xy', span =0.5, data=Ans02, subset=y<quantile(Ans02[,"y"],0.75) + IQR(Ans02[,"y"])*1.5)

2-5_a5e42e48

 外れ値を除いた曲線を描くことができました。確かに、「直線に乗ってるっぽい」ですね。

箱ひげ図の特徴

 ところで、はずれ値を除去しても、y軸の箱ひげ図の幅があまり変わっていないことは、大事なポイントです。この「データを多少抜いても、あまり変わらない」箱ひげ図の性質を、ロバスト性というと習いました。
 何故、ロバストか。箱ひげ図はデータの順番を見ているので、データが多ければ、はずれ値を外したところで全体への影響は少ない。一方平均なんかは、値そのものが計算に効いてくるので、外れ値の影響を思い切り受けるわけです。なるほど・・・。
 極端なデータセット(96, 1, 1, 1, 1) を考えてみましょう。
 平均値は20、中央値は1。
 一方、はずれ値「96」を外すと、平均値は1に大きく変化しますが、中央値は依然として1(=(1+1)/2)なのです。
 外れ値の目安を聞いたときに、「外れ値を外すと1.5倍の範囲も変わって、やってもやっても新しいはずれ値が出るのでは?」と思ったのですが、この性質によって、この「タマネギの皮むき」をある程度回避できるのですね。
 その2では、求めた最小二乗曲線が「どのくらい妥当なのか」という話と、最小二乗曲線の注意点について、学んだことを書きます。

関連リンク

*1:2011/11/22: 「この幅1.5個分よりメディアンから離れていたら」としていた記述を修正しました。また、以降の「四分位偏差」も「四分位範囲」に修正しました。野中先生ありがとうございます。