Tutorialに学ぶseabornの使い方①(概要&Visualizing statistical relationships)|Pythonによる可視化入門 #5

f:id:lib-arts:20190614213755p:plain

連載の経緯は#1をご確認ください。

Pythonでの可視化について取り扱えればということで#1〜#4ではMatplotlibについてまとめました。

#4までで大体のMatplotlibの使い方については把握ができたので、#5からはMatplotlibベースで高度な描画を実現してくれるseabornについて取り扱っていきます。#5ではseabornの概要と、チュートリアルの"Visualizing statistical relationships"を元に使い方についてまとめていきます。
以下目次になります。
1. seabornの概要
2. Visualizing statistical relationshipsについて
2-1. Relating variables with scatter plots
2-2. Emphasizing continuity with line plots
2-3. Showing multiple relationships with facets
3. まとめ


1. seabornの概要
1節ではseabornの概要についてまとめていきます。

f:id:lib-arts:20190614221449p:plain

seaborn: statistical data visualization — seaborn 0.9.0 documentation

上記のseabordのドキュメントを元に解説を行っていきます。概要文がそれほど長くないので、簡単に和訳を行います。

Seaborn is a Python data visualization library based on matplotlib. It provides a high-level interface for drawing attractive and informative statistical graphics.
For a brief introduction to the ideas behind the library, you can read the introductory notes. Visit the installation page to see how you can download the package. You can browse the example gallery to see what you can do with seaborn, and then check out the tutorial and API reference to find out how.
To see the code or report a bug, please visit the github repository. General support issues are most at home on stackoverflow, where there is a seaborn tag.

和訳:『seabornはmatplotlibにベースとして用いたPythonでのデータ可視化ライブラリです。seabornのhigh-levelなインターフェースを用いることで見栄えがよくて有益な統計的なグラフを描くことができます。ライブラリの背後にある考え方を簡単に知るにあたっては、"introductory notes"が役に立ちます。また、パッケージのダウンロードの方法に関しては"installation page"を確認してください。"example gallery"を見ればseabornでできることを確認することができ、"tutorial"や"API reference"で詳細を確認することができます。コードを見たりバグの報告したりにあたっては、"github repository"にアクセスしてください。一般的なサポートについてはseabornのタグがついた"stackoverflow"を確認してください。』
matplotlibベースのライブラリであることから考えると、ベーシックな機能というよりはより可視化を意識したライブラリになっているようです。概要からリファレンス情報まで過不足なくまとまっているという意味で非常に読みやすいトップページの印象です。
大体のライブラリの概要はつかむことができたので2節では実際にチュートリアルを確認していきます。

f:id:lib-arts:20190614222140p:plain

Official seaborn tutorial — seaborn 0.9.0 documentation

上記でチュートリアルがまとまっているのですが、全て取り扱うと長くなりそうなので#5では"Visualizing statistical relationships"について取り扱っていきます。


2. Visualizing statistical relationshipsについて
2節ではチュートリアルより、"Visualizing statistical relationships"について取り扱っていきます。

f:id:lib-arts:20190614231448p:plain

Visualizing statistical relationships — seaborn 0.9.0 documentation

まず簡単な概要をつかめればということで冒頭のみ和訳します。

Statistical analysis is a process of understanding how variables in a dataset relate to each other and how those relationships depend on other variables. Visualization can be a core component of this process because, when data are visualized properly, the human visual system can see trends and patterns that indicate a relationship.

和訳:『統計的な分析は、データセットの変数がどのように相互で関係しているかや他の変数とどのように依存関係にあるかを理解するプロセスです。可視化はこのプロセスの主要な要素であり、理由としてはデータが適切に可視化されるならば人間の視覚が関連性を指摘するトレンドやパターンを認識することができるからです。』
上記から読み取るに、統計的な分析において変数間の関係性について議論するにあたって可視化が重要であり、それについてseabornで実現していくという流れになっているようです。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="darkgrid")

また、上記を先に実行しておく必要があるので、2-1以降に進む前にこちらを先に実行しておいてください。


2-1. Relating variables with scatter plots
2-1では相関性のある変数の散布図を描画する"Relating variables with scatter plots"について取り扱います。まずは下記を実行してみましょう。

tips = sns.load_dataset("tips")
sns.relplot(x="total_bill", y="tip", data=tips);

実行結果は下記のようになります。

f:id:lib-arts:20190614232210p:plain
Matplotlibの図の時と同様に散布図の描画になっていますが、より洗練されたデザインになっています。
大体のイメージがつかめたところで気になるのは分析対象のデータです。分析対象のデータはtipsで与えられているので、tipsの中身について把握を行います。

print(type(tips))
print(tips.shape)
print(tips.head(10))

