肉なし回鍋肉

なんでも。 主にNEW GAME!, 野球, 麻雀

【第3回】打者の「能力」を数値化してみる 【因子分析】

こんにちは。肉なし回鍋肉です。今回は「打者の「能力」を数値化してみる」の3回目です。前回は繰り返し因子の抽出を行い、満足いく結果が出せました。今回は因子の命名と下位尺度の構成、因子得点の予測をします。いよいよ実際に数値化できるようになります!

全体の目次

今回の目次

因子の命名

まずは前回の結果をおさらいします。

f:id:hui_guo:20200731132240p:plain
前回の計算結果
この結果から、各因子に名前をつけていきます。

第1因子は、打率、安打、BABIP、二塁打で因子負荷量が大きくなりました。これらの指標に共通するような能力が、第1因子の名前になります。
これらの項目はボールをフェアグラウンドに飛ばすことによって得られる出塁に関する項目であり、バットをボールに的確に当てる能力と考えられるので「ミート力」と命名します。

続いて第2因子です。先ほどの表は1, 4, 3, 2の順番なのでお間違いなく。ここでは盗塁、盗塁刺、三塁打で因子負荷量が大きいですね。これら3項目はいずれも走塁に関する項目であるので「走力」と命名しましょう。
盗塁は出塁後に発生するプレーであり、打席での打撃行為とは関係ないプレーです。しかし、足の早さによって内野ゴロが安打、安打が二塁打二塁打三塁打になることがあります。また、足の早い選手ならセーフティバントという選択肢も生まれます。このように、足の早さも打撃結果に影響を与えることから「走力」も打撃に影響を与える因子であると考えることにします。
ちなみに盗塁死が走力に関係していることになっていますが、足の遅い選手はそもそも盗塁をしないため盗塁死しないということでしょう。詳しくは後ほど。

第3因子はBB%、BB/K、出塁率で因子負荷量が大きくなりました。これらの項目はボール球を見送って四球を選ぶことで得られる出塁に関する項目であり、ストライクかボールかの判定を正しく行う能力と考えられるので「選球眼」と命名します。

最後に第4因子では、K%、ISO、HR%で因子負荷量が大きくなっています。ISOとHR%は長打に関する指標で、K%は三振に関する指標です。K%とISO、K%とHR%の相関係数はそれぞれ .522と .547であり、長打を打つにはある程度の三振のリスクを背負う必要があると言えるでしょう。ここではK%は三振を恐れずに長打を狙った結果喫した三振の率と捉えることにします。つまりK%も長打に関係する指標と考えて、この因子はボールをより遠くに飛ばす能力であるとして「長打力」と命名します。ただし、K%とISO、K%とHR%の相関は中程度であり、長打を打てるが三振の少ない打者、長打を打てないが三振の多い打者というのも一定数存在することは確認しておくべきでしょう。

下位尺度の構成

ここでは各因子を代表する観測変数を選出します。素直に因子負荷量が高い項目を選ぶと以下の通りになります。

  • 第1因子(ミート力):打率・安打・BABIP、二塁打
  • 第2因子(走力):盗塁・盗塁刺・三塁打
  • 第3因子(選球眼):BB%・BB/K・出塁率
  • 第4因子(長打力):K%・ISO・HR%

これらの項目に対する信頼性を、α係数というのを用いて検証します。これが1に近づくほど信頼性(内部一貫性)が高いと言えます。だいたい0.7を超えてると良いらしいですが、項目数によって値の出やすさが変わるため、一概には言えないです。

#下位尺度候補まとめ
l.f1 <- c("打率", "安打", "二塁打", 
	"BABIP")
l.f2 <- c("三塁打", "盗塁", "盗塁刺")
l.f3 <- c("出塁率", "BB.", "BB.K")
l.f4 <- c("K.", "HR.", "ISO")
d.f1 <- zdatas[l.f1]
d.f2 <- zdatas[l.f2]
d.f3 <- zdatas[l.f3]
d.f4 <- zdatas[l.f4]

#α係数
alpha(d.f1)
alpha(d.f2)
alpha(d.f3)
alpha(d.f4)
f:id:hui_guo:20200801191726p:plain
α係数

こちらが結果です。各因子が3項目または4項目と少ない項目から構成されているにも関わらず、全因子でα係数が .80を超えました。これは十分な内部一貫性を有していると言えるでしょう。また、下位尺度を構成するある項目を削除した時のα係数も算出しました。このα係数が通常のそれよりも高い時は、その項目がなければより内部一貫性が高くなったという意味になります。今回、長打力からK%を削除した時に内部一貫性が大きく上昇してますが、まあもともと0.87あるならいいでしょう。

因子得点の予測

因子得点とは

因子得点とは、各ケース(ここでは打者)が各因子に対してどれほどの重みを持っているのかを計算したものです。今回は回帰法で因子得点を求めてあります。

#因子得点
score <- f5$scores
sdatas <- data.frame(datas, score)
zsdatas <- data.frame(zdatas, score)
回帰分析

回帰分析とは、目的変数Yを説明変数Xで説明するような式を作る作業です。今回のケースでは、Yが因子得点、Xが観測変数になります。つまり、観測変数から因子得点を計算する式を作ろうってことです。
実際の因子得点は、全観測変数を使用して計算します。しかし、回帰分析で全観測変数を説明変数にすると式がめちゃくちゃになります。実用性皆無です。そこで、今回は説明変数とする観測変数は各下位尺度を構成する観測変数に限定して回帰分析をします。なお、実際の成績から計算できることを目的としているので、説明変数は標準化していないデータで計算します。

