LoginSignup
1
1

More than 5 years have passed since last update.

【Python】Pandasのdataframeを使って体重周りの計算をしたお話

Last updated at Posted at 2018-01-27

Pandasのdataframeを使って体重周りの計算をしたお話

目的

  • iOSヘルスケアのデータで除脂肪体重がハブられてるのがちょっと面倒くさい
    • というのも、除脂肪体重は筋肉の量に関係し、基礎代謝の目安にもなるため
  • 除脂肪体重は体脂肪率の逆(下の式1)から求められる
  • 基礎代謝は下の式2(または式2補足)で求められる
  • 今回はヘルスケアのデータのエクスポートデータではなく、iOSアプリ(QSAccess)から得られたcsvファイルをもとに作成する。

式一覧

  • 体重(Kg) W
    • Weightの略
  • 体脂肪率(%) F
    • Fatの略、%値(実際にはcsv取り込み時に小数表記になる)
  • 除脂肪体重(Kg) L
    • Lean Body Massの略
  • 基礎代謝(kcal) B
    • base metabolismの略

式1(除脂肪体重を求める)

L = W \times \frac{100 - F}{100}

式2(除脂肪体重から基礎代謝を求める)

B = 370 + 21.6L

式2補足(式2に式1を代入)

B = 370 + (\frac{100 - F}{100} \times 21.6W)

式3 BMIの算出

  • 身長 H
    • BMIの計算ではm単位。Heightの略
BMI = \frac{W}{H^2}

Pandasとデータフレームの扱い

csvファイルを取り込んで計算するにあたって、Pandasというライブラリ(モジュール)とデータフレームという型に触れることになった。

データフレームとは

(ざっくりとした理解では)表型のデータ種別。今回のようなcsvファイルのような形式がイメージとして近い。

データフレームの列名を変更する

データフレームに対してrenameというメソッドで変更できる。1

ちなみに、以下で'Start'を'日付'と変更しようとしているが、csv取り込み時に基準列に設定した列名は変更できない(らしい)。

    # データフレーム上の列名を変更
    df = df.rename(columns={'Start':'日付', \
            'Body Fat Percentage (%)': '体脂肪率', 'Weight (kg)': '体重'})  

参考: pandas.DataFrameの行名・列名の変更 - note.nkmk.me

列の絞り込み

元データには時間帯・期間を表すStart, Finishという列があったが、今回はFinishは不要のため、基準列となっているStart以外のうち、体脂肪率と体重だけに絞り込むことにした。

    # データフレームの値列を体脂肪率と体重に絞る
    data = df[['体脂肪率', '体重']]

参考: Pandas でデータフレームから特定の行・列を取得する - Python でデータサイエンス

無効データ(0で出力されたレコード)を除外する

計算するにあたって、体脂肪率・体重のどちらかが0だと意味の無いデータになってしまうため、どちらかが0の場合にレコードを除外する必要があった。

以下の、data[data > 0]が0より大きいデータを有効とする(0以下を無効とする)記述で、無効となった値をdata.dropna()で除外している。

    # 0は欠損値として扱い、そのレコードを削除する
    data = data[data > 0]
    data = data.dropna()

参考

計算して出来た値を列として追加する

また、data['列名'] = 値のリスト([])や計算式という式を書くと、データフレームに列を追加できる。この計算式には列名を指定して、他の列の各行の値をそれぞれ計算に利用することが出来る。

なお、BMIの計算で使用している(height ** 2)は、height(身長(m))の2乗を示している。(Pythonの構文)

    # BMI、除脂肪体重、基礎代謝(Katch-McArdle式:除脂肪体重から算出する式)を求める
    data['BMI'] = data['体重'] / (height ** 2)
    data['除脂肪体重'] = data['体重'] * (1 - data['体脂肪率'])
    data['基礎代謝'] = 370 + (21.6 * data['除脂肪体重'])

参考: Pandas のデータフレームに行や列 (カラム) を追加する - Python でデータサイエンス

あとは順次計算していくだけ

以下にこれまでのコードをまとめたソースコードを示します。

QSAccess.py
    # データフレーム上の列名を変更
    df = df.rename(columns={'Start':'日付', \
            'Body Fat Percentage (%)': '体脂肪率', 'Weight (kg)': '体重'})  

    # データフレームの値列を体脂肪率と体重に絞る
    data = df[['体脂肪率', '体重']]

    # 0は欠損値として扱い、そのレコードを削除する
    data = data[data > 0]
    data = data.dropna()

    # BMI、除脂肪体重、基礎代謝(Katch-McArdle式:除脂肪体重から算出する式)を求める
    data['BMI'] = data['体重'] / (height ** 2)
    data['除脂肪体重'] = data['体重'] * (1 - data['体脂肪率'])
    data['基礎代謝'] = 370 + (21.6 * data['除脂肪体重'])

あとは

出来たcsvデータをExcelに取り込んで一部をグラフ化したり。結局、体重と比べやすい除脂肪体重を見れば十分だったりします。

その他参考(csv読み込み等)


  1. {'key': 'value'}で表されるのは辞書型のデータ 

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1