最近暇を持て余しておりまして。(嘘です。任された仕事がいつまで経っても終わらず、先輩方に迷惑ばかりかけてないか不安です。)
そんなおり、友人にけしかけられたということもあり、マッチングアプリなるものをはじめてみました。
いろいろな女性がいらっしゃるわけですが、ある時、ある女性が求める条件の一つに「高身長男性」という項目がありました。
どうやらその女性は自らの身長が高いということもあり、男性に求める最低身長が180cm超えでした。
高いなと思いつつ、180cm超えってそんなにいるっけ?と思い、日本の成人男性の上位何%が180cm超えているのか気になり調べてみました。
データ
データは以下のサイトから、Excelデータを取得してきました。
e-Stat 政府統計の総合窓口
令和元年国民健康・栄養調査
今回調べたいのは日本の成人男性(20歳以上)の平均身長と標準偏差なので、他の項目は無視します。
この時、20歳以上の成人男性の人数は人、平均身長は、標準偏差はです。
データの標準化
上記のデータの値をそのまま使うのもありですが、せっかくなので標準化してみます。
標準化とは、与えられたデータを平均が0、分散が1のデータに変換する操作のことです。標準変数をとし、各データを、平均値を、標準偏差をとすると、
となります。この時、成人男性の身長という軸を、標準化した軸で表すと、
とできます。上記より、という値は、標準変換すると軸上ではで表せることがわかりました。
身長が180cm以上の男性の割合は?
ここから標準正規分布表を使って、がどのくらいかを調べてみます。
標準正規分布表を参考に値を見つけると、
よって、平均身長からまでの成人男性の割合はおおよそということがわかりました。
つまり、成人男性の身長が以下の人は、(平均身長以下の人も含めて)ということがわかりました。
では、逆に身長以上の人はどれくらいいるのかというと、全体から身長が以下の人の割合を引けば良いので、
よって、日本の成人男性の上位の人が180cm超えているということがわかりました。
なるほど。 これを多いとみるか、少ないと見るかはあなた次第になりそうです。
もちろん、このデータは日本人だけなので、ガタイの良い外国人の方も含めると全く違う結果になると思います。
サンプルコード
暇なのでサンプルコードを作ってみました。調べたい身長の部分を変えるといろいろ調べることが可能です。
環境はGoogle Colaboratoryです。
import numpy as np import matplotlib.pyplot as plt from scipy.integrate import quad from scipy.stats import norm MEAN = 167.7 SIGMA = 6.9 input = 180 #調べたい身長 Z = (input - MEAN) / SIGMA I = quad(lambda x: 1/(np.sqrt(2 * np.pi)) * np.exp( -1 * x**2 / 2), 0, Z) print("あなたの身長は上位{:}%".format((1.0 - (I[0] + 0.50)) * 100)) x = np.linspace(-3.5, 3.5, 101) y = np.exp(-x**2 / 2) / np.sqrt(2 * np.pi) plt.plot(x, y) x1 = np.linspace(Z,3.5,101) y1 = np.exp(-x1**2 / 2) / np.sqrt(2 * np.pi) plt.fill_between(x1, y1, where=y1>0,facecolor='y') plt.show()
実行すると以下のグラフが出てきます。
cmを超える成人男性は色のついた部分のみになります。いずれにせよ、視覚化すると分かりやすいですね。