こちらの記事では要約統計量の取得方法について解説しました。
今回は、matplotlib を使って要約統計量をグラフ化する方法について解説します。
この記事で取り上げるのは、箱ひげ図(boxplot)、バィオリンプロット(violinplot)、ヒストグラム(histgram)になります。
要約統計量で使うグラフの種類
要約統計量で知りたいことはデータの分布なので、これを可視化することになります。
箱ひげ図、ヒストグラムは昔から使われてきましたが、最近ではバィオリンプロットも使われるようになりました。

それぞれの違いについて簡単にまとめておきます。
箱ひげ図 | データの分布を5種類の統計量(最小値、第一四分位数、中央値、 第三四分位数、最大値)を使って表現したもの |
バィオリンプロット | データの分布の密度を左右の幅で表現したもので、箱ひげ図と (90度回転させて階級をなくした)ヒストグラムを合体したようなもの |
ヒストグラム | データの分布を決められた区間(階級)毎に集計し、棒グラフとして表現したもの |
グラフ表示で使ったサンプルデータについて
サンプルデータは numpy による正規分布のランダムデータを使っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import numpy as np import matplotlib.pyplot as plt import pandas as pd #正規分布の乱数を使ってサンプルデータを作成(平均値:loc、標準偏差:scale、データ数:size) data1 = np.random.normal(loc=50, scale=25, size=100) data2 = np.random.normal(loc=20, scale=10, size=100) data3 = np.random.normal(loc=10, scale=5, size=100) df = pd.DataFrame({'col1':data1,'col2':data2,'col3':data3}) #1次元データによるグラフ表示 data = data1 plt.plot(data) plt.show() #2次元(表形式)データによるグラフ表示 data = df plt.plot(data) plt.show() |
1次元データのグラフは data1 を、2次元(表形式)のグラフは DataFrameを使っています。
ランダムなので実行する度にグラフの形は変わりますが、だいたい以下のような感じです。

箱ひげ図をプロットする
箱ひげ図は boxplot を使います。
先ほどの折れ線グラフの plot() が bolplot() に代わっただけです。
1 2 3 4 5 6 7 8 9 |
#1次元データによるグラフ表示 data = data1 plt.boxplot(data) plt.show() #2次元(表形式)データによるグラフ表示 data = df plt.boxplot(data) plt.show() |
実行結果は次のようになります。

ヒストグラムをプロットする
ヒストグラム は hist を使います。
先ほどの折れ線グラフの plot() が hist () に代わっただけです。
とりあえずデータを突っ込むだけで、階級は自動で決めてくれます。
1 2 3 4 5 6 7 8 9 |
#1次元データによるグラフ表示 data = data1 plt.hist(data) plt.show() #2次元(表形式)データによるグラフ表示 data = df plt.hist(data) plt.show() |
実行結果は次の通りです。
複数のデータをプロットする場合、棒が重なって表示されます。

バィオリンプロットをプロットする
バィオリンプロットは violinplotを使います。
先ほどのヒストグラム の hist() が violinplot() に代わっただけです。
1 2 3 4 5 6 7 8 9 |
#1次元データによるグラフ表示 data = data1 plt.violinplot(data) plt.show() #2次元(表形式)データによるグラフ表示 data = df plt.violinplot(data) plt.show() |
結果は次のようになります。

グラフにタイトルやデータ名を表示する
箱ひげ図やバィオリンプロットを単独で描画するだけなら特にこのままでよいかもしれませんが、一覧形式のデータをグラフ化する場合、データ名も表示したくなります。
そこで、グラフのタイトルやデータ名、グリッド線などを使って見た目を綺麗に整えてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#matplotlibが対応している漢字フォントを指定 plt.rcParams['font.family'] = 'Meiryo' #箱ひげ図を描画 fig = plt.figure() ax = fig.add_subplot() ax.boxplot(df,showmeans=True,showfliers=False) #平均値を表示、外れ値を非表示 ax.set_title('箱ひげ図') #グラフタイトル ax.set_xlabel('X軸') #横軸タイトル ax.set_ylabel('Y軸') #縦軸タイトル ax.set_xticks([x + 1 for x in range(len(df.columns))]) #X軸のメモリを設定 ax.set_xticklabels(df.columns) #X軸のメモリにラベルを設定 ax.grid() #グリッド線の表示 plt.show() #バィオリンプロットを描画 fig = plt.figure() ax = fig.add_subplot() ax.violinplot(df) ax.set_title('バィオリンプロット') #グラフタイトル ax.set_xlabel('X軸') #横軸タイトル ax.set_ylabel('Y軸') #縦軸タイトル ax.set_xticks([x + 1 for x in range(len(df.columns))]) #X軸のメモリを設定 ax.set_xticklabels(df.columns) #X軸のメモリにラベルを設定 ax.grid() #グリッド線の表示 plt.show() |
結果は以下の通りになります。
箱ひげ図は showmeans = True で平均値を▲マークで表示し、 showfliers=False により外れ値を非表示にしています。

まとめ
今回は統計量のグラフ化で良く使われている、箱ひげ図、ヒストグラム、バィオリンプロットについて、matplotlib を使ったグラフ表示の方法を解説しました。
pandas の DataFrame や numpy の ndarray に格納されているデータを簡単にグラフ化出来ますので、是非ご活用ください。