▶ 初学者向けにPythonを使ったデータ分析に役立つ記事を書いています
▶ matplotlibによる可視化を基本から解説しています。以下の投稿も合わせてご覧ください。
はじめに
今回は箱ひげ図について基本から解説します。前回のヒストグラムと同様、量的データの分布や傾向を視覚的に表現するグラフの一つです。ヒストグラムと比較して複数のデータと比較しやすいというメリットがあります。そのため、「複数の量的データの分布や傾向をみるとき」あるいは「1つの量的データを質的データの値ごとに分布や傾向をみるとき」に力を発揮します。一方で、大まかな分布や傾向を見ることはできますが、細かな分布を把握することはできない点には注意しましょう。
環境
- Windows11
- Python 3.11.4
- pandas 2.0.3
- numpy: 1.25.0
- matplotlib: 3.7.1
- seaborn: 0.12.2
箱ひげ図とは
箱ひげ図とは、データのばらつき具合を表すグラフです。ヒストグラムもデータの分布をみるグラフですが、箱ひげ図では、最大値、最小値、四分位数、中央値などの情報を簡潔に表現できます。
また次のようなメリットがあります。
- データの分布や特徴を一目で把握できる
- 極端な値(外れ値)があっても影響を受けにくい
- 複数のデータを比較しやすい
但し、ヒストグラムと比較して細かな分布を把握することはできないので、目的に合わせてグラフを使い分けるようにしましょう。
箱ひげ図自体をもう少し詳しく確認したい場合は以下の投稿をどうぞ
サンプルデータ
まずはサンプルデータを準備しましょう。今回はseabornにあらかじめ用意されている「penguins」データを使うことにしましょう。
import seaborn as sns
import matplotlib.pyplot as plt
import japanize_matplotlib
## ペンギンのデータセットを読み込む
penguins = sns.load_dataset("penguins")
penguins.head()
箱ひげ図の描き方
Pythonでグラフを描く際には可視化ライブラリを使うと便利です。ここでは、matplotlibとseabornというライブラリを使った箱ひげ図の描き方を紹介します。また、テーブルデータを操作する際に便利な機能を提供しているpandasというライブラリを使って箱ひげ図を描けるので、最後にこちらも紹介します。
- matplotlib
Pythonでグラフを描くための基本的なライブラリであり、他のライブラリとの互換性が高いです。様々な種類のグラフを自由にカスタマイズできるので、細かい調整が必要な場合に便利です。 - seaborn
matplotlibをベースにしたライブラリであり、コードがシンプルで読みやすいです。統計的なデータ分析に適したグラフが多く用意されており、美しいデザインで可視化できます。 - pandas
Pythonでテーブルデータを効率的に扱うためのライブラリです。pandasでは、Excelやcsvファイルなどの様々なデータフォーマットの読み込みや書き出し、データの加工や修正、データの統計量やグラフ化などの機能があります。
matplotlibを使って描く
まず基本構文を確認しておきましょう。
labelsはオプションですが、指定しておいた方がわかりやすいです。シーケンスで指定する必要があるので、1つの箱ひげ図を描く場合でもリストで指定するとよいでしょう。
さっそく描いてみましょう。
plt.boxplot(df['body_mass_g'])
あれ?何かおかしいですね。基本構文通りなのに箱ひげ図が描かれません。これは、データに欠損値が含まれているためです。matplotlibの場合は欠損値を含んでいると箱ひげ図を正しく描くことができません。欠損値を除去して描画してみましょう。
plt.boxplot(df['body_mass_g'].dropna())
今度は箱ひげ図を描画できました。でも、なんのグラフなのかわかりにくいですね。labelsを指定するとよいでしょう。次のようにします。
plt.boxplot(df['body_mass_g'].dropna(),labels=['body_mass_g'])
次にspeiciesごとに箱ひげ図を描いてみましょう。単純にやるのであれば、次のようにします。
species = ['Adelie', 'Chinstrap', 'Gentoo']
fig,axes = plt.subplots(1,3,figsize=(15,3))
axes = axes.flatten()
for i,name in enumerate(species):
axes[i].boxplot(x=df.query('species==@name')['body_mass_g'].dropna(),labels=[name])
うまくいきました!
このように基本的にはカテゴリ変数の値ごとに描画を繰り返す必要があります。
seabornを使って描く
まず基本構文を確認しておきましょう。
どちらでも簡単に描けますが、今回はsns.boplot()の方で描いてみましょう。
sns.boxplot(y='body_mass_g',data=df)
seabornの場合は、欠損値があっても自動で処理をしてくれます。便利ですね。量的変数をyにしていすると縦方向の箱ひげ図、xに指定すると横方向の箱ひげ図になります。次にspeciesごとに描いてみます。
sns.boxplot(x='species', y='body_mass_g',data=df)
なんとたった一行です!!すごい!!この場合は、yに量的変数を指定しているので縦方向の箱ひげ図、xに質的変数を指定しているので、質的変数の値ごとに箱ひげ図を描画しています。
色が気になる場合は、colorを指定するとよいでしょう。’white’を指定すると次のようにシンプルな箱ひげ図になります。
sns.boxplot(x='species', y='body_mass_g',data=df,color='white')
箱ひげ図では細かな分布は確認できない、という注意点があるのですが、実はswarmplotと組み合わせるとこの弱点を克服することができます。swarmplotは、カテゴリーごとに分布を散布図で表示するもので、同じ値があっても重ならないように横にずらして並べます。これにより、サンプル数や値の分布を把握しやすくなります。
箱ひげ図と組み合わせて描画してみましょう。
sns.boxplot(x='species', y='body_mass_g',data=df,color='white')
sns.swarmplot(x='species', y='body_mass_g',data=df)
これだと詳細な分布までわかりますね。しかもたった2行のコードです。
すごいですね!!
このようにseabornでは詳細なグラフが簡単なコートで描けることが多いです。そのため、私は基本的にはseabornで可視化することが多いです。
pandasのplotで描く
最後にpandasのplot()で描く方法も紹介しておきます。基本構文は以下です。
あまり使うことはないのですが、複数の描画をするときは便利です。
df.plot(kind='box',subplots=True, layout=(1,4))
plt.tight_layout()
dfの量的変数は「body_mass_g」だけではありません。これらをわざわざ指定しなくても、上記のように一気に描くことができます。量的変数の分布を一気に描いて確認するときには便利ですね。
まとめ
今回は箱ひげ図の描き方を基本から紹介しました。可視化ライブラリを使うと箱ひげ図も簡単に描くことがわかりましたね。箱ひげ図は詳細な分布がわからない、という注意点がありますが、swarmplotと組み合わせることで、これを克服できます。
データ理解の最初のステップで量的データの分布を核にする際に必須となるので、是非、身につけておきましょう。
コメント