LoginSignup
1
0

More than 1 year has passed since last update.

プロ野球直近3年間 球団同士の得点数・失点数の関連(セ・リーグ編)

Last updated at Posted at 2023-01-02

以下手順

  1. プロ野球セリーグチーム別の直近3年間の得点数と失点数の平均を取得する。
  2. x軸に得点数、y軸に失点数*(-1)の2次元グラフを作成する。
  3. その散らばりを偏差値 - 50 の値で球団同士の無向グラフとして描画する。

実行環境:Google Colabratory
使用テキストファイル1:network.txt(各球団の偏差値差)
使用テキストファイル2:coord.txt(各球団の[得点数偏差値,失点数偏差値]の座標)
上記2種類のテキストファイル

以下コード

データフレーム作成

import pandas as pd
''' データフレームを制作(順に2020,2021,2022)
    list1= [[ヤクルト得点],[Dena得点],[阪神得点],[巨人得点],[広島得点],[中日得点],
      [ヤクルト失点],[Dena失点],[阪神失点],[巨人失点],[広島失点],[中日失点]] '''
list1=[[468,625,619], [516,559,497], [494,541,497], [532,552,548], [523,557,552], [429,405,414], 
       [589,531,566], [474,624,566], [460,508,428], [421,541,589], [520,589,544], [489,478,544]]
columns1 = ["2020", "2021", "2022"]
index1 = ["ヤクルト得点", "Dena得点", "阪神得点","巨人得点","広島得点","中日得点","ヤクルト失点","Dena失点","阪神失点","巨人失点","広島失点","中日失点"]
base = pd.DataFrame(data=list1, index=index1, columns=columns1)
base["平均"] = round((base["2020"] + base["2021"] + base["2022"]) / 3, 0)  #小数点以下を削除

# 攻撃平均と守備平均
Kougeki = base[:6]
Syubi = base[6:]

team = ['ヤクルト', 'Dena', '阪神', '巨人', '広島', '中日']

Kougekilist = []
Syubilist = []
# 攻撃・守備別にリストを定義
for x in range(6):
  # print(team[x], Kougeki['平均'][x], ',' , Syubi['平均'][x])
  Kougekilist.append(Kougeki['平均'][x])
  Syubilist.append(Syubi['平均'][x])
base
〜〜出力結果〜〜
index,2020,2021,2022,平均
ヤクルト得点,468,625,619,571.0
Dena得点,516,559,497,524.0
阪神得点,494,541,497,511.0
巨人得点,532,552,548,544.0
広島得点,523,557,552,544.0
中日得点,429,405,414,416.0
ヤクルト失点,589,531,566,562.0
Dena失点,474,624,566,555.0
阪神失点,460,508,428,465.0
巨人失点,421,541,589,517.0
広島失点,520,589,544,551.0
中日失点,489,478,544,504.0

得点数の偏差値換算

# 得点数の偏差値
import numpy as np
team = ['ヤクルト', 'Dena', '阪神', '巨人', '広島', '中日']
scores = Kougekilist  
np_scores = np.array(scores)

#numpy.mean 算術平均が求められる。
mean = np.mean(np_scores)

#numpy.std 標準偏差
std = np.std(np_scores)
K = []
print('得点数偏差値換算')
for x in range(6):
  score_a = Kougekilist[x]
  #(得点 - 平均点) / 標準偏差
  deviation = (score_a - mean) / std
  #今回は偏差値 - 50をする
  deviation_value =  0 + deviation * 10
  K.append(round(deviation_value))
  print(team[x],"偏差値:"+str(round(deviation_value)))
〜〜出力結果〜〜
ヤクルト 偏差値:11
Dena 偏差値:1
阪神 偏差値:-1
巨人 偏差値:5
広島 偏差値:5
中日 偏差値:-21

失点数の偏差値換算

# 失点数の偏差値
import numpy as np
team = ['ヤクルト', 'Dena', '阪神', '巨人', '広島', '中日']
scores = Syubilist
np_scores = np.array(scores)

#numpy.mean 算術平均が求められる。
mean = np.mean(np_scores)

#numpy.std 標準偏差
std = np.std(np_scores)

S = []
print('失点数偏差値換算')
for x in range(6):
  score_a = Syubilist[x]
  deviation = (score_a - mean) / std
  # 偏差値 - 50
  deviation_value = 0 + deviation * 10
  S.append(round(deviation_value))
  print(team[x],"の偏差値:"+str(round(deviation_value)))
〜〜出力結果〜〜
ヤクルト の偏差値:11
Dena の偏差値:9
阪神 の偏差値:-18
巨人 の偏差値:-3
広島 の偏差値:7
中日 の偏差値:-6

得点数のリストと失点数のリストと偏差値座標

K   #得点数のリスト
〜〜出力結果〜〜
[11, 1, -1, 5, 5, -21]
S   #失点数のリスト
〜〜出力結果〜〜
[11, 9, -18, -3, 7, -6]
team = ['ヤクルト', 'Dena', '阪神', '巨人', '広島', '中日']
for v in range(6):
  print(team[v],'の座標は',str(K[v]),',',str(-S[v]))
〜〜出力結果〜〜
ヤクルト の座標は 11 , -11
Dena の座標は 1 , -9
阪神 の座標は -1 , 18
巨人 の座標は 5 , 3
広島 の座標は 5 , -7
中日 の座標は -21 , 6

ライブラリのインストール

!pip install japanize_matplotlib
# 実行後にランタイム再起動する
# 「IPA」フォントをインストール
!apt-get -y install fonts-ipafont-gothic
# matplotlibのキャッシュをクリア
!rm /root/.cache/matplotlib/fontlist-v300.json

ネットワーク環境と2つのテキストファイルの読み込み

import matplotlib.pyplot as plt
import networkx as nx
import numpy as np

# 無向グラフの作成
G = nx.Graph()
# 自身の実行環境  *各自変更が必要
G = nx.read_weighted_edgelist('/content/drive/MyDrive/Colab Notebooks/DataMining/Assignment/network.txt', nodetype=str)

# 自身の実行環境  *各自変更が必要
pos_array=np.loadtxt('/content/drive/MyDrive/Colab Notebooks/DataMining/Assignment/coord.txt', dtype='int32')

pos = {}
# ndarrayの情報を「(x,y)」という値に変換する
for n, c in zip(list(G.nodes), pos_array): 
  pos[n] = (c[0], c[1])

グラフ描画

import matplotlib.pyplot as plt
import japanize_matplotlib
fig = plt.figure(dpi=120)

edge_labels = {(i, j): w['weight'] for i, j, w in G.edges(data=True)}

nx.draw_networkx_nodes(G, pos, node_size=400) #ノードを描画
nx.draw_networkx_edges(G, pos, width=2) #エッジを描画
nx.draw_networkx_labels(G, pos, font_family='IPAexGothic') #(ノードの)ラベルを描画
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels) #エッジのラベルを描画

plt.xlabel("← 少ない     得点数     多い →")
plt.ylabel("← 多い     失点数     少ない →")
plt.title("チーム別直近3年間の得点数と失点数")
plt.show()

QiitaGraph.png

結果と分析

  • 中日の攻撃力が相対的に見て圧倒的に弱い
  • 阪神の守備力が相対的に見て圧倒的に強い
  • Denaと広島の相関が高い
  • 2年連続首位のヤクルトは失点数がワースト

参考文献

SPAIA 打者成績ランキング
プロ野球データFreak
Googleスライド形式での記述も

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0