ヒストグラムは量的データの分布を視覚化するためによく利用されている。データ解析や統計検定などにあたり、データをヒストグラムで描き、その分布の特徴を確認してデータ全体の傾向を捉えたりすることはよくある。
ヒストグラムの横軸は階級、縦軸は度数表す。階級は、データを一定の幅を区切って作られる。例えば、データを区切る幅を「5cm ごと」と設定した時、階級は「0-5cm」、「5-10cm」、「10-15m」のように作られる。度数は、各階級に含まれるデータの数を指す。例えば、ある植物のタネが発芽してから 10 日後に、個体長さを測ると、2cm, 5cm, 6cm, 4cm, 9cm, 3cm, 12cm, 1cm が得られたとする。このとき、幅を 5cm として、階級と度数の表を作ると次のようになる。このように作られた階級と度数をそれぞれ横軸と縦軸にして、グラフを描くとヒストグラムが描かれる。
階級 | 0≤x<5 | 5≤x<10 | 10≤x<15 | 15≤x<20 |
度数 | 4 | 3 | 1 | 0 |
階級の幅は、スタージェスの公式に基づいて決めたり、スコットの公式に基づいて決めたりする方法がある。しかし、これらの方法は、それぞれが得意とするデータの特徴がある。すべてのデータに適応できるような方法はない。そのため、階級の幅は、公式に基づいて決めるのに固着せず、データの特徴に応じてあるいは解析目的に応じて決定した方がいい。
hist 関数の基本的な使い方
基本的な方法
hist
関数に、数値のベクトルを与えると、ヒストグラムが描かれる。ヒストグラムの幅は、デフォルトでは、スタージェスの公式によって計算された幅を利用する。
x <- rnorm(1000)
hist(x)
hist(x, col = "orange", main = "rnorm")
横幅を調整する方法
デフォルトでは、hist
関数によって描かれるヒストグラムの幅は、スタージェスの公式から計算される。幅の計算式を変更する場合は、breaks
引数に、そのアルゴリズム名を与えればいい。スタージェスの公式(Sturges
)以外に、Scott
、FD
または Freedman-Diacoins
を与えることができる。また、breaks
に幅を直接指定したり、分割する値を指定したりすることもできる。
x <- rnorm(1000)
hist(x, breaks = 10)
hist(x, breaks = c(-5,0, 1, 2, 3, 4, 5))
hist(x, breaks = "Scott")
縦軸の調整
ヒストグラムの縦軸は度数(頻度)であるが、この頻度を確率に変更することもできる。縦軸を確率に変更したとき、ヒストグラムの面積をすべて足し合わせると 1 になる。縦軸を度数(頻度)にするか、確率にするかは、引数 freq
で指定する。
x <- rnorm(1000)
hist(x, freq = FALSE)
hist(x, freq = TRUE)
密度表示
hist
関数でヒストグラムを描いてから、density
関数で推測した密度を line
関数で重ね書きすることができる。また、rug
関数で、ヒストグラムの下にラグプロットを描き入れることもできる。
x <- c(rnorm(1000), rnorm(1000, 3, 2))
hist(x, freq = FALSE)
lines(density(x), col = "orange", lwd = 2)
hist(x, freq = FALSE)
lines(density(x), col = "orange", lwd = 2)
rug(x)
複数のヒストグラムを描く方法
複数のヒストグラムを重ねて描く場合、ヒストグラムの色を少し透明化させることで、重なりの部分も見えやすくなる。ヒストグラムの色をしてする際に、RGB では赤は #ff0000、青は #0000ff などのように表すことができる。RGB の色の透明化する場合は、RGB の数値の後ろに透明度を指定すればいい。例えば、#ff000030 や #0000ff50 などのようにする。
x <- rnorm(1000, 10, 5)
y <- rnorm(1000, 15, 5)
hist(x, col = "#ff00ff40", border = "#ff00ff", breaks = 20)
hist(y, col = "#0000ff40", border = "#0000ff", breaks = 20, add = TRUE)
truehist
truehist
は MASS パッケージに含まれているヒストグラムを描く関数である。使い方は hist
関数に似ているが、オプションが多く、より細かい設定ができる。
library(MASS)
x <- rnorm(1000)
truehist(x, h = 0.1, prob = TRUE, col = "black")
truehist(x, breaks = c(-4, 0, 1, 2, 3, 4), prob = FALSE, col = "white")
目盛りの異なる 2 つのヒストグラムを描く方法
truehist
関数あるいは hist
関数を利用するとき、axes = FALSE
と指定することで、軸座標を一時的に描かないようにできる。これを利用すれば、メモリの異なる縦軸の座標を複数付けることができる。以下の例では x 軸を固定して、2 つのヒストグラムを描いた。
library(MASS)
par(mar = c(4.5, 4.5, 4.5, 5.5))
x <- rnorm(1000, 300, 100)
y <- rnorm(1000, 500, 200)
truehist(x, xlim = c(0, 1000), h = 10, col = "#ff990080", border = "#ff990080",
axes = FALSE, xlab = "", ylab = "")
axis(side = 1) # x
axis(side = 2, col.axis = "#ff9900", col = "#ff9900") # left y
mtext("Orange", side = 2, line = 3) # left(side = 2), margin(line = 3)
par(new = TRUE)
truehist(y, xlim = c(0, 1000), h = 10, col = "#66990080", border = "#66990080",
axes = FALSE, xlab = "", ylab = "")
axis(side = 4, col.axis = "#669900", col = "#669900") # right y
mtext("Green", side = 4, line = 3) # right(side=4)