Matplotlib Box Plot – チュートリアルと例題

Python には多くのデータ可視化ライブラリがありますが、Matplotlib はその中でも最も人気のあるライブラリです。Matplotlib の人気の理由はその信頼性と実用性にあり、少ないコードでシンプルなプロットから複雑なプロットまで作成することができます。また、プロットは様々な方法でカスタマイズすることができます。

このチュートリアルでは、Matplotlib で Box Plot をプロットする方法を説明します。

Box Plots は、データセットの要約統計量を可視化するために用いられ、データの範囲や分布のような分布の属性を表示することができます。

データのインポート

Box Plotを作成するためには、プロットするためのデータが必要です。Box Plot は連続変数の分布を可視化するので、特徴として連続変数を含むデータセットを選ぶ必要があります。ここでは、Wine Quality データセットを使用します。

まず、必要なライブラリをすべてインポートすることから始めます。データセットを読み込み、解析するためにPandasをインポートします。もちろん、Matplotlibもインポートする必要がありますし、より正確に言えば、PyPlotモジュールもインポートします。

import pandas as pd
from matplotlib import pyplot as plt


それでは、データセットが使用できる状態になっているか確認してみましょう。データセットの先頭を出力して、データが正しく読み込まれたことを確認します。また、データの欠落がないことも確認します。

dataframe = pd.read_csv("winequality-red.csv")
print(dataframe.head())
print(dataframe.isnull().values.any())


   fixed acidity  volatile acidity  citric acid  ...  sulphates  alcohol  quality
0            7.4              0.70         0.00  ...       0.56      9.4        5
1            7.8              0.88         0.00  ...       0.68      9.8        5
2            7.8              0.76         0.04  ...       0.65      9.8        5
3           11.2              0.28         0.56  ...       0.58      9.8        6
4            7.4              0.70         0.00  ...       0.56      9.4        5


[5 rows x 12 columns]
False


2つ目のprint文はFalseを返します。これは欠損データがないことを意味します。これは、データの欠落がないことを意味します。欠落があった場合、DataFrameの欠落を処理しなければなりません。

Matplotlib での箱ひげ図作成

データセットからいくつかの特徴を選択し、 boxplot() 関数でそれらの特徴を可視化してみましょう。Pandas を利用して、必要な特徴列を抽出し、便宜上変数として保存します。

fixed_acidity = dataframe["fixed acidity"]
free_sulfur_dioxide = dataframe['free sulfur dioxide']
total_sulfur_dioxide = dataframe['total sulfur dioxide']
alcohol = dataframe['alcohol']


いつものように、プロット関数はPyPlotインスタンス(plt)、Figureインスタンス、Axesインスタンスに対して呼び出すことができます。

import pandas as pd
import matplotlib.pyplot as plt


dataframe = pd.read_csv("winequality-red.csv")


fixed_acidity = dataframe["fixed acidity"]
free_sulfur_dioxide = dataframe['free sulfur dioxide']
total_sulfur_dioxide = dataframe['total sulfur dioxide']
alcohol = dataframe['alcohol']


fig, ax = plt.subplots()
ax.boxplot(fixed_acidity)
plt.show()


ここでは、 subplots() 関数の戻り値から figax オブジェクトを抽出しているので、そのどちらかを使って boxplot() 関数を呼び出すことができます。あるいは、単に plt.boxplot() を呼び出すこともできました。

いずれにせよ、この結果は

プロットを作成した後、データの要約統計のいくつかを見ることができます。箱ひげ図は、データセットの中央値(中央の垂直線)、四分位範囲(箱の両端)、選択したデータセットの特徴の最小値と最大値(「ひげ」の遠端)を表示します。

また、列を増やすだけで、1つの図に複数の列をプロットすることができます。これも plt インスタンス、 fig オブジェクト、 ax オブジェクトのいずれかを使って行うことができます。

import pandas as pd
import matplotlib.pyplot as plt


dataframe = pd.read_csv("winequality-red.csv")


fixed_acidity = dataframe["fixed acidity"]
free_sulfur_dioxide = dataframe['free sulfur dioxide']
total_sulfur_dioxide = dataframe['total sulfur dioxide']
alcohol = dataframe['alcohol']


columns = [fixed_acidity, free_sulfur_dioxide, total_sulfur_dioxide, alcohol]


fig, ax = plt.subplots()
ax.boxplot(columns)
plt.show()


この結果は

さて、複数の列をプロットすることにしたので、もっとたくさんのことができるようになりました。

プロットのカスタマイズ

