[Meisyo]第2回公式戦決勝戦

名将と呼ばれた者達、第2回公式戦決勝戦がありました。結果をお伝えします。
(ゲームにログインしていれば、こちらから結果を見ることが出来ます)

オモテ:
都立東京読売巨人高校
チーム総合力:115.125
打撃:E 走塁:E 守備:E
総評:安定した戦力で順当に勝ち上がってきた

VS

ウラ:
府立理想の高校
チーム総合力:128.75
打撃:E 走塁:D 守備:E
総評:珍しい走力重視チーム、総合力はトップクラス

いやー、いいですね。
どちらも今月の練習試合レート上位、どちらが勝ってもおかしくない戦いです。

3回戦までに優勝候補だったチームがほぼ敗れ去るという結果となり、結果がわかりませんでした。
くそう、今度は準決勝と言っていたのに(by初戦敗退おじさん)

果たして・・・

・・・!

おめでとうございます!

府立理想の高校、イデアさんの優勝です!

第2回目もアツい戦いをありがとうございました!
(バグ出なくて良かったー!今度は完全にバグ0にするぞー!)

機械学習の勉強から見えた「間違いだらけのAI認識」

「AI」という字面が新聞にもネットニュースにも数多く出てくるようになりました。

ただ、機械学習を勉強してて思ったんですが・・・・AIの定義が曖昧すぎる
内容が書いてある記事も殆ど無いし…。

AIが行っているのは画像認識なのか、自然言語処理なのか?
画像認識なら種類分け?数値回帰分析?
・・・単純にバズワード(流行り言葉)としての「AI」を使ってるのが多いのかなー?と思います。

ただのクラウドサービスやAIもどき(安い労働力を使った人力サービス)もAIって言いますしね。

「AIを利用して業務改善!」
中身読んでみると・・・それエクセルの重回帰分析でよくね?とか。

機械学習の研究者の方も同じような発言をしていました。
「AIという言葉を使うのはためらう」と。

熱に浮かされるのはいいですが・・・、真実を見たいですね。
自分も技術側から見た機械学習→画像認識の現在の限界を確認したいです。
もし、可能であれば誰かに仕える(使える)ようなプログラムコードに落とし込みたい。

[Meisyo]ビッグデータから学ぶ試合の基礎設計3

これは[Meisyo]ビッグデータから学ぶ試合の基礎設計2の投手編です!

ここでは、「どのパラメータが打率等にどれくらい関係するのか」を理解することで強いチームを作る指針を記載しておきます。

というわけで27-2. 重回帰分析を使っていきます。

この結果(防御率)はどの要素(速球、コントロール、体力…etc)が関係してるの?を答える統計解析です。

調査方法は前回と同じです。

調査内容

・計算する結果
防御率、WHIP

・要素
定数項(1)、速球、速球キレ、コントロール、体力、変化球タイプ、総変化量、総キレ量
※定数項あり。
※変化球タイプはチェンジアップあり=1、なし=0

調査結果

データ(選手)数:390
トータルアウト(/3で投球回):32720
倍率:10000(結果を見えやすくするため)
*SE:標準誤差

関係すると考えられる能力は赤(太)、関係しそうなのは黒(太)、関係しないと考えられる能力は黒で表記します。

判定基準も前回と同じ。

結果名 各 速球 速球キレ コントロール 体力 変化球タイプ 総変化量 総キレ量
各SE SE SE SE SE SE SE SE
防御率 17419 403.0 -98.79 -262.1 606.4 -878.1 254.0 65.59
23467 237.9 139.7 240.3 225.1 4933 184.9 115.4
WHIP 14194 79.71 -17.37 -84.76 86.75 271.0 -7.885 0.436
4883.8 49.52 29.09 50.01 46.85 1026 38.48 12.36

結論から言うと、「防御率、WHIPに体力が相関し、速球が弱く相関し、コントロールはマイナスに相関するかも」と言えるでしょう。
加えて、「複雑なパラメータが絡み合って存在していることが予想される」ということでしょう。

ただ、打撃側のように強い相関は見られません。

投球タイプ(チェンジアップ持ち)での違いが出なくてよかったです。
どの球種を持てば強いというのはなさそうですね。

問題点!
コントロールはマイナスに相関する・・・?
コントロールに能力が割り振られるより、速球、体力に割り振られたほうが強い・・・?

四球率は高くなっても、それよりも打たれないほうがマシ?本当かなあ。

私の主観とデータとのぶつかり合いですね。

このデータを使ってチームを導いていきましょう!!

こぼれ話

Meisyoには隠しパラメータがあります。
投手には1,2,3、野手にも1,2,3とあってそれぞれ3すくみを形成しています。

