(82) 野球選手の成績を主成分分析 (続編2/2)

投稿者: | 2016年11月12日

2,647 views

この記事は最終更新から 1880日 が経過しています。

(81) 野球選手の成績を主成分分析 (続編1/2) で作ったデータを使って、
(80) 野球選手を測ってみる 2016年版 と同じ解析をやってみる。

目的はオリジナルの物差しを作ること。

1. 複数年度×複数リーグのデータを直列に繋ぐ

(81) 野球選手の成績を主成分分析 (続編1/2)」で作ったデータを直列に繋ぎ、一つの入力データにする。その際に、各行(=各選手)の先頭列に年度値を埋め込んでおく。後で「○○○○年の和田はすごかった!」みたいな喜び方をしたいから。

import csv
def load_data(basepath):
    files = glob.glob( basepath + '/*.csv')
    ary=[]
    for fpath in files:
        year = fpath.split('/')[-1].split('_')[0]
        f = open(fpath, 'r')
        dr = csv.reader(f)
        for row in dr:
            row.insert(0, year)
            ary.append(row)
    return np.array(ary)

2. 12年間で延べ701人分の打撃結果を解析

12年間連続で規定打席に到達している人は1人で12人分カウントされる。

def calc_pca(X):
    Xm = np.broadcast_to(X.mean(axis=0), X.shape)
    Xs = np.broadcast_to(X.std(axis=0),  X.shape)
    Xv = (X - Xm) / Xs
    R1  = np.corrcoef(Xv.T)
    l,v = np.linalg.eigh(R1)
    r = l / l.sum()
    return v,r,Xv

def ctrl_proc():
    basepath = '../0081/data'
    ary_joined = load_data(basepath)
    # 不要項目を削除
    in_data = ary_joined[0::,6:24]
    # PCA
    X = in_data.astype(np.float64)
    v,r,Xv = calc_pca(X)
    return ary_joined,v,r,X,Xv

3. 結果は?

(80) 野球選手を測ってみる 2016年版」と同じような物差しができた…
あんまりおもしろくないなぁ

第1主成分

よく試合に出場し、よくヒットを打ち、よくホームに帰り、長打も多く、打点も稼ぐ、スーパースターを見つけ出す物差し!

第2主成分

よく欠場するし、あんまりヒット打たないし、足遅くて併殺多いし、でもときどき一撃をくらわすパワーを持つ、ちょっとビミョーな準1流選手を見つけ出す物差し

12年間延べ701人の選手を物差しで測った結果は以下の通り。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です