Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

THE iDOLM@STERをサイエンスする【D@t@ science・永遠の17歳の正体を推定】

皆様、闇に飲まれよ(訳:お疲れ様です。)

今回はアイドルマスターをデータサイエンスしていきたいと思います。
各タイトルは熊本弁で付けています。
まだ命名規則など正しく掴めていないので期待しないでください。
今回はスクリプト一切無しでやっていきます。

~~~ 少し前の事 ~~~

ワイ「今日はトッモとお出かけや。
世の中にはアイドルマスターなるコンテンツがあるそうやな。
軟弱なアニメやゲームなんぞにはハマらんで~。
データサイエンスは日々進化しとるからな。
プライベートでも日々精進や。
お前も勉強しとけよトッモ。」

友達「運転中暇やから音楽ながすで~」

(♪音楽再生中♪)

ワイ「お、聞かない曲やな。」

~~~ 数時間後 ~~~

ワイ「この~さか~みち~を、のぼ~るた~びに~」

友達「それがアイマスやで。」

ワイ「・・・・」

友達「ライブとアニメDVD貸すで。」

ワイ「FuFuu!!」

友達「コールまでばっちりやんけ。何回見たんや。」

「ククク、私の記事にたどり着くとは、アナタも「瞳」の持ち主のようね……。私の力に身を焼かれぬよう、せいぜい気をつけなさい。フフ、フフフフフ(訳:記事を見てくれてありがとう、頑張ります!! )」

少しハマりかけのアイマスをより深く理解するためにもデータからアプローチしてみます。

そもそもアイマスってご存じですか?
簡単に説明すると古くから続く日本の文化らしいです。
アイドル事務所のアイドルが頑張ってアイドルやるコンテンツです。

「我に力を!(訳:よろしくお願いいたします。)」

まずデータが置いてある場所を探すワケですが、765プロでは人数が少ないし346プロのデータを使ってみます。
ゲームの攻略wikiが使えそうなのでここを参考にしましょう。

デレステ攻略Wiki

取り出したデータから基本統計します。

-- Data Summary ------------------------
                           Values
Name                       data  
Number of rows             185   
Number of columns          10    
_______________________          
Column type frequency:           
  factor                   2     
  numeric                  8     
________________________         
Group variables            None  

-- Variable type: factor ----------------------------------------------------------
# A tibble: 2 x 6
  skim_variable n_missing complete_rate ordered n_unique
* <chr>             <int>         <dbl> <lgl>      <int>
1 type                  0             1 FALSE          3
2 name                  0             1 FALSE        185
  top_counts                                
* <chr>                                     
1 coo: 65, cut: 62, pas: 58                 
2 アナス: 1, イヴ・: 1, キャシ: 1, クラリ: 1

-- Variable type: numeric ---------------------------------------------------------
# A tibble: 8 x 11
  skim_variable n_missing complete_rate  mean    sd    p0   p25   p50   p75  p100
* <chr>             <int>         <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 hight                 0             1 156.   8.84 127   152   157   162   182  
2 old                   0             1  17.3  4.05   9    15    17    19    31  
3 weight                0             1  43.2  4.92  28    41    43    46    60  
4 bust                  0             1  80.9  6.67  60    77    81    85   105  
5 waist                 0             1  56.3  2.60  47    55    56    58    65  
6 hip                   0             1  81.2  5.00  65    79    81    85    93  
7 number                0             1  95.5 54.5    1    49    96   142   190  
8 BMI                   0             1  17.7  1.17  14.9  17.0  17.6  18.1  23.2

攻略サイトにあるデータは190人分。

#体重非公開
    hight old weight bust waist hip number BMI    type       name
181   166  26     NA   NA    NA  NA    181  NA passion     佐藤心
184   149  19     NA   NA    NA  NA    184  NA passion 夢見りあむ

#年齢非公開
   hight old weight bust waist hip number      BMI type     name
50   146  NA     40   84    57  84     50 18.76525 cute 安部菜々

#3サイズ非公開
    hight old weight bust waist hip number      BMI    type       name
25    145  13     40   NA    NA  NA     25 19.02497    cute 大沼くるみ
34    139  17     30   NA    NA  NA     34 15.52715    cute     双葉杏
181   166  26     NA   NA    NA  NA    181       NA passion     佐藤心
184   149  19     NA   NA    NA  NA    184       NA passion 夢見りあむ

年齢や体重、3サイズなどを記入していない人が居るので除いておきます。

