Matplotlib & Seaborn 入門講座 | 11.「Seabron」で色々なグラフを作成してみる

Matplotlib & Seaborn 入門講座 11
Matplotlib & Seaborn入門講座

この記事の執筆・監修

キノコード
キノコード

テクノロジーアンドデザインカンパニー合同会社のCEO。
日本最大級のプログラミング教育のYouTubeチャンネル「キノコード」や、プログラミング学習サービス「キノクエスト」を運営。
著書「あなたの仕事が一瞬で片付くPythonによる自動化仕事術」や、雑誌「日経ソフトウエア」や「シェルスクリプトマガジン」への寄稿など実績多数。

挨拶

こんにちは。キノコードです。
Matplotlib & Seaborn入門講座の11回目です。 今回からSeabornを使ってのレッスンが始まります。
このレッスンでpythonを使ってグラフを作成するMatplotlib & Seaborn入門講座は終わりです。
お疲れ様でした。
このレッスンでは、pairplotというデータ分析に有用なグラフについても解説していきます。
最後までレッスンにお付き合いください。

レッスンで使ったファイルはこちら

■保存方法
Mac:右クリック⇒「リンク先を別名で保存」
Windows:右クリック⇒「名前を付けてリンク先を保存」
Jupyter Labのファイルはこちら

ライブラリインポート

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

それでは早速、ライブラリをインポートします。
まず、matplotlibをpltという名前でインポート。
matplotlibはSeabornとセットでインポートしておくと良いでしょう。
続いて、notebook上にグラフを表示させるための記述もします。
saabornは、snsという名前でインポートしておきます。
実行します。
インポートが完了しました。

データセット用意

tips_data = sns.load_dataset('tips')

続いて、グラフを作成するためのデータを用意します。
seabornの、load_datasetメソッドでデータセットを呼び出すことができます。
今回は、「tips」というデータを使用します。
引数にtipsと記述し、シングルコーテーションでくくります。
これを、tips_dataという変数に格納しておきましょう。
実行します。

tips_data

データの中身を表示させてみます。
これは、あるレストランで支払われたチップと、それに関するデータが格納されています。
「total_bill」は、レストランで支払われた金額。
単位はドルです。
「tip」は支払われたチップの金額。
「sex」は性別。
「smoker」は、喫煙者または禁煙者かを、YesかNoで示しています。
「day」は曜日。
「time」は、DinnerまたはLunchの時間帯を示します。
最後の「size」に関しては、何を示すかちょっと不明ですが、来店人数だと思われ、1~6のいずれかの数字が入っています。


total_bill :レストランでの支払い金額(ドル)
tip :チップの金額(ドル)
sex :性別
smoker :喫煙者か禁煙者か
day :曜日(Thu, Fri, Sat, Sun)
time :時間帯(Lunch or Dinner)
size :来店人数(?)

tipsデータについて:
kaggle https://www.kaggle.com/jsphyg/tipping
https://www.kaggle.com/sanjanabasu/tips-dataset
GitHub https://github.com/mwaskom/seaborn-data/blob/master/tips.csv


散布図

sns.set(style='darkgrid')
sns.scatterplot(x='total_bill', y='tip', data=tips_data)
plt.show()

まず、散布図から作成します。
seabornのsetメソッドで、背景色を設定できます。
今回は、darkgridとします。
そして、前回の動画ではrelplotというメソッドで散布図を作成しましたが、
seabornにはscatterplotという散布図を作成できるメソッドも用意されています。
x軸のデータを「total_bill」、y軸のデータに「tip(チップ)」を渡します。
dataという引数には、データを格納した変数tips_dataを記述します。
実行します。
散布図を作成できました。
ちなみに、この時のグラフサイズは、matplotlibのデフォルト値である6対4が反映されています。
以前のレッスンの復習になりますが、このグラフのサイズは、matplotlibのfigureメソッドで変更することができます。

plt.figure(figsize=(9,6))

sns.set(style='darkgrid')
sns.scatterplot(x='total_bill', y='tip', data=tips_data)
plt.show()

それでは、グラフのサイズを変更してみましょう。
figureメソッドの引数figsizeに、9対6を渡します。
matplotlibのfigureメソッドについては、「Matplotlib Subplot編」でも解説をしています。
合わせてご覧ください。
実行します。
グラフのサイズを変更できました。

plt.figure(figsize=(9,6))

sns.set(style='darkgrid')
sns.scatterplot(x='total_bill', y='tip', data=tips_data, hue='time')
plt.show()

