肉なし回鍋肉

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

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

こんにちは。夏休みを迎えた肉なし回鍋肉です。今回から4回(予定)に分けて、高校の卒業研究でやった内容を書きます。流石に時効でしょってことで・・・。内容は「打者の「能力」を数値化してみる 」です。統計学的に色々やってるのですが、統計をよく知らない人でも分かるように進めていくので、どうぞよろしくお願いします。

今回は第1回ということで、どういう研究なのか、どういう手法でやるのか等の導入・準備回です。実際の分析は統計ソフトのRを使用しましたので、その具体的なコードも併せて紹介します。なんかの参考になれば幸いです。
全体の目次


今回の目次

序論

野球におけるバッターには、いろんな特徴を持った選手がいます。例えば、イチローみたいなヒットを量産するバッターや、一撃必殺のホームランバッターみたいな感じです。このような選手の特徴は、打撃成績を見れば分かります。先ほどの例で言えば打率や本塁打ですね。

ところで、打撃成績について、次のように考えることができませんか?「打撃成績とは、打者がもともと持っている能力から得られた結果である」と。言い換えると、それぞれの打者の持っている「能力」が、打撃成績を決定しているのだと。図で表すとこんな感じです。

f:id:hui_guo:20200730204544p:plain
ざっくりイメージ


パワプロって各選手にパワーが86、ミートが14とか能力が割り振られて、オーペナで回すとその能力相応の成績を残しますよね。イメージとしてはまさにこの関係です。

この図に出てくる「能力」と「成績」のうち、我々が実際に観測できるのは「成績」だけです。与えられた成績から能力を数値化するってのが、今回の目標になります。

方法

分析対象

ここでは能力を導き出す「成績」を選びます。まずは対象の選手です。データは多いに越したことはないので、日本プロ野球の2005~2017年シーズンで規定打席に到達した選手756名とします。出典はNPBのホームページからです。

対象の選手を決めたら、次は対象となる成績です。NPBで発表されている成績は以下の22成績です。

打率、試合、打席、打数、得点、安打、二塁打三塁打本塁打、塁打、打点、盗塁、盗塁刺、犠打、犠飛、四球、故意四、死球、三振、併殺打長打率出塁率

ただ、これだけじゃあ物足りないですね。いわゆる「セイバーメトリクス」の指標は含まれていないのです。ということで、これらの22成績から計算できる以下の7成績を加えます。

  • K%=三振÷打席

今考えると四球に故意四球が含まれてるかもしれないなと思うのですが、これは考えないことにします。各指標の意味は省略します。

以上756名の29成績について、分析していきます。

因子分析とは

因子分析とは、多次元のデータを分析する手法(多変量解析)の一つです。因子分析は、観測された変数の相関関係を使い、それらの背後に因子と呼ばれる共通の原因があると仮定して探し出す手法です。ちょうど、序論で話したイメージと似た感じですよね。詳細は次回で。

統計ソフトR

今回の分析には、Rという統計ソフトを使いました。インストールや設定などの解説は行いませんので、必要であればご自身でお願いします。

分析1 データを取り込む・パッケージの読み込み

ここからはいよいよ実際の分析です!と言ってもまずはデータを読み込む作業なのですが。

自分の場合、実際に使用するデータはExcelに全部コピペして、csv形式で保存しました。ガチ勢はプログラムでデータすら回収してしまうらしいのですが、当時の私にはその発想すらなかったです。次のコードで、csvファイルを読み込みます。

#データ読み込み
datas <- read.csv("motodata.csv", header = T, 
	fileEncoding = "CP932")
zdatas <- read.csv("hyojyunkadata.csv", header = T, 
	fileEncoding = "CP932")

read.csvで、作業ディレクトリ内のcsvファイルを読み込むことができます。header=Tはcsvファイルの1行目が列名であるという意味です。自分の環境(Mac)では、「fileEncoding = "CP932"」ってのが無いとうまく読み込めなかったです。これは人によっては不要かもしれません。datasには純粋な成績、zdatasには標準化された成績が入ってます。

これだけでデータは読み込めました。ただ、Rの都合上、列名の「K%」や「BB/K」は「K.」「BB.K」として読み込まれてしまいます。グラフなどを作るときにこれだと困るので、正しい成績名のデータフレーム(さっきのdatasとかのこと)を作ります。ついで、正しく無い成績名のデータフレームも作っちゃいます(あとで使うので)。

#指標名データフレーム
allStatsNames <- c("打率", "試合", "打席", "打数", "得点", "安打", "二塁打", "三塁打", "本塁打", "塁打", "打点", "盗塁", "盗塁刺", "犠打", "犠飛", "四球", "故意四球", "死球", "三振", "併殺打", "長打率", "出塁率", "OPS", "BABIP", "BB.", "K.", "HR.", "BB.K", "ISO")
allNames <- c("打率", "試合", "打席", "打数", "得点", "安打", "二塁打", "三塁打", "本塁打", "塁打", "打点", "盗塁", "盗塁刺", "犠打", "犠飛", "四球", "故意四球", "死球", "三振", "併殺打", "長打率", "出塁率", "OPS", "BABIP", "BB%", "K%", "HR%", "BB/K", "ISO")

すごい見にくいけど勘弁してください。
あとは、サンプルサイズの値をnumbersに記録しておきます。

#サンプル数
numbers <- 756

こうすると、もし後からデータ数が変化した時も簡単に対応できます。
最後に、今回使用するパッケージを読み込みます。

#パッケージ読み込み
library(psych)
library(MASS)
library(parallel)
library(car)

以上で準備は完了となります。

今回のまとめ

  • 打者の成績は打者の能力によって決定されていると考える!
  • 「因子分析」で能力を数値化してみる!

次回は実際に因子分析を行います。続きもぜひご覧ください。それではさようなら。