【Python, Google Drive】体重管理&解析アプリを作ろう5 ~解析(グラフ2)~

体重トレンド解析を実装する自分だけのWebアプリを作成するため、前回記事までに登録フォーマットの原型を作成し、データの特徴量を算出した後にデータをグラフ化しました。

今回は、グラフ化の第二弾ということで、1週間の曜日ごとの体重増減をグラフ化していきます。このグラフから、曜日ごとによる体重及び体脂肪量の増減が見やすくなるため、計画を立てやすくなると思います。

1. Weekdayデータの作成

今回も図1のようなデータを例として使用し、グラフを作成していきたいと思います。データがない方は前回記事をご確認いただき、ご自身の体重データを作成してみてください。

まずは、グラフに必要な特徴量を算出しておきます。こちらは前回の記事でも算出した特徴量ですので、前回をお読みになっている方は飛ばしていただいて構いません。

df = df.astype(
    {'Weight [kg]': 'float',
     'Fat [%]': 'float',
     'Breakfast': 'int', 
     'Lunch': 'int',
     'Dinner': 'int',
     'Running': 'int',
     'Muscle': 'int',
     'Sports': 'int'}
     )
df['Date'] = pd.to_datetime(df['Date'])
df["Diff-Weight(Previous)"] = df["Weight [kg]"].diff().fillna(0)
df["Fat [kg]"] = (df["Weight [kg]"] * df["Fat [%]"] / 100)
df["Fat [kg](Previous)"] = df["Fat [kg]"].diff().fillna(0)

上記コードを実行すると、以下のようなデータテーブルが作成されます。体重と体脂肪量の前回値との差分が算出されていることがわかります。

続いて、曜日ごとの体重と体脂肪量の増減の合計を算出していきます。体重と体脂肪量の前回値を曜日ごとに合計することで算出していきます。以下のコードを実行してみてください。

df_data = df[['Date', 'Diff-Weight(Previous)', 'Fat [kg](Previous)']]
df_data["Weekday"] = df_data['Date'].dt.weekday
df_data = df_data.groupby('Weekday').agg('sum')
df_data.index = ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN']
df_data = df_data.reset_index().rename(columns={'index': 'Weekday'})
df_add = pd.DataFrame(
                    {
                    "Weekday": "Total",
                    "Diff-Weight(Previous)": df_data.iloc[:, 1].sum(),
                    "Fat [kg](Previous)": df_data.iloc[:, 2].sum()
                    }, index=[8]
                    )
df_data = pd.concat([df_data, df_add])
df_data

実行すると、以下のテーブルのように、曜日ごとと合計の体重と体脂肪量の増減の合計表が作成されます。このデータテーブルをグラフ化していきます。

2. データのグラフ化

先ほど作成した曜日ごとのデータをグラフ化します。以下のコードを実行してみてください。

fig, ax = plt.subplots(1, 1, figsize=(12, 6)
ax.set_title('Weight [kg], Fat [kg] by Weekday', fontsize=15)
ax.bar(df_data["Weekday"], df_data.iloc[:, 1], label="Weight [kg]")
ax.bar(df_data["Weekday"], df_data.iloc[:, 2], label="Fat [kg]")
ax.set_xticklabels(df_data["Weekday"], rotation=0)
ax.set_xlabel("Weekday", fontsize=15)
ax.set_ylabel("Weight [kg], Fat [kg]", fontsize=15)
ax.grid(True)
ax.legend()
plt.rcParams["font.size"] = 15
plt.show()

実行すると以下の図のように、曜日ごとの体重と体脂肪量のグラフが作成されます。曜日ごとに 体重と体脂肪量の増減が変化してくると思いますので、生活の見直しや改善に役立てていただけると幸いです。

3. まとめと関連記事

今回のまとめコードは以下となります。コードがわかりやすいように関数化しています。

def show_data_weekday(df, figsize=(12, 6), font=15):
    df_data = df[['Date', 'Diff-Weight(Previous)', 'Fat [kg](Previous)']]
    df_data["Weekday"] = df_data['Date'].dt.weekday
    df_data = df_data.groupby('Weekday').agg('sum')
    df_data.index = ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN']
    df_data = df_data.reset_index().rename(columns={'index': 'Weekday'})
    df_add = pd.DataFrame(
                        {
                        "Weekday": "Total",
                        "Diff-Weight(Previous)": df_data.iloc[:, 1].sum(),
                        "Fat [kg](Previous)": df_data.iloc[:, 2].sum()
                        }, index=[8]
                        )
    df_data = pd.concat([df_data, df_add])

    fig, ax = plt.subplots(1, 1, figsize=figsize)
    ax.set_title('Weight [kg], Fat [kg] by Weekday', fontsize=font)
    ax.bar(df_data["Weekday"], df_data.iloc[:, 1], label="Weight [kg]")
    ax.bar(df_data["Weekday"], df_data.iloc[:, 2], label="Fat [kg]")
    ax.set_xticklabels(df_data["Weekday"], rotation=0)
    ax.set_xlabel("Weekday", fontsize=font)
    ax.set_ylabel("Weight [kg], Fat [kg]", fontsize=font)
    ax.grid(True)
    ax.legend()
    plt.rcParams["font.size"] = font
    plt.show()

show_data_weekday(df, figsize=(12, 6), font=15)

以下は本記事の関連記事となります。随時更新中ですので公開次第、リンクを貼り付けていきます。

Baran

それでは、よいPythonライフを!

Baran

以下の記事も書いています。よかったらご覧ください。

Baran

Twitterもやってまーす。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT US

Baran-gizagiza
経歴:浪人→理系大学院卒業→大手製造業に就職(技術職)→アメリカ赴任中 仕事は、研究・設計など上流工程の仕事に携わっています。企業勤務を継続しながら、新しいことにチャレンジしたいと思い、ブログを下記はじめました。 このブログでは、趣味である 筋トレ(健康、ダイエット) AIとデータ(高校数学、プログラミング) 読書(主に自己啓発系) を中心に、人生経験やおすすめ情報の発信しています。