Javaで名将ポイントを出してみた

#Javaで名将ポイントを出してみた

さぁ、皆さんプロ野球もCSが終わっていよいよドラフト、日本シリーズと続いていく今日この頃。

今年、[名将ポイント](http://wikiwiki.jp/livejupiter/?%CC%BE%BE%AD%A5%DD%A5%A4%A5%F3%A5%C8)なる単語が生まれ、阪神の和田って名将やん！って話もあったりするわけですが、**本当に名将だったのか？**という疑問のもと検証してみることにしました。~~というネタプロ野球解析記事です。~~

##ルール
通常のルールはガバガバ~~で簡単に計算できて面白くない~~なので、~~適当に~~いい感じのルールを考えました！

- 4点差以上で勝利は別に名将じゃなくても勝てるので0点
- 僅差で勝つのは名将なので1点差なら3点、2点差なら2点、3点差なら1点
- 引き分けはまぁ名将なので1点
- 3点差以内で負けるのは愚将のやること1点差なら-4.5点、2点差なら-3点、3点差なら-1.5点
- 4点差・5点差で負けるのは普通なので0点
- 6点差以上で負けるのはまぁ名将なので1点
- 10点差以上で負けるのは結構名将なので2点

てな感じにしました。

これくらいなら、ちゃんと勝たないと名将ポイントはたまりませんし、接戦を落してたらポイントガタ落ちなのでいい感じではないかと。

##やったこと
最近、Javaを勉強しようということになんかなっているのでJavaでやってみました！

```
import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
public class Meisho {
    public static void main(String[] args) throws IOException ,ParseException {
        DateFormat df = new SimpleDateFormat("yyyyMMdd");
        Date dt = df.parse("20150327");
        // カレンダークラスのインスタンスを取得
        Calendar cal = Calendar.getInstance();
        // 現在時刻を設定
        cal.setTime(dt);
        HashMap<String,Float> teams = new HashMap<String,Float>();
        teams.put("ソフトバンク", 0F);
        teams.put("日本ハム", 0F);
        teams.put("ロッテ", 0F);
        teams.put("西武", 0F);
        teams.put("オリックス", 0F);
        teams.put("ヤクルト", 0F);
        teams.put("巨人", 0F);
        teams.put("楽天", 0F);
        teams.put("阪神", 0F);
        teams.put("広島", 0F);
        teams.put("中日", 0F);
        teams.put("ＤｅＮＡ", 0F);
        //ペナント開始から終了まで
        for (int i = 0; i < 195; i++){
            //過度にアクセスしないよう1秒ずつsleepを入れておく？
            try{
                Thread.sleep(1000);
            }catch (InterruptedException e){
            }
            String date = df.format(cal.getTime());
            System.out.println(date);
            //某ニュースサイトからとりあえずデータを取ってくる
            Document document = Jsoup.connect("某URL?&date=" + date).get();
            Elements tables = document.select("試合情報");
            
            for (Element table : tables) {
                String result = table.select("各試合情報").text();
                if (result.equals("結果")){
                    //HTMLから必要な値を取得
                    String senkoTeam = table.select("チーム名の要素").first().text();
                    String kokoTeam = table.select("チーム名の要素").last().text();
                    Integer senkoPoint = Integer.parseInt(table.select("点数の要素").first().text());
                    Integer kokoPoint = Integer.parseInt(table.select("点数の要素").last().text());
                    Float senkoCheck = meishoCheck(senkoPoint,kokoPoint);
                    Float kokoCheck = meishoCheck(kokoPoint,senkoPoint);
                
                    Float senkoNowCheck = teams.get(senkoTeam);
                    teams.put(senkoTeam, senkoNowCheck + senkoCheck);
                    Float kokoNowCheck = teams.get(kokoTeam);
                    teams.put(kokoTeam, kokoNowCheck + kokoCheck);
                }
            }
            System.out.println(teams);
            cal.add(Calendar.DATE, 1);
        }
        System.out.println(teams);
    }
    
    private static Float meishoCheck(Integer ownPoint, Integer targetPoint) {
        Integer diff = ownPoint - targetPoint;
        //4点差以上で勝利は別に名将じゃないので
        if (diff > 3){
            return 0F;
        } else if (diff > 0){
            //1点差なら3点、2点差なら2点、3点差なら1点名将ポイントを差し上げる
            return 4F - diff;
        } else if (diff == 0){
            //同点なら名将ポイントは1点
            return 1F;
        } else if (diff > -4) {
            //3点差以内で負けるのは愚将のやることなので、1点差なら-4.5点、2点差なら-3点、3点差なら-1.5点
            return (-4F - diff) * 1.5F;
        } else if (diff > -6) {
            //4点差・5点差で負けるのは普通
            return 0F;
        } else if (diff > -10) {
            //6点差以上はまぁ名将
            return 1F;
        } else {
            //負け試合は10点差以上は結構名将
            return 2F;
        }
    }
}
```

## データ

#### パリーグ

||SB|日本ハム|ロッテ|西武|オリックス|楽天|
:------------:|:------------:|:------------:|:------------:|:------------:|:------------:|:------------:|
3,4月|-5.5|8|-9.5|5|-38.5|7.5|
5月|-2.5|5.5|-5|5|-32|-12.5|
6月|10.5|6|-1.5|-1.5|-12|3|
7月|9|6.5|-1.5|-21|-0.5|-12|
8月|13.5|1.5|0|-17.5|-17.5|-21.5|
9,10月|-9.5|-7.5|4|-11|-11.5|2|
計|15.5|20|-13.5|-41|-112|-33.5|

#### セリーグ

||ヤクルト|巨人|阪神|広島|中日|DeNA|
:------------:|:------------:|:------------:|:------------:|:------------:|:------------:|:------------:|
3,4月|-16|-5.5|0.5|-41|-10|8|
5月|-14.5|-15|17.5|-13.5|-21.5|2|
6月|-9.5|-21|6.5|-8|-6|-22|
7月|4.5|4|7|-10|-27.5|-12|
8月|-4.5|-13.5|7.5|7.5|-6|-24.5|
9,10月|11.5|-2|-33|3|-11|-14.5|
計|-28.5|-53|6|-62|-82|-63|

これでも何となくわかりますが、実際の[成績・得失点差]([http://baseball.yahoo.co.jp/npb/standings/)や[月間成績](http://lcom.sakura.ne.jp/NulData/Stats/Standing.htm)と見比べると分かりやすいと思います。

## 解析
当然、勝った方が名将になりやすいので順位が上位のチームの方が点数は高めにでます。それを踏まえて・・・。

### 3月、4月
広島とオリックスの逆スタートダッシュが目立ちます。

特に広島は得失点差+2で借金7と接戦の弱さが目立ちました。

~~そりゃーあんだけ延長で負けてたらそうなるわな~~

勝ち負けと比べて名将ポイントが高かったのは借金2の楽天でしょうか。

確かに春先はデーブ監督意外とよくやっているって風潮があった気はします。

### 5月

名将ポイントが話題になり出したのはこの5月の成績からですね。

阪神の名将ポイントは素晴らしい数値をたたき出しています。月間17.5はこの年の**TOP**です。

この月の阪神は12勝13敗とむしろ負け越していますから、いかに苦しい時期を借金1で乗り切ったかがよくわかりますね！

一方2か月連続でオリックスは逆噴射が目立つとともに、実はその陰で巨人の名将ポイントが低いです。

14勝12敗でこの数字なのでもっと勝てた月だと思います。

### 6月
6月は交流戦の結果がモロに反映されており、パリーグが軒並み点数が高く、セリーグは大体どこも悲惨なことになっています。

特に5月までは検討していたDeNAと巨人は激しくポイントを落としています。

そんななかちゃんと名将ポイントを稼ぐ和田阪神は流石です。

### 7月
目立つのは西武のマイナス。この時期丁度13連敗真っただ中で7月8月と大きくポイントを落としています。

他は中日が大きく数字を落としていますがあとは目立った点はないです。

### 8月
パリーグはソフトバンクが13.5と高い数字を出す一方、日本ハムは1.5と決して高い数字ではありません。

しかしソフトバンクは17勝6敗 得失点差+29、日本ハムは16勝9敗 得失点差+23と互角の戦いをしています。

日本ハムは8月1点差負けが5試合もあったことが響いています。

この辺りの接戦を拾っていけなかったところも最終的にペナントに響いた要因の一つかもしれません。

一方、話題の中心阪神はセリーグで唯一、毎月ポイントプラスでここまで来ています。

そしてここにきて首位に浮上！得失点差マイナスで優勝とか名将和田や！~~Vやで！~~・・・となるところだったのですが・・・。

### 9月,10月
という訳でオチなんですが、最後の最後で**-33**とかいう**大大逆噴射**をかました阪神でしたとさ・・・。

実際、9月10月の阪神は1点差負けが6試合もあったことはかなり響いてしまいました・・・。

一方勝負どころの9月でポイントをしっかり稼いで接戦をものにしたヤクルトが見事優勝しました。

## 各チームまとめ

### ソフトバンク
春先はやや苦しんでいた影響が数字にも現れています。乗ってきた6月以降は接戦もものにし続けていたため高いポイントをたたき出しています。~~9月、10月はいつもの風物詩ですねぇ・・・~~

### 日本ハム
割と通年で安定したポイントを残していました。やはり戦力を見ると栗山監督は良くやっているということなのでしょう。

### ロッテ
西武と比較すれば大分うまく戦っていた感じなのでしょう。まぁやっぱロッテの秋は・・・。

### 西武
春先は首位に立っていた時期もありいい戦いでしたが、13連敗あたりから高橋朋・増田が崩れだした影響がモロに出ています。

### オリックス
春先の逆噴射が目立ちますが、通年で接戦を取ることができなかったことを物語っています。

### 楽天
順位を考えると、ポイントはいいほう。松井裕が安定していたのが大きかったですね。

### ヤクルト
春先こそ苦しむものの、中継ぎがしっかりしてきた夏場からはいい戦いをしていたようです。特に勝負どころの9月での、ポイント稼ぎは見事！

### 巨人
戦力を考えると1年を通して接戦というか貧打で苦しい戦いが続いていたことを物語っています。

### 阪神
8月までは名将っぷりを発揮し続けてきた！・・・んですが秋の阪神・・・。~~週ベは許されないw~~

### 広島
特に春先、延長に突入しては負けるを繰り返していたのが痛かった。数字にもそれが表れています。ただ、これは中崎や大瀬良など後ろがしっかり整備されてきた影響か、夏場以降はいい戦いをしていました。~~なお最終戦~~

### 中日
12球団でオリックスと並んでどの月もポイントがマイナスだったチーム。1年を通して後ろが固定できなかったことが大きく響きましたかね・・・。

### DeNA
春先の快進撃と交流戦の失速とAS後の失速がそのまま数字に表れている感じ。中継ぎ抑えがそろってきているので来年は期待したいところ。

### 結論

和田監督は**8月までは**名将！~~9月とかなかった~~

和田監督4年間お疲れ様でした。

## 一応技術的な話
HTMLの解析にはJsoupを使いました。

Javascript的な書き方で記述ができるので結構使いやすかったです。

後やっぱ型がしっかりしてるのでめんどいｗ

PHP的にはIntegerとFloatとかくらいいい感じにしてくれてもええやん！って思ってしまいますｗ

## まとめ
[こういうスライド](http://www.slideshare.net/shinyorke/hackpython-pyconjp)があがっててなんか野球解析したいって、思ってたのでなんとなくやった！

楽しかった！(小並感