LoginSignup
42
46

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-03-11

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

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

42
46
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
46