Rubyによる重回帰分析

Posted by Shugo Maeda on January 05, 2016 · 4 mins read

新年あけましておめでとうございます。

このブログは、株式会社ネットワーク応用通信研究所のメンバーが技術的な情報を発信するために立ち上げました。 筆者の思いつきではじめたので、とりあえず非公式という扱いです。

第一回は、Rubyによる重回帰分析について紹介します。

概要

重回帰分析は、ある変数(目的変数)の値を、他の複数の変数(説明変数)の値から予測する方法です。

今回は、重回帰分析を使って、真・女神転生に登場する悪魔の「防御」パラメータの値を予測してみたいと思います。

真・女神転生では、悪魔は力・知・魔・体・速・運といった基本パラメータを持っており、これらに基づいて他のパラメータの値が決定されます。 例えば、「命中」パラメータは「(力 / 4) + 速」という計算式によって決定されます。 ところが、「攻撃」パラメータや「防御」パラメータの計算式については明らかになっていません。

そこで、重回帰分析を用いて、「防御」パラメータの値を予測します。

準備作業

まず、こちらのスクリプト(Ruby 2.3以降でないと動作しません)で攻略サイトから全悪魔のデータをダウンロードし、JSON形式に変換します。

$ ruby devil_summon.rb > devils.json

JSONデータは以下のような構造になっています。

[
  {
    "名前": "魔神 ヴィシュヌ",
    "LV": 82,
    "HP": 990,
    "MP": 822,
    "CP": 57,
    "アイテム": "",
    "攻撃": 176,
    "命中": 29,
    "防御": 81,
    "回避": 22,
    "魔法威力": 21,
    "魔法効果": 20,
    "魔法/特技": [
      "メギド",
      "マハンマ",
      "ディアラハン"
    ],
    "攻撃回数": "2~3",
    "": 36,
    "": 18,
    "": 19,
    "": 20,
    "": 20,
    "": 15,
    "特徴": "破魔を反射し\n呪殺が無効", "属性": "L" },
  ...

次にSciRubyプロジェクトのStatsampleライブラリをインストールします。

$ gem install statsample

これで準備は完了です。

重回帰分析

Statsampleで重回帰分析を行うには、Statsample::Regression.multipleメソッドを使用します。 第一引数には分析対象のデータ、第二引数には目的変数の名前を指定します。

分析対象のデータは、{目的変数名 => 値の配列, 説明変数名1 => 値の配列, 説明変数名2 => 値の配列, ...}のような形式のハッシュを用意して、to_datasetメソッドを呼び出すことで得られます。

悪魔ではなく人間の場合、防御パラメータは「防具の防御力 + (体/ 2) + (速 / 2)」で決定されることがわかっているので、説明変数として体・速の二つを使ってみることにしましょう。

require "statsample"
require "json"

devils = JSON.parse(ARGF.read)
obj_name = "防御"
exp_names = ["体", "速"]
h = ([obj_name] + exp_names).each_with_object({}) { |name, h|
  h[name] = devils.map {|i| i[name]}
}
puts Statsample::Regression.multiple(h.to_dataset, obj_name).summary

では、実際に実行してみましょう。

$ ruby devil_analyze.rb devils.json
= Multiple reggresion of 体,速 on 防御
  Engine: Statsample::Regression::Multiple::RubyEngine
  Cases(listwise)=255(255)
  R=0.947
  R^2=0.897
  R^2 Adj=0.896
  Std.Error R=6.705
  Equation=-12.946 + 3.208体 + 0.891速
  == ANOVA
    ANOVA Table
+------------+------------+-----+-----------+----------+-------+
|   source   |     ss     | df  |    ms     |    f     |   p   |
+------------+------------+-----+-----------+----------+-------+
| Regression | 98952.078  | 2   | 49476.039 | 1100.413 | 0.000 |
| Error      | 11330.259  | 252 | 44.961    |          |       |
| Total      | 110282.337 | 254 | 49521.000 |          |       |
+------------+------------+-----+-----------+----------+-------+

  Beta coefficients
+----------+---------+-------+-------+--------+
|  coeff   |    b    | beta  |  se   |   t    |
+----------+---------+-------+-------+--------+
| Constant | -12.946 | -     | 1.312 | -9.868 |
| 体        | 3.208   | 0.813 | 0.087 | 36.922 |
| 速        | 0.891   | 0.261 | 0.075 | 11.858 |
+----------+---------+-------+-------+--------+

Equation=-12.946 + 3.208体 + 0.891速という予測式が得られました。

例えば、妖魔ハヌマーン(体=15・速=26)にこの予測式を当てはめると防御パラメータの予測値は58.34となりますが、実際の値は60なので近い値です。

ただし、サンプルによっては大きく外れることもありますので、未知の悪魔に出会った場合には注意してください。

参考文献