Quest PM

米系スタートアップで働くプロダクトマネージャー(PM)の姿をサンフランシスコから

驚くほど簡単に予測できる!Facebook Prophetを使ってみた

f:id:questpm:20180215131750j:plain

プログラミングとプロダクトマネージャー

PMになりたい人と話していると、よく出てくるのが「プログラミングは必要か?」という質問。自分は「必須ではないが、できると仕事の幅が間違いなく広がる」と答えるようにしている。

自分は決してGeekプログラマーではありません。あくまで趣味ベースでPythonを書ける程度のレベル。ですが少しでもできると、今回紹介するような機械学習を使った時系列データの予測が簡単にできるようになります。

まずは何を予測したいか決める

Data Drivenな会社であれば、おそらくユーザーがどのようにプロダクトを使っているのか何らかの形でログをとっているはず。例えばあなたがソーシャル系アプリのPMだとして、ユーザーがどのくらいコメントを投稿するかを時系列で予測したいとしよう。

今回はFacebook ProphetというFacebookオープンソース化している予測モジュールをPythonで使います。

データを集める

FB Prophetは取り込むデータの形式について決まりがあり、下のような感じの時系列データを用意してください。

ds,y
...(省略)...
10/18/17,5149823
10/19/17,5045734
10/20/17,5212312
10/21/17,5350494
10/22/17,5245749
10/23/17,5142039
10/24/17,5098498
10/25/17,5012391
10/26/17,5043982
...(省略)...

CSV形式でdsがタイムスタンプ、y列の部分が日毎のトータルコメント数です。(数字はすべてダミーです。)ラベルは必ずds, yにしてください。期間としては1年分はほしいところ。

機械学習のキモ

機械学習というと、慣れていない人からすると何をしているのかよくわからないという人もいると思います。ですが、実はやっていることは大きく分けて下の5つのステップだけ。

1. 元データを取り込む
2. データを整形する
3. 機械学習モデルの選択
4. モデルに学習させ、精度をテスト
5. できあがったモデルを使う

精度が悪ければ3と4を繰り返し、必要に応じてチューニングします。

こう見ると難しくないですよね?至極真っ当なことをしてるだけです。

FB Prophetを実際に使ってみる

上の5ステップに従ってコードを書くとどうなるか見てみます。

ステップ1

モジュールのインポートと、Python PandasでCSVファイルのインポートを行い、test_dfとしておきます。

from fbprophet import Prophet
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

test_df = pd.read_csv('./csv/daily_data.csv')
ステップ2

次にデータを整形します。

test_df['y'] = np.log(test_df['y']) 

これはy列の数字が大きな値だったり大きく変動している場合、予測にかけると未来の値がとてつもなく大きくなってしまう場合があります。そうなると見づらいので対数をとって見やすくするのがこの一文です。

ステップ3

モデルを選びます。といってもfbprophetは一つしかないのでこのまま書くだけ。

model = Prophet() 
ステップ4

学習させます。

model.fit(test_df,algorithm='Newton') 

model.fitの関数が上のtest_dfを取り込んでいるわけです。

ステップ5

実際に走らせます。

future_data = model.make_future_dataframe(periods=12, freq = 'm')
forecast_data = model.predict(future_data)

model.make_future_dataframeの部分はどこまで先の未来を予測するかを定義しています。periods=12, freq = 'm'の部分で「12ヶ月先」と定義しているわけです。もしくはperiods=100, freq = 'd'とすれば100日先の予測となります。

model.predict(future_data)で実際に走らせます


グラフに表してみる

model.plot(forecast_data)
plt.show()

自分のMacbook Proだと、1年先くらいのデータだと1分もかからず処理が終了。model.plotでグラフを作り、plot.show()でグラフを画面に出力します。

すると、こんな感じで表示される。
https://facebook.github.io/prophet/static/quick_start_files/quick_start_12_0.png


機械学習のコードを自分で作り上げると大変だが、fbprophetを使えばたった10行ほどでできてしまう!


PMとしてFB Prophetを使う時に考えるべきこと

上のサンプルでは一次元データで予測を行ったが、もちろん他の因子を追加することも可能。例えば上の元データにLikeの数を追加して予測したい場合は、add_regressorというメソッドがあるのでこれを加えればOK。詳しくはドキュメントを参考に。

予測は予測にすぎず、確実に起こる未来ではありません。プロダクトマネージャーとして大事なのは、目をつけているKPIが先々どのように変わりそうか、その振る舞いの意味することは何か、大きいほうに触れた場合インフラ的にさばき切れるのか等々、様々な論点を抽出するところにある。

データサイエンスチームを巻き込んで、さらに突っ込んで分析してみるのもアリ。あいまいな状態からいかにクリアな議論へと昇華させていくのは、PMとしての腕のみせどころ。ちなみにUSではこのような姿勢を"Move the conversation forward"という言い方をします。

こうした予測を活用すると、今気づいていないことを前倒しで気づけるということが可能になってきます。後々「こんなはずでは・・」という事態を最小化できるので、ぜひ使ってみてください。またPMへの活用の仕方がイマイチわからない、もしくはこのようなケースにつかえるのか?等々ご質問があれば、遠慮なくご連絡を。

今回のコードはこちら。
github.com