Kazuki.io

プログラミングやITガジェットなどの備忘録だよ。人の役に立てばいいな。

fbprophetで時系列分析をしてみた。

まえがき

最近、プログラミングのネタとして、Pythonと機械学習なるものを勉強中です。
仕事柄、時系列分析をできると面白いネタができるんじゃないかと探してみるとありました! その名もfbprophet!

facebookが作ったPythonとRのライブラリでだれでも簡単に時系列分析ができるみたいです。
facebook.github.io
github.com

本当にそんなに簡単にできるのかよってことでトライ!
今回は超シンプルに過去データからトレンドを学習して未来のデータを予測することにチャレンジしてみます!
まずは過去約3年分のデータから未来の14日分を予測する…ということをやってみようと思います。

ソースコード

1. 必要なモジュールをインポートします。
codecsはShif-JIS読み込みように使っています。pandas.reas_csvだと調子わるかったので…

import pandas as pd
import matplotlib.pyplot as plt
import codecs
from fbprophet import Prophet 


2. 分析元のデータを読み込みます。
データはcsvで予め作っておきました。

read_path = 'data/raw/'
data_file = 'data.csv'
all_data = pd.DataFrame()

with codecs.open(read_path+data_file, "r","Shift-JIS", "ignore") as f:
    data = pd.read_table(f, delimiter=",", skiprows=1, index_col=0, usecols=[0, 1])
    data.index = pd.to_datetime(data.index)
    data.columns = ['value']
    all_data = pd.concat([all_data, data])
    
all_data = all_data.dropna(how='all')

3. データフレームを整形します。

df= pd.DataFrame()
df['ds'] = all_data.index
df['y'] = all_data.value.values

4. モデルを作成します。

m = Prophet()

5. モデルにデータフレームの内容を学習してもらいます。

m.fit(df)


6. 将来を予測してもらいましょう。ここでは14日分を予測します。

future = m.make_future_dataframe(periods=14)
forecast = m.predict(future)

7.予測したデータをグラフ化してみます。

m.plot(forecast)
plt.xlim(future.ds.iloc[-365-30], future.ds.iloc[-1]) # lloc 行ラベル ilo行番
plt.xlabel('Date')
plt.ylabel('High')
plt.show()

出力結果は以下のとおりです。なんとなく、「っぽい」感じでグラフが描画されました。
f:id:kazukisaito:20180823133611p:plain

とりあえず、動かしたい場合のためにソースを貼っておきます。

fbprophet_study

テストデータはこちら
data.csv · GitHub

感想

本家ドキュメントやQiitaを見ながらコピーしつつ、意味を調べつつ勉強しました。
当方Pythonをほぼ知らない状態から勉強したため、時間はかかりましたが同時にPythonの魅力にも触れることができました。
こんなに簡単に分析できるなんて…

次回は周期設定や外部変数などを使ってもう少し深い分析をしたいと思います。