ヒストグラム

ヒストグラムは量的データの分布を視覚化するためによく利用されている。データ解析や統計検定などにあたり、データをヒストグラムで描き、その分布の特徴を確認してデータ全体の傾向を捉えたりすることはよくある。

ヒストグラムの横軸は階級、縦軸は度数表す。階級は、データを一定の幅を区切って作られる。例えば、データを区切る幅を「5cm ごと」と設定した時、階級は「0-5cm」、「5-10cm」、「10-15m」のように作られる。度数は、各階級に含まれるデータの数を指す。例えば、ある植物のタネが発芽してから 10 日後に、個体長さを測ると、2cm, 5cm, 6cm, 4cm, 9cm, 3cm, 12cm, 1cm が得られたとする。このとき、幅を 5cm として、階級と度数の表を作ると次のようになる。このように作られた階級と度数をそれぞれ横軸と縦軸にして、グラフを描くとヒストグラムが描かれる。

階級0≤x<55≤x<1010≤x<1515≤x<20
度数4310

階級の幅は、スタージェスの公式に基づいて決めたり、スコットの公式に基づいて決めたりする方法がある。しかし、これらの方法は、それぞれが得意とするデータの特徴がある。すべてのデータに適応できるような方法はない。そのため、階級の幅は、公式に基づいて決めるのに固着せず、データの特徴に応じてあるいは解析目的に応じて決定した方がいい。

hist 関数の基本的な使い方

基本的な方法

hist 関数に、数値のベクトルを与えると、ヒストグラムが描かれる。ヒストグラムの幅は、デフォルトでは、スタージェスの公式によって計算された幅を利用する。

x <- rnorm(1000)

hist(x)
hist(x, col = "orange", main = "rnorm")
Rのhistで描いたヒストグラム

横幅を調整する方法

デフォルトでは、hist 関数によって描かれるヒストグラムの幅は、スタージェスの公式から計算される。幅の計算式を変更する場合は、breaks 引数に、そのアルゴリズム名を与えればいい。スタージェスの公式(Sturges)以外に、ScottFD または 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")
Rのhistで描いたヒストグラム,ヒストグラムの横幅を調整する例

縦軸の調整

ヒストグラムの縦軸は度数(頻度)であるが、この頻度を確率に変更することもできる。縦軸を確率に変更したとき、ヒストグラムの面積をすべて足し合わせると 1 になる。縦軸を度数(頻度)にするか、確率にするかは、引数 freq で指定する。

x <- rnorm(1000)

hist(x, freq = FALSE)
hist(x, freq = TRUE)
Rのhistで描いたヒストグラム,縦軸を頻度あるいは回数を指定する例

密度表示

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)
Rのhistで描いたヒストグラム,密度関数を書き入れる

複数のヒストグラムを描く方法

複数のヒストグラムを重ねて描く場合、ヒストグラムの色を少し透明化させることで、重なりの部分も見えやすくなる。ヒストグラムの色をしてする際に、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)
Rのhistで描いたヒストグラム,密度関数を書き入れる

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")
Rのtruehistを利用して描いたヒストグラムの例

目盛りの異なる 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)
Rのtruehistを利用して描いたヒストグラムの例