続いて、カテゴリーごとにプロットを分けてみます。
LunchまたはDinnerを示す、timeというカラムを指定します。
hueという引数に、カテゴリーに指定したいカラム名を渡します。
実行します。
Lunchが青色、Dinnerがオレンジでプロットされました。

sns.set(style='darkgrid')
sns.relplot(x='total_bill', y='tip', data=tips_data, col='time', kind='scatter')
plt.show()

カテゴリー別に複数グラフとして表示させたい場合には、前回使用したrelplotメソッドを使います。
ちなみに、relplotは、別々のグラフではなく、前回のように1つの散布図を作成することもできます。
では、LunchとDinnerで別々のグラフとして表示させてみましょう。
colという引数に、カテゴリーに指定したいカラムを渡します。
そして、散布図を作成したいので、kindという引数にscatterと記述します。
実行します。
カテゴリー別のグラフを作成できました。
また、このような複数のグラフを表示できるrelplotでは、figureメソッドでグラフのサイズを変更することができません。
サイズ変更をするにはどのようにすればよいでしょうか?

sns.set(style='darkgrid')
sns.relplot(x='total_bill', y='tip', data=tips_data, col='time', kind='scatter', height=3, aspect=1)
plt.show()

複数のグラフを表示させるrelplotなどの場合、heightとaspectという引数でサイズを設定します。
heightは高さ、aspectは高さに対する比率です。
また、これはグラフ全体ではなく、1つのグラフに対して反映されます。
例えば、heightに3、aspectに1を設定すると、1つのグラフが3対3の正方形で表示されます。
実行してみましょう。
サイズを変更できました。
ちなみに、こちらを設定しない時のデフォルトではheightが5、aspectは1です。

回帰直線

plt.figure(figsize=(9,6))

sns.set(style='darkgrid')
sns.regplot(x="total_bill", y="tip", data=tips_data)
plt.show()

次に、回帰直線を含む散布図を作成します。
regplotメソッドで、簡単に作成できます。
引数は、散布図を作成した時と同じです。
実行します。
回帰直線を追加できました。

sns.set(style='darkgrid')
sns.lmplot(x="total_bill", y="tip", data=tips_data, hue="smoker")
plt.show()

続いて、散布図にカテゴリー別の回帰直線を表示させてみましょう。
ただの散布図ではなく、カテゴリ別にするには、regplotメソッドではなく、lmplotというメソッドを使う必要があります。
ここでは、喫煙者か禁煙者かを示す「smoker」というカラムを使用します。
引数hueに、smokerを渡します。
実行します。
2つの回帰直線が表示されました。

plt.figure(figsize=(9,6))

sns.set(style='darkgrid')
sns.lmplot(x="total_bill", y="tip", data=tips_data, hue="smoker")
plt.show()

こちらのlmplotでも、figureメソッドではグラフのサイズを変更できません。
試しにやってみましょう。
9:6で設定します。
実行します。
グラフサイズが変更できていません。

sns.set(style='darkgrid')
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips_data, height=6, aspect=1.5)
plt.show()

lmplotの場合、relplotと同様にheightとaspectで指定します。
heightを6、aspectを1.5としてみます。
実行します。
先ほどよりも大きく表示されました。

ヒストグラム

plt.figure(figsize=(9,6))

sns.set(style='darkgrid')
sns.histplot(x='day', data=tips_data)
plt.show()

続いて、ヒストグラムを作成してみましょう。
histplotというメソッドで作成できます。
引数xには、曜日のカラムを示した「day」を渡します。
実行します。
曜日ごとのデータ数がcountとして表示されました。

plt.figure(figsize=(9,6))
sns.histplot(x='day', data=tips_data, hue='sex')
plt.show()

さらに、性別のカテゴリーで色分けをしてみます。
引数hueに、性別を示す「sex」を渡します。
実行します。
グラフが透明になりましたが、少し見づらいです。
こちらを積み上げグラフにしてみましょう。

plt.figure(figsize=(9,6))
sns.histplot(x='day', data=tips_data, hue='sex', multiple='stack')
plt.show()

multipleという引数に「stack」を指定することで、積み上げグラフを作成できます。
実行します。
先ほどよりも、見やすくなりましたね。

plt.figure(figsize=(9,6))
sns.histplot(data=tips_data, x='day', hue='sex', multiple='dodge')
plt.show()

さらに、引数multipleに「dodge」を指定すると、横並びのグラフを表示できます。
実行します。
グラフが横並びになりました。
しかし、曜日同士のグラフの間隔が狭いです。

