交流戦が進むにつれ、当初は今年はダメだと諦めかけていたホークスの優勝が現実味を帯びてきたため、残り試合の結果で勝率がどのようになるかを表計算ソフト(Calc)に手入力して計算してみました。けれども、勝ち、負け、引き分けをちまちまと場合分けして計算するのが面倒で、場合分けを見逃してしまう可能性もありましたので、やっつけでPerlスクリプトを書いてみました。
スクリプトは次のとおりです。(winrate.plという名前で実行可能でパスが通ったディレクトリにあるとします。)
2014/9/7加筆
多少、変更をしました。
次のオプションがあります。
要素は順に、チーム名、勝ち、負け、引き分けの試合数でタブで区切っています。(Yahoo!のサイトなどのページからペーストすれば簡単に用意できます。)
ここでは交流戦の勝率を計算するので-iオプションを付けて次のようなコマンドを投入します。(100行以上の出力があるのでheadで先頭だけを表示させます。)
交流戦の実施概要に書かれている通り、勝率が同じ場合の順位の取り決めには細かい規則があるので、この結果だけでは不十分なところがあるでしょうけれど、同時に起こりえないものもあるので、ある程度の参考にはなりそうです。
2014/9/22追記
なお、プロ野球勝率予測計算Perlスクリプト・改版にこれを手直ししたものを載せてますので、こちらもご覧ください。
2014/9/7加筆
多少、変更をしました。
- 引き分けを加味しないオプションを追加(リーグ戦で引き分けを加味した結果にすると現実性の低い結果が多数出力されるため)
- 全試合を終了したチームの隣に"*"を記述
- 表示の書式を変更(タブで区切ると間延びして見えるので)
#!/bin/perl -w
# 残り試合の勝率計算
use Getopt::Long;
GetOptions('i' => \$interleague, # 交流戦
'r' => \$rest, # 残り試合表示
'd' => \$no_draw # 引き分けを含めない
);
open(DATAFILE, "< $ARGV[0]") or die("指定ファイルエラー\n");
$nl = 0; # 行番号(チーム識別)
while (my $line = <DATAFILE>) { # 読み込み
chomp($line); # 行末の改行を削る
# 要素で分割
($team[$nl], $win[$nl], $lose[$nl], $draw[$nl]) = split(/\t/, $line);
$nl++;
}
if ($interleague) {
$games = 24; # 交流戦試合数
}
else {
$games = 144; # リーグ戦試合数
}
for ($i = 0; $i < $nl; $i++) { # 各チームの成績予想
$left = $games - $win[$i] - $lose[$i] - $draw[$i]; # 残り試合
for ($w = $left; $w >= 0; $w--) { # 勝ち数
for ($d = 0; $d <= $left - $w; $d++) { # 引き分け数
$l = $left - $w - $d; # 負け数
# 全部の勝ち、負け、分け数
$wins = $win[$i] + $w;
$loses = $lose[$i] + $l;
$draws = $draw[$i] + $d;
# 勝率
$ave = $wins / ($loses + $wins);
printf("%s", $team[$i]);
print "*" unless ($left); # 戦績が確定したチーム
# my $format = "\t%3d\t%3d\t%3d";
my $format = " %2d %2d %d";
if ($rest) { # 残り試合数のみでの表示
printf($format, $w, $l, $d);
}
else { # 全試合数での表示
printf($format, $wins, $loses, $draws);
}
printf(" %.4f\n", $ave);
last if ($no_draw); # 引き分け数を加味しない(ループを抜ける)
}
}
}
多々、改善の余地があると思いますが、とりあえずこれで自分の欲しい結果が求められています。次のオプションがあります。
- -i: 交流戦用(全試合24試合として計算)
付けなければ144試合で計算 - -r: 残り試合のみの数値を表示
付けなければ全試合の数値を表示 - -d: 引き分けを加味しない
G 15 7 0 B 14 8 0 H 12 7 2 D 12 9 1 F 10 9 1 L 11 11 0 BS 10 10 0 M 10 10 0 S 7 10 2 T 9 13 0 C 7 15 0 E 7 15 0
要素は順に、チーム名、勝ち、負け、引き分けの試合数でタブで区切っています。(Yahoo!のサイトなどのページからペーストすれば簡単に用意できます。)
ここでは交流戦の勝率を計算するので-iオプションを付けて次のようなコマンドを投入します。(100行以上の出力があるのでheadで先頭だけを表示させます。)
winrate.pl -i il.txt | headすると次のように出力されます。
G 17 7 0 0.708 G 16 8 0 0.667 G 16 7 1 0.696 G 15 9 0 0.625 G 15 8 1 0.652 G 15 7 2 0.682 B 16 8 0 0.667 B 15 9 0 0.625 B 15 8 1 0.652 B 14 10 0 0.583残り試合が勝ち、負け、引き分けのあらゆる場合の勝ち、負け、引き分け、勝率を計算した結果です。
winrate.pl -i -r il.txt | headこのように-rオプションを付けてると次のように残り試合のみの数字で表示されます。
G 2 0 0 0.708 G 1 1 0 0.667 G 1 0 1 0.696 G 0 2 0 0.625 G 0 1 1 0.652 G 0 0 2 0.682 B 2 0 0 0.667 B 1 1 0 0.625 B 1 0 1 0.652 B 0 2 0 0.583勝率が5番目の要素なので、これで降順に並べ替えると優勝争いの様子が見えてきます。
winrate.pl -i -r il.txt | sort -n -k5 -r次がその結果の先頭からの一部です。
G 2 0 0 0.708 G 1 0 1 0.696 H 3 0 0 0.682 G 0 0 2 0.682 H 2 0 1 0.667 G 1 1 0 0.667 B 2 0 0 0.667 G 0 1 1 0.652 B 1 0 1 0.652 H 1 0 2 0.650 H 2 1 0 0.636 B 0 0 2 0.636 H 0 0 3 0.632 G 0 2 0 0.625これを見ると、首位のジャイアンツが全敗した場合の勝率を超えられるのはホークスとバファローズのみなので優勝争いはこの3チームに限られます。
交流戦の実施概要に書かれている通り、勝率が同じ場合の順位の取り決めには細かい規則があるので、この結果だけでは不十分なところがあるでしょうけれど、同時に起こりえないものもあるので、ある程度の参考にはなりそうです。
2014/9/22追記
なお、プロ野球勝率予測計算Perlスクリプト・改版にこれを手直ししたものを載せてますので、こちらもご覧ください。