ご覧のように、プロットは正常に生成されましたが、X軸とY軸に目盛りラベルがなければ、グラフを解釈することは困難です。

そこで、xticks関数を用いてプロットをカスタマイズし、X軸にラベルを追加することができます。追加したいラベルの数と、それらの列のそれぞれのラベルを渡してみましょう。

fig, ax = plt.subplots()
ax.boxplot(columns)
plt.xticks([1, 2, 3, 4], ["Fixed acidity", "Free sulfur dioxide", "Total sulfur dioxide", "Alcohol"], rotation=10)
plt.show()


もし望むなら、 vert パラメータを変更することで、プロットの方向を変更することもできます。vertはプロットが垂直にレンダリングされるかどうかを制御し、デフォルトでは1` に設定されています。

fig, ax = plt.subplots()
ax.boxplot(fixed_acidity, vert=0)
plt.show()


notch=True属性はボックスプロットにノッチ形式を作成し、patch_artist=True` はボックスプロットを色で塗りつぶします。

fig, ax = plt.subplots()
columns = [free_sulfur_dioxide, total_sulfur_dioxide]
ax.boxplot(columns, notch=True, patch_artist=True)
plt.xticks([1, 2], ["Free sulfur dioxide", "Total sulfur dioxide"])
plt.show()


平均をボックス上に表示するために meanline 引数を使用することができますが、ノッチを表示する場合には、両者が衝突する可能性があるので、これは避けるべきです。

これは showmean パラメータと組み合わせる必要があります。可能であれば、平均はボックスを横切る線として表示されます。可能でない場合は、平均は点として表示される。

fig, ax = plt.subplots()
columns = [free_sulfur_dioxide, total_sulfur_dioxide]
ax.boxplot(columns, patch_artist=True, meanline=True, showmeans=True)
plt.xticks([1, 2], ["Free sulfur dioxide", "Total sulfur dioxide"])
plt.show()


16進数のカラーリストを作成し、 set_facecolor 引数を使用することで、異なる特徴カラムに色を付けることができます。以下の例では、変数 boxboxes 要素に使用したい色をまとめて zip し、それらのボックスごとにフェースカラーを設定しています。

columns = [fixed_acidity, free_sulfur_dioxide, total_sulfur_dioxide, alcohol]
fig, ax = plt.subplots()
box = ax.boxplot(columns, notch=True, patch_artist=True)
plt.xticks([1, 2, 3, 4], ["Fixed acidity", "Free sulfur dioxide", "Total sulfur dioxide", "Alochol"])


colors = ['#0000FF', '#00FF00',
          '#FFFF00', '#FF00FF']


for patch, color in zip(box['boxes'], colors):
    patch.set_facecolor(color)


plt.show()


結論

このチュートリアルでは、Matplotlib と Python で Box Plot を作成する方法について学びました。そして、 vert, meanline, set_facecolor のような引数を使用して、どのようにカスタマイズできるかを見てきました。

もしあなたがデータ可視化に興味があり、何から始めたらいいかわからないなら、Pythonでデータ可視化に関する私たちの本の束をチェックしてみてください。

Pythonによるデータ可視化

データビジュアライゼーションで危険な存在になる

30日間無条件返金保証

初級から上級まで

定期的に無料で更新(最新更新は2021年4月)

ボーナスリソースやガイドを更新

Pythonでデータ可視化 MatplotlibとPandasは、Pythonの基礎知識を持つ全くの初心者が、PandasとMatplotlibを使って、単純なプロットからインタラクティブなボタンを持つアニメーションの3Dプロットまで、これらのライブラリで高度な作業をするための強力な基盤を構築できるように設計された書籍です。

本書は、Pythonの基本的な知識を持つ方を対象としています。
PandasとMatplotlibについて知っておく必要
があることすべてを教えてくれる詳細なガイドです。

Pythonによるデータ可視化」は、Pythonの初級~中級開発者向けの書籍で、Pandasを使った簡単なデータ操作から、MatplotlibやSeabornなどのコアなプロットライブラリを取り上げ、Altairなどの宣言型ライブラリや実験的ライブラリを活用する方法について案内しています。具体的には、11章にわたって、9つのPythonライブラリを取り上げています。Pandas、Matplotlib、Seaborn、Bokeh、Altair、Plotly、GGPlot、GeoPandas、そしてVisPyです。

データビジュアライゼーションのユニークで実用的なガイドとして、あなたがキャリアで使うかもしれない多くのツールを紹介しています。

タイトルとURLをコピーしました