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

## 目次
[プログラマーのための統計学 - 目次](http://qiita.com/Esfahan/items/bd9e52837bbaeb168b9f)

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

```py
%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](https://qiita-image-store.s3.amazonaws.com/0/105936/c2f2d0ff-081c-a344-f875-2fea95dcfa0b.png)

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

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

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

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

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

| パーセンタイル | 別名 |
| --- | --- |
| 25パーセンタイル | 第一四分位数
| 50パーセンタイル | 第二四分位数（中央値） |
| 75パーセンタイル | 第三四分位数 |

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

```math
四分位範囲(IQR) = 75パーセンタイル（第三四分位数）－25パーセンタイル（第一四分位数）
```

## 箱ひげ図と四分位数

![download (8).png](https://qiita-image-store.s3.amazonaws.com/0/105936/7391fe02-6652-01f2-371b-f8ae3226e44c.png)

四分位数とは、データの個数で４分割したものなので、以下の区間には、同じデータ数が入っています。

- 最小値 -> 第一四分位数
- 第一四分位数 -> 第二四分位数
- 第二四分位数 -> 第三四分位数
- 第三四分位数 -> 最大値

しかし、上記のグラフでは、各区間の長さが異なっています。
これは、データにばらつきがあるということです。
第一四分位数 -> 第二四分位数の区間がとても短くなっていますが、これはテストの結果が40点前後の人が一番多く、偏っているということになります。

また、第一四分位数 -> 第二四分位数 -> 第三四分位数の、3つの区間を合わせると、全体の半分のデータ数となります。つまり、半数の人のテストの点数が、39点から70点くらいの間にあるということになります。

## 外れ値のある箱ひげ図
中央値や四分位数は、最大値、最小値が極端であったとしても、引きづられることはありませんが、最大値、最小値は当然引きづられます。
測定ミスなどによる異常データが原因で、極端なデータ存在している場合もあります。
そこで、極端な値がある場合は、外れ値とみなして、箱ひげ図を作成する方法を説明します。

前述の箱ひげ図の場合、最大値、最小値が極端であった場合、ヒゲが長くなります。
外れ値を考慮する箱ひげ図の場合は、ヒゲの長さは、最大値側、最小値側でそれぞれ、箱の1.5倍以下とし、それを超えるデータは、外れ値とみなします。

pythonのmatplotlibでは、外れ値を自動で検出してくれるようです。
以下のコードでは、国語の点数結果に170点、190点を追加してみました。
テストは100点満点なので、この2つは外れ値になるはずです。
グラフの目盛りは200までに増やしています。
これでグラフを作成してみます。

```py
%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](https://qiita-image-store.s3.amazonaws.com/0/105936/73f1e22e-3447-befc-3487-ef3ae59046a4.png)

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

以上

## 参考
- [統計web - 箱ひげ図とは](https://bellcurve.jp/statistics/course/5219.html)
- [Pythonで箱ひげ図](http://qiita.com/Yuichi801/items/8ffd9fb6c5ec39e206fc)
- [箱ひげ図の意味](http://mathtrain.jp/hakohige)