「顕現せよ!(訳:とりあえずplot。)」

まずキャラを知らないのでタイプ別に分けて図にしてます。

01.png

これだけでも結構面白いことが分かりそうです。
データサイエンスはこのデータの図示からいかに有力な仮説を立てるかであったり、データの性質を正しく読み取れるかが重要であり面白さだと勝手に思ってます。
ドメインの知識が深くあればあるほど見える仮説は違うでしょうし、視点の置き方も変わってくると思います。
データサイエンスはデータとデータからの創作物にデータの背景にあるストーリーを語らせることができるものなので、ちょっと根拠のある憶測程度に考えながら色々ストーリーを作っていきましょう。

色分け

タイプごとに色分けしています。ggplotで色指定すると結構想像していたものと変わってしまう・・・
でもなるべくタイプのイメージカラーに寄せようと頑張って「青・ピンク・オレンジ」を選んでます。
右下の棒グラフから分かる通り、人数は最もクールキャラが多いです。

アイマスのアイドルがタイプを指定して志願してくるのか、事務所方針で入所後に変わるのかはわかりませんが、クールが多いようです。

身長

身長は、キュートタイプのキャラは身長が低い傾向にあるようです。
他のタイプよりも5~10cmほど低そうです。
身長と相関の高い特徴量を見てみると、体重・ヒップ・バスト・年齢・ウエストの順です。
身長が高ければ体重が重くなる、というのは一般的な感覚として一致します。
次にバストとヒップが相関が強く、ウエストが相関は特徴量の中では低いほうという部分はさすがアイドルということでしょう。
どのアイドルもウエストはキープしているのですね。

アイマスのアイドル年齢層は分布を確認すると10歳以上が多いです。
meijiの成長期についての報告では女性の身長は9歳,12歳に二度成長の波を迎えます。
つまりアイドルの身長はほとんど決まっている状態と考えておきましょう。
すると年齢と身長に相関が小さいのも納得ができます。

年齢

年齢はcoolが高い傾向にあります。

年齢が高いとキュートやパッションでは売り出しにくくなるのか、年齢に伴ってクール寄りの雰囲気になっていくからクールに割り振られるのか?
そう考えてみると、事務所側が年齢や雰囲気に適したタイプに振り分けていそうですね。
となると入所時にアイドル側からタイプ希望してくるというストーリーは成り立ちにくそう?

先ほど除外した永遠の17歳ウサミンこと安部菜々はキュートですが、年齢(永遠の17歳)は他のアイドルよりも高いことが考えられています。
本人の見た目や持ち味的にキュートやパッションでも活躍できると考えられてキュートに割り振られたのでしょう。
年齢とキャラどっちをとるのか。組み分け帽子もさぞ悩ん・・・おや、誰か来たようだ。

体重

体重はタイプ別で特に違いは無い様子。
これも身長の時と同様にウエストと年齢は相関が低く、身長・バスト・ヒップは相関が高いです。
アイマスのアイドルが「体重が増えた」、と言ってきたとしても、「腹回りの皮下脂肪が増えた」という結果にはなりません。
健康的な成長と言っていいでしょう。
ただし、内臓脂肪となると外見では分からない場合があるので注意です。さらに内臓脂肪型は内臓の機能障害などに結び付く可能性が高いので要注意です。
太り方のタイプは「ウエストと身長」もしくは「ウエストとヒップ」の比を計算すると皮下脂肪タイプか内臓脂肪タイプかひとつの指標が得られます。
今回はウエスト割る身長が0.5を超えたら内臓脂肪タイプという判断基準を使ってみます。

結果0.5を超えるアイドルはいませんでした。
では超えなかったとはいえ数値が高かったアイドルを確認してみます。

数値が0.44~0.43のアイドル

    hight old weight bust waist hip number     BMI    type     name
164   128   9     29   61    57  67    167 17.7002 passion 市原仁奈
18    127   9     31   60    55  65     18 19.22004 cute 横山千佳

どちらも年齢的に身長が小さく、ウエストとの比が大きく出ていると考えられます。
問題ないでしょう。このまま成長したら数値は下がっていくと思われます。

数値が0.42のアイドル

  hight old weight bust waist hip number      BMI type       name
8   153  17     52   90    65  89      8 22.21368 cute 三村かな子

oh....
内臓脂肪は危ないですからね。
気を付けましょうね。

3サイズ

相関は大体身長と体重の関係から説明できていると思います。
なによりもウエストをしっかりキープしているところがすごいですね。
さすがアイドルです。

