データの可視化をseabornでお手軽に。

文字化け解消法で紹介したmatplotlibですが、使いこなせる気が全くしないのが正直なところ。

だってこのキーワード引数の多さったら… 覚えきれませんよ。

plot関数だけでも指定可能な引数は30以上かな。
http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot

Property    Description
agg_filter  unknown
alpha       float (0.0 transparent through 1.0 opaque)
animated    [True | False]
antialiased or aa   [True | False]
axes        an Axes instance
clip_box    a matplotlib.transforms.Bbox instance
clip_on     [True | False]
...

それでいて出来上がるのはこんな~~ダサい~~グラフ。

頑張れば綺麗なグラフも描画できるみたいなんですけど、あまり学習意欲が湧きませんよね。

そこでseabornの出番です。

Seaborn is a Python visualization library based on matplotlib. It provides a high-level interface for drawing attractive statistical graphics.

意訳すると、matplotlibのwrapperとしてより高レベルな(抽象化された)インタフェースを提供してくれるそうです。

urllibに対するrequestsパッケージみたいな位置づけかな。

インタフェースも大事ですが、こんなheatmapを10行程程度のコードで描画できてしまうなら、学習意欲が湧いてきますよね。

とは言え、いきなりheatmap描くような大そうなデータは持ち合わせていないので、我が家の家電製品の消費電力データを使って基本的なグラフを描画してみようと思います。

$ cat 冷蔵庫.csv 
No.,DateTime,Watt,kWh
    1,2015/03/02-23:25:44,58.9,0
    2,2015/03/02-23:35:44,50.6,0.01
    3,2015/03/02-23:45:44,50.3,0.02
    4,2015/03/02-23:55:44,61.7,0.02
    5,2015/03/03-00:05:44,72.4,0.03
    6,2015/03/03-00:15:44,51.3,0.04
    7,2015/03/03-00:25:44,47.7,0.05
    8,2015/03/03-00:35:44,47.6,0.06
    9,2015/03/03-00:45:44,20.2,0.06
   10,2015/03/03-00:55:44,40.5,0.06

これはサンワサプライ製TAP-TST10で取得したログです。リアルタイムにロギングできないのが欠点ですが…まぁ安いので。

これをpandasでDataFrame化するとこうなります。

import pandas as pd

data = pd.read_csv("冷蔵庫.csv")
print(data)

       No.             DateTime  Watt    kWh
0        1  2015/03/02-23:25:44  58.9   0.00
1        2  2015/03/02-23:35:44  50.6   0.01
2        3  2015/03/02-23:45:44  50.3   0.02
3        4  2015/03/02-23:55:44  61.7   0.02
4        5  2015/03/03-00:05:44  72.4   0.03
5        6  2015/03/03-00:15:44  51.3   0.04
6        7  2015/03/03-00:25:44  47.7   0.05
7        8  2015/03/03-00:35:44  47.6   0.06
8        9  2015/03/03-00:45:44  20.2   0.06
9       10  2015/03/03-00:55:44  40.5   0.06
10      11  2015/03/03-01:05:44  59.4   0.07
...
[1441 rows x 4 columns]

print(data.DateTime)
0       2015/03/02-23:25:44
1       2015/03/02-23:35:44
2       2015/03/02-23:45:44
3       2015/03/02-23:55:44
4       2015/03/03-00:05:44
5       2015/03/03-00:15:44
6       2015/03/03-00:25:44
7       2015/03/03-00:35:44
8       2015/03/03-00:45:44
9       2015/03/03-00:55:44
10      2015/03/03-01:05:44
...
Name: DateTime, dtype: object

print(data['Watt'])
0       58.9
1       50.6
2       50.3
3       61.7
4       72.4
5       51.3
6       47.7
7       47.6
8       20.2
9       40.5
10      59.4
Name: Watt, dtype: float64

これをseabornで可視化するコードはこうなります。

import seaborn as sns
import pandas as pd

data = pd.read_csv("冷蔵庫.csv")

# 比較的簡単なpointplotを使う
ax = sns.pointplot(
    x='DateTime',   # x軸にDateTime
    y='Watt',       # y軸にWatt
    data=data,      # DataFrameを指定
    markers=[''])   # dataをplotするマーカーを非表示に

# x軸方向のデータが多すぎるので1日毎にラベルを間引く(データは間引かない)
xlabels = [datetime.split('-')[0]
    if list(data.DateTime).index(datetime) % 144 is 0 else ''
    for datetime in data.DateTime]

# x軸ラベルを設定&ラベル表示を90度回転
ax.set_xticklabels(xlabels, rotation='vertical')

# pngファイルに書き出す
sns.plt.savefig('冷蔵庫.png')

データが詰まりすぎてますね…。

以下のようにちょっと間引きます。

data = pd.read_csv("冷蔵庫.csv")[:360]

今度はいい感じになりました。

冷蔵庫の定格消費電力は約110Wと表記されているので、ピーク値が114.0Wなのをみると、大体スペック通りですね。

data.Watt.mean()
44.557499999999997

data.Watt.min()
2.2999999999999998

data.Watt.max()
114.0

消費電力量は?

import seaborn as sns
import pandas as pd

data = pd.read_csv("冷蔵庫.csv")

# 比較的簡単なpointplotを使う
ax = sns.pointplot(
    x='DateTime',   # x軸にDateTime
    y='kWh',        # y軸にkWh(積算消費電力量)
    data=data,      # DataFrameを指定
    markers=[''])   # dataをplotするマーカーを非表示に

# x軸方向のデータが多すぎるので1日毎にラベルを間引く(データは間引かない)
xlabels = [datetime.split('-')[0]
    if list(data.DateTime).index(datetime) % 144 is 0 else ''
    for datetime in data.DateTime]

# x軸ラベルを設定&ラベル表示を90度回転
ax.set_xticklabels(xlabels, rotation='vertical')

# pngファイルに書き出す
sns.plt.savefig('冷蔵庫kWh.png')

1kWh/日程度の消費電力量なことが分かります。

data.kWh.max() / 10.0
1.0589999999999999

seabornのAPI referencegalleryを見ると、テンション高くなりますね。

まずは道具を使いこなせるようにならねば。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする