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

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

実行環境：Google Colabratory
使用テキストファイル1：network.txt(各球団の偏差値差)
使用テキストファイル2：coord.txt(各球団の[得点数偏差値,失点数偏差値]の座標)
[上記2種類のテキストファイル](https://drive.google.com/drive/folders/1faanJZcXTTmnUTsVuf5qms9wp6TcM4Q3?usp=sharing)

## 以下コード

### データフレーム作成
```
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1474567/913c141d-e88d-8859-1046-060a526c40f0.png)

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

### 参考文献
[SPAIA 打者成績ランキング](https://spaia.jp/baseball/npb/sabermetrics/player/)
[プロ野球データFreak](https://baseball-data.com////////team/ce.html)
[Googleスライド形式での記述も](https://docs.google.com/presentation/d/1_R3si-gSuFLya3exQI7juRfsnRgwvONU_xxJvmml6hM/edit?usp=sharing)