目次
箱ひげ図とは
箱ひげ図とは、データの分布やばらつきをわかりやすくするためのグラフです。
例えば、ある10人のテストの点数が以下だったとします。
No | 数学の点数 | 国語の点数 |
---|---|---|
1 | 74 | 81 |
2 | 65 | 62 |
3 | 40 | 32 |
4 | 62 | 67 |
5 | 85 | 41 |
6 | 67 | 50 |
7 | 82 | 85 |
8 | 71 | 70 |
9 | 60 | 67 |
10 | 99 | 97 |
このデータを元に、matplotlibを使って箱ひげ図を作ります。
%matplotlib inline
import matplotlib.pyplot as plt
# 数学の点数
math = [74, 65, 40, 62, 85, 67, 82, 71, 60, 99]
# 国語の点数
literature = [81, 62, 32, 67, 41, 50, 85, 70, 67, 97]
# 点数のタプル
points = (math, literature)
# 箱ひげ図
fig, ax = plt.subplots()
bp = ax.boxplot(points)
ax.set_xticklabels(['math', 'literature'])
plt.title('Box plot')
plt.xlabel('exams')
plt.ylabel('point')
# Y軸のメモリのrange
plt.ylim([0,100])
plt.grid()
# 描画
plt.show()
以下のようなグラフが出来上がります。
この青い部分を箱、縦の黒い線をヒゲと呼びます。
ヒゲは、最小値と最大値の間に引かれています。
箱は四分位数を表しています。
四分位数とは何かを、次の項で説明します。
四分位数とは
四分位数を理解するために必要な用語がいくつかあるので、順を追って説明します。
パーセンタイル
データを小さい順にならべたときに、頭から数えて、N%の位置にあるデータを、Nパーセンタイルと呼びます。
例えば、30パーセンタイルであれば、頭から30%の位置にあるデータのことになります。
0パーセンタイルは最小値、100パーセンタイルは最大値となります。
四分位数
本題の四分位数です。
四分位数とは、以下のパーセンタイルのことをいいます。
この3つの位置で区切ると、データの個数を4分割することができます。
パーセンタイル | 別名 |
---|---|
25パーセンタイル | 第一四分位数 |
50パーセンタイル | 第二四分位数(中央値) |
75パーセンタイル | 第三四分位数 |
四分位範囲(interquartile range / IQR)
以下の式で算出されるものを、四分位範囲、またはIQRと呼びます。
四分位範囲(IQR) = 75パーセンタイル(第三四分位数)-25パーセンタイル(第一四分位数)
箱ひげ図と四分位数
四分位数とは、データの個数で4分割したものなので、以下の区間には、同じデータ数が入っています。
- 最小値 -> 第一四分位数
- 第一四分位数 -> 第二四分位数
- 第二四分位数 -> 第三四分位数
- 第三四分位数 -> 最大値
しかし、上記のグラフでは、各区間の長さが異なっています。
これは、データにばらつきがあるということです。
第一四分位数 -> 第二四分位数の区間がとても短くなっていますが、これはテストの結果が40点前後の人が一番多く、偏っているということになります。
また、第一四分位数 -> 第二四分位数 -> 第三四分位数の、3つの区間を合わせると、全体の半分のデータ数となります。つまり、半数の人のテストの点数が、39点から70点くらいの間にあるということになります。
外れ値のある箱ひげ図
中央値や四分位数は、最大値、最小値が極端であったとしても、引きづられることはありませんが、最大値、最小値は当然引きづられます。
測定ミスなどによる異常データが原因で、極端なデータ存在している場合もあります。
そこで、極端な値がある場合は、外れ値とみなして、箱ひげ図を作成する方法を説明します。
前述の箱ひげ図の場合、最大値、最小値が極端であった場合、ヒゲが長くなります。
外れ値を考慮する箱ひげ図の場合は、ヒゲの長さは、最大値側、最小値側でそれぞれ、箱の1.5倍以下とし、それを超えるデータは、外れ値とみなします。
pythonのmatplotlibでは、外れ値を自動で検出してくれるようです。
以下のコードでは、国語の点数結果に170点、190点を追加してみました。
テストは100点満点なので、この2つは外れ値になるはずです。
グラフの目盛りは200までに増やしています。
これでグラフを作成してみます。
%matplotlib inline
import matplotlib.pyplot as plt
# 国語の点数
literature = [81, 62, 32, 67, 41, 50, 85, 100, 170, 190]
# 点数のタプル
points = (literature)
# 箱ひげ図
fig, ax = plt.subplots()
bp = ax.boxplot(points)
ax.set_xticklabels(['literature'])
plt.title('Box plot')
plt.xlabel('exams')
plt.ylabel('point')
# Y軸のメモリのrange
plt.ylim([0,200])
plt.grid()
# 描画
plt.show()
グラフの上部の方に、 +
が2つできました。
この2つは、170点、190点が外れ値としてみなされたものです。
pythonのmatplotlibでは、特に外れ値を定義しなくても、このように自動で判別してくれるようなので、非常に便利ですね。
以上