ボックスプロット

ボックスプロットは、データの四分位点などを同時に表現できるグラフである。グラフの真ん中に四角形(ボックス)が見られる。

ボックスの枠の上下に垂線が突き出している。ボックスの上辺は第 3 四分位点、下辺は第 1 四分位点を表す。ボックス内部にある横線は第 2 四分位点(中央値)を表す。また、上下に伸びる垂線の頂点の外側にあるプロットされている点は、 2σ 範囲に含まれないデータ(外れ値)を表す。

ボックスプロットと似たようなプロットには、ヴァイオリンプロットビーンプロットなどがある。これらは、四分位点だけでなく、データの推定密度などもプロット上で確認できる。

boxplot の基本的な使い方

サンプルデータを生成してからボックスプロットを描く例。複数のボックスプロットを横に並べて描くとき、各々のデータを boxplot に代入する。

# サンプルデータを作成
x <- rnorm(1000, 10, 1)
y <- rnorm(3000, 13, 3)
z <- rnorm(5000, 15, 5)

# ボックスプロットを描く(左下の図)
boxplot(x, y, z)

# 項目名と色を変更(右下の図)
boxplot(
  x, y, z,                          # データ
  names    = c("X", "Y", "Z"),      # 項目名
  border   = "orange",              # ボックス枠線の色
  col      = "lightyellow",         # ボックス内部の塗り色
  varwidth = TRUE                   # データの個数をボックス幅で表現
)
Rのboxplotで描いたボックスプロット

上は、ベクトル型のデータをボックスプロットに描く例である。行列型のデータの場合も同じように利用する。

# 行列型のデータを生成
m <- matrix(rnorm(10000,10,5), ncol = 5)
colnames(m) <- c("A", "B", "C", "D", "E")

# デフォルトでボックスプロットを描く(左下の図)
boxplot(m)

# ボックスの枠線と塗り色を指定(右下の図)
boxplot(m, 
  main = "rnorm", xlab = "type", ylab = "values",
  border = c("darkgreen", "orange", "red", "magenta", "blue"),
  col    = c("lightgreen", "lightyellow", "pink", "pink", "lightcyan")
)
Rのboxplotで行列型のデータをもとに描いたボックスプロット

プロットの幅を変更する場合は boxwex 引数を利用する。

x <- cbind(rnorm(100, 10, 20), rnorm(100, 30, 30))    # サンプルデータ

boxplot(x)                    # デフォルトでボックスプロットを描く(左下の図)
boxplot(x, boxwex = 0.3)      # ボックスプロットの幅を調整して描く(右下の図)
ボックスプロットの幅を調整する ボックスプロットの幅を調整する

2 水準以上の場合のボックスプロット

2 水準以上のデータに対して、ボックスプロットを左右配置にするか、上下配置にするかで描く。

次は、サンプルデータ(rat.food.txt)を利用して、上下配置でボックスプロットを描く例。サンプルデータは、ラットに 3 種類の餌(PF、C、G)を与え、7 日間の体重を測ったものである。それぞれの餌群には 5 個体が存在する。

# データを読み込む
x <- read.table("https://stat.biopapyrus.net/data/rat.food.txt", header = TRUE)

y <- x[, -1]                         # データを取り出して y に保存する

type <- unique(x[, 1])               # 餌の種類を取得
cols <- c("red", "blue", "green")    # 餌の種類に応じて色を塗り分ける

# 何もない図を作成(座標軸は後で描き入れる)
plot(0, 0, type = "n", xlim = range(1:ncol(y)), ylim = range(x[, -1]),
     xlab = "Type", ylab = "Weight", axes = FALSE)

# 各項目それぞれについてボックスプロットを描く
for (i in 1:length(type)) {
  boxplot(y[x[, 1] == type[i], ],
          col = cols[i], xaxt = "n", add = TRUE)
}

# 凡例
legend("topleft", legend = type, col = cols, pch = 15)

# x 軸を書き入れる
axis(1, at = 1:ncol(y), labels = colnames(y), tick = TRUE)
boxplot

上下配置でボックスプロットを描く例。

x <- read.table("https://stat.biopapyrus.net/data/rat.food.txt", header = TRUE)
y <- x[, -1]                         # データを取り出して y に保存する
type <- unique(x[, 1])               # 餌の種類を取得
cols <- c("red", "blue", "green")    # 餌の種類に応じて色を塗り分ける

# 何もない図を作成
plot(0, 0, type = "n",
     xlim = range(1:(ncol(y) * 3)),           # x 軸を広めにとる
     ylim = range(y), xlab = "Type", ylab = "Weight",
     axes = FALSE)                            # 座標軸を描かない

# 各項目それぞれについてボックスプロットを描く
for (i in 1:length(type)) {
  boxplot(y[x[, 1] == type[i], ],
          at = c(1:ncol(y)) * 3 - i + 0.5,    # x 座標を調整する
          col = cols[i], xaxt = "n", add = TRUE)
}

# 凡例
legend("topleft", legend = type, col = cols, pch = 15)

# x 軸を描く
axis(1, at = 1:ncol(y) * 3 - 1.5, labels = colnames(y), tick = TRUE)
boxplot

ggplot2

次のボックスプロットは ggplot2 を利用して描いたものである。(詳細

ggplot2で描いたボックスプロット。  ggplot2で描くボックスプロット