はてだBlog(仮称)

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

DataFrame.plotによるDataFrameの可視化・グラフ表示 (Python/Pandas): チートシート風まとめ

この記事について

Pandas.DataFrameのplot関数についてまとめてみました。

なお、実のところ、まとまっている・体系的であるというところでいうと、この記事を書くのに参考にさせていただいたサイト(後述の参考文献・参考サイト)がおすすめです。

体系的にまとめる網羅するという意味では参考サイトには及ばないことから、この記事では、plot関数による可視化ではなくて、plot関数自体の用途の可視化をしてみています。

まあ、オレオレチョイスのチートシートをまとめめてみましたのでそれを後半に貼り付けしていますというところです。

Pythonでのグラフ表示/データ可視化

Python関連のグラフ表示/データ可視化といえば、matplotlib、seaborn、Pandasのplot、bokehなどが挙げられると思います。

比較はここでは行いませんが、Pythonにある程度慣れている人であれば、(PandasやNumpyにさほど馴染みがなくても)見よう見まねで、Pandasのplotから始めてみるのが、私のおすすめです。

というのも、DataFrameはひらたくいうと、EXCELの表みたいなものです。また、グラフの一番多い用途は、表形式・整然データの数列のかたまりをグラフにプロットしてみるというものかと思いますので、PandasでのEDAからの流れが自然です。

加えて、他のライブラリに比べるとグラフ表示のモチベーションのひとつである、とりあえず生一丁、ひとまず可視化みたいな用途を意識してか、他のライブラリよりも特にパラメータなどを指定しなくてもデフォルトでもっともらしい表示をしてくれるような気がします。

例えば、次のような塩梅です。

import pandas as pd
import matplotlib.pyplot as plt
import io

pesedo_csv = io.StringIO("""
val1,val2,str
4,25,あああ
5,20,いいい
6,15,ううう
7,10,えええ
8,5,おおお
""")

df = pd.read_csv(pesedo_csv)
df.plot()
plt.show()

↓ 表示されるグラフ

f:id:azotar:20200221234010p:plain

(特に何もしなくとも文字列のカラムが程よく無視されているところもポイント)

なお、みてのとおり、Pandasのplotはmatplotlibに依存しています。現にmatplotlibのラッパーだそうです。他の可視化ライブラリも、DataFrameやmatplotlibというキーワードを介して互いにつながっており、ある程度どれかに習熟すれば他のライブラリもググりながら慣れていくことができるところがあります。

どれか一つを好んで使っていても、どうしても他のライブライが使いたくなった場合もあるでしょう。でもこれらの関係からすると互いのスイッチングコスト/一過性のつまみ食いコストが小さいように思います。というころもあって、まずはシンプルなPandasのplotから始めてみようとうところです。

というところでチートシート

f:id:azotar:20200221235536p:plain

他にもいろいろできますし、グラフ自体のトーン(色など)も編集できますが、ここでは、まずは整然データがあって、それらの系列がどのオプションで対応すればどのようにプロットされるか、という視点でまとめることで「用途の早見表」となるように意識してみました。

チートシートに沿ったプログラム例

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('iris.csv').head(10)  # いわゆる irisデータの最初の10行

df.plot.line()
df.plot.line(subplots=True) #subplotsパラメータを指定すると複数グラフを並べることができる。系列ごとの数値のスケールが違う場合に便利。
df.plot.bar()
df.plot.area()
df.plot.bar(stacked=True)
df.plot.box()
df.plot.kde()
df.plot.scatter(x='SepalLength', y='SepalWidth')

plt.show()


# および2軸のグラフの例
df.plot.line(secondary_y=['SepalWidth'])
plt.show()


それぞれ上記のチートシートのZ字順のグラフ表示例です。

これだけで本当にチートシートに示したグラフが表示できてしまいます。

また、チートシートにはスペースの都合で入れていませんが、プログラム例の最後の「df.plot」ですが、「secondary_y」に系列名を指定すると、その系列(DataFrameのカラム)は2軸目のグラフとして表示されます。(下記イメージ)

f:id:azotar:20200222000542p:plain


2020/2/22 追記

続編として、複数グラフを一枚表示する方法について書きました。

itdepends.hateblo.jp


参考文献・参考サイト

公式 pandas.pydata.org

お世話になったサイト own-search-and-study.xyz なお、同じサイトの別ページで「pandasのplottingに関するまとめ」もあります。 Pandasからの多変量のグラフ化という意味では、seabornなどもさることながら、plottingがおもしろそうですね。

own-search-and-study.xyz

この記事では深くふれていませんが、matplotlibのオブジェクト指向インタフェース(ステートレス)とステートフルインタフェースが同居していて、良い面もありますが、一方非常にくせものです。 どっちのモードを意識して可視化関数を呼び出していくか...という知らないと非常に混乱の元になる点についてふれてあるという意味でこの章の11章にはお世話になりました。 pandasクックブック ―Pythonによるデータ処理のレシピ―