Edited at

PythonでPandasのPlot機能を使えばデータ加工からグラフ作成までマジでシームレス

More than 1 year has passed since last update.


Pandasのグラフ描画機能

この記事ではPandasのPlot機能について扱います。

Pandasはデータの加工・集計のためのツールとしてその有用性が広く知られていますが、同時に優れた可視化機能を備えているということは、意外にあまり知られていません。

この機能は Pandas.DataFrame.plot() もしくは Pandas Plot と呼ばれるものです。

Pandas Plotを使いこなすことが出来るようになれば、


  • データの読み込み、保持

  • データの加工

  • データの集計

  • データの可視化

というデータ分析の一連のプロセスを全てPandasで完結させることが出来る、つまり分析の「揺りかごから墓場まで」を実現することが出来ます。


Pandasのプロット以外の機能について

この記事ではPandasのデータハンドリングなどに関わる機能は説明しません。

そちらにも興味がある方は下記の記事などを参考にしてください

Python Pandasでのデータ操作の初歩まとめ

http://qiita.com/hik0107/items/d991cc44c2d1778bb82e

Pythonでのデータ分析初心者がまず見るべき情報源のまとめ

http://qiita.com/hik0107/items/0bec82cc09d0e05d5357


Pandas Plotとはなんなのか

Pandas PlotはPandasのデータ保持オブジェクトである "pd.DataFrame" のいちメソッドです。


pd.DataFrame.plot() はmatplotlibの薄いWrapperとして存在する。

pandasのplotは非常に簡単にイケてるプロットを作成する機能がある。

The plot method on Series and DataFrame is just a simple wrapper around plt.plot():

We provide the basics in pandas to easily create decent looking plots


- 公式ドキュメントより


Pandasのplotメソッドでサポートされているグラフの種類は下記の通り

またpandasのver0.17以上であれば、さらに多くの種類のグラフが用意されています。


  • bar (barh) : 棒グラフ もしくは 横向き棒グラフ

  • hist :ヒストグラム

  • box : 箱ひげ図

  • kde :確率密度分布

  • area : 面積グラフ

  • scattter : 散布図

  • hexbin :密度情報を表現した六角形型の散布図

  • pie :円グラフ


Pandas Plotの文法上の特徴

"Pandas Plot" はPandas.DataFrameという、データオブジェクト自身のメソッドであることに由来して、通常のチャート作成ライブラリとはやや違いがあります。

違いというか、利点と言ってしまってもいいかもしれません。

大抵の場合は相対的に言ってシンプルに記述することが可能です。

例として、PandasPlotと同様にMatplotlibのラッパーであるビジュアライズライブラリの seabornと文法を比較してみます。


pandasplot.py

df.plot.scatter(x='xdata', y='ydata')



seaborn.py

sns.jointplot(x='xdata', y='ydata', data=df)


seabornのように data=dfみたいな記述をしなくてよいのが良い!可読性も上がる!

(効果には個人差があります)

また、x軸に使うのがDataFrameのIndexである場合にはさらに簡単です


pandasplot.py

df.plot.scatter(y='ydata') # xの指定は省略可能



補足-seaborn

seabornについてはよければ下記の記事を参照して下さい

pythonで美しいグラフ描画 -seabornを使えばデータ分析と可視化が捗る

http://qiita.com/hik0107/items/3dc541158fceb3156ee0


各種のチャートの紹介

実際にコードを書いて動かしながら進められるように、データのDLから始めます


import.py

# グラフ化に必要なものの準備

import matplotlib
import matplotlib.pyplot as plt

# データの扱いに必要なライブラリ
import pandas as pd
import numpy as np
import datetime as dt


下記のおまじない設定をしておくとチャートが綺麗にかけます

plt.style.use('ggplot') 

font = {'family' : 'meiryo'}
matplotlib.rc('font', **font)

こんな感じ適当にデータを作ります


data.py

url = 'https://vincentarelbundock.github.io/Rdatasets/csv/robustbase/ambientNOxCH.csv'

df_sample = pd.read_csv(url, parse_dates=1, index_col=1)

# dfの準備
df = df_sample.iloc[:, 1:]

# df_monthlyの準備
df_monthly = df.copy()
df_monthly.index = df_monthly.index.map(lambda x: x.month)
df_monthly = df_monthly.groupby(level=0).sum()


このdfとdf_monthlyで色んなグラフを書いてみます


棒グラフ

df_monthly.plot.bar(y=['ad', 'ba', 'se'], alpha=0.6, figsize=(12,3))

plt.title(u'普通の棒グラフ', size=16)

3つのカテゴリを合わせて一本のバーにしたい場合は

df_monthly.plot.bar(y=['ad', 'ba', 'se'], alpha=0.6, figsize=(12,3), stacked=True, cmap='Blues')

plt.title(u'積み上げ型の棒グラフ', size=16)


時系列グラフ

df.plot( y=['ad', 'ba', 'ef'], figsize=(16,4), alpha=0.5)


ヒストグラム

ax= df.plot( y=['ad', 'ba', 'ef'], bins=50, alpha=0.5, figsize=(16,4), kind='hist')


散布図

色を塗り分けたり、サイズを描き分けたり色々出来る

fig, axes = plt.subplots(2, 2, figsize=(14, 10), sharey=True)

# 1.普通のプロット
df[0:150].plot(x='ad', y='ba', kind='scatter', ax=axes.flatten()[0])
# 2.離散値を色で表す
df[0:150].plot(x='ad', y='ba', kind='scatter', c='ef', cmap='Blues', ax=axes.flatten()[1])
# 3.離散値をバブルサイズで表す(ちょっと数は減らしてる)
df[0:150].plot.scatter(x='ad', y='ba', s=(df['su']-20)*3, ax=axes.flatten()[2])
# 4.両方同時に使う
df[0:150].plot.scatter(x='ad', y='ba', s=(df['su']-20)*3, c='ef', ax=axes.flatten()[3])

なんかカッコイイ!

散布図とちょっと違うがこういうのもある

Hexabinというらしいです。

df[0:150].plot(x='ad', y='ba',kind='hexbin', gridsize=20)


その他

円グラフ(あんまり使わない)

df_monthly.plot( kind='pie', y = 'se')

エリアチャート(あんまり使わない)

df_monthly.plot(y=['se', 'ef'], kind='area', stacked=True, alpha=0.4)


まとめ

Pandasのプロット機能マジ便利。

データの読み込みから分析、グラフ化まで一気に出来て最高。


参考サイト