バストはクールとパッションがキュートよりも高いです。
これはキュートが身長低めであったことからも納得できます。
年齢の分布から見てもキュートは年齢が低いのでバスト・身長も低いということでしょう。

ウエストはパッションが少しばかり大きいようです。
対角線に描画されている分布を確認するとパッションは大きい方向に外れ値のようなコブがあります。
確認してみましょう。

    hight old weight bust waist hip number      BMI    type       name
139   162  17     58   92    65  93    142 22.10029 passion 海老原菜帆
140   170  16     56  105    64  92    143 19.37716 passion     及川雫
158   182  17     60   91    64  86    161 18.11375 passion 諸星きらり

発育が良過ぎる....

パッションはこのお三方がいましたね。
ウエストが大きいですが、この三人はバストが大きいことでも知られています。さらに身長も十分に大きいです。
パッションは元気ではじけるようなアイドルが多いのでしょう。

ただ規格外のパラメータを持つアイドルは外れ値となって影響してくる場合があるので、分析時には要注意です。

最後に箱ひげ図

右列に箱ひげ図がついています。
箱ひげは分布を確認すると同時に外れ値についても語ってくれる優秀な図です。
ウエストについての箱ひげ図を見ると、大きな3人が確認できます。
他にも、クールではウエストやヒップが低いキャラが良そうなこともわかります。

個人名前別に図で確認する

クリックしてもらうとhtmlに飛んでぐりぐり確認できます。

everyone-names

せっかくなので推定も

データサイエンスはデータの性質を語るだけでなく、推定することもできます。
今回はプロフィール未公開のキャラのデータを推定してみましょう。
ただし完全に得られるデータ数が185人分しかなく、データが少ないためにあまり精度は期待できません。
トイプロブレムとしてたのしんでいきます。

簡単な方法

このデータ量であれば平均値補間などでも十分に思いますが。
単純な方法として回帰してみます。

年齢に対してBMI以外は相関が高いので回帰に使えそうです。
ただし身体に関するパラメータなので多重共線性が生まれること必須でしょう。
そこは注意ですが、トイプロブレムとして遊ぶだけなので許容します。

02.png

タイプによって多少傾き方は違いますが、図を見る限りすべてのアイドルを統一してモデルを作ってしまっても問題ないでしょう。

04.png

07.png

身長で年齢を予測するモデル

Call:
lm(formula = old ~ hight, data = data)

Residuals:
    Min      1Q  Median      3Q     Max 
-8.3213 -1.6254 -0.4888  1.2006 11.9957 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -31.20224    3.89374  -8.013 1.27e-13 ***
hight         0.31057    0.02487  12.487  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.983 on 183 degrees of freedom
Multiple R-squared:   0.46, Adjusted R-squared:  0.4571 
F-statistic: 155.9 on 1 and 183 DF,  p-value: < 2.2e-16

体重で年齢を予測するモデル

Call:
lm(formula = old ~ weight, data = data)

Residuals:
    Min      1Q  Median      3Q     Max 
-8.6837 -1.7405 -0.2328  1.2801 13.7724 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -4.1612     2.1055  -1.976   0.0496 *  
weight        0.4974     0.0484  10.278   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.232 on 183 degrees of freedom
Multiple R-squared:  0.366, Adjusted R-squared:  0.3625 
F-statistic: 105.6 on 1 and 183 DF,  p-value: < 2.2e-16

身長から年齢 Adjusted R-squared: 0.4571
体重から年齢 Adjusted R-squared: 0.3625
R二乗値を見ると体重での予測はあまり精度が良くなさそうです。
R二乗値はデータをどれだけモデルが説明できているかどうかの値です。

03.png

他にバスト・ウエスト・ヒップからの推定モデルを作りましたが、身長が一番精度良さそうです。

さて、推定モデルができたところで、永遠の17歳の年齢を予測してみましょう。

  hight old weight bust waist hip number      BMI type     name
1   146  NA     40   84    57  84     50 18.76525 cute 安部菜々

結果は

predict(lm_model,unknown_old) = 14

14歳

