はじめに
「蓬莱の幻想」さんのサイトを参考にして、架空の人物データを実際に作成しました。
架空の人物のデータ元となるのは、18歳~22歳の女性1634名を対象に1992年から1995年にかけて行われた身体測定データを参考にさせて頂いております。
作成した架空人物のデータでは、オリジナル・データと同様に、18歳~22歳の女性1634名分の身長、バスト、ウェスト、ヒップ、肩幅、股下、体重を数値化しました。
また、合わせて人数を水増しして、3000名、10000名分のデータも作成してみました。
作成した架空人物データのダウンロード
今回作成した架空人物の身体データのダウンロードは、以下のリンクから可能です。
(ファイル形式は、.csvです。エクセル、あるいはメモ帳などで開くことができます。)
- 架空の18歳~22歳女性1634名分の身長、バスト、ウェスト、ヒップ、肩幅、股下、体重
- 架空の18歳~22歳女性3000名分の身長、バスト、ウェスト、ヒップ、肩幅、股下、体重
- 架空の18歳~22歳女性10000名分の身長、バスト、ウェスト、ヒップ、肩幅、股下、体重
作成した架空の人物データとオリジナル・データの比較
作成した架空人物データとオリジナルの論文データとの比較 <バスト・ヒップ>
左側の図が今回作成した架空人物のデータを基に、バストとヒップのサイズを散布図にしたものです。
右側の図は、実際に採寸された値を基にして論文で掲載されていた散布図です。
今回の架空人物データは、元のデータをほぼ再現することができました。が、バストもヒップもサイズが非常に多きい人物といった例外的な値までは、架空人物データでは再現しきれなかったようです。また、図をみてみると、ヒップのサイズが大きい人はバストのサイズも大きいと言えそうです。言い換えると、ヒップのサイズとバストのサイズはある程度相関がありそうです。
作成した架空人物データとオリジナルの論文データとの比較 <ウェスト・ヒップ>
左側の図が今回作成した架空人物のデータを基に、ウェストとヒップのサイズを散布図にしたものです。
右側の図は、実際に採寸された値を基にして論文で掲載されていた散布図です。
今回の架空人物データは、元のデータをほぼ再現することができました。が、こちらもウェストもヒップもサイズが非常に多きい人物といった例外的な値までは、架空人物データでは再現しきれなかったようです。また、図をみてみると、ウェストのサイズが大きい人はヒップのサイズも大きいと言えそうです。バストとヒップのサイズと、ウェストとヒップのサイズを見比べると、ウェストとヒップの図のほうがより各点が直線的に並んでいるように見えますので、バストとヒップのサイズよりも、ウェストとヒップのサイズの結び付きのほうが大きいといえるでしょう。
バストが大きければヒップも大きいと言えますが、バストとヒップの関係よりもウェストが大きいとヒップが大きいという関係のほうが大きいということですね。
作成した架空人物データとオリジナルの論文データとの比較 <身長・バスト>
左側の図が今回作成した架空人物のデータを基に、身長とバストのサイズを散布図にしたものです。
右側の図は、実際に採寸された値を基にして論文で掲載されていた散布図です。
今回も架空人物のデータはある程度実際のデータを模倣できていると言えそうですが、身長とバストの図を見てみると全体的に直線的ではなく円のような形で各点が並んでいます。身長とバストの各点が直線的に並んでいれば、身長の高さとバストの大きさは関連があるといえますが、今回は各点が円のように並んでいるので、身長の高さとバストの大きさは関連がなさそうです。
つまり、身長が高くてバストが大きいひともいるし、身長が高くてバストが小さい人もいるということですね。
作成した架空の人物データを分析
既にスリーサイズの各数値の間でどのような関係があるのかを見てきましたが、ここからは今回作成した人口データの内容を元に見ていきましょう。
作成した架空人物データ <身長・ヒップ>
左側の図が今回作成した架空人物のデータを基に、身長とヒップのサイズを散布図にしたものです。
右側の図は、上記で既に載せたウェストとヒップの散布図です。比較の為に再掲してあります。
身長とヒップの散布図を見てみると、ウェストとヒップの散布図ほと一直線には並んでいないようです。とは言っても、身長とヒップの散布図は、円のように各点がバラバラという訳でもありませんので、身長とヒップの関係は若干あると言えるといった程度でしょうか。
身長が高い人はヒップも大きいと言えなくもないが、そうでない場合もあるという感じですね。
作成した架空人物データ <身長・体重>
左側の図が今回作成した架空人物のデータを基に、身長と体重を散布図にしたものです。
右側の図は、上記で既に載せたウェストとヒップの散布図です。比較の為に再掲してあります。
身長と体重の散布図を見てみると、上記の身長とヒップと同じような点の並びかたですね。ですので、これも身長と体重の関係は若干あると言えるといった程度でしょうか。
身長が高い人は体重が重いと言えなくもないが、身長が高くても体重が軽い人もいるという感じですね。
各測定項目間の関連度合い
ちなみに、今まで身長と体重が関連しているのか、関連していないのか、若干関連しているようだ、などと曖昧な表現でしたが数値で表すとどのようになるのかみてみましょう。
上記は、元々の論文データに記載されていた各項目間の関連度合いを示した表です。関連が高ければ高いほど1に近くなります。逆に関連が無い場合は0の数字となります。縦の身長と横の身長が重なる一番左上の数字は1になってますね。当然ですが身長と身長は完全な関連があるので、最高値の1です。また、身長と体重の関連度合いは、0.47830となっているので、完全な関連があるとも言えませんし、全く関連がないとも言えない、若干関連があるといった程度でしょう。
ウェストと体重の関連度合いが0.83351、ヒップと体重の関連度合いが0.87817となっているので、このあたりの関連度合いがやはり高そうです。
架空の人物データ作成方法
それでは、以降は実際に架空の人物データを作成した手順を一気に記載していきます。
架空の人物データの作成方針については、以下の方針に従います。
共分散行列と乱数を使い、その傾向を模したサンプルデータを作るためには、2つの条件があります。
1. 各データの平均値と標準偏差、また相関行列が分かっていること
2. 各データが正規分布であること
https://hourai-gensou.com/neta/1990woman-data/
今回のオリジナル・データでは、各データの平均値、標準偏差、相関係数は明らかになっています。(相関係数についてはこちら。)
しかし、バスト、ウェスト、ヒップのデータは、「蓬莱の幻想」さんによると正規分布ではなく対数正規分布になっていることがヒストグラムから読み取れるそうですので、バスト、ウェスト、ヒップと体重のデータについては、以下の計算式で対数変換を行います。
対数正規分布の平均(μx)、標準偏差(σx)が与えられれば、次式により対数正規分布のパラメータである正規分布の平均値(μ)、標準偏差(σ)が計算できる。
σ2 = ln{ 1 + (σx/μx)2 }
μ = ln(μx) - σ2 /2
http://godfoot.world.coocan.jp/Lognorm-Prob.htm
バスト、ウェスト、ヒップ、体重は上記で述べたように、対数正規分布になっているため、元の資料に記載されている以下のデータを上記の式を使って変換します。
[変換前]
[変換後]
また、共分散行列については、相関係数が以下のように求められる為、元データに載っている相関係数から、共分散の値を算出します。算出した共分散を行列として並べて共分散行列を作成します。
身長とバストの相関係数 = 身長とバストの共分散 ÷ {身長の標準偏差×バストの標準偏差}
身長とバストの共分散 = 身長とバストの相関係数 × {身長の標準偏差×バストの標準偏差}
以上の内容を考慮して、以下の手順で架空の人物データを作成していきます。
参考サイト
https://www.jstage.jst.go.jp/article/jje1965/33/2/33_2_97/_pdf
https://hourai-gensou.com/neta/1990woman-data/
http://godfoot.world.coocan.jp/Lognorm-Prob.htm
残りの課題
身長の成長率から換算した現代バージョン編
https://hourai-gensou.com/neta/bigbreast-fact/#more-4979
はじめまして。
個人でゲームを作っており、キャラクターの身長体重3サイズを自動生成したいと検索し、こちらのブログに辿り着きました。
Stats: 2つのデータの関連度合いを示す計算方法
https://blog.aiampy.net/20200109-correlation-coefficient/
のページも合わせて共分散、相関係数、標準偏差の概念、計算方法が難しい数式を使わずわかりやすく書かれており、ありがたく読ませていただきました。
ここまでの記事で相関についてある程度分かったつもりになった上で、共分散行列から実際に疑似データを作成する方法が知りたいです。「蓬莱の幻想」さんのサイトでも一番知りたい疑似データを作成する方法までは書かれておらず、共分散、相関係数などで検索しても共分散を求める方法までしか見つけられませんでした。記事の続きを書いてはいただけないでしょうか。
共分散行列から実際に疑似データを作成する方法は、Pythonのライブラリを使ってサクッと作ったような気がします。
このあたりのサイトが参考になるかと。
https://www.kkaneko.jp/data/pstat/corv.html
https://phst.hateblo.jp/entry/2020/01/22/000000
あるいは、既に本記事に掲載してある作成済みの疑似データ(CSVファイル)の内容を作成されているゲーム内でそのまま使っていただいても構いません(_ _)。
Pythonライブラリの紹介をありがとうございます。疑似データを作成するための数式の方面ばかり探していて、プログラミング側から使えるライブラリを探すという発想が抜けておりました。。使用言語がjavascriptなので、javascriptでも使えるライブラリやスクリプトがないか探してみます。
返信くださりありがとうございました。
たびたびすみません。
Pythonのnumpyでrandom.multivariate_normalをしてみたのですが、期待した結果を得られませんでした。
https://gist.github.com/asakayu/e783cbe5aaa33c25bbc5575d991e2ad3
引数に記事で上げていただいている共分散行列の表と、それぞれの項目の平均値を入れてみましたが、記事のCSVのようにうまく値が散らばりませんでした。
おそらく引数に入れる値を間違えているのだと思います。どの値を入れて計算されたかお教えいただけないでしょうか。
散らばらない値というのは、バスト、ウェスト、ヒップ、体重、ですよね。
これらの項目の平均値は、正規分布に変換後の値を入れた気がします。
さらに、出てきた値に対して対数変換の逆の計算を行うと最終的な値になったような気がします。
ありがとうございます。
記事の
https://blog.aiampy.net/wp-content/uploads/2020/09/covariance_matrix.png
の表が正規分布に変換後の値だとは思うのですが、ここからrandom.multivariate_normalして出た値をさらに対数変換の逆で元の値に戻すということでしょうか。
対数変換log変換の当たりがうまく理解できず読み飛ばしてしまっていたので、対数変換について勉強してみます。
疑似データの生成に成功しました!
https://colab.research.google.com/drive/1eEgW7H4wSFRpHU5rnNZ5sPcpKcThfeKN
記事とコメント返信でお答えいただけたおかげでここまで辿り着けました。ありがとうございました。
得られる結果に対する指数変換、対数変換が単に元データの平均値をexpやlogすることだと気づくのに時間がかかっていました……
できれば共分散行列も計算で求めたいと思っていますが、現状記事の行列をそのまま使わせていただいております。
リリースまでに解決出来なかった場合に、この記事の共分散行列のデータをゲーム内で使わせていただいてもよろしいでしょうか。
そもそもの入力する平均値に、バスト、ウェスト、ヒップ、体重の項目は以下の正規分布後の平均値を使ってほしいという意図でしたが、実施された計算方法でも似たような計算結果になるようですね。(「μ = ln(μx) – σ2 /2」 の「σ2 /2」値分が誤差になる程度ですかね。)
https://blog.aiampy.net/wp-content/uploads/2020/09/log_mean.png
共分散行列のデータに関しましては、ご自由にご利用ください。
共分散行列の生成までできました!!!
https://colab.research.google.com/drive/1Bw145hiYs3hTQHN_Xh_TAlnFij_3fkfx
少数第二位まで元データの平均と結果を一致させられたので、おそらくこの記事で書かれたことは実現できたかと思います。