LoginSignup
8
4

More than 3 years have passed since last update.

【機械学習】練習用データセットの作成【身長・体重】

Posted at

はじめに

教師あり学習について知人に教える機会があり、タイタニックをベースに教えようと思ったのですが、
身近でもなく、解りやすいデータでもないため、正直使いづらいなと思いました。1
そこで身長・体重のそれっぽいデータを作ってみました。

1.目的

身長、体重、性別のcsvデータを生成する。

height weight sex
165.5 66.4 male
174.5 74.2 male
156.3 54.9 female
161.4 52.2 female

2.データ参照元様

政府統計の総合窓口 e-stat 平成27年国民健康・栄養調査 から表番号12,13の資料より
20~29歳のBMIと身長の平均と標準偏差を参考にさせていただきました。

※BMIの標準偏差はそのまま使うと予測時の精度が低くなるので、今回は変えます。

2.考え方

numpyのrandam.normalを使い、身長とBMIの正規乱数を生成します。
そのあと、生成した身長とBMIから体重を計算します。(身長[m]の二乗 * bmi)


height = numpy.random.normal(身長の平均,身長の標準偏差,データ数)
bmi = numpy.random.normal(BMIの平均,BMIの標準偏差,データ数)
weight = (height * 0.01) ** 2 * bmi

3.コード

BMIの標準偏差を2にしていますが、これは予測時の精度を上げるためです。

import numpy as np
import pandas as pd

male = pd.DataFrame()
female = pd.DataFrame()

m_height = np.random.normal(171.7,6.6,1000)
f_height = np.random.normal(158.3,5.7,1000)

# m_bmi = np.random.normal(23.12,4.24,1000)
# f_bmi = np.random.normal(20.82,3.42,1000)
m_bmi = np.random.normal(23.12,2,1000)
f_bmi = np.random.normal(20.82,2,1000)

male["height"] =np.sort(m_height)
male["weight"] = (male["height"] * 0.01) ** 2 * m_bmi
male["sex"] = "male"

female["height"] = np.sort(f_height)
female["weight"] = (female["height"] * 0.01) ** 2 * f_bmi
female["sex"] = "female"

df = pd.concat([male,female])

生成したデータをグラフ化するとこんな感じになります。
(当たり前ですけど)線形データっぽくなります。
male_female.png

ちなみに資料通りの標準偏差で生成するとこうなります。
分散が大きく、性別、身長、体重だけでの予測は難しそうです。
def_male_female.png

colabのリンク
実行すると、標準偏差2で生成されるcsvデータをダウンロードします。

終わりに

身長・体重という面白みに欠けるサンプルデータですが、
学習目的で雑に扱えるデータとしては、使いやすいんじゃないかなと思います。

参考にさせていただいたサイト様

BMIについて:https://keisan.casio.jp/exec/system/1161228732
正規乱数について:https://note.nkmk.me/python-numpy-random/


  1. タイタニックはデータクレンジングや特徴量エンジニアリングが必要になるという点で、チュートリアル的にいいものだと思います。 

8
4
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
8
4