<

! -- mermaid記法用 https://staff.hatenablog.com/entry/2023/03/01/164316 -->

43号線を西へ東へ

フリーランスの備忘録、アウトプットの実験場

ランニングを続けるためのご褒美

このブログはプロモーションリンクを含むときがあります


しんどいことを継続するためには、いろいろな仕掛けが必要です。

走り慣れてない方がランニングを続ける際に、しんどい気持ちを残すだけでは無く、冷静にデータを見直すことは有用です。Apple Watchを用いてランニングの統計データを集計して、自分にポジティブイメージを作る方法を実践しています。

アラフィフのメタボのおじさんが、事務所から自宅までの25kmを走るために走る練習をしている記録です。走り始めて75日になりました。

自動で日数を数える!あなたの進捗ブログに追加すべきJavaScriptコード - 43号線を西へ東へ

ランニングのログデータを可視化して、褒める材料を探しては自分を励ましています。

「しんどいと感じていても、前よりペースが上がっているよ」
「昔は週1しか走れなかったのに、今は週五で走れてるよ」

自分を客観視して褒めるというかなりイタイことをしているのですが、他人様に迷惑をかけているわけでは無いですし、目的達成のためには手段を選びません。

現在2.5kmしか走れない過体重のおじさんが、あと6ヶ月後に25km走れるのでしょうか。自分のためにも、また同じような境遇のおじさんに「やれば出来る」と希望を与えられるように頑張りたいと思います。

現在のランニングのプロトコル

20分間走

現在は20分で走れる距離を走っています。10分のタイマーをかけて走って、タイマーがなれば戻ってくる方法です。

心拍数コントロール

4月の途中から心拍数は130に上がらないようなレベルで走っていましたが、随分と慣れてきました。最近は呼吸よりもふくらはぎの張りがつらいです。

ご褒美

成果は数字で表されます。前よりも早く、長く走れることがトレーニングの効果であり、ご褒美です。

ご褒美その1:走行距離が伸びてきた

月毎のグラフなので、5月の値は2024年5月11日現在の値になります。

水色の棒グラフが月間走行距離。ほぼ毎日(週5~6)走れるようになってきた4月が突出している。5月は11日現在で4月の半分以上の距離は走行済み。一回あたりの距離が1.9kmから2.5kmと微増。

月間の走行距離とペース

Pythonコード

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

# 日本語フォントのパスを設定
font_path = '***'
japanese_font = FontProperties(fname=font_path)

# データの読み込み
data_path = 'run2024.csv'
running_data = pd.read_csv(data_path)

# 時間列をdatetime形式に変換してインデックスに設定
running_data['時間'] = pd.to_datetime(running_data['時間'])
running_data.set_index('時間', inplace=True)

# ランタイムを秒から分に変換し、1kmあたりのペースを計算
running_data['ランタイム (分)'] = running_data['ランタイム (秒)'] / 60
running_data['ペース (分/km)'] = running_data['ランタイム (分)'] / running_data['距離 (km)']

# 年月を追加
running_data['年月'] = running_data.index.to_period('M')

# 月ごとのデータを集約
monthly_data = running_data.groupby('年月').agg({
    'ペース (分/km)': 'mean',
    '距離 (km)': ['sum', 'count']
})

# 新しいカラム名を設定
monthly_data.columns = ['月間ペース (分/km)', '月間総走行距離', '月間ワークアウト回数']

# 月間平均走行距離を計算
monthly_data['月間平均走行距離'] = monthly_data['月間総走行距離'] / monthly_data['月間ワークアウト回数']

# グラフの作成
plt.rcParams['font.family'] = japanese_font.get_name()  # グローバルに日本語フォントを設定
fig, ax1 = plt.subplots(figsize=(16, 9))  # 幅を大きくする

# 棒グラフの幅設定
bar_width = 0.35

# 月番号を表示させる
ax1.tick_params(axis='x', labelsize=8)  # ラベルのフォントサイズを小さくする

months = range(len(monthly_data))
bars1 = ax1.bar(months, monthly_data['月間総走行距離'], width=bar_width, color='lightblue', label='月間総走行距離', align='center')
bars2 = ax1.bar([x + bar_width for x in months], monthly_data['月間平均走行距離'], width=bar_width, color='green', label='月間平均走行距離', align='center')

# 数値の追加
for bar in bars1:
    yval = bar.get_height()
    ax1.text(bar.get_x() + bar.get_width()/2, yval + 0.5, round(yval, 1), va='bottom', ha='center', fontsize=12, color='black')

for bar in bars2:
    yval = bar.get_height()
    ax1.text(bar.get_x() + bar.get_width()/2, yval + 0.5, round(yval, 1), va='bottom', ha='center', fontsize=12, color='black')

# 月名に直す
month_labels = [f'{m+1}月' for m in monthly_data.index.month - 1]
ax1.set_xticks([x + bar_width / 2 for x in months])
ax1.set_xticklabels(month_labels)
ax1.set_xlabel('月', fontproperties=japanese_font)
ax1.set_ylabel('走行距離 (km)', fontproperties=japanese_font)
ax1.tick_params(axis='y')

# ペースのプロット(右軸)
ax2 = ax1.twinx()
ax2.set_ylabel('月間ペース (分/km)', fontproperties=japanese_font)
ax2.plot(months, monthly_data['月間ペース (分/km)'], color='red', label='月間ペース (分/km)')
ax2.tick_params(axis='y', labelcolor='red')

# 凡例とタイトル
fig.legend(loc='upper left', bbox_to_anchor=(0.1, 0.9), prop=japanese_font)
plt.title('年月別 ランニングパフォーマンス', fontproperties=japanese_font)

plt.show()

