最近ダイエットしていて、少しだけ成果が出たので、グラフ表示しようと思ってました。
そのついでにこれからの予測もしてみようということで、過去のデータを集め、グラフ表示してみます。
google Colaboratory とは
グラフ表示にgoogle Colaboratoryを使用しました。グラフ表示する実行環境を用意するより簡単だからです。
結果も残せますし、悪くない使い勝手です。
Prophet とは
Prophetは、fecebookが作ったライブラリで、時系列予測を行うライブラリです。
今回は、体重を予測できるかどうかやってみました。
体重データ
体重そのものは太り過ぎなので、公表するのはどうかと思い、BMIをデータとして使用します。
データは以下の感じです。
"ds","y" "2006-06-19",24.2 "2007-06-21",24.4
ヘッダが、”ds”と”y”になっているのはProphet用です。
データの登録
上記のようにgoogle colabを起動したとして、体重データは、横の赤丸がついている、フォルダーのようなアイコンを選択し、アップロードは「+」が付いたアイコンを選択します。
/content/ds_bmi.csvに置いておきます。
ちなみに、この方法でデータを置いておくと、数時間でデータが無くなりますのでご注意ください。
体重時系列予測/グラフ表示プログラム
プログラムは、以下の感じにしてみました。
import pandas as pd from fbprophet import Prophet import matplotlib.pyplot as plt !pip install japanize-matplotlib import japanize_matplotlib #日本語化matplotlib import seaborn as sns sns.set(font="IPAexGothic") weight_data = pd.read_csv("/content/ds_bmi.csv", index_col='ds', parse_dates=True) fig, ax = plt.subplots() # BMIグラフ ax.plot(weight_data.index, weight_data["y"]); ax.set_xlabel("日時"); ax.set_ylabel("BMI"); weight_data = pd.read_csv("/content/ds_bmi.csv") # 飽和予測(増加) m = Prophet(growth='logistic') # BMI範囲 25 -35 weight_data['cap'] = 35 weight_data['floor'] = 25 m.fit(weight_data) future = m.make_future_dataframe(periods=1000) future['cap'] = 35 future['floor'] = 25 forecast = m.predict(future) fig1 = m.plot(forecast) fig2 = m.plot_components(forecast)
いろいろパラメータを変更してみた結果、以下にしてみました。
- ロジスティック回帰(実はよく分かってない)
- 3年周期(periods=1000)
- cap/floorで最大と最小を定義した。
- BMI的に、25 – 35 ととりあえず仮置
グラフについて
BMIグラフ
まず、BMIグラフです。以下のようになりました。
予測グラフ
予測グラフ(上記:fig1)は以下になりました。はっきり言って意味がありません。
どんなにパラメータを変えてもよく分かりませんでした。まぁ当然か。。季節性もないし、データが偏ってる。。
予測の構成要素グラフ
上記予測を行った際の補助資料(上記:fig2)をグラフ表示しました。こっちはなんとなく面白い結果が出ました。
要するに以下を予測している感じですか。
- 夏は体重が減りやすい
- 3年後には元に戻る
まぁそうなんだろうなと思います。
終わりに
あまり予測できませんでした。まぁしょうがありませんが。
3年後に戻らないように気をつけないと。。