LoginSignup
40
41

More than 5 years have passed since last update.

【プログラマーのための統計学】箱ひげ図

Last updated at Posted at 2017-08-23

目次

プログラマーのための統計学 - 目次

箱ひげ図とは

箱ひげ図とは、データの分布やばらつきをわかりやすくするためのグラフです。
例えば、ある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()

以下のようなグラフが出来上がります。

download (10).png

この青い部分を箱、縦の黒い線をヒゲと呼びます。
ヒゲは、最小値と最大値の間に引かれています。
箱は四分位数を表しています。

四分位数とは何かを、次の項で説明します。

四分位数とは

四分位数を理解するために必要な用語がいくつかあるので、順を追って説明します。

パーセンタイル

データを小さい順にならべたときに、頭から数えて、N%の位置にあるデータを、Nパーセンタイルと呼びます。
例えば、30パーセンタイルであれば、頭から30%の位置にあるデータのことになります。
0パーセンタイルは最小値、100パーセンタイルは最大値となります。

四分位数

本題の四分位数です。
四分位数とは、以下のパーセンタイルのことをいいます。
この3つの位置で区切ると、データの個数を4分割することができます。

パーセンタイル 別名
25パーセンタイル 第一四分位数
50パーセンタイル 第二四分位数(中央値)
75パーセンタイル 第三四分位数

四分位範囲(interquartile range / IQR)

以下の式で算出されるものを、四分位範囲、またはIQRと呼びます。

四分位範囲(IQR) = 75パーセンタイル(第三四分位数)-25パーセンタイル(第一四分位数)

箱ひげ図と四分位数

download (8).png

四分位数とは、データの個数で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()

download (9).png

グラフの上部の方に、 + が2つできました。
この2つは、170点、190点が外れ値としてみなされたものです。
pythonのmatplotlibでは、特に外れ値を定義しなくても、このように自動で判別してくれるようなので、非常に便利ですね。

以上

参考

40
41
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
41