今回要素として調べてみましたが、「全体的に見ると結果はそこまで変わらない」という結果が出ました。3すくみだからしょうがないね。

どうしても打てないピッチャーが居る。もしかしたら、ベンチに眠っているあの選手が打ち砕くかもしれない・・・!というのを期待して作ってます。

[Meisyo]ビッグデータから学ぶ試合の基礎設計2

名将と呼ばれた者達、めちゃくちゃソースコードが長い(この記事)

ここでは、「どのパラメータが打率等にどれくらい関係するのか」を理解することで強いチームを作る指針を記載しておきます。

というわけで27-2. 重回帰分析を使っていきます。

この結果(打率)はどの要素(ミート、パワー、走力…etc)が関係してるの?を答える統計解析です。

調べてみたらPHPで重回帰分析があったので使いました。(多分python使ったほうが良さそう。とても重かった・・・。)これをcakePHPに入れて計算してみます。

・・・ただし、これはコピペで動かないので注意。最初は動かなかったので、最終的にソースを整形する作業が必要でした。orz

調査内容

・計算する結果
打率、出塁率、長打率、OPS、各塁打率(各塁打/打数)、HR率(HR/打数)

・要素
定数項(1)、ミート、パワー、走力、肩力、守備力、エラー回避、反応、コントロール(投手)=PC
※定数項あり。コントロール(投手)は陰性対照・・・だよな?

調査方法

View/calc.ctp

<?php
    App::uses('MeisyoController', 'Controller');
    $ct = new MeisyoController();
    $cf = Configure::read("cf");
    // Test
    App::import('Vendor','Regression');
    $mag = 10000;
    $total = 0;
     // Data
     $Y = $X = [];
     //$CP_R = $ct->_set_array($ct->Dpp->find('all'), 'Dpp', 'id');
     $CB_R = $ct->_set_array($ct->Dpb->find('all'), 'Dpb', 'id');

     $i = 0;
     foreach($CB_R as $d)
     {
       // if($i > 1000) break;
       if($d['ab'] != 0)
       {
         // bt
         $num0 = $d['h']/$d['ab']; // 打率
         $num1 = ($d['h'] + $d['bb'] + $d['hbp']) / ($d['ab'] + $d['bb'] + $d['hbp'] + $d['sf']); // 出塁率
         $num2 = $d['tb'] / $d['ab']; // 長打率
         $num3 = $num1 + $num2; // OPS
         $num4 = $d['1b'] / $d['ab']; // 1b率
         $num5 = $d['2b'] / $d['ab']; // 2b率
         $num6 = $d['3b'] / $d['ab']; // 3b率
         $num7 = $d['hr'] / $d['ab']; // HR率
         // 出力
         $num = $num7 * $mag;
         $total += $d['ab'];
         //
         if($CD = $ct->_read_data('Card', $d['id']))
         {
           $Y[] = [$num];
           $X[] = [1, $CD['b_mt'], $CD['b_pw'], $CD['b_sp'], $CD['b_sf'], $CD['b_df'], $CD['b_er'], $CD['b_ss'], $CD['p_co']];
           $i++;
         }
       }
     }
     // 早い処理
     // 5000件ずつデータを取得するようにする
     //$limit = 5000;
     //$params = array('limit' => $limit, 'offset' => 0);
     //while ($data = $this->Model->find('all', $params)){
     // 何らかの処理
     //$params['offset']+= $limit;
     //}

     //$this->_read_data('Dpp', $CD['id']);
     //$this->_read_data('Dpb', $CD['id']);
    $reg = new Lib_Regression();
    $reg->setX($X);
    $reg->setY($Y);

    $reg->Compute();

    // 出力
    echo "Num:" . count($Y) . "<br>";
    echo "TotalAb:{$total}<br>";
    echo "×:{$mag}<br>";
    $Table = ['getCoefficients', 'getStandardError',];
    echo "<table>";
    foreach ($Table as $array)
    {
      echo "<tr>";
        foreach($reg->$array() as $val)
        {
          echo "<td>". floor($val * 1000)/1000 ."</td>";
        }
      echo "</tr>\n";
    }
    echo "</table>";
    // 表示
    $List = ['getSSE', 'getSSR', 'getSSTO', 'getRSQUARE', 'getF', 'getRSQUAREPValue', 'getCoefficients', 'getStandardError', 'getTStats', 'getPValues'];
    foreach($List as $array)
    {
      echo "{$array}<pre>";
      var_dump($reg->$array());
      echo "</pre>";
    }
?>

