BOS開発記録:直接得点から盤面前進力へ

打者の戦闘力を、1つの数字で見たい
野球を見ていると、いつもこういう気持ちになります。
この打者、結局どれくらいすごいんやろ
打率はわかりやすい。でも打率だけだと、四球をたくさん選ぶ打者や、ホームランで一発を狙う打者の良さが見えません。
OPSはもう少しマシです。出塁率と長打率を足したもので、打率より広い視野で打者を見ている。
ただ、OPSにはずっと引っかかっていることがありました。
なぜ出塁率と長打率をそのまま足すのか
OPSが高い選手は良い打者。これは間違いない。でも、
OPS = 出塁率 + 長打率
という形そのものに、はっきりした理由は見えません。経験的にチーム得点とよく相関するから使われている、でも「OPS .900」と言われたとき、それが野球の盤面でどういう意味なのかは説明しにくい。
そこで思いました。打者の戦闘力を1つの数字で出す指標を、自分で納得できる形で作れないだろうか。
打率の置き換えとか、OPSの改良版とかではなく、
打者がその打席で何を生み出したか
を、自分の頭でちゃんと追える形にしたい。これがBOSを作り始めた動機です。
v1.0:その打席で直接何点入ったかを数えてみた
最初の発想はかなり自然でした。
打者の仕事は点を取ること。だったら、その打席で実際に何点入ったかを数えればいい。
具体的にはこうです。走者なしで単打を打っても点は入りません。だから走者なしの単打は0点。一塁にランナーがいるときに二塁打を打っても、走者は普通三塁で止まるので0点。でも一・二塁にランナーがいるときに二塁打を打てば、二塁ランナーが還って1点入ります。
これを、走者の状況8通り(走者なし、一塁、二塁、三塁、一二塁、一三塁、二三塁、満塁)すべてで計算します。盤面によって出やすさは違うので、MLBの複数年データをもとにしたTom TangoのRun Expectancy Matrixで公開されている出現率で重み付けして平均を取る。
この手順で打撃結果ごとの「平均的に何点入るか」を出すと、こうなりました。
四死球 = 0.036
単打 = 0.099
二塁打 = 0.285
三塁打 = 0.611
本塁打 = 1.612
つまり、
BOS v1.0 = 0.036 × 四死球率
+ 0.099 × 単打率
+ 0.285 × 二塁打率
+ 0.611 × 三塁打率
+ 1.612 × 本塁打率
「直接得点をベースにした打者の戦闘力」。考え方としては筋が通っているし、計算もできた。最初のBOSはここに着地しました。
v1.0の問題:本塁打が強くなりすぎた
ところが、できあがった係数を眺めていて、すぐに違和感が出てきます。
本塁打 ≒ 単打の16倍
本塁打 ≒ 四死球の45倍
ホームランが強いのはわかります。一発で点が入るんだから、当然強いはず。
でも、45倍はやりすぎではないか。
これだけ差があると、単打や四球の価値はほとんど見えません。四球を1個選ぶより、ホームランを1本打つほうが45倍の戦闘力。そう言われると、たしかに得点だけを見ればそうかもしれないけれど、打者としての評価の感覚と合わない。
実際、2022年のパ・リーグ首位打者だった日本ハムの松本剛をv1.0で計算するとこうなります。
打率 .347、出塁率 .398、長打率 .438、OPS .836
BOS v1.0 = 0.057
2022年のNPB平均BOS v1.0は0.075。 首位打者なのに、平均以下 です。
理由ははっきりしています。松本剛は2022年に本塁打を3本しか打っていません。v1.0は「その打席で直接何点取ったか」しか見ていないので、ヒットで一塁に出てもランナーがいなければ0点、四球で出塁しても0点。直接得点に寄りすぎていて、首位打者の働きが拾えていない。
v1.0そのものは間違っているわけではありません。「打者が一発で点を取る力」を見る指標としては筋が通っている。でも、
打者単体の攻撃力全体を見る指標
としては、見ている範囲が狭すぎました。打席で起きていることのうち「最後に点が入ったかどうか」だけを評価して、「盤面を作った貢献」を完全に切り捨てている。
ヒットで一塁に出てチャンスを作る。四球でアウトを増やさずに次へつなぐ。二塁打で得点圏へ走者を進める。こういう仕事が、v1.0ではほとんどゼロ扱いになる。これでは打者の戦闘力の指標とは言えない。
何を見るかを、根本から変える
v1.0の問題は計算ミスではありません。設計の問題です。「直接得点」を見ようとしたこと自体が、打者の戦闘力を測るには狭すぎた。
そこで、見るものを変えることにしました。
打者の仕事は、点を取ることだけではない。アウトにならないこと、打者自身や走者を前に進めること、これも打者の大きな仕事です。点が入るかどうかは、その打席1つだけでは決まらない。後ろの打者が打てば入るし、打てなければ入らない。
なら、
直接得点ではなく、盤面をどれだけ前に進めたか
を見ればいい。打者の仕事を「最後に点が入ったか」ではなく「次のバッターにどれだけ良い盤面を渡したか」で測る。これなら、ヒットも四球も長打も、それぞれの貢献分がちゃんと数字に出るはずです。
考え方が決まりました。あとはこれをどう数式にするか。
v2.0:塁を座標化して、打つ前後の差分を見る
「盤面を前に進めた量」を数字にするために、塁に番号をつけます。
一塁 = 1
二塁 = 2
三塁 = 3
本塁 = 4
本塁は、一塁・二塁・三塁の次にある4番目の地点なので4。これで盤面の状態を1つの数字で表せます。走者なしなら0、一塁にランナーがいれば1、満塁なら1+2+3=6。
そして、
前進量 = 打った後の盤面価値 − 打つ前の盤面価値
で打撃結果を評価する。
例えば走者なしで単打を打つと、
打つ前:0
打った後:打者が一塁 = 1
前進量:+1
v1.0ではこれは0点でした。v2.0では+1。ちゃんと「盤面を進めた」と評価される。
走者一塁で単打なら、一塁ランナーが二塁へ、打者が一塁へ。
打つ前:一塁 = 1
打った後:一・二塁 = 1 + 2 = 3
前進量:+2
同じ単打でも、盤面によって前進量が変わる。これが大事なところです。
そして、これも8通りの盤面すべてで計算して、出現率で重み付けして平均を取る。実際の盤面ではなく平均盤面を使うのは、前後の打者や打線の影響を切るためです。同じ4番打者でも、前の3人が出塁マシンか凡退マシンかで盤面は全然違う。それを混ぜると打者本人の力が見えなくなる。
v1.0と同じ手順、でも見ている対象だけが「直接得点」から「盤面前進量」に変わった。それで計算するとこうなりました。
四死球 = 1.445
単打 = 1.612
二塁打 = 3.125
三塁打 = 4.452
本塁打 = 5.453
並べてみるとはっきりします。
v1.0:本塁打 ≒ 単打の16倍、四死球の45倍
v2.0:本塁打 ≒ 単打の3.4倍、四死球の3.8倍
ホームランは依然として一番強い。当然です、4つ全部の塁を一気に動かすんだから。でも、その差が「単打の3.4倍」くらいに収まった。これは感覚と合う。
そして、四死球も単打も、ちゃんと数字として見える大きさになった。打者が盤面を作る仕事が、ちゃんと評価される指標になった。
さっき平均以下になっていた松本剛をv2.0で計算し直すと、0.741。これなら「平均以上のかなりの好打者」と読める数字です。
v2.0で、BOSの形は固まった
v2.0で、BOSの設計はほぼ完成しました。
打者の戦闘力を「直接得点」ではなく「盤面前進力」で測る。塁を座標化して、打つ前後の差分を取る。8通りの盤面に出現率で重み付けして、平均盤面での前進量を係数にする。
この枠組みで、
- ホームランタイプは高く評価される
- 単打を量産するタイプも、ちゃんと数字に出る
- 四球を選ぶタイプも、埋もれない
- バランス型もそれなりに評価される
打者のタイプによらず、「盤面を動かす力が大きい打者」を上に出せる指標になった。BOSの本質はここで完成しています。
ただ、v2.0の係数を眺めていて、もうひとつ考え直すべき点が出てきました。それは計算の入力に使っている「盤面の出現率」のほうです。
v2.1:出現率を、意味のある粗さに丸める
v2.0の係数は、次の盤面出現率を使って計算していました。
走者なし 0.558
一塁 0.200
二塁 0.074
三塁 0.025
一二塁 0.070
一三塁 0.032
二三塁 0.018
満塁 0.024
ただ、この数字をそのまま小数第3位まで使うことには、あまり意味がありません。
そもそもこの出現率はMLB由来のデータ(Tom TangoのRun Expectancy Matrix)です。NPBでも盤面分布の大きな傾向は近いはずですが、0.558 や 0.074 という細かい桁まで同じだとは考えない方がいい。リーグも違えば、年代やイニング、出塁傾向のクセも違う。参考値としては十分使えますが、小数第3位までを「正しい数字」として扱うのは、出典データの性質に対して精密さを与えすぎです。
そして、BOSで本当に使いたいのは、細かい生の数値ではありません。
走者なしが一番多い
一塁が次に多い
二塁や一二塁がその次に来る
三塁、一三塁、二三塁、満塁は少ない
この盤面分布の大きな傾向です。打者の戦闘力を「平均的な盤面が与えられたときの前進量」で測るというBOSの目的にとって、必要なのはこの骨格であって、小数第3位の精度ではない。
実際、あとからプロ野球データパークの2025年「アウト・塁状況別の得点期待値」にある機会数ベースで確認しても、この傾向は大きく変わりませんでした。走者なしが約56.7%、一塁が約18.6%、二塁が約7.9%、一二塁が約7.1%。細かい数字は違っても、「走者なしが最も多く、一塁が次に多く、二塁・一二塁が続き、満塁や二三塁は少ない」という骨格はほぼ同じです。
ならば、細かい小数をそのまま使うより、整数%に丸めた方がBOSの設計に合っています。データの性質に過剰な精度を与えず、必要な傾向だけを残す。
走者なし 56%
一塁 20%
二塁 7%
三塁 3%
一二塁 7%
一三塁 3%
二三塁 2%
満塁 2%
合計100%。
この丸めた出現率で同じ計算をやり直すと、
四死球 = 1.43
単打 = 1.60
二塁打 = 3.10
三塁打 = 4.42
本塁打 = 5.42
式に組むとこうなります。
BOS v2.1 = 1.43 × 四死球率
+ 1.60 × 単打率
+ 3.10 × 二塁打率
+ 4.42 × 三塁打率
+ 5.42 × 本塁打率
ここで強調しておきたいのは、v2.1は v2.0を雑にしたものではない ということです。
v2.0では元データの出現率をそのまま使いました。v2.1では、その細かい桁に意味を持たせすぎず、盤面分布の傾向だけを残して丸めています。設計思想は完全に同じで、入力する出現率の粗さだけが違う。v2.0の小数第3位までの細かさは、MLBデータとしては意味のある精度ですが、NPB用のBOSにそのまま持ち込むと必要以上に精密な数字として見えてしまう、という話です。
v2.0とv2.1で、評価はほとんど変わらない
丸めたあとも、盤面分布の大きな傾向は変わっていません。走者なしが最も多く、一塁が次に多く、満塁や二三塁は少ない。この骨格が保たれているので、係数も大きくは変わりません。
実際の選手データで比べても、v2.0とv2.1の差はかなり小さい。例えば佐藤輝明の2025年成績で見ると、
v2.0 = 0.903
v2.1 = 0.896
差 = 0.007
小数3桁目で揺れる程度です。打者の良し悪しの評価は変わらない。
逆に言えば、出現率を少し粗くしても結果がほぼ変わらないなら、BOSで見たい大きな評価には、細かい桁よりも盤面分布の骨格の方が効いている、と考えられます。
最終形:BOS v2.1
開発を通して着地したのが、こちらの式です。
BOS = 1.43 × 四死球率
+ 1.60 × 単打率
+ 3.10 × 二塁打率
+ 4.42 × 三塁打率
+ 5.42 × 本塁打率
BOS v2.1は、その打席で何点入ったかを見る指標ではなく、平均的な盤面が与えられたときに、打者が1打席あたりどれだけ盤面を前に進めるかを見る指標です。
まとめ
BOSは、最初から今の形だったわけではありません。
最初のv1.0では、「その打席で直接何点入ったか」を数えようとしました。これは自然な出発点でしたが、本塁打の価値が単打や四死球に比べて大きくなりすぎ、首位打者タイプの打者を平均以下にしてしまうほど、打者の盤面を作る力が見えなくなりました。
そこでv2.0では、得点そのものではなく、打者が盤面をどれだけ前に進めたかを見るようにしました。塁を座標化し、打つ前と打った後の差分を取ることで、単打・長打・四死球のバランスがかなり自然になりました。
最後にv2.1では、MLB由来の細かい出現率をそのまま使うのではなく、盤面分布の傾向を保ったまま整数%に丸めました。細かい桁に意味を持たせすぎず、BOSの目的に合った粗さへ落とした形です。
つまり、BOS v2.1は、
直接得点を見る指標から、盤面前進力を見る指標へ
という設計変更の結果として生まれたものです。