1500m牛丼を大真面目に(簡単に)分析する

# 1500m牛丼とは
## 発端
1500m牛丼は2016年9月、YouTuberの東海オンエアによって公開された、[新競技「1500m牛丼」で世界新記録達成！！](https://www.youtube.com/watch?v=ihFCPDg34fo) を発端とする競技である。
東海オンエアメンバーの記録は以下の通りである。なお、てつや氏は牛丼を完食できず、いまだ競技である。
| rank | 名前 | 1500m | 牛丼 | 合計 |
|:-:|:-:|:-:|:-:|:-:|
| 1 | りょう | 5'23 | 6'55 | 12'18 |
| 2 | しばゆー | 6'48 | 11'49 | 18'37 |
| 3 | としみつ | 7'57 | 13'18 | 21'25 |
| - | てつや | 6'16 | --- | --- |
## 弊部の取り組み
弊部活動では動画が公開された2016年から、年に1回のペースでレクリエーションの一環として実施されている。2019年までは長距離パートの恒例行事となっていたが、2020年から2021年までのコロナによる中断期間を経て、2022年、2023年は短距離パートやフィールドパートを含めて年末行事として行われた。特に本年2023年は50人以上が参加し盛大に(?)実施された。
# 分析してみた
記録が手元に残る2017年から2023年までの119記録に関して簡単に分析を行った。csvファイルは、1500mの記録、牛丼の記録、パート分類(1:中距離or長距離、2:その他)、年度が含まれる。

~~~main.py
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from matplotlib.colors import ListedColormap
df = pd.read_csv('timenew.csv')
df['total'] = df['1500mSec'] + df['BeefBowlSec']
df['Year'] = df['Year'].astype('int')
~~~
とりあえず散布図を書いてみる。青は中長距離パート、赤はその他である。
~~~main.py
df.plot.scatter(x='1500mSec', y='BeefBowlSec', c=df.part.values, cmap= "bwr")
x = np.linspace(0, 1500)

plt.xlim(0, 1500)
plt.ylim(0, 1500)

plt.show()
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516074/42b2e1d2-ac4e-1fee-904b-eed185523a6e.png)

散布図行列を書いてほかの変数に対しても確認してみる
~~~main.py
import seaborn as sns
sns.pairplot(df, height=1.5)
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516074/9b57dd4c-f1dc-663f-eb55-ada822550704.png)


続いて相関関係を見る
~~~main.py
pd.options.display.precision = 4 #出力桁数
df.corr()
~~~
結果は
||1500mSec|BeefBowlSec|Year|part|total|
|---|---|---|---|---|---|
|1500mSec	|1.0000	|-0.0777	|0.2644	|0.6198	|0.1597|
|BeefBowlSec	|-0.0777	|1.0000	|0.0519	|-0.0677|0.9718|
|Year	|0.2644	|0.0519	|1.0000	|0.4704	|0.1140|
|part	|0.6198	|-0.0677	|0.4704	|1.0000	|0.0797|
|total	|0.1597	|0.9718	|0.1140	|0.0797	|1.0000|

1500mの記録(1500mSec)と牛丼の記録(BeefBowlSec)にもう少し相関があるかと考えていたが、ほぼ相関がみられなかった。逆に、牛丼と合計タイムには正の強い相関がみられる。




## 学内記録を出すためには
弊部の最高記録は7'17"である。そこで、8分以内の記録に対し、分析を行う。なお、この記録を出しているのは全員専門種目が中長距離である。
~~~main.py
df_480=df[(df['total'] <= 480) ]
df_480.plot.scatter(x='1500mSec', y='BeefBowlSec')
x = np.linspace(0, 400)

#等値線(totaltime)を引く
for i in range(0,8): 
  y = -x + 400+i*20
  plt.plot(x, y,c="gray")

plt.xlim(0, 400)
plt.ylim(0, 400)

#一次近似
res = np.polyfit(df_480['1500mSec'], df_480['BeefBowlSec'], 1)
plt.plot(x, np.poly1d(res)(x))

plt.show()
~~~
結果は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516074/4f6589a5-eccb-510a-f111-cff234d547ad.png)
相関関係を出すと
~~~main.py
pd.options.display.precision = 4
df_480.corr()
~~~

||1500mSec	|BeefBowlSec	|Year	|part	|total|
|---|---|---|---|---|---|
|1500mSec	|1.0000	|-0.7281	|-0.3680	|NaN	|-0.1823|
|BeefBowlSec	|-0.7281	|1.0000	|0.4323	|NaN	|0.8067|
|Year	|-0.3680	|0.4323	|1.0000	|NaN	|0.3028|
|part	|NaN	|NaN	|NaN	|NaN	|NaN|
|total	|-0.1823	|0.8067	|0.3028	|NaN	|1.0000|

1500mの記録(1500mSec)と牛丼の記録(BeefBowlSec)の相関係数は-0.73となった。ある程度の記録を出そうと思うと、1500mを余力を持って走り、牛丼をいかに速く食べるかが求められそうである。


## 自己記録を目指すには
8分以上、12分以下の記録に対し、分析を行う。
~~~main.py
df_720=df[(df['total'] <= 720) & (df['total'] >= 480)]
df_720.plot.scatter(x='1500mSec', y='BeefBowlSec',c=df_720.part.values, cmap= "bwr")
x = np.linspace(0, 500)

#Part=1,Part=2のそれぞれの中心を書く
centroids = df_720.groupby('part')[['1500mSec', 'BeefBowlSec']].mean()
plt.scatter(centroids['1500mSec'], centroids['BeefBowlSec'], marker='o', s=100,  c=['royalblue', 'orangered'])

#等値線(totaltime)を引く
for i in range(0,8):
  y = -x + 480+i*50
  plt.plot(x, y,c="gray")

plt.xlim(0, 500)
plt.ylim(0, 500)

#一時近似
res = np.polyfit(df_720['1500mSec'], df_720['BeefBowlSec'], 1)
plt.plot(x, np.poly1d(res)(x))

plt.show()
~~~
結果は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516074/dcc5f39f-b6ea-2dfb-afd2-e18149931118.png)


相関は
||1500mSec	|BeefBowlSec	|Year	|part	|total|
|---|---|---|---|---|---|
1500mSec	|1.0000	|-0.2758	|0.2460	|0.6443	|0.3450
BeefBowlSec	|-0.2758	|1.0000	|-0.2561	|-0.1286	|0.8071
Year	|0.2460	|-0.2561	|1.0000	|0.5062	|-0.0990
part	|0.6443	|-0.1286	|0.5062	|1.0000	|0.2701
total	|0.3450	|0.8071	|-0.0990	|0.2701	|1.0000

中長距離選手(Part=1)とその他競技選手(Part=2)で偏りが見られる。

# まとめ
可視化を中心に行った。考察は特にしていないがが、1500ｍの記録よりもとにかく牛丼を速く食べることが一番。時間があればほかにもいろいろ追記するかも？