見出し画像

ランニング記録データの利活用②

分析屋 研究開発チームのkです。前回に続いて、約半年前に趣味で始めたランニングと勉強中のBIについて書きます。

編集の都合により、本記事の執筆時期(6月20日から6月30日、7月5日から7月10日)と公開時期に多少の時差があります。ご了承ください。

前回のまとめと今回の概要

前回の記事では、ランニングを習慣化した方法や有酸素運動のメリットなどを紹介し、ダッシュボード作成の準備を行い、ダッシュボードの大まかなデザインを決めました。

今回は、可視化用のデータを用意し、ダッシュボード作成を行います。




データの用意

私は、ランニングをするときにadidasさんの「adidas Running」というアプリを使っています。このアプリのアカウントで ログインすることで走行記録のデータを出力することができます。出力が完了するとzipファイルをダウンロードすることができます。このファイルには運動した回数分のjsonファイルが入っていて、これらをPythonでデータ加工してcsvファイルに変換します。

上記のアプリを使っていない場合や、Pythonでのデータ加工を飛ばしたい場合は、以下のような表形式でエクセルファイルやcsvファイルを作り、1回の走行記録を1行に入力してください。それができたら次の見出し「データの加工」は読み飛ばして、「ダッシュボード作成」から読んでください。

走行時間の単位は時間、消費カロリーの単位はkcal、走行距離の単位はkmです。上の表は実データから取り出したもので、2023年12月5日の場合、30分弱運動し、2.83km走り、200kcal消費したことが分かります。

また、消費カロリーが5日連続で200kcalになっているのはデータの入力ミスではなく、「200kcal分運動する(だけ)ダイエット」を続けていたからです。

データの加工

adidas Running」からダウンロードしたzipファイルを解凍すると、以下のようなフォルダ構成になっていました。

├─Adiclub
│  └─Engagements
├─Challenges
│  ├─Collaboration_challenge
│  ├─Competition_challenge
│  └─Status
├─Goals
├─Privacy-settings
│  └─Marketing-consent
├─Purchases
│  ├─Subscription-History
│  └─Subscriptions
├─Social-connections
│  ├─Followers
│  ├─Following
│  └─Pending-follow-requests
├─Sport-sessions
│  ├─GPS-data
│  └─Heart-rate-data
├─User
└─User-Events

今回使うjsonファイルは「Sport-sessions」フォルダ直下に入っています。jsonファイルの中身は以下のようになっています。実際のjsonファイルには他にも様々な値が入っているのですが、今回は使わないため一部割愛しています。

{
    "duration": 1665000,
    "calories": 200,
    "start_time": 1701817380000,
    "features": [
        {
            "type": "weather",
            "attributes": {
                "temperature": 0.0
            }
        },
        {
            "type": "steps",
            "attributes": {
                "average_step_rate": 107,
                "maximum_step_rate": 144,
                "total_steps": 2969,
                "average_step_length": 86
            }
        },
        {
            "type": "initial_values",
            "attributes": {
                "distance": 2580,
                "duration": 1077000,
                "pause": 0,
                "sport_type": {
                    "id": "14",
                    "type": "sport_type"
                },
                "start_time": 1701817986000,
                "end_time": 1701819063000
            }
        }
    ]
}

このjsonファイルから、日付、走行時間、消費カロリー、走行距離の4つの値を取り出します。値と単位は以下の通りです。

上記を踏まえて、「Sport-sessions」フォルダにcdしてから以下のスクリプトを実行します。

import json
from datetime import datetime
from pathlib import Path
import pandas as pd

def extract_exercise_info_from_json(json_filepath: str | Path) -> dict:
    """
    `json_filepath`にあるjsonから以下の4項目を取り出し、dictに入れて返す
        - 日付:       yyyy-mm-dd 形式の日付
        - 走行時間:     走った時間の長さ。単位は時間
        - 消費カロリー: 運動で消費したカロリー。単位はkcal
        - 走行距離:     走った距離。単位はkm
    """
    with open(json_filepath) as f:
        exercise_data = json.load(f)

        start_unixtime = exercise_data["start_time"] / 1000
        date = datetime.fromtimestamp(start_unixtime).strftime("%Y-%m-%d")

        duration_hour = exercise_data["duration"] / 1000 / 60 / 60

        calories_kcal = exercise_data["calories"]

         track_metrics = list(
            filter(
                lambda x: x["type"] == "track_metrics",
                exercise_data["features"]
            )
        )[0]
        distance_km = track_metrics["attributes"]["distance"] / 1000

        return {
            "日付": date,
            "走行時間": duration_hour,
            "消費カロリー": calories_kcal,
            "走行距離": distance_km
        }
  