plt.figure(figsize=(9,6))
sns.histplot(x='day', hue='sex', data=tips_data, multiple='dodge', shrink=0.8)
plt.show()

間隔を広げるには、shrinkという引数を使います。
先程の、グラフ同士がくっついた状態のデフォルトは1です。
従って、値を小さくするほど間隔が広がります。
ここでは0.8としてみます。
実行します。
グラフ同士の間隔を広げることができました。

plt.figure(figsize=(9,6))

sns.set_palette('Set1')
sns.histplot(x='day', hue='sex', data=tips_data, multiple='dodge', shrink=0.8)
plt.show()

続いて、グラフの色を変更しましょう。
seabornには、たくさんのカラーパレットが用意されています。
色の設定で困った時に、非常に便利です。
カラーパレットを使用するには、seabornのset_paletteメソッドを使用します。
今回は、「Set1」を指定してみます。
実行します。
グラフの色を変更できました。

plt.figure(figsize=(9,6))

sns.histplot(data=tips_data, x='day', hue='sex', multiple='dodge', shrink=0.8, palette='Set1')
plt.show()

set_paletteメソッドを記述せずに、実行させる方法もあります。
histplotの引数に、直接paletteを指定することで、色を変更できます。
実行します。
同じ結果になりました。

plt.figure(figsize=(9,6))

colors = ['coral', 'darkcyan']
sns.set_palette(colors)

sns.histplot(data=tips_data, x='day', hue='sex', multiple='dodge', shrink=0.8)
plt.show()

カラーパレットを使用せず、独自のカラーを指定することもできます。
colorsという変数に、好きな色をリストで代入します。
これを、set_paletteの引数に記述します。
実行します。
指定した色に変更できました。

plt.figure(figsize=(9,6))

colors = ['coral', 'darkcyan']

sns.histplot(data=tips_data, x='day', hue='sex', multiple='dodge', shrink=0.8, palette=colors)
plt.show()

こちらでも、変数colorsを直接paletteに渡すこともできます。
実行します。
同じ結果になりました。

複数グラフ(pairplot)

sns.set(style='darkgrid')
sns.pairplot(tips_data, hue='time', palette='Set1', diag_kind='hist')
plt.show()

最後に、pairplotというメソッドで、全ての変量同士の相関グラフを表示させ、グラフサイズを変更させてみましょう。
引数hueに「time」を指定し、LunchとDinnerのカテゴリごとで色を分ける設定にします。
paletteには、「Set1」のカラーパレットを指定してみます。
diag_kindという引数に「hist」を指定することで、対角線上のグラフがヒストグラムになります。
実行します。
相関グラフを作成できました。

sns.set(style='darkgrid')
sns.pairplot(tips_data, hue='time', diag_kind='hist', palette='Set1', height=4, aspect=1)
plt.show()>

このpairplotでも、figureメソットでfigsizeの変更はできません。
従って、heightとaspectで大きさを変更しましょう。
heightを4、aspectを1とします。
実行します。
先ほどよりも大きく表示されました。

グラフ保存

sns.set(style='darkgrid')
sns.pairplot(tips_data, hue='time', diag_kind='hist', palette='Set1', height=4, aspect=1)
plt.savefig('pairgraph.png')

作成したグラフを保存しましょう。
グラフを保存するには、matplotlibのsavefigメソッドを使用します。
ファイル名を好きな名前で記述し、シングルコーテーションでくくりましょう。
ここでは、png形式で保存してみます。
実行します。
グラフを保存できました。
figsizeの変更を中心に解説をしましたが、seabornにはグラフを作成するためのメソッドがたくさん用意されています。
そのため、少しややこしかった部分があるかもしれませんが、
scatterplotやhistplotといった、1つのグラフのみ表示させるメソッドではfigsizeでサイズを変更でき、
relplotやpairplotといった、複数のグラフを同時に表示できるようなメソッドではheightやaspectを使うのだと覚えておきましょう。

挨拶

キノコードではmatplotlibやSeabornのレッスンだけではなく、仕事の自動化のレッスン、人工知能のレッスンなども配信しています。
また、今後はWebアプリケーションの開発の動画やファイナンスの分析の動画などもアップしていく予定です。
キノコードの新着動画はチャンネル登録をしていただければ、通知が届きますので、ぜひチャンネル登録をお願いします。
それでは、次のレッスンでお会いしましょう。

レッスンで使ったファイルはこちら

■保存方法
Mac:右クリック⇒「リンク先を別名で保存」
Windows:右クリック⇒「名前を付けてリンク先を保存」
Jupyter Labのファイルはこちら