AI 機械学習でダイエット効果(体重変化)の分析と予測

時系列データの機械学習に最適（むしろ革命的に最強）のProphetを使って自分の体重変化を分析・予測してみました。
敬愛する山本義徳先生の動画で拝見した増量期とプチ減量期のサイクルを自分に合った期間で実施するための最適解を探します。
一連の実施内容と結果としてこちらに Jupyter Notebook を置いておきます。
https://github.com/GenkiOkuma/My-body-weight-analytics/blob/main/My%20Body%20Weight%20Analytics.ipynb

# 参考
（こちらの記事を拝読のうえProphetを実践しました。ありがとうございます。）
[Google Colaboratoryで書籍「Pythonで儲かるAIをつくる」の実習コードを動かす方法](https://qiita.com/makaishi2/items/25529634aac508dcd6b0)
[時系列予測ツールFacebook Prophetを使いPythonで様々なデータから予測をする](https://qiita.com/baby-degu/items/f8a7466a73227af69c14)
[Prophetによる時系列データの予測](https://mikiokubo.github.io/analytics/15forecast.html)

### 1. 体重計測
アマゾンで買った安い体重計で日々計測をする。
中国語に文字化けするけど、一応csv出力ができる。中山きんに君の動画でも見かけた。
![IMG_20210501_094638.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147524/10dff697-a002-7171-3fea-21572bc41d44.jpeg)

### 2. Jupyter Notebook の Python環境にcsvファイルを取り込む。
column名は文字化けしてたので手動でcsvファイルを編集した。体重だけでなく体脂肪率とか筋肉量とか体内年齢とかが取れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147524/eb6f9730-aa86-10ad-292a-f02a92724602.png)

### 3. ラインチャート
```Python
df_ = df.copy()
df_ = df_.set_index('ds')
fig = plt.subplots(figsize=(20,5))
sns.lineplot(data=df_)
fig = plt.subplots(figsize=(20,5))
sns.lineplot(data=df_.resample("D").min())
fig = plt.subplots(figsize=(20,5))
sns.lineplot(data=df_.resample("W").min())
fig = plt.subplots(figsize=(20,5))
sns.lineplot(data=df_.resample("m").min())
```
・計測ごと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147524/89b606cf-8625-4cb2-d7e5-ba77d108d801.png)
・1日の最小値
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147524/46a58a8b-26e8-1e19-938e-c21473578652.png)
・週の最小値
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147524/b04472a0-979a-b3a8-da8a-fc25fda9e9b4.png)
・月の最小値
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147524/9d1d69bf-8157-829b-ca47-bdd19dacc21a.png)
下記のようにやってきたつもりだが、いい感じにできていると思う。
2020年12月～2021年1月　→　減量期
2月～3月　→　増量期
4月　→　減量期
5月　→　増量期(予定)

### 4. 時間別の箱ひげ図
```Python
df_ = df.copy()
df_ = df_[(df_['ds'] >= datetime(2021,3,1)) & (df_['ds'] < datetime(2021,4,30))]
df_['time'] = df_['ds'].dt.hour
plt.figure(figsize=(20,6))
sns.boxplot(x="time", y="weight(kg)", data=df_,)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147524/9926dd29-cb59-19b9-cd5d-06151a149f16.png)
1日に1～3回しか計測していないのでデータが足りない。朝低くて、夜高いという程度。

### 5. 曜日別の箱ひげ図
```Python
df_ = df.copy()
df_ = df_[(df_['ds'] >= datetime(2021,3,1)) & (df_['ds'] < datetime(2021,4,30))]
df_ = df_.set_index('ds')
df_["day"] = df_.index.strftime("%A")
plt.figure(figsize=(20,6))
sns.boxplot(x="day", y="weight(kg)", data=df_,)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147524/eaa52d05-2e12-7063-4477-8e53dadee849.png)
金曜日はばらつきやすい。日曜日は高くなりやすい。金曜と日曜は要注意。

### 6. Prophetで分析・予測
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147524/ba59aa0f-d64a-e20c-3010-5c9bb314ce28.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147524/b397995f-4313-6cf3-fb8b-d0ab5621a737.png)

### 7. Prophetで作ったmodelの誤差検証
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147524/02e92049-04a1-e569-a4b8-fe9deaae0be3.png)

平均誤差は2%程度と低く、精度が高い。まあ体重ってそんなに大きくブレないしね。

### 8. 考察
・ダイエット始めてまだ半年くらいなので、増量期と減量期の切り替えに悩みがちですが、Prophetのトレンド分析が参考になりました。
・予測がいい感じに痩せる方向を示しているのでプレッシャーになります。
・78.0kg から 64.2kg にダイエットしたわけですが、見た目はこんな感じに変化しています。
・体内年齢は実年齢 +2 から -5 に変化しました。体が変わると人生変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147524/8e715960-1c16-e45d-bcb7-1f2b7a8e3195.png)