ご褒美その2:ペースが速くなっているのに心拍数は最大・平均とも減少

ランニング中の最大心拍数および平均心拍数

Pythonコード

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

# データの読み込み
data_path = '***'
running_data = pd.read_csv(data_path)

# 時間列をdatetime形式に変換してインデックスに設定
running_data['時間'] = pd.to_datetime(running_data['時間'])
running_data.set_index('時間', inplace=True)

# ランタイムを秒から分に変換し、1kmあたりのペースを計算
running_data['ランタイム (分)'] = running_data['ランタイム (秒)'] / 60
running_data['ペース (分/km)'] = running_data['ランタイム (分)'] / running_data['距離 (km)']

# 月を追加
running_data['月'] = running_data.index.month

# 月ごとのデータを集約
monthly_data = running_data.groupby('月').agg({
    'ペース (分/km)': 'mean',
    '最高心拍数 (bpm)': 'max',
    '平均心拍数 (bpm)': 'mean'
})

# 日本語フォントの設定
font_path = '***'
japanese_font = FontProperties(fname=font_path)

# グラフの作成
fig, ax1 = plt.subplots(figsize=(10, 6))

# 心拍数の棒グラフ(左軸)
width = 0.35  # 棒グラフの幅
bars1 = ax1.bar(monthly_data.index - width/2, monthly_data['平均心拍数 (bpm)'], width=width, color='#92a1cf', label='平均心拍数')  # Muted blue
bars2 = ax1.bar(monthly_data.index + width/2, monthly_data['最高心拍数 (bpm)'], width=width, color='#d95f02', label='最大心拍数')  # Muted orange
ax1.set_xlabel('月', fontproperties=japanese_font)
ax1.set_ylabel('心拍数 (bpm)', color='black', fontproperties=japanese_font)
ax1.tick_params(axis='y')
ax1.set_xticks(range(1, 13))  # X軸の目盛りを1月から12月までの整数に設定
ax1.grid(True)
ax1.set_ylim(110, None)  # 最小値を100に設定

# バーに値を表示する
for bar in bars1:
    yval = bar.get_height()
    ax1.text(bar.get_x() + bar.get_width()/2, yval, round(yval, 1), ha='center', va='bottom', fontsize=12)

for bar in bars2:
    yval = bar.get_height()
    ax1.text(bar.get_x() + bar.get_width()/2, yval, round(yval, 1), ha='center', va='bottom', fontsize=12)

# ペースのプロット(右軸)
ax2 = ax1.twinx()
ax2.plot(monthly_data.index, monthly_data['ペース (分/km)'], color='#7570b3', marker='o', label='平均ペース')  # Muted purple
ax2.set_ylabel('ペース (分/km)', color='#7570b3', fontproperties=japanese_font)
ax2.tick_params(axis='y', labelcolor='#7570b3')

# 凡例の追加、フォントプロパティ適用
fig.legend(loc='upper left', bbox_to_anchor=(0.1, 0.9), prop=japanese_font)

plt.title('月別ランニングパフォーマンス', fontproperties=japanese_font)
plt.show()

表形式

年月 ランニング回数 合計走行距離 平均走行距離 平均ペース 平均心拍数 (bpm)
2024-02 1 1.09 1.09 8:14 128
2024-03 3 5.56 1.85333 9:20 128
2024-04 17 32.26 1.89765 8:46 126.412
2024-05 8 19.99 2.49875 8:29 125.125

使用しているデータ形式

Apple Watchで測定したランニングデータを、iPhoneのアプリRummeterにインポートしてから、ランニングのサマリーデータをCSV形式でエクスポートしています。

Apple WatchのランニングデータをCSVで書き出せる方法が分かれば、変更する予定です。

使用しているデータ(CSV形式)

名前,時間,ランタイム,ランタイム (秒),停止時間,停止時間 (秒),緯度,経度,高度 (メートル),距離 (km),平均スピード (km/時),平均ペース,平均ペース (秒),最高スピード (km/時),最高ペース,最高ペース (秒),登り (メートル),降り (メートル),カロリー,歩数,最大歩数ペース (歩数/分),平均歩数ペース (歩数/分),最高心拍数 (bpm),平均心拍数 (bpm),合計ランタイム,合計ランタイム (秒),合計距離 (km)
,2024-02-27 05:50:20,0:08:59,539.3,0:00:00,0.0,0.0,0.0,0,1.09,7.28,0:08:14,494,8.68,0:06:55,415,0,0,97,1215,164,135,143,128,0:08:59,539.3,1.09

ご褒美その3:Apple Watchのバッジ

iPhoneのフィットネスアプリ内のログで長く走ったり、カロリーを消費したりするとバッジが付与されます。バッジを集めてもポイントが貯まるわけでもありません。走っていないときは「だからなに?」という目で見ていましたが、今はバッジの付与を素直に喜び楽しんでいます。

最後に

4月には毎日走ろうと思っていましたが、右ふくらはぎの張りがだんだん増えてきました。5月は休憩入れながら週5~6日のペースで走っています。

グラフの通り、月間の走る距離は増加し、ランニングペースが最初よりは速くなっているものの、心拍数は上がりにくくなっています。

心肺機能(肺および細胞内のガス交換能)が復活してきたと言うことでしょう。

高校時代からの古傷アキレス腱の痛みが全く出ないのはうれしい状況です。ただ、ふくらはぎの張りとアキレス腱痛の関連性は高いので、走る頻度、距離、筋トレの導入など、いろいろやっていき、今の10倍の距離を走れるようになりたいと思います。

余談 なすなかし復帰

なすなかしがコンビ復活していた。ロケのオープニングのぼけがおもしろいなすなかにし。何気にうれしいです。復帰おめでとうございます。