【Python】簡単にできる箱ひげ図の作成!

グラフ作成

概要:箱ひげ図の作成

こんにちは、すのくろです。

今回はプログラミング言語「python」の関数

plt.boxplot()や、sns.boxplot()

を使って、簡単にcsvのような表データから、箱ひげ図を作る方法をお伝えしていきたいと思います。

表データの列ごとのデータを集計して、箱ひげ図でまとめる方法を紹介します。

以下のようなものが最終アウトプットです。

それでは解説していきます!

必要なモジュールのインポート & csvデータの読み込み

はじめに、データの操作・計算やグラフ描画をしていくために、必要なモジュール(関数を使うためのパックみたいなもの)をインポートします。

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

続いて、扱いたいデータを読み込みます。

df = pd.read_csv("box_data1.csv")
df

今回は「box_data.csv」という3個の指標(A, B, C)のデータ群(n=10)を列ごとにまとめた↓のような表データです。

このCSVファイルをコードと同じディレクトリ(フォルダ内)に入れておけば上のコードで読み込み完了です。

plt.boxplot()による箱ひげ図の作成

続いて、箱ひげ図を作っていきましょう。

とは言っても、↓の関数1つで簡単にできます。

plt.boxplot(x=df)

出力結果が以下の図です。

boxplot() 箱ひげ図

このままだと、ラベルが左から順に1,2,3と振ってあるだけなので、表の列名(A ,B,C)に変更します。引数に「labels=df.columns」を加えます。

念の為解説ですが、df.columnsというのは、表データdfの列名をリストで取得する関数です。

↓が参考までに実際の画像です。

df.columns

引数の追加で、ラベルが追加されたかと思いますが、

ついでにグラフタイトルや縦軸・横軸名も追加しておきましょう。

これで最低限の情報がのった箱ひげ図のグラフの完成です!

↓がここまで説明したコードとその出力結果のグラフになります。

plt.boxplot(x=df, labels=df.columns)
plt.title("Boxplot")
plt.ylabel("Score [-]")
plt.xlabel("Type")
boxplot() 箱ひげ図凡例あり

sns.boxplot(data=***)による箱ひげ図の作成

「plt.boxplot()」で簡単に箱ひげ図が作れることがわかったかと思いますが、

次により便利で応用が効く「sns.boxplot()」について紹介したいと思います。

sns.boxplot(data=df)
plt.title("Boxplot")
plt.ylabel("Score [-]")
plt.xlabel("Type")

で、引数にラベルの設定もなく、以下のようなグラフが出力されます。

sns.boxplot()による箱ひげ図

sns.boxplot()はseabornという見た目が良いライブラリの関数なので、デフォルトで色がついていて便利です。

また、縦軸名などがpltの時と同じように書いてありますが、

snsは内部でpltを使っているので、matplotlibの装飾も同様に可能です。

sns.boxplot(data=***, x=*, y=*)による項目ごとの箱ひげ図の作成

sns.boxplot()を使って簡単に箱ひげ図を作ることができたことが分かりました。

ここからは、さらに引数を追加して、より汎用的な箱ひげ図を作ることができます。

その例をいくつか紹介したいと思います!

まず、先ほどと同様の3つのデータ群(A, B, C)がそれぞれ1日目と二日目がある(2回ある)ような場合などの例です。

今回はデータを集計した表の例として、「box_data2.csv」の表データを用います。

csvファイルは↓のような内容です。1列目の列名(Day)にDay1, or Day2が入っています。

皆さんも自身で同じような構成のファイルを準備してみてください。

ここで、各データに対して、1日目と2日目を比較する箱ひげ図を作ってみましょう!

その場合には、例えば下記のコードのように、

xとyを引数で指定してあげます。

xには、横に並べる項目、yにはデータです。

その例が下記コードと出力結果です。

df2 = pd.read_csv("box_data2.csv")

plt.figure(figsize=(4, 3)) 
sns.boxplot(data=df2, x="Day", y="A")
plt.title("A")
plt.ylabel("Score [-]")
箱ひげ図 比較

この作業を項目AだけでなくB,Cにも同様に行いたい場合は、

下記のようにfor文で、yに指定していた「A」の所を、[A, B, C]のリストで回してあげれば、簡単にできます!

for i in range(3):
    plt.figure(figsize=(4, 3)) 
    sns.boxplot(data=df2, x="Day", y=df2.columns[i+1])
    plt.title(df2.columns[i+1])
    plt.ylabel("Score [-]")

また、グラフの画像をA、B、C3枚ではなく一枚にまとめたい場合は、

subplot()を使ってあげると、例えば下記のようにA、B、Cが横に並んだグラフが作成できます。

plt.figure(figsize=(12, 3), dpi=150) 

for i in range(3):
    plt.subplot(1, 3, i+1)
    sns.boxplot(data=df2, x="Day", y=df2.columns[i+1])
    plt.title(df2.columns[i+1])
    plt.ylabel("Score [-]")
subplot()によるグラフの並び

sns.boxplot(hue=***)による箱ひげ図の作成

最後に、引数「hue=」使った例を紹介します。

この「hue」を使うと一発で項目や条件ごとにデータの振り分けを行って箱ひげ図を作ってくれます。

ここで扱う表データ例は下記のようなあらゆる項目が列ごとに並んでいるものです。

以下に「box_data3.csv」という↑の内容の表データを準備します。

では早速「hue」を使った項目別に振り分けた箱ひげ図を作っていきましょう!

言葉で説明するよりもコードと出力結果を見てもらった方が早いと思うので、

先に、どうなるか以下に結果を示します。

df3 = pd.read_csv("box_data3.csv")

plt.figure(figsize=(8, 4), dpi=150) 
sns.boxplot(data=df3, x="Type", y="Score [-]", hue="Day")
plt.title("hue")
plt.ylabel("Score [-]")
hueを使ったboxplot()による箱ひげ図

このように、ほぼ1つの関数

sns.boxplot(data=df3, x=”Type”, y=”Score [-]”, hue=”Day”)

で、グラフ自体はできてしまいます!

「hue」を使うことで、

2つ以上の項目について、それぞれ2つ以上の条件で自動で分けて箱ひげ図にしてくれます!

各引数の意味合いは以下の通りです。

・x:項目(サンプルや種類)

・y:値

・hue:グループ分けする条件(時間ごとや、平均値より上/下のグループなど)

まとめ

今回はデータの統計的な分布が分かりやすい箱ひげ図について紹介しました。

  • plt.boxplot(data=***)
  • sns.boxplot(data=***)
  • sns.boxplot(data=***, x=***, y=***)
  • sns.boxplot(data=***, x=***, y=***)
  • sns.boxplot(data=***, x=***, y=***, hue=***)

ぜひデータの内容を視覚的に見せたい場合は、平均値だけでなく箱ひげ図を活用してみてください。

Pythonを中心としたプログラミングをより体系的に学びたいと言う方向けに、おすすめのオンラインスクールを2つ厳選して紹介していますので、こちらもよければご覧ください!

一度がっつり外部の力を使って体系的に短期間に学ぶ方がその後の仕事や研究活動の効率が上がるので、興味がある方は考えてみてください!

以上、ここまでお読みいただき、ありがとうございました!

コメント

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