以下手順
- プロ野球セリーグチーム別の直近3年間の得点数と失点数の平均を取得する。
- x軸に得点数、y軸に失点数*(-1)の2次元グラフを作成する。
- その散らばりを偏差値 - 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()
結果と分析
- 中日の攻撃力が相対的に見て圧倒的に弱い
- 阪神の守備力が相対的に見て圧倒的に強い
- Denaと広島の相関が高い
- 2年連続首位のヤクルトは失点数がワースト