概要
この記事は、上記の記事のおまけです。
Python/Pandasの DataFrameの複数の列の値の関係や比較を可視化したい時によく使われるであろうグラフ表示方式のうち比較的シンプルなプロット方法のスニペットをまとめました。
公式ドキュメントや有志の方が体系的にまとめている解説記事には遠く及びませんが、あえて私の主観でよく使うもの*1および最小のタイプ量でもここまでできるという例を俯瞰で示すことを目的にまとめました。
(最小のタイプ量というところは、つまるところこれは、ミドルウェアが便利なことによるものでこの記事のチカラではないですが。便利な分だけいろいろできるので、オレ様チョイスではありますがエッセンスを絞り込んだというのがこの記事のウリ?になっているかもしれません。)
複数の列の値の関係や比較の(シンプルな)可視化に向いたグラフのチョイス
先の記事ではpandas.DataFrame.plotについて記載していましたが、ここではseabornもターゲットに加えました。
ということで、チートシート風のまとめはこちら↓
列ごとのヒストグラム DataFrame.hist()
iris.hist()
DataFrame.plot.hist() の場合、一つのグラフに詰め込んでプロットされます。 多くの場合は、DataFrameの各列の数値のオーダーや表す数値の単位が異なるので、グラフの行列で確認したいという場合には、DataFrame.hist()が便利です。
散布図行列
ここからはseabornです。定石の「import seaborn as sns」でインポートしています。
私のようなヒトでもこれを画面に表示しておけば、データサイエンスしてる感が出るグラフ(笑)。
特定のフィールドのカテゴリデータを元にした件数
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のデータバーの要領でクロス集計の結果をヒートマップ表示したりします。
プログラムサンプル
上記の全部入りプログラムの例です。
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()
参考文献
*1:つまり、plotやseabornの網羅的な解説ではなくて、私の、私の中でも特定シーンにおいて便利かなと思われるものに絞ってあります。他にも当ライブラリには豊富な機能がありますので、体系的な情報をお求めのかたは他サイトをごらんください。