Viewに入れるのは良くないが(‘A`)

調査結果

データ(選手)数:1561
トータル打数:39429
倍率:10000(結果を見えやすくするため)
*SE:標準誤差

関係すると考えられる能力は赤(太)、関係しそうなのは黒(太)、関係しないと考えられる能力は黒で表記します。

判定基準を詳しく言うと、統計学の平均±標準誤差を使用します。

関係すると考えられる能力は赤(太)
説明変数Xiが、Xi±2SEをしても0にならない値となった場合これと判定します。
Xi±2SEは母平均の95%が含まれている。=該当する数値は0にならない可能性が非常に高いと判断できるからです。

関係しそうなのは黒(太)
説明変数Xiが、Xi±SEをしても0にならない値となった場合これと判定します。
Xi±SEは母平均の68%が含まれている。=該当する数値は0にならない可能性が高いと判断できるからです。

関係しないと考えられる能力は黒
それ以外は黒で表示します。「んーこれはXi±SEが0になるから関係ないんじゃね」という感じです。

では結果をば。

結果名 各 ミート パワー 走力 肩力 守備力 E避 反応 PC
各SE SE SE SE SE SE SE SE SE
打率 298.8 34.469 7.941 8.212 -0.302 -2.406 0.94 3.695 2.68
415 2.904 2.831 2.941 2.893 2.936 2.689 2.643 4.353
出塁率 2331 22.17 2.895 4.454 -2.755 -5.649 -1.016 7.432 3.729
447.0 3.129 3.050 3.169 3.117 3.163 2.897 2.848 4.690
長打率 -1121 52.50 23.21 22.19 2.927 -0.431 3.298 8.225 5.102
622.3 4.355 4.245 4.411 4.339 4.403 4.033 3.964 6.528
OPS 1209 74.68 26.11 26.65 0.172 -6.08 2.281 15.657 8.832
966.6 6.766 6.594 6.852 6.74 6.84 6.264 6.157 10.14
一塁打率 1008 25.346 2.506 -4.174 -1.674 -2.467 0.061 1.989 1.611
386.7 2.707 2.638 2.741 2.696 2.736 2.506 2.463 4.057
二塁打率 -333.2 3.773 0.342 11.62 0.008 -0.724 -0.126 0.423 0.518
124.7 0.873 0.851 0.844 0.870 0.883 0.808 0.794 1.309
三塁打率 -42.44 1.782 0.348 -0.086 0.872 -0.346 0.533 -0.259 -0.252
61.69 0.431 0.42 0.437 0.43 0.436 0.399 0.393 0.647
HR率 -334.2 3.566 4.745 0.843 0.492 1.129 0.472 1.540 0.802
102.6 0.718 0.700 0.727 0.716 0.726 0.665 0.654 1.077

結論から言うと、「ミートが全能力の中で一番、打率等に強い相関関係がある。」と言えるでしょう。
加えて、「複雑なパラメータが絡み合って存在していることが予想される」ということでしょう。設計通りでよかったです。

面白いのは、
・出塁率には守備力がマイナスに相関関係してそう。
・一塁打率には走力がマイナスに相関関係している。(二塁打率が高くなっている理由に合致しそう)

興味深いのは、
・OPSはミート>パワー≒走力>反応に相関している。
・反応が(表記の割に)意外と重要そう
設計通り。(キリッ
反応は、速球投手の活躍のために生まれました。速球早い=反応早くないとブレるって感じですね。その他には守備にも走塁にもプラス要素として入っている素敵な能力です。

不思議なのは、
・三塁打率・・・何故お前は肩力が必要なんだ?
・HR率は・・・ん?走力必要か?守備力とは・・・何なのか。
なんだろうこれは、というものですね。

予想外だったのは、
・長打にそれほどパワーが関係してこないこと(HRには関係するよ!)

面白いですね。
選手たちは本当に生き物みたいです。

今後もデータ分析を通じて面白いゲームを作っていきたいと思います。よろしくお願いします!

こぼれ話

このゲームの歴史をちょっと紐解くと、このゲームは生まれて間もないですが、原型の物理プログラムコード自体は2011年頃には生まれていました。

「何人かと思いっきり試合しまくって微調整する」「打撃練習(実装予定なし)で打率を調整する」等々、合わせて3年近く調整にかかっています。

当初は「0.1秒ごとに球を動かして投球・打撃をする」でした。
当時のマシンパワーは今に比べてひどかったのと、比較的重いPerl(CGI)だったので動かすのに相当苦労した記憶があります。

動作確認は「表示で疑似3Dを作って動きを1球ずつ確認」してました。

・まともに球投げねえ(笑)
・まともに打撃しねえ(笑)(そりゃ0.1秒間隔じゃ球とバットが埋まるでしょ)
・まともに守備しねえ(笑)ってか守備陣どこ?打ったらHRなんだけど。
みたいなことをしていました。

それに比べたらだいぶ進歩したなあと思ってます。

[Meisyo]練習試合にレーティング制を導入

練習試合にレーティング制を導入しました。
レートはメイン画面に下記のように表示されます。

平均レートは1000です。

レーティングの変動⊿Rは下記の式で表されます。
a(レートRa)がb(レートRb)に勝った場合、
⊿R = 16+(Rb-Ra)*0.04
⊿R = 1~31内

目的

  • 練習試合にメリハリをつけるため
  • 自分の強さが数値化されます。目指せ1位!

  • 初心者育成促進のため
  • 強い人は強い人と、初心者は初心者とマッチしやすくなります。
    初心者は前より強い人と当たりにくくなるので、勝ちやすくなり成長も早いです。
    その代わり、強い人は勝ちにくくなるので成長が遅くなりがちです。

リセット時期

公式戦開始と同時

[Meisyo]基本機能(守備位置変更)追加と練習の修正

下記変更を行いました。
・基本機能(守備位置変更)の追加
・練習No.3(高いor低い順に数字をクリック)にスタートボタンを追加

基本機能(守備位置変更)の追加

そういえば守備位置変更がなかった!
ちなみに打順は変わりません。守備位置だけしか変わりません。

1. 守備位置を交代したい選手同士をセットしクリック。(今回は2捕手と9ライト)

2. 変わります。

練習の修正

練習No.3(高いor低い順に数字をクリック)にスタートボタンを追加しました。


「いきなり開始すんのやめて!!」・・・わかってたすみません!!

経緯

とても多くの「こうやってほしい」コメントをいただいたのですが、採用できることが少なかった・・・。orz

からあげさん(@kara_so2)ありがとうございました!

ビッグデータはメンデルの法則(表現型)を調べているだけ、理由(遺伝子)を調べる時代が来る

人が認識している人(個人としての人)とAIが認識している人(群としての人)には違いがあるのかもしれません。

個人は遺伝子を元にした多様な細胞が集まり形成されています。
群は(??)を元にした多様な人が集まり形成されています。

今はまだ「群の動きの理由」がわかりません。
(??)とは一体何なんでしょうか?

もしかしたら、体内を参考にすると良いのかもしれません。

例で上げるなら、成功した起業家と抗体産生の近さでしょうか。
群では、ある問題の解決策を提示・行動する人(起業家)にお金が舞い込み、その人の行動を後押ししていきます。
体内では、「体外から侵入した病原体を排除する」という問題解決策をもつ免疫細胞は、度重なる淘汰を乗り越え一気に生産されます。
似ていると思いませんか?

「ダイバーシティがなければ弱い組織」
これは個人的にはちょっと疑問ですが、体内から見れば正常な判断です。
多様性を持つ、解決策に多様性を持つ細胞が居なければ、変な問題が浮かび上がってきた時に対応できないでしょう。

このように個人を元に群を考えることは意外とよいのかもしません。

今はビッグデータが持て囃されています。
「なぜビッグデータのように人が行動するのか?」ということはわかっていません。
わからなくても別にいいですね。お金が儲かるものですし。
(売るのはゴールドラッシュと同じようにスコップにしよう!)

ただ一言だけ言えるのは、ビッグデータはメンデルの法則(表現型)を調べているだけです。
間違いなく理由(遺伝子)を調べる時代が来ます。

理由がわかればビッグデータなんて得る必要がなくなるわけですし。陳腐な知識になってしまうわけです。(人間がビッグデータを知覚できるかは置いといて、ですが。)

ただ、がん細胞のように、爆発的に増えて止まらず成長するものには体には打ち手はありません。果たしてデータは群にとって何なんでしょうか?

[Meisyo]Androidアプリ版 作成案1

「アンドロイドアプリの基本」的な本が届いて3日。だいたいわかった(わかってない)ので一応完成予想図を考えておきましょう。

[トップページ]→[ログイン画面]or[ゲーム画面]
・アプリの利用メリット
[お知らせ機能]
・練習
・練習試合
・公式戦開催
・公式戦試合開始可能
[アプリ限定ルーレット1日1回]
なにか当たるかも?選手P、気合の塊等

[トップページ]
Meisyo Logoを表示、読み込めるまではWait画面


下でぐるぐる(Wait)

[サブページ]
[ログインできていない場合]
ID:
PASS:
を入力する欄あり
[ログインできている場合]
http://rei-farms.jp/meisyo/main/ (メイン画面)にアクセス

Webページみたいに新しいページをすぐに作れないのかなあと思ってみてます。
これは一体・・・。まだわかんね。(‘A`)

[Meisyo]練習に実施例を追加

練習がさらにわかりやすくなりました。

赤枠の「ミニゲーム実施例」をクリックすると・・・

その練習のミニゲームを実際に行った動画を見ることができます。

「こんな感じでやるのか~」と目標になるのかな?と思います。

情報提供者の方ありがとうございました!