はてだBlog(仮称)

私的なブログど真ん中のつもりでしたが、気づけばWebサイト系のアプリケーション開発周りで感じたこと寄りの自分メモなどをつれづれ述べています。2020年6月現在、Elasticsearch、pandas、CMSなどに関する話題が多めです。...ですが、だんだんとより私的なプログラムのスニペット置き場になりつつあります。ブログで述べている内容は所属組織で販売している製品などに関するものではなく、また所属する組織の見解を代表するものではありません。

時間がない方のためのPandas plot、seabornでの複数列の比較に向いたグラフ簡単表示例

概要

itdepends.hateblo.jp

この記事は、上記の記事のおまけです。

Python/Pandasの DataFrameの複数の列の値の関係や比較を可視化したい時によく使われるであろうグラフ表示方式のうち比較的シンプルなプロット方法のスニペットをまとめました。

公式ドキュメントや有志の方が体系的にまとめている解説記事には遠く及びませんが、あえて私の主観でよく使うもの*1および最小のタイプ量でもここまでできるという例を俯瞰で示すことを目的にまとめました。

(最小のタイプ量というところは、つまるところこれは、ミドルウェアが便利なことによるものでこの記事のチカラではないですが。便利な分だけいろいろできるので、オレ様チョイスではありますがエッセンスを絞り込んだというのがこの記事のウリ?になっているかもしれません。)

複数の列の値の関係や比較の(シンプルな)可視化に向いたグラフのチョイス

先の記事ではpandas.DataFrame.plotについて記載していましたが、ここではseabornもターゲットに加えました。

ということで、チートシート風のまとめはこちら↓

f:id:azotar:20200223150216p:plain

列ごとのヒストグラム DataFrame.hist()

iris.hist()

DataFrame.plot.hist() の場合、一つのグラフに詰め込んでプロットされます。 多くの場合は、DataFrameの各列の数値のオーダーや表す数値の単位が異なるので、グラフの行列で確認したいという場合には、DataFrame.hist()が便利です。

散布図行列

ここからはseabornです。定石の「import seaborn as sns」でインポートしています。

sns.pairplot(iris, hue='Name', diag_kind="kde")

私のようなヒトでもこれを画面に表示しておけば、データサイエンスしてる感が出るグラフ(笑)。

特定のフィールドのカテゴリデータを元にした件数

sns.countplot(x=iris['Name'])

ある列に注目して、その列の中のカテゴリ変数ごとの件数を数えます。DataFrame.groupbyを使ったデータをインプットにすると、DataFrame.plot.bar()などでもできそうですが、以外にめんどくさいので、countplotはタイプ量削減としては便利かもということでチョイス。

stripplot

sns.stripplot(data=iris, y='SepalLength', x='Name')

ある列について、カテゴリ(x軸方向)ごとの値の分布を、プロット。hueパラメータに別のカテゴリを指定できるので、実質2つのカテゴリを同時に扱うこともできる。

swarmplot

sns.swarmplot(data=iris, y='SepalLength', x='Name')

俗にいうと、stripplotのプロットを横方向にして見やすくしたグラフ。

ヒートマップ

sns.heatmap(data=iris_mean, annot=True, cmap='Reds')

言わずと知れたヒートマップ。多変量の相関を確認する用途が多そうですが、私はEXCELのデータバーの要領でクロス集計の結果をヒートマップ表示したりします。

プログラムサンプル

上記の全部入りプログラムの例です。

iris.csvは、定番のiris.csvです。

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

iris = pd.read_csv('iris.csv')
print(iris.columns)
# Index(['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth', 'Name'], dtype='object')

# 列ごとのヒストグラム DataFrame.hist() 
iris.hist()
plt.show()

# (対比用) DataFrame.plot.hist() 
# iris.plot.hist()

# 散布図行列
sns.pairplot(iris, hue='Name');plt.show()

# 特定のフィールドのカテゴリデータを元にした件数
sns.countplot(x=iris['Name']);plt.show()

# stripplot 
sns.stripplot(data=iris, y='SepalLength', x='Name');plt.show()

# hueパラメータの用途を示すための加工。このデータ加工自体は意味をなさない。
iris['even'] = 'Odd'
even_crit = iris.index % 2 == 0
iris.loc[even_crit, 'even'] = 'Even'

# stripplot(hueパラメータ設定) 
sns.stripplot(data=iris, y='SepalLength', x='Name', hue='even');plt.show()

# swarmplot
sns.swarmplot(data=iris, y='SepalLength', x='Name', hue='even');plt.show()

# ヒートマップ
# -- 種別ごとのSepalLengthなどの平均値を求めてそれをヒートマップに表示
import numpy as np
iris_mean = iris.groupby('Name').agg(np.mean)
sns.heatmap(data=iris_mean, annot=True, cmap='Reds');plt.show()

参考文献

seaborn.pydata.org

pandas.pydata.org

*1:つまり、plotやseabornの網羅的な解説ではなくて、私の、私の中でも特定シーンにおいて便利かなと思われるものに絞ってあります。他にも当ライブラリには豊富な機能がありますので、体系的な情報をお求めのかたは他サイトをごらんください。