上記を実行すると下記のように、データの形式やサイズの把握を行うことができます。

f:id:lib-arts:20190614234224p:plain
こちらを確認することで、サイズが(244, 7)のPandasの形式でデータが得られていることがわかります。また、sns.replotの引数に与えた"total_bill"と"tip"は列の名前であるということがわかります。ここで7次元あるデータのうち2次元しか使っていないのですが、seabornではもう少し図に情報量を増やすことができます。

sns.relplot(x="total_bill", y="tip", hue="smoker", style="time", data=tips);

上記を実行することで下記のような図が得られます。

f:id:lib-arts:20190614234333p:plain
これは4つの変数を考慮しているので、実質4次元で可視化が行えているということになります。
またさらに定量的な軸を足すにあたっては、sizeという引数を用いることで大きさを変えることも可能です。

sns.relplot(x="total_bill", y="tip", size="size", sizes=(15, 200), data=tips);

上記を実行すると下記のようになります。

f:id:lib-arts:20190614234651p:plain
このように単なる相関性の可視化であっても、seabornを用いることで非常に自由度の高い形で描画を行うことができます。


2-2. Emphasizing continuity with line plots
2-2では主に時系列データに適用できそうな"Emphasizing continuity with line plots"についてご紹介します。まずは下記を実行してみましょう。

df = pd.DataFrame(dict(time=np.arange(500),
value=np.random.randn(500).cumsum()))
g = sns.relplot(x="time", y="value", kind="line", data=df)
g.fig.autofmt_xdate()

f:id:lib-arts:20190615000039p:plain
上記はランダムウォークのような過程を図示したものです。観測対象が乱数を用いて生成されているので、実行するごとに違うデータになることに注意です(np.random.seedで乱数を固定すれば同じ結果を得られるようにすることができます)。与える引数のkindに"line"を設定することで時系列データを表現してくれていることに注意です。kindをデフォルトにすると散布図の形式になるので、下記も実行して比較を行ってみてください。

df = pd.DataFrame(dict(time=np.arange(500),
value=np.random.randn(500).cumsum()))
g = sns.relplot(x="time", y="value", data=df)
g.fig.autofmt_xdate()

f:id:lib-arts:20190615000154p:plain
このようにkindに何も与えなければ散布図に変わります。
もう一例確認できればということで、下記を実行してみてください。

fmri = sns.load_dataset("fmri")
sns.relplot(x="timepoint", y="signal", kind="line", data=fmri);

f:id:lib-arts:20190615000840p:plain
通常の折れ線グラフに加え、y軸に区間の情報が入っています。2-1の際と同様に対象データの中身をつかめればということで、下記を実行してみてください。

print(type(fmri))
print(fmri.shape)
print(fmri.head(15))

f:id:lib-arts:20190615001739p:plain
実行結果を見ると、timepointがユニークではなく、複数あることがわかります。y軸の区間はそれぞれのtimepointにおける平均の値と95%信頼区間の可視化を行っています。このように計測データが複数ある際の時系列データも可視化を行うことができます。ちなみにci=Noneを設定することで(ci; confidence interval)、信頼区間を省略することもできます。

sns.relplot(x="timepoint", y="signal", ci=None, kind="line", data=fmri);

f:id:lib-arts:20190615001805p:plain
時系列のグラフについても大体の概要がつかめたので、2-2はここまでとします。


2-3. Showing multiple relationships with facets
2-3ではグラフの描き分けに関しての"Showing multiple relationships with facets"について取り扱っていきます。まずは下記のコードを実行してみましょう。

sns.relplot(x="total_bill", y="tip", hue="smoker", col="time", data=tips);

f:id:lib-arts:20190615002216p:plain
生成された図を見ることで、colで与えた"time"の情報を元にLunchとDinnerでグラフを描き分けてくれていることがわかります。
もう一例確認できればということで、fmriデータについても見てみましょう。下記を実行してみてください。

sns.relplot(x="timepoint", y="signal", hue="subject",
            col="region", row="event", height=3,
            kind="line", estimator=None, data=fmri);

f:id:lib-arts:20190615002647p:plain
上記を確認することによって、列方向にはregion、行方向にはeventでグラフが描き分けられていることがわかります。
この辺のグラフの描き分けを実装するとなると少し厄介なので、なかなか便利な機能だと思われます。


3. まとめ
#5ではseabornの概要と、"Visualizing statistical relationships"の内容について抜粋してご紹介しました。

Visualizing statistical relationships — seaborn 0.9.0 documentation

チュートリアルが非常に充実しており、全て取り扱うと冗長になると思われ半分ほどのご紹介となりましたので、より詳しくは上記をご確認いただけたらと思います。
#6でも引き続きseabornチュートリアルから"Plotting with categorical data"を取り扱えればと思います。