身長からの年齢推定結果は14歳だそうです。
他の変数も使って重回帰してみます。

  Call:
    lm(formula = old ~ ., data = data[, c(1:6, 8)])

  Residuals:
    Min      1Q  Median      3Q     Max 
  -7.5781 -1.7232 -0.4598  1.4356 10.2042 

  Coefficients:
  Estimate Std. Error t value Pr(>|t|)   
  (Intercept) -91.97824   53.89544  -1.707  0.08964 . 
  hight         0.62639    0.34593   1.811  0.07186 . 
  weight       -0.82525    0.64564  -1.278  0.20285   
  bust          0.22828    0.08364   2.729  0.00698 **
  waist        -0.01595    0.12880  -0.124  0.90158   
  hip          -0.01443    0.11073  -0.130  0.89647   
  BMI           1.73723    1.53706   1.130  0.25990   
  ---
  Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

  Residual standard error: 2.898 on 178 degrees of freedom
  Multiple R-squared:  0.5044,  Adjusted R-squared:  0.4877 
  F-statistic:  30.2 on 6 and 178 DF,  p-value: < 2.2e-16

モデルの精度は身長の時とそんなに変わりませんので、出力結果にもそんなに期待はできないでしょう。

ちなみに結果は 16歳 と予測されました。
17歳に少しだけ近づきました。

でも14とか16とかおかしいやろ。
永遠の17歳って言っているひとが10代前半の...おや、誰か(略)

外れ値を考慮

先ほど3サイズの項でもお話した通り、推定を行うときに外れ値の影響に引っ張られている可能性がありますので、これを考慮したいと思います。
特に単純な線形回帰は外れ値があると影響を大きく受けますので。

hazure.png

重回帰モデルで影響を強く受けているデータを可視化することができます。
図中に出てくる140,144,158に相当するアイドルを確認しましょう。

    hight old weight bust waist hip number      BMI    type       name
140   170  16     56  105    64  92    143 19.37716 passion     及川雫
144   152  28     47   92    58  84    147 20.34280 passion   片桐早苗
158   182  17     60   91    64  86    161 18.11375 passion 諸星きらり

これまた規格外の方々が登場です。
で....いや、言うまい。
夢が詰まっている三人ですが、外れ値として取り除かせていただきます。

ちなみに体重・ウエスト・バストの関係を図にするとこんなこともできます。
これもクリックで飛びます。

weight-waist-bust-bubble
Call:
lm(formula = old ~ ., data = data[, c(1:6, 8)])

Residuals:
    Min      1Q  Median      3Q     Max 
-5.5294 -1.5882 -0.3683  1.4307 10.6882 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)   
(Intercept) 28.62572   56.20220   0.509  0.61116   
hight       -0.15588    0.36194  -0.431  0.66723   
weight       0.72244    0.68533   1.054  0.29327   
bust         0.22231    0.08265   2.690  0.00784 **
waist        0.05964    0.12129   0.492  0.62353   
hip         -0.06888    0.10652  -0.647  0.51872   
BMI         -1.91493    1.62097  -1.181  0.23907   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.692 on 175 degrees of freedom
Multiple R-squared:  0.5626,    Adjusted R-squared:  0.5476 
F-statistic: 37.51 on 6 and 175 DF,  p-value: < 2.2e-16

R二乗値が改善しましたね。
予測結果は15歳でした。

...........。

モデルがッ!正しくなるまでッ!推定するのをやめない!

重回帰や。重回帰が悪いんや。
世の中にはもっとすごい推定モデルがある!

「我が魂の赴くままに!高次元写像!(訳:次に試すのはSVMです)」

Support Vector Machine object of class "ksvm" 

SV type: eps-svr  (regression) 
 parameter : epsilon = 0.1  cost C = 1 

Gaussian Radial Basis kernel function. 
 Hyperparameter : sigma =  0.335111772470748 

Number of Support Vectors : 127 

Objective Function Value : -53.3494 
Training error : 0.365601 

訓練データは2.4歳のズレ、テストデータは2.8歳のズレで予測するモデルができました。
予測結果は、15歳
カーネルトリックをもってしても勝てないのか。

「自然、木々の力を借りるとしよう。(訳:決定木やランダムフォレストもやってみます)」

単純な決定木モデルではこんな予測になります。

rpart-reg.png

身長が高ければ年齢も高いと判断しているようです。
17歳以上と判断してもらうにはまず体重が43以上である必要があります。
安部菜々は体重は40で身長は146センチなので17歳以上判定をとるのは難しそうです。

予測は15.7歳

もう少し決定木を複雑にしたランダムフォレストでは、

Call:
 randomForest(formula = old ~ ., data = data_training, importance = T,      proximity = T, ntree = 100) 
               Type of random forest: regression
                     Number of trees: 100
