Pythonでグラフを描く⑥箱ひげ図の作成
今回は、「Pythonでグラフを描く⑤折れ線グラフの作成」で使用したデータセットを使って箱ひげグラフを書くことを目標にする。
前回作成したデータセットは↓
箱ひげ図とは。。。Googleで「箱ひげ図」と検索してほしい。おそらく自分がここで説明するよりも、数百倍分かりやすいwebページが存在する。ここでは箱ひげ図がなんなのか知らなくても、簡単なコードでまあまあカッコいいグラフを作成することを目標としている。

↑こんな感じの箱ひげ図を書きたい。
今回は、以下の図のような架空の研究によって集積したデータを箱ひげ図にすること目指す。筋トレ前にテストを一回(pre)、筋トレ後にテストを二回(post1、post2)行ったという架空の研究である。自分が運動と脳機能の研究をしていたこともあり、研究の想像をしたほうがグラフが描きやすい。
今回描く箱ひげ図では、pre、post1、post2におけるテストのスコアを描くことにする。

まずはお決まりのライブラリーをインポートするコードを打ち込む。
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')#グラフの背景を白くする
%matplotlib inline
次はcsvファイルの読み込み。
df=pd.read_csv('sample2.csv')
読み込んだら、中身を確認。確認する関数はhead()。
df.head()

読み込めたことが確認できた。じゃあ、さっそく箱ひげ図を書いてみる。seabornのコードboxplot()の一行でグラフを作成できる。x軸にScore、y軸にtimingのデータを入れる。
sns.boxplot(x="Score", y="timing", data=df)

なんか横に出てきた。。。縦に描いた箱ひげ図が欲しい。ということで、boxplotのxとyに入力した列を入れ替える。
sns.boxplot(x="timing", y="Score", data=df)

これで箱ひげ図完了。今日はここまで、、、というわけにはいかず。。。もっとカッコいいグラフにしたい。個人的にはカラフルなグラフよりも、白黒で分かりやすい(余分な情報が含まれていない)グラフがカッコいいと考えている。上で作成したグラフに修正を加えていく。
修正するポイントは、
・グラフを大きくする
・グリッド線を消す
・色をグレーにする
・軸ラベルを大きくする
・グラフのタイトルを作成する
・y軸のラベルを付ける
・x軸ラベルを消す
というコードを付け加えて再度箱ひげ図を作成する。
plt.figure(figsize=(20,10))#グラフの大きさ設定
sns.set_style('ticks')#grid腺を消す
sns.boxplot(x="timing", y="Score", data=df, palette="Greys")
plt.tick_params(labelsize = 30)#軸ラベルの大きさ
plt.title("Mean", size=50)#グラフのタイトル
plt.ylabel("Score", size=50)#y軸ラベル
plt.xlabel("")#x軸ラベルの消去

レポートに載せるくらいならこれくらいでも合格点がでるかもしれない。ただ、線が細いのが弱々しくて気に入らない。線を太くしてみる。線を太くするにはboxplot()の中にlinewidth=を加える。とりあえずえいやでlinewidth=50にしてみる。
plt.figure(figsize=(20,10))#グラフの大きさ設定
sns.set_style('ticks')#grid腺を消す
sns.boxplot(x="timing", y="Score", data=df, palette="Greys",linewidth=50)
plt.tick_params(labelsize = 30)#軸ラベルの大きさ
plt.title("Mean", size=50)#グラフのタイトル
plt.ylabel("Score", size=50)#y軸ラベル
plt.xlabel("")#x軸ラベルの消去

やべー( ゚Д゚)!いかついグラフができた。いやこれは箱ひげ図というよりもダンベル図。。。。何を描きたいか分からなくなってきた。これじゃ箱ひげ図の意味がなくなるので、再度linewidthの値を修正。次は、linewidth=5に設定。
plt.figure(figsize=(20,10))#グラフの大きさ設定
sns.set_style('ticks')#grid腺を消す
sns.boxplot(x="timing", y="Score", data=df, palette="Greys",linewidth=5)
plt.tick_params(labelsize = 30)#軸ラベルの大きさ
plt.title("Mean", size=50)#グラフのタイトル
plt.ylabel("Score", size=50)#y軸ラベル
plt.xlabel("")#x軸ラベルの消去

うん。これなら力強くてカッコいい。
今回の箱ひげ図を作成するために参考にしたwebサイト
・seaborn.boxplot
https://seaborn.pydata.org/generated/seaborn.boxplot.html
・seabornによる統計データ可視化(ポケモン種族値を例に)(1)
http://mizti.hatenablog.com/entry/2017/11/18/seaborn1
と今日はこんな感じ。