2015年2月10日火曜日

Rで複数のヒストグラムを比較する方法あれこれ

2つ以上のヒストグラムを1つのグラフ上に描画して、比較したいようなときってありますよね。

例えば、集団aのテストの点数と、集団bのテストの点数が、それぞれ1000件ずつあるとしましょう。

# サンプルデータを作っておく
a <- rnorm(1000, 40, 10)
b <- rnorm(1000, 60, 10)


borderオプションを使って、ヒストグラムの線に色をつけるってのは1つのやり方ですね↓

# 線に色をつける
hist(a, breaks=seq(0,100,5), border="red", xlim=c(0,100), main="", xlab="")
hist(b, breaks=seq(0,100,5), border="blue", add=T)

borderオプションでヒストグラムの線に色をつける

なんとなく見えてはいるのですが、重なった縦線は後から描画した方で上書きされてしまい、そのへんがちょっと見にくいですね。

colオプションで面に色をつけることもできますが・・・

# 色で塗りつぶす
hist(a, breaks=seq(0,100,5), col="red" , xlim=c(0,100), main="", xlab="")
hist(b, breaks=seq(0,100,5), col="blue", add=T)

colオプションでヒストグラムを塗りつぶす

↑普通の色で塗っちゃうと重なったところが見えなくなってしまいます。

そういうときは、透過色を使えばいいです↓

# 透過色を使う
hist(a, breaks=seq(0,100,5), col="#FF00007F", xlim=c(0,100), main="", xlab="" )
hist(b, breaks=seq(0,100,5), col="#0000FF7F", add=T)
colオプションに透過色を指定しヒストグラムを塗りつぶす

colオプションへの指定は、「##rrggbbaa」という感じで2桁ずつ、「赤・緑・青・不透明度」を16進で指定します。上記の例では、赤の50%透過と青の50%透過を使っているような感じですので、重なったところが紫になります。

赤と青と紫の3つのヒストグラムに見えるというあなたは、ちょっぴり偏屈かもしれません。

3つ以上重なってくると、さすがに上記のようなやり方は無理があるので、いっそのこと一本の線にしてしまうのがいいように思います。

実はhist関数には戻り値があって、階級値やら度数やらの情報が格納されています。それを使って、線でプロットする(plotのtype="l"指定とか、lines関数での描画とか)という方法があります↓

#
# ヒストグラムではなく線グラフで表現
#
 
# hist関数を使って階級値ごとの度数を求めておく(描画結果は不要)
ha <- hist(a, breaks=seq(0,100,5))
hb <- hist(b, breaks=seq(0,100,5))
 
# mids(=階級値)とcounts(=度数)の情報を使って描画する
plot(0, 0, type="n", xlim=c(0,100), ylim=c(0, 200), xlab="", ylab="")
lines(ha$mids, ha$counts, col="red")
lines(hb$mids, hb$counts, col="blue")
plot関数のtype="l"オプション または lines関数で描画する

縦軸のスケールが度数ではなく確率密度になっても構わないなら、density関数による密度推定を使うという方法もあります↓

# density関数を使ったカーネル密度推定
plot(0, 0, type="n", xlim=c(0,100), ylim=c(0, 0.04), xlab="", ylab="")
lines(density(a), col="red")
lines(density(b), col="blue")

density関数を使ってカーネル密度推定結果で描画する

度数をそのままプロットするより、滑らかな感じになりました。おおよその分布の傾向を見ることが目的なら、こちらの方法の方が簡単な気がします。

また、度数の差が大きいものどうし(100人の得点データと1000人の得点データなど)の場合でも、確率密度を使うと同じ土俵で比較することが可能になります。




0 件のコメント:

コメントを投稿