箱ひげ図を用いることでデータのばらつきを分かりやすく表現することが可能になります。ここでは、Pythonのmatplotlibを用いて箱ひげ図を描く方法を説明します。
開発環境
- matplotlib 3.1.3
- Python 3.7.7
箱ひげ図とは?
箱ひげ図は与えられたデータ系列から四分位数と呼ばれる以下の5つの統計量を可視化したグラフです。
- 最小値
- 25パーセンタイル(第1四分位点)
- 中央値(第2四分位点)
- 75パーセンタイル(第3四分位点)
- 最大値
なお、四分位範囲(IQR)は「第3四分位点 – 第1四分位点」で定義され、これが箱ひげ図の箱の大きさになります。
箱ひげ図は、データのばらつきをわかりやすく可視化することができるのが特徴で、非常によく用いられる基本的な統計図の一つです。
基本的な箱ひげ図の描画方法
Axesオブジェクトのboxplotメソッドで折れ線グラフを描画できます。(pyplotスタイルの場合は、pyplotのboxplot関数を用います)
基本的な使い方①:データ系列が1つの場合
データ系列をリストとしてboxplotメソッドの引数として渡すだけで、箱ひげ図を作成することができます。
x = [7, 6, 9, 6, 10, 13, 12, 10, 14, 18, 7, 10, 13]
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.boxplot(x)
plt.show()
基本的な使い方②:データ系列が2つ以上ある場合
データ系列が複数ある場合は、それぞれのデータ系列をリストとして用意し、そのデータ系列をboxplotメソッドの引数にリストやタプルで渡すことで箱ひげ図を作成することができます。
x1 = [7, 6, 9, 6, 10, 13, 12, 10, 14, 18, 7, 10, 13]
x2 = [20, 23, 20, 19, 21, 20, 18, 23, 18, 19, 20, 22]
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.boxplot((x1, x2))
plt.show()
基本的な使い方③:外れ値がある場合
matplotlibのboxplotメソッドは外れ値の判定も自動で行ってくれます。例えば次のように外れ値がある場合は、箱ひげの外に〇で表示されます。
x = [7, 6, 9, 6, 10, 13, 12, 10, 14, 18, 7, 10, 13, 25, 10, 12, 9, 8, 15, 13, 10, 20]
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.boxplot(x)
plt.show()
通常、箱ひげ図を描く場合はそれぞれ以下の値を外れ値として判定します。
- (第1四分位点) – 1.5 x IQR より小さい値
- (第3四分位点) + 1.5 x IQR より大きい値
つまり、箱ひげ図のひげが箱の大きさの1.5倍以上になるときに、その値を外れ値として判定します。この外れ値の判定方法はwhis引数で設定することが可能です。例えば、whis=0.5とすると箱ひげ図のひげが箱の大きさの0.5倍以上になるときにその値を外れ値として判定します。
x = [7, 6, 9, 6, 10, 13, 12, 10, 14, 18, 7, 10, 13, 25, 10, 12, 9, 8, 15, 13, 10, 20]
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.boxplot(x, whis=0.5)
plt.show()
先ほどと比較して、データ系列は同じですがひげの長さが短くなって外れ値の表示が増えていることが分かります。
また、whis=[10, 90]のようにリストで指定すると、パーセンタイルでの外れ値の指定となります(この場合は、下位10パーセンタイルと上位90パーセンタイルが外れ値)。
箱ひげ図のスタイルの設定
箱ひげ図を横にする
vert引数にFalseを指定することで箱ひげ図を横に表示させることも可能です。
x = [7, 6, 9, 6, 10, 13, 12, 10, 14, 18, 7, 10, 13, 25, 10, 12, 9, 8, 15, 13, 10, 20]
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.boxplot(x, vert=False)
plt.show()
箱ひげ図に平均値を表示させる
箱ひげ図に表示されるのは中央値なので、デフォルトでは平均値は分かりません。そこで、showmeans引数を用いることで平均値を表示させることができます。
x = [7, 6, 9, 6, 10, 13, 12, 10, 14, 18, 7, 10, 13, 25, 10, 12, 9, 8, 15, 13, 10, 20]
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.boxplot(x, showmeans=True)
plt.show()
なお、ここで表示される平均値は外れ値も含めた平均値であることに注意してください。
コメント