データの分布を視覚的に表現する箱ひげ図(boxplot)について勉強します。“数学チュートリアル やさしく語る 確率統計 西岡康夫(著)”の1.6節 箱ひげ図の例題をRで解きます。
例題
ある都市におけるある月の各日最低気温(℃: 小数点以下四捨五入)は以下の通りであった。
22 22 18 17 23 23 22 18 18 20
22 20 19 18 19 16 21 19 16 17
15 21 18 17 16 15 20 17 14 19
このデータについて次の問いに答えよ。
(1)Q1, Q3を求めよ。
(2)四分位偏差を求めよ。
(3)箱ひげ図を描け。
四分位数(quartile)は分位数(quantile)の1つです。個数\(n\)のデータを昇順に並べて、4等分すると区切りの境界が3つできます。境界にあたる数値を小さい方から第1四分位数(first quantile)\(Q_1\)、第2四分位数(second quantile)\(Q_2\)、第3四分位数(third quantile)\(Q_3\)と呼びます。第2四分位数\(Q_2\)は中央値と等しいです。
四分位数を求めるには、まずデータを昇順に並べます。
data <- c(22, 22, 18, 17, 23, 23, 22, 18, 18, 20, 22, 20, 19, 18, 19, 16, 21, 19, 16, 17, 15, 21, 18, 17, 16, 15, 20, 17, 14, 19)
data
## [1] 22 22 18 17 23 23 22 18 18 20 22 20 19 18 19 16 21 19 16 17 15 21 18
## [24] 17 16 15 20 17 14 19
data_s <- sort(data)
data_s
## [1] 14 15 15 16 16 16 17 17 17 17 18 18 18 18 18 19 19 19 19 20 20 20 21
## [24] 21 22 22 22 22 23 23
データの個数\(n\)は30で偶数なので、昇順に並べたデータを2等分して、小さい方の\(\frac{n}{2}\)個のデータ(下位データ)と、大きい方の\(\frac{n}{2}\)個のデータ(上位データ)をそれぞれ抽出します。
# number of data
n <- length(data)
# lower level of data
data_l <- data_s[1:(n/2)]
data_l
## [1] 14 15 15 16 16 16 17 17 17 17 18 18 18 18 18
# upper level of data
data_u <- data_s[(n/2+1):n]
data_u
## [1] 19 19 19 19 20 20 20 21 21 22 22 22 22 23 23
第1四分位数\(Q_1\)は下位データの中央値で、第3四分位数は上位データの中央値です。第1四分位数\(Q_1\)と、第2四分位数\(Q_3\)をそれぞれ計算します。
# first quartile
q1 <- median(data_l)
q1
## [1] 17
# third quartile
q3 <- median(data_u)
q3
## [1] 21
第2四分位数(中央値)は下位データの最大値と上位データの最小値の平均です。median(data)と計算しても同じ結果になります。
(max(data_l) + min(data_u)) / 2
## [1] 18.5
分位数はquantile関数だけで計算することができます。
quantile(data, probs=c(0.25, 0.5, 0.75), type=2)
## 25% 50% 75%
## 17.0 18.5 21.0
分位数の計算方法はいくつかあり、Rのquantile関数は9つのアルゴリズムを組み込んでいます。アルゴリズムはtypeオプションで指定でき、デフォルトはtype = 7となります1。
probsオプションで\(q\)分位を指定できます。デフォルトはprobs = c(0, 0.25, 0.5, 0.75, 1)です。
quantile関数をオプションなしで計算すると次のようになります。
quantile(data)
## 0% 25% 50% 75% 100%
## 14.00 17.00 18.50 20.75 23.00
四分位偏差(quartile deviation)は四分位範囲(IQR: interquartile range)を2で割った数値です。四分位範囲と四分位偏差の定義は次のとおりです。
\[ IQR = Q_3 - Q_1 \] \[ (Quartile\ deviation) = \frac{IQR}{2} = \frac{Q_3 - Q_1}{2} \]
問(1)で求めた\(Q_1\)と\(Q_3\)で四分位範囲と四分位偏差を計算します。
# interqurtile range
iqr = q3 - q1
iqr
## [1] 4
# quartile deviation
qd = iqr/2
qd
## [1] 2
箱ひげ図を描くために必要な代表値をまとめます。
| 箱ひげ図に必要な代表値 | Rのコード | Rの計算結果 |
|---|---|---|
| 最小値(minimum) | min(data) |
14 |
| 第1四分位数(first quartile) | quantile(data, probs=0.25, names=F) |
17 |
| 中央値(median) | median(data) |
18.5 |
| 第3四分位数(third quartile) | quantile(data, probs=0.75, names=F) |
21 |
| 最大値(maximum) | max(data) |
23 |
箱ひげ図はこの5つの代表値を箱とひげで表現した図で、ひげの長さや箱の大きさで分布(データのばらつき)を目で見てわかりやすくします。
せっかくだからマニュアルで計算した代表値で箱ひげ図を描きたいのですが、絵をいちいちlines関数で描くのはやりたくないので、データを入力して箱ひげ図を描く関数を使います。
グラフをプロットするためにggplot2パッケージをインストールします。
if (!require("ggplot2")) {
install.packages(c("ggplot2"), repos="http://cran.rstudio.com/")
library(ggplot2)
}
## Loading required package: ggplot2
ggplot関数で箱ひげ図を描きます。
# Make data frame for ggplot
df <- data.frame(data)
head(df)
## data
## 1 22
## 2 22
## 3 18
## 4 17
## 5 23
## 6 23
# Add plot layers
g <- ggplot(df, aes(x = "", y = data))
g <- g + geom_boxplot() # set boxplot chart
g <- g + xlab("On some month at some city") # x label
g <- g + ylab("The lowest temperature at a day (deg. C)") # y label
g <- g + ggtitle("Boxplot by ggplot2") # title
# Plot
plot(g)
箱ひげ図をboxplot関数で描くこともできます。
boxplot(data, xlab="On some month at some city", ylab="The lowest temperature at a day (deg. C)", main="Boxplot by boxplot")
箱の中の太線は中央値を表しています。ひげの長さはデータの範囲(range)です。箱の長さは四分位範囲(IQR)です。ひげの長さと箱の中の太線の対称性からデータの分布の偏りがわかります。
R: Sample Quantiles - R manualや、Quantile - Wikipediaに詳しい説明があります。この記事では“やさしく語る 確率統計”の方法に従って四分位数を計算していて、データの個数が偶数の場合はquantile(data, type = 2)のアルゴリズムと同じ方法だと思うのですが、しっかり調べてはいないので自信がありません。↩