見出し画像

各球団の年齢層を可視化して分析する

プロ野球が開幕して早くも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	石川 雅規	441980/01/22	23年	投手	167cm	73kg	A	左左	秋田	6,750万円	s
1	2	青木 宣親	421982/01/05	15年	外野手	175cm	80kg	A	右左	宮崎	14,000万円	s
2	3	川端 慎吾	361987/10/16	19年	内野手	185cm	86kg	O	右左	大阪	3,000万円	s
3	4	石山 泰稚	351988/09/01	12年	投手	182cm	83kg	A	右右	秋田	15,000万円	s
4	5	嘉弥真 新也	341989/11/23	13年	投手	172cm	72kg	O	左左	沖縄	2,000万円	s
...	...	...	...	...	...	...	...	...	...	...	...	...	...
83	84	古川 雄大	192004/05/25	2年	外野手	186cm	90kg	O	右右	大分	750万円	l
84	85	野田 海人	192005/03/18	2年	捕手	174cm	80kg	A	右右	福岡	650万円	l
85	86	川下 将勲	192005/04/03	1年	投手	186cm	72kg	A	左左	北海道	280万円	l
86	87	木瀬 翔太	192005/04/05	1年	投手	185cm	83kg	O	右右	京都	280万円	l
87	88	杉山 遙希	182005/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)にしました。
上記のコードをコピペすれば動くので、手っ取り早く試したい人などはどぞどぞ。

ここから先は

0字 / 1ファイル
この記事のみ ¥ 100

よろしければサポートをよろしくお願いします。サポートいただいた資金は活動費に使わせていただきます。