exercise_info_list = []
for json_filepath in sorted(Path(".").glob("*.json")):
    exercise_info = extract_exercise_info_from_json(json_filepath)
    exercise_info_list.append(exercise_info)

exercise_df = pd.DataFrame.from_records(exercise_info_list)
exercise_df["日付"] = pd.to_datetime(exercise_df["日付"])
exercise_df.to_csv("exercise.csv", index=False)

スクリプトを実行すると、exercise.csvというcsvファイルが出力されます。このファイルを使ってダッシュボードを作成します。


ダッシュボード作成

データを用意できたので、ダッシュボードを作成します。

データの接続

まずは、「ホーム」、「データ」、「データを取得」から、先ほど出力したcsvファイルとPower BIを接続します。以下のような画面が表示されるので、右下の「データの変換」ボタンを押します。

Power BIとcsvファイルを接続する画面

Power Queryの画面が表示されるので、データ型の変換が正しく行われているか確認します。日付のデータ型がdate、走行時間と走行距離のデータ型がnumber、消費カロリーのデータ型がInt64になっていることが確認できたら、画面左上の「閉じて適用」ボタンを押してPower Queryを閉じます。

Power Queryの画面

ビジュアルの設定

先ほどビジュアルの配置を考えた時に、空のビジュアルを置いたままにしておいたので画面は以下のようになっています。それぞれの設定を変えてダッシュボードを作成します。

ビジュアルの設定をする前の画面

タイトルとスライサーの設定

タイトルは「1か月間のまとめ」に変更します。

スライサーで年月を選択できるようにするため、テーブルビューの「テーブルツール」、「計算」、「新しい列」から、以下のDAXを使って「年月」列を追加します。

年月 = YEAR(exercise[日付]) & "年" & MONTH(exercise[日付]) & "月"

それができたらレポートビューに戻って、スライサーのフィールドに「年月」列を指定します。「ビジュアルの書式設定」から「ビジュアル」、「スライサーの設定」、「オプション」、「スタイル」から「タイル」を選択します。他のスタイルを選んでも問題ありません。

この画面は1か月間のデータを確認するのに使うため、「ビジュアルの書式設定」から「ビジュアル」、「スライサーの設定」、「選択項目」から「単一選択」にチェックを入れます。

スライサーヘッダーは非表示にして、値(「2023年12月」、「2024年1月」などの文字列」)のフォントサイズを少し大きくしました。

タイトルとスライサーを設定したときの画面


次回予告

キリがよくないですが、文字数が5000文字を越えそうなので今回はここで終わりにします。次回はダッシュボード作成の続きをやります。



ここまでお読みいただき、ありがとうございました!
この記事が少しでも参考になりましたら「スキ」を押していただけると幸いです!

分析屋ではBIを使ったデータ可視化に関するサービスサイトもございます。Power BIに関するお困りごとがございましたらお気軽にお問い合わせください。

株式会社分析屋について

弊社が作成を行いました分析レポートを、鎌倉市観光協会様HPに掲載いただきました。

ホームページはこちら。

noteでの会社紹介記事はこちら。

【データ分析で日本を豊かに】
分析屋はシステム分野・ライフサイエンス分野・マーケティング分野の知見を生かし、多種多様な分野の企業様のデータ分析のご支援をさせていただいております。 「あなたの問題解決をする」をモットーに、お客様の抱える課題にあわせた解析・分析手法を用いて、問題解決へのお手伝いをいたします!

【マーケティング】
マーケティング戦略上の目的に向けて、各種のデータ統合及び加工ならびにPDCAサイクル運用全般を支援や高度なデータ分析技術により複雑な課題解決に向けての分析サービスを提供いたします。

【システム】
アプリケーション開発やデータベース構築、WEBサイト構築、運用保守業務などお客様の問題やご要望に沿ってご支援いたします。

【ライフサイエンス】
機械学習や各種アルゴリズムなどの解析アルゴリズム開発サービスを提供いたします。過去には医療系のバイタルデータを扱った解析が主でしたが、今後はそれらで培った経験・技術を工業など他の分野の企業様の問題解決にも役立てていく方針です。

【SES】
SESサービスも行っております。


この記事が参加している募集