まずはミート力です。

#重回帰分析
meet <- lm(GLS1 ~ 打率 + 安打 + 二塁打 + 
	BABIP, sdatas)
summary(meet)
vif(meet)
Call:
lm(formula = GLS1 ~ 打率 + 安打 + 二塁打 + BABIP, data = sdatas)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.16935 -0.05575 -0.01354  0.04597  0.32813 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -9.1813662  0.0329127 -278.96   <2e-16 ***
打率        21.2402840  0.2225161   95.45   <2e-16 ***
安打         0.0088365  0.0002014   43.87   <2e-16 ***
二塁打       0.0410495  0.0005103   80.44   <2e-16 ***
BABIP        3.1694483  0.1621077   19.55   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.08058 on 751 degrees of freedom
Multiple R-squared:  0.9935,	Adjusted R-squared:  0.9935 
F-statistic: 2.864e+04 on 4 and 751 DF,  p-value: < 2.2e-16

出力結果そのままだと分かりにくいので、以降は綺麗にした結果のみの紹介にします。

f:id:hui_guo:20200801193436p:plain
ミート力の重回帰分析

表の「係数」は、各成績にかける係数です。「決定係数R2」は当てはまりの良さを表す値で、大きいほど良いです。「VIF」(分散拡大係数)は、多重共線性というのを判断する値で、10以下なら大丈夫です。「Pr(>|t|)」ってのは小さければ有意な説明変数ってことになります。

まあ結論としては、「ミート力=21.249×打率+0.009×安打+0.041×二塁打+3.171×"BABIP"-9.183」という式でミート力が求められるってことです。

次は走力です。Rのコードは先ほどのミート力と同じ感じなので省略。

f:id:hui_guo:20200801194247p:plain
走力の重回帰分析

結論の式は「走力=0.182×三塁打+0.030×盗塁+0.082×盗塁刺-1.024」となります。

盗塁死が多いほど走力が高くなることになっていますが、これは足の速い選手ほど盗塁試行回数が増えることが原因でしょう。しかし、この式では盗塁死しまくっても回数を積み重ねれば走力のある選手ということになってしまいます。盗塁成功率の高い選手が正当に評価されないことにな流ので、この点は改善の余地があると言えるでしょう。

次は選球眼です。

f:id:hui_guo:20200801194722p:plain
選球眼の重回帰分析

選球眼の結果は文句なしです。予測式は「選球眼=9.467×出塁率+12.924×"BB%"+1.349×"BB/K"-5.259」

最後に長打力なのですが・・・。因子の命名で、長打力とはボールをより遠くに飛ばす能力であること、長打を打てるが三振の少ない打者、長打を打てないが三振の多い打者というのも一定数存在することを説明しました。K%を説明変数として予測式を作成すると、三振が多ければ長打力が高くなる構造となっちゃいます。逆に、三振の少ないパワーヒッターが正当に評価されないことになります。α係数でも、K%を削除した方が内部一貫性は高くなることが示されており、このままK%を説明変数として回帰分析を行うのは不適当であると判断しました。よって、K%を除き、HR%、ISOを説明変数として重回帰分析を行った。
(盗塁刺は消すとα係数が結構落ちちゃうので消さなかったんだと思います)

f:id:hui_guo:20200801195227p:plain
長打力の重回帰分析

今回も問題なし・・・ではありませんね。VIFがでかいので、どちらかの指標を削除して計算し直すことになります。HR%は本塁打限定の指標ですので、外野の頭を大きく超えた打球でもホームランにならなければ単打と同じ扱いになります。一方、ISOは二塁打三塁打も評価するので長打力をより適切に表しているのはISOであると考えます。そこで、HR%を削除し、ISOのみを説明変数として今度は単回帰分析を行います。

f:id:hui_guo:20200801195438p:plain
長打力の単回帰分析

これは問題ないですね。予測式は「長打力=12.778×"ISO"-1.881」となります。

すべての能力(因子)について回帰式をまとめると、

  • ミート力=21.249×打率+0.009×安打+0.041×二塁打+3.171×"BABIP"-9.183
  • 走力=0.182×三塁打+0.030×盗塁+0.082×盗塁刺-1.024
  • 選球眼=9.467×出塁率+12.924×"BB%"+1.349×"BB/K"-5.259
  • 長打力=12.778×"ISO"-1.881

となります。これで、プロ野球の打者の能力を数値化できるようになりました!

因子得点は平均0、標準偏差1の分布になっています。なので、求めた因子得点を10倍し、50を足せば偏差値に変換することができます。偏差値(というか正規分布)の性質を知れば、より楽しめるでしょう。

ただし、注意点として、これらの式は「規定打席に到達した打者」を分析して作った式であることがあります。この式を規定打席未満の選手に当てはめても正常な数値を出せるとは限りません。高校野球にも使えません。今後適応範囲を広げられると良いですね。

今回のまとめ

  • ミート力=21.249×打率+0.009×安打+0.041×二塁打+3.171×"BABIP"-9.183
  • 走力=0.182×三塁打+0.030×盗塁+0.082×盗塁刺-1.024
  • 選球眼=9.467×出塁率+12.924×"BB%"+1.349×"BB/K"-5.259
  • 長打力=12.778×"ISO"-1.881

ついにタイトル回収しました。次回は、この研究の応用編ということで、打者の能力の成長・衰退についてお話しします。よければ次回もご覧ください。