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

スポンサーリンク
Post image

文字化け解消法で紹介した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を見ると、テンション高くなりますね。

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

comments powered by Disqus