Rでヒストグラムを作成する際、縦軸を度数(頻度)ではなく相対度数にしたいという時が結構あると思います。
この時、freq=FALSEを指定してやればOKと思っていましたが、実はそうではなかったっぽいのでメモしておきます。
縦軸のデフォルトは度数(頻度)
タイトルのまんまです。何も指定しなければ縦軸は度数(頻度)になります。
X <- rnorm(100, mean=0, sd=1) # サンプルデータの作成(正規乱数)
hist(X)
もちろん hist(X, freq=TRUE)
としても同じ図が出力されます。
hist(data, freq=FALSE) の縦軸は相対度数ではない
Rのヒストグラムは freq=FALSE
としても相対頻度(割合)にはなりません。
見た方が早いので早速。freq=FALSE
を指定してやります。
hist(X, freq=FALSE)
もし、縦軸が相対度数を表しているなら棒1の長さの合計は1になるはずですが、どう見ても1にならなさそうです(真ん中らへんの3つの棒を足すだけで1を超えている)
というわけで、freq=FALSE
としても相対頻度が描画されないことが分かりました。
「じゃあこれってなんなんだよ」って思うと思いますが、これは確率密度関数を推定したものになっているようです。なのでヒストグラムの面積の総和は1になっています。
相対度数を描画するには
一旦、ヒストグラムを格納して中身を見てみます。
H <- hist(X)
すると、
こんな感じで、ヒストグラムが色々なパラメータを持っていることが分かります(Rstudioで見ています)
freq=FALSE
とした際の縦軸は $density
を使っており、各棒の度数は $counts
に入っているので、$counts
をもとに相対度数を計算して $density
を書き換えます。
H$density <- H$counts / sum(H$counts)
plot(H, freq=FALSE)
この際、グラフの出力には上記のように plot
を使います。
また、 freq=FALSE
も書いてあげる必要があります。
これで無事に相対頻度を描画することができました。
めでたしめでたし。
ちなみにヒストグラムのパラメータがそれぞれ何を表しているかというと、
-
$breaks
:セル間の分割点(それぞれの棒の端の座標だと思えばOK) -
$counts
:棒に含まれるデータの数 -
$density
:確率密度の推定値(たぶん$mids
における確率密度の推定値2) -
$mids
:棒の真ん中の座標 -
$xname
:データの名前 -
$equidist
:breaks
の間隔がすべて等しいか(等しい場合はTRUE
)
★参考文献★
[1] http://127.0.0.1:21889/library/graphics/html/hist.html (histのドキュメント)
[2] http://127.0.0.1:21889/library/stats/html/density.html (densityのドキュメント)
-
たぶん普通は"bin"っていうと思いますが、この記事では誰にでもわかりやすく"棒"でいきます。 ↩
-
histのドキュメントのSee Alsoにdensityがあり、これによるとどうやらカーネル密度推定をしているみたいです。 ↩