「大相撲の決まり手って傾向あるの?」をpandasとmatplotlibで調べたよ。vol.2
背景
-
7月末からデータサイエンスの領域を学ぶことにして、先日「ちょっとやってみたこと(大相撲の決まり手分析)」をzennで書いたところ、コアな相撲ファンからフィードバックをもらいました。
前回の記事:「大相撲の決まり手って傾向あるの?」をpandasとmatplotlibで調べたよ -
そのコアな相撲ファンからもらったフィードバックをもとに新たな仮説を立てたので今回分析した結果をメモとして残します。
前回の結論とコアな相撲ファンからのフィードバック
前回の結論
詳しくは前回の記事を見てもらえればと思いますが、
- 押し出しが決まり手として一番多くて、「押し出し/寄り切り/突き落とし」でほとんど勝敗は決まっている。
- 力士ごとに決まり手や手数は若干異なるものの、土俵外へ出す決まり手が大半。照ノ富士つよい。
コアな相撲ファンからのフィードバック
「従来は体格が良く、体を持ち上げるタイプの相撲取る人が多かったので寄り切る相撲が多かった
しかし最近は押し力士(つっぱりと押し)が増えたので去年か一昨年くらいに押し出しが寄り切りを上回った。貴景勝は寄り切りで踏ん張れないから押し出しが多いはず」
・・・。
コアなファンすごい。自分の結論を軽く上回ってきて泣けます。
しかし、若干疑い深い自分は
「貴景勝は寄り切りで踏ん張れないから押し出しが多いはず」
これをまず調べてみました。
すると、
「コアなファンすごい!!押し出し多い!!寄り切り、確実に少ない!!」と興奮がおさまらない結果に。
個人の相撲内容まで頭に叩き込んでいることに尊敬しかありません。
そこでもらったフィードバックをもっと分析してみようと以下の仮説を立てました。
仮説
- 体格の良い、体重が重い力士は寄り切りが多く、逆に体重が少ない力士は押し出しが多いのではないか
- 体重差を比較した場合、各試合の結果が押し出しの試合は軽い力士、寄り切りの試合は重い力士が勝つ傾向があるのではないか
この仮説を検証するために、まずは前回の2022年夏場所(5月)の幕内データに加えて、各力士の体重データを収集して統合することにしました。
今回も環境はGoogle Colaboratoryです
一応押し出しと寄り切りの説明を加えます。
※日本相撲協会の決まり手八十二手からそのまま説明文を拝借
- 押し出し:両手又は片手を筈(はず:親指と他の4本の指をY字に開くこと)にして、相手の脇の下や胸に当て、土俵の外に出して勝つことを言います。相撲の中でも全ての基本となる技です!
- 寄り切り:相手に体を密着させて前か横に進んで土俵の外に出して勝つことを言います。
押し出しと寄り切りとでテンションが全然違うのが絶妙にツボです。
内容
データを追加する
まずは前回のデータの読み込みです。
import pandas as pd
df = pd.read_csv('/content/drive/MyDrive/sumo/dataset/sumo.csv')
df
以下が読み込んだデータです。
東 東.1 東.2 決まり手 西 西.1 西.2 Date
0 東横綱 照ノ富士 0 押し出し 1 大栄翔 西小結 1
1 東大関 御嶽海 1 押し出し 0 高安 東前筆 1
2 東前2 霧馬山 1 寄り切り 0 正代 西大関 1
3 西前2 琴ノ若 1 押し出し 0 貴景勝 西大関 1
4 東関脇 若隆景 1 寄り切り 0 北勝富士 東前3 1
... ... ... ... ... ... ... ... ...
294 東前15 東龍 0 足取り 1 照強 西前8 15
295 東前9 琴勝峰 0 はたき込み 1 碧山 東前11 15
296 西前16 翠富士 1 肩透かし 0 栃ノ心 西前9 15
297 東前10 隠岐の海 1 上手投げ 0 明生 西前13 15
298 東前13 千代大龍 0 寄り切り 1 錦木 西前10 15
続いて幕内の力士の体重データを収集します。今回はBeautifulSoupを使ってみました。とっても美味しそうな名前。
# 今回はBeautifulsoupを活用
!pip install beautifulsoup4
いい感じに各力士のデータが集まっているところを探しているとドコモさんのdメニューのページの7月版が良さげでしたのでここから取得を試みます。
# requestsメソッドのimport
import requests
from bs4 import BeautifulSoup
# Responseチェック
requests.get('https://sumo.sports.smt.docomo.ne.jp/rikishidata/weight.html')
ここでResponse[200]と返って来ればいいのですが
Response [403]
403で返ってきてしまいました。ぐぬぬ・・・
なんとかできないかと調べてみたところ、request headerとreferを指定したらいける、ということなので早速試してみると
# Rrequest403が出たので、調べたところ以下書き方で対応可能
home_url = 'https://sumo.sports.smt.docomo.ne.jp/'
url = 'https://sumo.sports.smt.docomo.ne.jp/rikishidata/weight.html'
headers = {
'User-Agent':'Mozilla/5.0',
"referer":home_url
}
# requestのレスポンス確認 =>200
r = requests.get(url = url, headers = headers)
# BeautifulSoupでhtmlデータ取得
bs = BeautifulSoup(r.text, 'html.parser')
bs
すると
<title>力士 体重データ|スポーツ情報はdメニュースポーツ</title>
<meta content="大相撲、力士データの体重です。大相撲を楽しむならdメニュースポーツ!取組速報や力士情報、最新ニュースを無料でご覧頂けます。" name="description"/>
<meta content="大相撲,番付,取組,速報,dメニュー,ドコモ" name="keywords"/>
<!-- ogp -->
<meta content="力士 体重データ|スポーツ情報はdメニュースポーツ" property="og:title"/>
・・・以下略
と、無事取得できそうです(一歩前進)
体重のところは以下の形になっています。逸ノ城、重い。
<tbody>
<tr>
<th class="rank">1位</th>
<td class="player">
<a href="/rikishi/021310.html">
<span class="rank">
関脇 </span>
逸ノ城 <span class="num">
211kg </span>
</a>
</td>
</tr>
・・・以下略
どんなテーブル構成なのかもわかったので、力士の名前の列をrikishiのaタグから、体重列はspanのclassから取ってくることにします。
import re
# atag/rikishiのデータを全て取得
names_list = bs.find_all(href=re.compile('/rikishi/'))
print(names_list)
# class属性numを持つデータを全て取得
weights_list = bs.find_all(class_='num')
print(weights_list)
このデータを以下でDataFrameにします。
# nameの列をもつDataFrameを準備
df_name = pd.DataFrame(index = [], columns = ['name'])
# weightの列をもつDataFrameを準備
df_weight = pd.DataFrame(index = [], columns = ['weight'])
from collections import UserList
# names_listから一つずつ取り出す
for name in names_list:
rikishi_name = name.getText()
#dataに列データを格納
data = pd.Series([rikishi_name], index = df_name.columns)
#df_nameのDataFrameに格納
df_name = df_name.append(data,ignore_index = True)
#\n\nを削除
df_name['name'] = df_name['name'].str[2:]
for weight in weights_list:
rikishi_weight = weight.getText()
#dataに列データを格納
data = pd.Series([rikishi_weight], index = df_weight.columns)
#df_weightのDataFrameに格納
df_weight = df_weight.append(data,ignore_index = True)
#\nを削除
df_weight['weight'] = df_weight['weight'].str[1:]
#横に結合
df_rikishi = pd.concat([df_name, df_weight], axis=1)
df_rikishi
無事、取得できました
(「だんだん、このあたり慣れてきたぞ」という興奮がとまりません)
name weight
0 関脇 ... 211kg ...
1 前頭7枚目 ... 200kg ...
2 小結 ... 190kg ...
3 大関 ... 184kg ...
4 関脇 ... 182kg ...
5 横綱 ... 181kg
・・・
37 前頭2枚目 ... 134kg ...
38 前頭4枚目 ... 132kg ...
39 関脇 ... 131kg ...
40 前頭10枚目... 112kg ...
41 前頭3枚目 ... 111kg ...
本当はname列は力士名だけ取得したかったんですが、構造上それ以外の内容も取得されてしまっています。
(これはうまいやり方があったら知りたいです泣。)
仕方ないので、name列に含まれてる名前が元のdfデータに含まれていたら体重を追加するという処理を書いて対応しました。
# dfの長さ
lendf = len(df)
# df_rikishiの長さ
lendr = len(df_rikishi)
# dfに東.w(weightの意)のcolumnを作る
df['東.w'] = ''
# 東.1に一致する名前がdf_rikishiのname列にあれば、対応するweightを入れる
for i in range(lendf):
for j in range(lendr):
if df['東.1'][i] in df_rikishi['name'][j]:
df['東.w'][i] = df_rikishi['weight'][j]
# 同じ処理を西でもやる
df['西.w'] = ''
for i in range(lendf):
for j in range(lendr):
if df['西.1'][i] in df_rikishi['name'][j]:
df['西.w'][i] = df_rikishi['weight'][j]
df
無事、東.w列と西.w列が追加されました。よかった。
東 東.1 東.2 決まり手 西 西.1 西.2 Date 東.w 西.w
0 東横綱 照ノ富士 0 押し出し 1 大栄翔 西小結 1 181kg ... 162kg ...
1 東大関 御嶽海 1 押し出し 0 高安 東前筆 1 169kg ... 184kg ...
2 東前2 霧馬山 1 寄り切り 0 正代 西大関 1 139kg ... 165kg ...
3 西前2 琴ノ若 1 押し出し 0 貴景勝 西大関 1 166kg ... 163kg ...
4 東関脇 若隆景 1 寄り切り 0 北勝富士 東前3 1 131kg ... 166kg ...
... ... ... ... ... ... ... ... ... ... ...
294 東前15 東龍 0 足取り 1 照強 西前8 15 111kg ...
295 東前9 琴勝峰 0 はたき込み 1 碧山 東前11 15 159kg ... 182kg ...
296 西前16 翠富士 1 肩透かし 0 栃ノ心 西前9 15 112kg ... 168kg ...
297 東前10 隠岐の海 1 上手投げ 0 明生 西前13 15 156kg ... 148kg ...
298 東前13 千代大龍 0 寄り切り 1 錦木 西前10 15 190kg ... 172kg ...
しかし、追加した体重データは
- 7月のデータなので幕内力士が5月とは入れ替わっている
- 幕内力士で欠場が出た時に十両から繰り上がっているケースがある
- kgが計算するときに邪魔になる & strだとグラフが作れないのでint型に変換が必要
そこで以下の処理を加えました。
# 体重が入らなかった力士の抽出
# print(df[df['東.w'] == ''])
# print(df[df['西.w'] == ''])
# 体重データが入っていない力士(既に7月場所で幕内から外れているパターン)東龍/荒篤山/輝/千代の国/水戸龍/英乃海/竜電
# 東龍 165kg/荒篤山 165kg/輝 159kg/千代の国 148kg /水戸龍 198kg/英乃海 167kg/竜電 153kg
# 体重が空の力士データを集めて辞書型にする
d = {'東龍':'165kg', '荒篤山':'165kg', '輝':'159kg', '千代の国':'148kg', '水戸龍': '198kg', '英乃海':'167kg', '竜電':'153kg'}
# 東.1にdのkeyに対応する力士がいれば、その力士の体重を入れる
for i in range(lendf):
if df['東.1'][i] in d.keys():
df['東.w'][i] = d[df['東.1'][i]]
# 西も同じ処理
for i in range(lendf):
if df['西.1'][i] in d.keys():
df['西.w'][i] = d[df['西.1'][i]]
# print(df[df['東.w'] == ''])
# print(df[df['西.w'] == ''])
# 確認用
print(df[df['西.1'] == '東龍'])
# kgの削除
for i in range(lendf):
df['東.w'][i] = df['東.w'][i].replace('kg', '')
df['西.w'][i] = df['西.w'][i].replace('kg', '')
# strからintに型を変換
df['東.w'] = df['東.w'].astype(int)
df['西.w'] = df['西.w'].astype(int)
df.dtypes
これで綺麗なDataFrameになったのでcsvにして保存します。
ここまで毎度一苦労。興味ない分野だと間違いなく心が折れます。
# 取得したデータをcsvにしてdatasetに入れる。idexを入れない(取り出す時に使いやすい)
df.to_csv("/content/drive/MyDrive/sumo/dataset/sumoweight.csv", index=False)
データを読み込んで分析
ここからは念願の分析です。やっと分析できる、、、万歳!
# csvデータの読み込み
df = pd.read_csv('/content/drive/MyDrive/sumo/dataset/sumoweight.csv')
df
データは以下のような感じ
東 東.1 東.2 決まり手 西 西.1 西.2 Date 東.w 西.w
0 東横綱 照ノ富士 0 押し出し 1 大栄翔 西小結 1 181 162
1 東大関 御嶽海 1 押し出し 0 高安 東前筆 1 169 184
2 東前2 霧馬山 1 寄り切り 0 正代 西大関 1 139 165
3 西前2 琴ノ若 1 押し出し 0 貴景勝 西大関 1 166 163
4 東関脇 若隆景 1 寄り切り 0 北勝富士 東前3 1 131 166
... ... ... ... ... ... ... ... ... ... ...
294 東前15 東龍 0 足取り 1 照強 西前8 15 165 111
295 東前9 琴勝峰 0 はたき込み 1 碧山 東前11 15 159 182
296 西前16 翠富士 1 肩透かし 0 栃ノ心 西前9 15 112 168
297 東前10 隠岐の海 1 上手投げ 0 明生 西前13 15 156 148
298 東前13 千代大龍 0 寄り切り 1 錦木 西前10 15 190 172
まずは追加された体重データをもとに色々データを見てみます。
2022年夏場所の幕内力士の平均体重
2022年夏場所の幕内力士の平均体重を見ます。
# 夏場所に参加した幕内力士の平均体重取得
# 重複削除
df_unique = df.drop_duplicates(subset='東.1')
# 平均体重
mean_dfu = df_unique['東.w'].mean()
print(mean_dfu)
# 158kg
# 最大体重
max_dfu = df_unique['東.w'].max()
print(max_dfu)
print(df_unique[df_unique['東.w'] == max_dfu]['東.1'])
# 198kg 水戸龍
# 最小体重
min_dfu = df_unique['東.w'].min()
print(min_dfu)
print(df_unique[df_unique['東.w'] == min_dfu]['東.1'])
# 111kg 照強
# 標準偏差
std_dfu = df_unique['東.w'].std()
print(std_dfu)
2022年夏場所の平均体重は158kg。(ここ大事)
逸ノ城が欠場なので、最大は198kgの水戸龍、最小は111kgの照強。標準偏差は19というデータが得られました。90kg近く差がある相手を押すの、大変。照強すごい!
勝ち星と体重の関係
続いて勝ち星と体重に相関関係があるのかチェックしてみます。
重い人の方が強そうですよね。
今回は分析を見やすくする神ライブラリ、seabornも使ってみました!
今のDataFrameだと扱いにくいので、可視化しやすいように
- 勝者名/勝者体重/敗者名/敗者体重/決まり手に書き換えます。
!pip install japanize-matplotlib
# matplotlibのimport
import matplotlib.pyplot as plt
# 日本語対応
import japanize_matplotlib
# seabornのimport
import seaborn as sns
# Dataframeの長さ
ldf =len(df)
ldf
# 受取用の結果のリスト
res = []
# DataFrameの整頓
for i in range(ldf):
if df.loc[i]['東.2'] == 1:
win = df.loc[i]['東.1']
win_weight = df.loc[i]['東.w']
lose = df.loc[i]['西.1']
lose_weight = df.loc[i]['西.w']
result = df.loc[i]['決まり手']
e_res = {
'winer':'{}'.format(win),
'w_weight':'{}'.format(win_weight),
'loser':'{}'.format(lose),
'l_weight':'{}'.format(lose_weight),
'result':'{}'.format(result)
}
res.append(e_res)
else:
win = df.loc[i]['西.1']
win_weight = df.loc[i]['西.w']
lose = df.loc[i]['東.1']
lose_weight = df.loc[i]['東.w']
result = df.loc[i]['決まり手']
w_res = {
'winer':'{}'.format(win),
'w_weight':'{}'.format(win_weight),
'loser':'{}'.format(lose),
'l_weight':'{}'.format(lose_weight),
'result':'{}'.format(result)
}
res.append(w_res)
# resのDataFrame化
new_df = pd.DataFrame(res)
# 体重データはint型に
new_df['w_weight'] = new_df['w_weight'].astype(int)
new_df['l_weight'] = new_df['l_weight'].astype(int)
そしてさらに変換
# 力士別勝利数
winer_df = new_df.value_counts('winer').reset_index()
# 列名変更
winer_df = winer_df.rename(columns={0: 'win_sum'})
# 勝者の体重列の追加
winer_df['w_weight'] = ''
lenwd = len(winer_df)
lennewd= len(new_df)
for i in range(lenwd):
for j in range(lennewd):
if winer_df['winer'][i] in new_df['winer'][j]:
winer_df['w_weight'][i] = new_df['w_weight'][j]
winer_df['w_weight'] = winer_df['w_weight'].astype(int)
winer_df
このDataFrameをもとにまずは棒グラフに
#体重の分布確認
sns.displot(winer_df["w_weight"])
続いて、散布図でもみてみます
# 回帰直線を含んだ値
sns.jointplot(x='w_weight', y = 'win_sum' , data=winer_df, kind='reg')
- これはn数もう少し欲しい!とは思うのですが、勝ち越しレンジである8勝以上には140kg〜180kgあたりに集合がありそうにも見えます。
勝敗と体重の関係
続いて勝敗と体重の関係をみてみます。
勝者と敗者の体重差を比較して傾向があるのかをみてみます。
# 各試合において体重が重い方と軽い方のどちらが勝ったかをチェックする変数
weight_result =new_df['w_weight'] - new_df['l_weight']
#重い場合、軽い場合、同じ場合で分ける
heavy_sum = (weight_result > 0)
light_sum = (weight_result < 0)
equal_sum = (weight_result == 0)
hs = heavy_sum.sum()
ls = light_sum.sum()
es = equal_sum.sum()
len_wr = len(weight_result)
weight_r = [{'heavy':hs, 'light':ls, 'equal':es}]
# 重い、軽い、同じのDataframeを作成
weight_r = pd.DataFrame(weight_r)
print(weight_r)
# ラベル用
w_list = weight_r.columns.values
# 円グラフ作成
print(plt.pie(weight_r, labels = w_list))
# 棒グラフ作成
print(sns.catplot(data= weight_r, kind= 'bar'))
円グラフと棒グラフにしてみましたが棒グラフの方がわかりやすかったのでそれを使用します。
綺麗なくらい二分されてます。
勝者の体重が敗者より重い、軽いに関してはどちらが優勢というのはなく同等、という結果が得られました。
体重と決まり手(寄り切りと押し出し)の関係
体重のデータはある程度みれたので、ここからいよいよ仮説のところである、体重と決まり手の関係をみていこうと思います。
勝者の体重と決まり手に関係があるのか
まずは、「勝者の体重と決まり手に傾向があるのか」 をそれぞれの決まり手と体重の分布を箱ひげ図でみてみます。
# 決まり手が押し出しと寄り切りだけのDataFrameを作成
result_df = new_df[new_df['result'].isin(['押し出し', '寄り切り'])]
result_df
# 箱ひげ図の作成
sns.catplot(x = 'result', y = 'w_weight', data = result_df, kind='box', order=['寄り切り','押し出し'])
sns.catplot(x = 'result', y = 'w_weight', data = result_df, order=['寄り切り','押し出し'])
plt.show
これをみると押し出しの方が寄り切りよりも狭い範囲でまとまっているようにも見えます。
それと押し出しの中央値は寄り切りよりも10kgほど重い結果に。
勝者の体重が敗者より重い時と軽い時で決まり手に差が見られるのか
続いて、「勝者の体重が敗者より重い時と軽い時で決まり手に差が見られるのか」 を見てみます。
# 決まり手が押し出しと寄り切りのみのDataFrameを作成し、勝者の体重が敗者より重いか軽いかを比較
weight_result =result_df['w_weight'] - result_df['l_weight']
# DataFrame化
weight_result = pd.DataFrame(weight_result)
weight_result = pd.concat([weight_result,result_df['result']], axis = 1)
weight_result
# 列名変更
new_result = weight_result.rename(columns={0: 'result_num'})
new_result['diff'] = ''
new_result = new_result.reset_index()
for i in range(len(new_result)):
if new_result['result_num'][i] > 0:
new_result['diff'][i] = 'heavy'
elif new_result['result_num'][i] < 0:
new_result['diff'][i] = 'light'
else:
new_result['diff'][i] = 'equal'
new_result
sns.countplot(x = 'diff', data=new_result, hue='result')
これをみると、勝者の体重が敗者よりも重い時と勝者の体重が敗者よりも軽い時ではいずれも押し出しが多いことがわかりました。
それと、勝ち星数については勝者の体重が敗者よりも重い場合と軽い場合でほぼ同数であったので、このグラフをみると勝者が軽い場合は押し出し/寄り切りの数が、勝者が重い場合よりも多いようにも見えます。
「軽い力士の方が、最初の立ち会いで決まってしまうので押し出し/寄り切りに偏る傾向があり、重い力士は立ち会い以降にも立て直せる」とかでしょうか、コアなファンのコメントが待たれます。
幕内力士の平均体重と比較して勝者の体重が重い場合と軽い場合で決まり手に傾向があるのか
なかなか、大きな差が見られず涙目になってきたところで、
「幕内力士の平均体重と比較して勝者の体重が重い場合と軽い場合で決まり手に傾向があるのか」 を見てみることにしました。
result_df
light_result = result_df[result_df['w_weight'] < 158]
light_result
heavy_result = result_df[result_df['w_weight'] > 158]
heavy_result
まずは勝者の体重が幕内力士の平均体重よりも軽い場合
print(sns.countplot(x = 'result', data=heavy_result,order=['寄り切り', '押し出し']))
綺麗に二分されており、勝者の体重が幕内力士の平均体重よりも軽い場合、押し出し/寄り切りの決まり手数には差がないことがわかります。
続いて勝者の体重が幕内力士の平均体重よりも重い場合
print(sns.countplot(x = 'result', data=heavy_result,order=['寄り切り', '押し出し']))
...。
!!!
初めて綺麗に傾向が出た気もします。
勝者の体重が幕内力士の平均体重よりも重い場合、押し出しの数が多くなり、寄り切りの1.6倍となる
結論
ここまで得られた結果をもとに仮説に対して以下の結論をつけました。
最初にたてた仮説
- 体格の良い、体重が重い力士は寄り切りが多く、逆に体重が少ない力士は押し出しが多いのではないか
- 体重差を比較した場合、各試合の結果が押し出しの試合は軽い力士、寄り切りの試合は重い力士が勝つ傾向があるのではないか
結果
- 勝者の体重が幕内力士の平均体重より重い場合、決まり手は押し出しが寄り切りよりも1.6倍多い結果となった。
- 押し出しと寄り切りで大きな差は見られないが、押し出しの方は150kg - 170kgの範囲で多く、寄り切りは140kg - 170kgの範囲と下限が広い。また中央値も押し出しの方が10kgほど高い
以上から、幕内力士の平均体重より重い力士は寄り切りよりも押し出しで勝つ傾向があることがわかる
- 勝者の平均体重を押し出しと寄り切りで比較したところ、押し出しが159.1kg, 寄り切り153.5kgと押し出しの方が平均体重が重い結果となった。
- 勝者の体重が重い場合と軽い場合はいずれも押し出しの数が寄り切りを上回った。
- 勝者の体重が幕内力士の平均体重より重い場合、決まり手は押し出しが寄り切りよりも1.6倍多い結果となった。
よって、勝者の体重が敗者よりも重い場合と軽い場合、いずれのおいても押し出しの方が寄り切りよりも多く、幕内力士の平均よりも重い体重の力士は勝利した試合は寄り切りよりも押し出しで勝つ傾向があることがわかる。
なお、幕内力士の中においては体重そのものは勝ち星数や試合の勝敗に影響を与えていないように見える。
今回の結果を受けて色々と調べてみたところ、以下の記事が参考になりました。
【大相撲徳俵】「押し出し」増加、寄り切りに並ぶ 変わる決まり手、力士“大型化”要因か
大相撲で30年以上、決まり手係を務めている大山親方(元幕内大飛)は、押し相撲が増えてきた背景に力士の体重増加を挙げる。体重と押しの威力には相関関係があり、「体重が増えると斜めの動きに弱い半面、前への攻撃がものすごく強くなる」
なるほど、興味深い
感想
- 押し出しと寄り切りだけを分析するだけでも色々な角度から見ることができて、可視化ツールの使い方やどんな時に使うのが良いかなども色々と学べてよかった。
- もうちょっとn数あった方がより傾向とか時代別のトレンドとか見れそうで興味深かった。
- スポーツとデータサイエンス、やっぱり面白い。
- DataFrame作るのが一番大変。
一番困ったのは、今回は相撲にターゲットを絞ったのですが、そのほかの業界や領域を分析してみようと思った時に世の中に公開されている統計データがPDFになってるケースがめちゃくちゃ多いところでした。
これはなんでなんだろうか。
お願い、csvにしてええええ!!!(切実)
それではコアな相撲ファンに結果を見せてきます。
Discussion