電力データから季節変動の分解

季節変動のあるデータから季節変動を分離する方法のメモです。
Rでは季節変動のあるデータからstl関数を使って季節変動を簡単に分離できるらしいのですが、
pythonでも同じようにできるみたいなのでやってみました。
データは北海道電力の電力使用状況をダウンロードしてみました。

%matplotlib inline
import datetime as datetime  
import matplotlib.pyplot as plt
import pandas as pd
from statsmodels.tsa.seasonal import seasonal_decompose

data = pd.read_csv("http://denkiyoho.hepco.co.jp/data/2016_juyo_hokkaidou.csv", skiprows=3,names=['Date','Time','power'])
data.index = pd.to_datetime(data['Date'])
df = data.groupby(data.index).mean()
df.plot(color="darkblue")

まずは電力使用量のデータをグラフにしてみました。冬は電力使用量が上がっていることが分かりますね。ちなみに単位は万kWです。ここからトレンド、季節変動、、残差(ランダム成分)にわけます。

dataFrame = pd.DataFrame(df['power'].values.astype(int), pd.DatetimeIndex(start='2016-01-01', periods=len(df['power']), freq='D'))
ts = seasonal_decompose(dataFrame.values, freq=7)

plt.plot(ts.trend) # トレンド成分
plt.plot(ts.seasonal) # 季節成分
plt.plot(ts.resid) # ノイズ成分

これでトレンド、季節変動、、残差(ランダム成分)に分離できました。
グラフでまとめるとこんな感じです。

横の数値があっていないのがイマイチですね。

■グラフ生成

from matplotlib.font_manager import FontProperties
fp = FontProperties(fname='C:\Windows\Fonts\HGRGM.TTC')
fig = plt.figure(figsize=(12,10))
ax1 = fig.add_subplot(4,1,1)
plt.ylabel('data')
ax2 = fig.add_subplot(4,1,2)
plt.ylabel('trend')
ax3 = fig.add_subplot(4,1,3)
plt.ylabel('seasonal')
ax4 = fig.add_subplot(4,1,4)
plt.ylabel('remainder')
y1 = df['power']
y2 = ts.trend
y3 = ts.seasonal
y4 = ts.resid

ax1.plot(y1,label=u'power(万kw)',color="darkblue")
ax2.plot(y2,label='trend',color="darkblue")
ax3.plot(y3,label='seasonal',color="darkblue")
ax4.plot(y4,label='remainder',color="darkblue")
ax1.grid()
ax2.grid()
ax3.grid()
ax4.grid()
ax1.legend(prop=fp,loc='upper right')

つぎはARIMAモデルを推定してみたいと思います。

■参考
時系列分析入門~季節調整モデル編~ RとPythonで実装
http://qiita.com/dr_paradi/items/b279de980268e1dc114a

Rで季節変動のある時系列データを扱ってみる
http://tjo.hatenablog.com/entry/2013/10/30/190552

電気量
http://denkiyoho.hepco.co.jp/download.html