はじめに
教師あり学習について知人に教える機会があり、タイタニックをベースに教えようと思ったのですが、
身近でもなく、解りやすいデータでもないため、正直使いづらいなと思いました。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])
生成したデータをグラフ化するとこんな感じになります。
(当たり前ですけど)線形データっぽくなります。
ちなみに資料通りの標準偏差で生成するとこうなります。
分散が大きく、性別、身長、体重だけでの予測は難しそうです。
colabのリンク
実行すると、標準偏差2で生成されるcsvデータをダウンロードします。
終わりに
身長・体重という面白みに欠けるサンプルデータですが、
学習目的で雑に扱えるデータとしては、使いやすいんじゃないかなと思います。
参考にさせていただいたサイト様
BMIについて:https://keisan.casio.jp/exec/system/1161228732
正規乱数について:https://note.nkmk.me/python-numpy-random/
-
タイタニックはデータクレンジングや特徴量エンジニアリングが必要になるという点で、チュートリアル的にいいものだと思います。 ↩