No. of variables tried at each split: 2

          Mean of squared residuals: 7.537419
                    % Var explained: 52.96

予測は15.8歳

ちなみにこのランダムフォレストは訓練のズレ1.4歳,テストのズレ3歳でした。
ランダムフォレストは精度を上げるためにどんな特徴量を重視したらいいかを教えてくれます。

imp.png

年齢を予測するには「身長・体重・バスト」が重要なようです。
では言われた通りにこの3変数から年齢を予測してみましょう。

結果は16.2歳でした。
(多少17歳に近づいてきてる。)

結果発表~~~!!!

ウサミンは17歳以下。むしろ逆サバしてる。
ラブリー17歳」は正しかったんですね。

より正確に年齢推定するには3サイズや身長体重では情報が足りないのでしょうね。
健康診断結果とか、体組織のデータなどあれば年齢推定の助けになるかもしれません。

こうして新しく推定に効果あるデータを集めよう!という話に繋げられるのもデータサイエンスの面白いところです。

追記

他にも推定方法は色々ありますが、今回の分析はデータ量や特徴量からも望み薄だったので人気の方法を、データサイエンスの流れを説明するためにいくつか絞って採用しました。

今回は年齢推定ですが、データサイエンスでできる事はまだまだあります。
3サイズの推定もできるでしょう。
画像データから3サイズや身長・体重・年齢などを推定することもできるでしょう。
身体情報と趣味を記入すると自分が何タイプのアイドルかを推定してくれるような識別器も作れるでしょう。

データがあればアイデア次第で展望は無限大です。
ワクワクしませんか?

さぁ、アイマス好きなあなた!一緒にデータサイエンスしましょう!

スクリプトはgithubで共有します。

3サイズ推定もやってみたけど

  hight old weight bust waist hip number      BMI    type       name pred_bust pred_waist pred_hip
1   145  13     40   NA    NA  NA     25 19.02497    cute 大沼くるみ  74.22468   54.58933 76.30892
2   139  17     30   NA    NA  NA     34 15.52715    cute     双葉杏  73.16390   54.04179 75.06431
3   166  26     NA   NA    NA  NA    181       NA passion     佐藤心  88.50332   58.08068 86.56527
4   149  19     NA   NA    NA  NA    184       NA passion 夢見りあむ  78.32339   55.45990 79.03256

やっぱり年齢や身長から判断しているっぽい。
判断材料が無いから仕方ないね。

参考

https://machinelearningmastery.com/tune-machine-learning-algorithms-in-r/
http://d-m-l.jp/Rbiz/task_rf.html
https://www.kaggle.com/koushikgangavaram/titanic-rf-prediction-0-81818/notebook
http://mametalk.blog32.fc2.com/blog-category-6.html
http://www.pu-hiroshima.ac.jp/~ttetsuji/R/[27]rf.html
https://arakan-pgm-ai.hatenablog.com/entry/2019/08/13/000000
http://elsur.jpn.org/mt/2014/07/001949.html
https://qiita.com/kenmatsu4/items/1152d6e5634921d9246e
https://amalog.hateblo.jp/entry/decision-tree-scaling
http://aiweeklynews.com/archives/50653819.html
https://qiita.com/ttskng/items/2a33c1ca925e4501e609
https://futurismo.biz/archives/6736
http://drilldripper.hatenablog.com/entry/2017/02/07/183412
https://rstudio-pubs-static.s3.amazonaws.com/52658_be4f330b073149a38c0e917e2ad1f21e.html
https://www.kaggle.com/nsrose7224/random-forest-regressor-accuracy-0-91
https://www.kaggle.com/zhaqe17/title
http://d-m-l.jp/Rbiz/task_rf.html
https://www.kaggle.com/adachowicz/house-prices-random-forest-regression-analysis
https://www.kaggle.com/sahilyagnik/prediction-with-random-forest-regression-method
https://www.kaggle.com/celikagit/revenue-prediction-using-random-forest-regressor
https://qiita.com/katsu1110/items/a1c3185fec39e5629bcb
https://qiita.com/Falcon__0904/items/30e93a43d519f8c8aea0
https://aotamasaki.hatenablog.com/entry/bias_in_feature_importances
Ringa_hyj
R,python,ML,社内コンサル。 元:生命科学(創薬有機),製品開発・実験計画 現在:製造業,概念検証(需要予測,異常検知,etc.) https://amazongodman.github.io/
https://sit-jhonny.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away