喜多見柚の体型はどのくらい平均的なのか

喜多見柚の身長，体重，３サイズはシンデレラガールズのアイドルの平均値にかなり近い，とよく言われているので，実際にどれほど近いのか，また，他のアイドルはどうなのか，３通りの方法で定量的に確かめてみました．（統計学初心者なのでそれらの方法が妥当なのかは判断しかねますが...）

ただし，計算に当たって，プロフィールで数値を確認できないアイドルは除外しました（大沼くるみ，佐藤心，双葉杏，夢見りあむ）．

環境
google colab(python3.6.8)
使ったファイルはここhttps://github.com/ysk0832/hobby

#はじめに
平均値と見比べてみる。

   |身長|体重|B|W|H
---|---|---|---|---|---
平均値|156.23|43.2|80.88|56.31|81.24
喜多見柚|156|43|82|57|82

確かにほぼほぼ同じですね。

#方法１：cos類似度
cos類似度は、文書の比較などによく用いられる指標です。式は簡単で内積の定義を変形しただけ。
$$\cos\theta=\frac{a \cdot b}{\|\|a\|\|\|\|b\|\|}$$

コードは以下

```python
import numpy as np 
import pandas as pd

# 関数定義
# 内積
def ip(a,b):
  return (a*b).sum()
# ノルム
def norm(x):
  sum=(x*x).sum()
  return np.sqrt(sum)
# 類似度
def sim(a,b):
  return ip(a,b)/(norm(a)*norm(b))

# csv読み込み
df=pd.read_csv("cg.csv")
# 確認
print(df)

# 平均
mean=df.mean(numeric_only=True)

# 計算結果をリストに保存
simlist=[]
for i in range(0,186):
  result=sim(mean,df.iloc[i,1:6])
  print(result)
  simlist.append(result)

# 列を追加
df["類似度"]=simlist

# 類似度が高い順に出力
print(df.sort_values("類似度",ascending=False))
```

結果（上位１０人，下位１０人）
<img width="359" alt="top10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462051/042522e0-e361-b61c-cc7a-9e3441dfe14b.png">
<img width="367" alt="worst10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462051/1f7dd69e-f1d0-8b47-cb81-c5cbbf6afe64.png">

柚は3位でした．三船美優さんが2位...?!

#方法２：正規化する
各列ベクトルを0-1に正規化して再びcos類似度を計算してみます．
$$\frac{x-x_{min}}{x_{max}-x_{min}}$$

```python
# 一旦削除
df=df.drop("類似度",axis=1)

# 正規化して再計算

# 名前抜き
df_tmp=df.iloc[:,1:6]

# 正規化
df2=(df_tmp-df_tmp.min())/(df_tmp.max()-df_tmp.min())
mean2=(mean-df_tmp.min())/(df_tmp.max()-df_tmp.min())

# 計算結果をリストに保存
simlist=[]
for i in range(0,186):
  result=sim(mean2,df2.iloc[i,:])
  print(result)
  simlist.append(result)

# 列を追加
df["類似度"]=simlist

# 類似度が高い順に出力
print(df.sort_values("類似度",ascending=False))
```

結果
<img width="348" alt="top10normal.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462051/80510a90-2da4-7d7f-4e62-176f047470ae.png">
<img width="356" alt="worst10normal.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462051/b7aea5c0-afe2-5fe1-7692-88c357ea641f.png">

柚は7位．さっきと半分ほど被ってますね．

とは言っても，みんな類似度0.99超えててほとんど同じじゃないかと思ってしまいます．これはどうやら今回のデータが全て正の値なのも原因のようです．
https://cartman0.hatenablog.com/entry/2019/05/22/_cos%E9%A1%9E%E4%BC%BC%E5%BA%A6%E3%81%AE%E6%AC%A1%E5%85%83%E3%81%AE%E5%91%AA%E3%81%84
また，cos類似度はあくまでもベクトルの開き具合を見ているのであって，近い点だから類似度が高いとは一概には言えません．美優さんが2位になったのもそのためと考えられます．
ということで方法３へ．

#方法３：距離
シンプルに平均値からのユークリッド距離を計算します．

```python
df=df.drop("類似度",axis=1)

# 平均値との距離
dlist=[]
for i in range(0,186):
  d=norm(df.iloc[i,1:6]-mean)
  dlist.append(d)

# 列を追加
df["距離"]=dlist

# 距離が近い順に出力
print(df.sort_values("距離"))
```

結果
<img width="341" alt="top10d.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462051/cf67fb0f-1656-2c74-a393-8e26f34f8f73.png">
<img width="352" alt="worst10d.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462051/bbcfd867-93f2-8f4e-7a08-cd10991f8cec.png">

喜多見柚1位！！！！！！

#まとめ
今回は「体型が近い」の解釈の仕方によって評価指標も変わったのかなと．類似度は平均との比較というよりは，「この二人は身長はまるで違うがどちらも痩せ型である」みたいなことを知りたいときに使えばいいって感じですかね？

---

ということで，
**喜多見柚はシンデレラガールズでもっとも平均的な体型のアイドルである**
![ブルーミーヒロイン.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462051/fe9f2b97-1f53-dc32-90a3-ef5922c603eb.jpeg)