各球団の年齢層を可視化して分析する
プロ野球が開幕して早くも1か月が経ちました。
各球団の選手の年齢層を可視化して分析します。
各球団のプロフィールデータをスクレイピングしてデータを可視化します。
スクレイピングサイトはお馴染みのこちらです。
ライブラリをインポート
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
URL作成
スクレイピングするサイトにアクセスするためのURL文字列を作成します。
team = ['s','t','g','c','d','yb','bs','m','e','h','f','l']
body = 'https://baseball-data.com/ranking-age/'
スクレイピング
for文でurlを作成していくことで各球団のページにアクセスしてデータを取りにいきます。
取ったデータを加工して、pd.concat()でデータを連結していき1つのデータフレームにします。
age_list = pd.DataFrame()
for t in team:
url = body + t +'/'
print(url)
df = pd.read_html(url)
df = df[0]
df = df[:-1]
df['球団'] = t #球団のアルファベットを球団列として追加
age_list = pd.concat([age_list,df])
結果
https://baseball-data.com/ranking-age/s/
https://baseball-data.com/ranking-age/t/
https://baseball-data.com/ranking-age/g/
https://baseball-data.com/ranking-age/c/
https://baseball-data.com/ranking-age/d/
https://baseball-data.com/ranking-age/yb/
https://baseball-data.com/ranking-age/bs/
https://baseball-data.com/ranking-age/m/
https://baseball-data.com/ranking-age/e/
https://baseball-data.com/ranking-age/h/
https://baseball-data.com/ranking-age/f/
https://baseball-data.com/ranking-age/l/
マルチレベル除去
列名が二重になっているので、一列外します。
drop.levels(0)にすると列名の球団が空白になってしまうので、1にしましょう。
数字が低いほうが上段になります。
age_list.columns = age_list.columns.droplevel(1)
age_list
結果
順 位 選手名 年齢 生年月日 年数 守備 身長 体重 血液型 投打 出身地 年俸(推定) 球団
0 1 石川 雅規 44歳 1980/01/22 23年 投手 167cm 73kg A 左左 秋田 6,750万円 s
1 2 青木 宣親 42歳 1982/01/05 15年 外野手 175cm 80kg A 右左 宮崎 14,000万円 s
2 3 川端 慎吾 36歳 1987/10/16 19年 内野手 185cm 86kg O 右左 大阪 3,000万円 s
3 4 石山 泰稚 35歳 1988/09/01 12年 投手 182cm 83kg A 右右 秋田 15,000万円 s
4 5 嘉弥真 新也 34歳 1989/11/23 13年 投手 172cm 72kg O 左左 沖縄 2,000万円 s
... ... ... ... ... ... ... ... ... ... ... ... ... ...
83 84 古川 雄大 19歳 2004/05/25 2年 外野手 186cm 90kg O 右右 大分 750万円 l
84 85 野田 海人 19歳 2005/03/18 2年 捕手 174cm 80kg A 右右 福岡 650万円 l
85 86 川下 将勲 19歳 2005/04/03 1年 投手 186cm 72kg A 左左 北海道 280万円 l
86 87 木瀬 翔太 19歳 2005/04/05 1年 投手 185cm 83kg O 右右 京都 280万円 l
87 88 杉山 遙希 18歳 2005/09/23 1年 投手 181cm 82kg O 左左 東京 700万円 l
age_list['年齢'] = age_list['年齢'].str.replace('歳','').astype(int)
データクリーニング
データが文字列で「歳」という文字がついているので、「歳」を削除し、型を変換します。
また球団名もurlのページ名からチーム名称を変えます。
ヤクルトを最後の返還にしているのは「s」の文字列変換でオリックスの「bs」の「s」部分が変換されてしまうため先に「bs」を変換します。
age_list['球団'] = age_list['球団'].astype(str).str.replace('t','阪神').str.replace('g','巨人').str.replace('c','広島').str.replace('d','中日').str.replace('yb','横浜').str.replace('bs','オリックス').str.replace('m','ロッテ').str.replace('e','楽天').str.replace('h','ソフトバンク').str.replace('f','日本ハム').str.replace('l','西武').str.replace('s','ヤクルト')
age_list.dtypes
結果
順 位 int64
選手名 object
年齢 int64
生年月日 object
年数 object
守備 object
身長 object
体重 object
血液型 object
投打 object
出身地 object
年俸(推定) object
球団 object
dtype: object
データ可視化
年齢データをグラフで描画します。
sns.kdeplot(data = age_list, hue='球団',x = '年齢', palette='Paired')
結果
sns.violinplot(x="球団", y="年齢", split=True, data=age_list)
plt.xticks(rotation=45)
結果
(array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]),
[Text(0, 0, 'ヤクルト'),
Text(1, 0, '阪神'),
Text(2, 0, '巨人'),
Text(3, 0, '広島'),
Text(4, 0, '中日'),
Text(5, 0, '横浜'),
Text(6, 0, 'オリックス'),
Text(7, 0, 'ロッテ'),
Text(8, 0, '楽天'),
Text(9, 0, 'ソフトバンク'),
Text(10, 0, '日本ハム'),
Text(11, 0, '西武')])
球団別最高年齢
球団別に選手の最高年齢を表示します。
age_list.groupby('球団')['年齢'].max()
結果
球団
オリックス 41
ソフトバンク 43
ヤクルト 44
ロッテ 38
中日 41
巨人 39
広島 38
日本ハム 38
楽天 39
横浜 36
西武 40
阪神 33
Name: 年齢, dtype: int64
球団別最年少年齢
球団別に選手の最年少の年齢を表示します。
age_list.groupby(['球団'])['年齢'].min()
結果
球団
オリックス 18
ソフトバンク 20
ヤクルト 18
ロッテ 18
中日 19
巨人 19
広島 18
日本ハム 18
楽天 18
横浜 18
西武 18
阪神 18
Name: 年齢, dtype: int64
分析
グラフ、各球団の1軍選手在籍の最高年齢と最小年齢をみると、最小年齢はほぼ変わりありません。
しかし、最高年齢を見ると阪神が33歳でかなり若い構成になっています。
これで昨シーズン優勝し、5月7日現在で首位を走っているので数年は強い阪神が続きそうです。
巨人、横浜、オリックスも比較的若い選手層になっています。
巨人は特に阿部新監督で新しいチーム作りをしている状況が見えます。
ヤクルト、ソフトバンク、ロッテあたりが平均年齢が比較的高いです。
ヤクルトなどは青木選手や石川選手などベテランが活躍しているため平均を上げている感じでしょう。
ソフトバンクは2010年台の黄金時代から世代交代し、力を発揮するまでもう少しかか理想な雰囲気です。
ただし、今回の分析は年齢しか見ていませんので実際はもっと詳しく分析しなければいけません。
各球団の年齢分布を見て楽しむくらいがベストです。(ぇ
スクレイピング結果
今回スクレイピングしたデータを保存します。
age_list.to_csv('age_lists.csv',index=False)
ノートブックファイル(有料)
今回のコードをノートブックファイル(python)にしました。
上記のコードをコピペすれば動くので、手っ取り早く試したい人などはどぞどぞ。
よろしければサポートをよろしくお願いします。サポートいただいた資金は活動費に使わせていただきます。