アジマティクス

ここをこうするとおもしろい

最小二乗法でフシギダネの誕生日を求める

注意:この記事にはポケモン最新作で登場するポケモンの総数に関するネタバレが含まれています。逆に言えばそれ以外のネタバレは含まれていません。だってまだプレイしてないから!!! リーリエちゃんかわいいんでしょ!!! 知ってる!!!

この記事は、日曜数学アドベントカレンダー14日目の記事です。

去る2016年11月18日、ポケットモンスターシリーズ最新作である「ポケットモンスター サン・ムーン」が発売され、新たに81種類のポケモンが発見されました。これまでに見つかっていたものをあわせると全部で802種類のポケモンが見つかったことになります(フォルム違い、メガシンカ、アローラのすがた等は除く)。

もちろん、新たに幻のなんらかが見つかったりこの先のアップデート等でいくらか追加されるかもしれませんが、実際に新たなポケモンが何種類増えたか?ということは今回の本題ではないので置いといてください。

1996年2月27日に151種類が発見されてから、7570日後の2016年11月18日までに651種類増えたわけですので、一年あたり31種程度が発見され続けていることになります。11〜12日に一種類発見されている計算です。全国の博士たちが頑張ってくれたんだと思うとこみ上げるものがありますね。

縦軸にポケモンの総数、横軸に初代発売日からの経過日数をとって、グラフにプロットしてみました。

f:id:motcho:20161123042729p:plain

元にした表はこちらです。

f:id:motcho:20161213175832p:plain

x_i」というのは値のリストにつけられた名前であり、x_1x_7までをまとめた表記です。あとで出てきます。例えばx_3=2459を、y_7=802を表します。

このグラフ、よく見ると、

f:id:motcho:20161123044926p:plain

なんとな〜く直線の上に乗ってそうな感じがしますよね。つまりポケモンの増加を絶妙に表してくれるような直線(一次関数)が存在してくれそうなわけですが、今回はこの一次関数を求めるお話です。

ちょうどいい直線

ではどうやれば、ちょうどいい直線を見つけられるのでしょうか。

f:id:motcho:20161213172359p:plain

上のグラフ中の赤線と青線を比べると、赤線のほうが元データをもっともらしく表しているように見えます。つまりその「もっともらしさ」を定量的に評価したいわけですが、そのために次のようなことを考えます。

f:id:motcho:20161213181616p:plain

オレンジの縦線は、実際のデータの値である黒点と、青い直線が示す値との「乖離(どれだけ離れているか)」を示したものです。この乖離が最も小さくなるように直線を選べば、ちょうどいい直線が見つかるだろう、と。そういうわけです。

試しに、よりちょうどよさそうな赤の直線の方でも見てみましょう。

f:id:motcho:20161213182304p:plain

ちょうどよすぎて、ほとんどオレンジの線が見えなくなってしまいました。こちらのほうがいい具合にポケモンの増加を表してくれそうです。ではどうすればこの直線の式を求められるのでしょうか。

最小二乗法

一般の直線は、y=ax+bという式で表されます。abに適当な数値を入れればだいたいどんな直線でも表すことができるということです(x=aみたいな形してるもの以外)。よって、ちょうどいい直線を探すには、abだけ求めればいいということになりますが、これは「\displaystyle\sum _{i=1}^n\left(y_i-ax_i-b\right)^2を最小化するようなab」を探せば求められます。どういうことか。

この式を分解してみます。まず「\displaystyle\sum _{i=1}^n」というのは「i1からnまでの和」と読み、今回はデータが7つあるのでn=7です。これはつまりx_1x_7までと、y_1y_7までのすべての値を式に代入したものたちの和を取ることを意味します。上記の式を「\sum」を使わずに書くと、

\left(y_1-x_1a-b\right)^2+\left(y_2-ax_2-b\right)^2+...+\left(y_7-ax_7-b\right)^2

=\left(151-0a-b\right)^2+\left(251-1363a-b\right)^2+...+\left(802-7570a-b\right)^2

ということになります。xyが1番目の値から7番目の値までを渡っていることをご確認ください。いちいち全部書くのはだるいので、\sumという記号で簡略化しているわけです。

次に、その足される中身である「y_i-ax_i-b」というのは、これは「実際のデータの値と、直線が示す値との差」になります。この和をとろうとしているのです。

最後に「^2」がついている理由ですが、「実際のデータの値と、直線が示す値との差」はプラスだったりマイナスだったりするため、そのまま和をとるとそれぞれが打ち消し合ってしまうことがあります。それゆえに、二乗することで符号を揃えているのです。符号を揃えることにより、実際のデータとの「差」ではなく、実際のデータからの「乖離」だけを取り出すことができるようになっているわけです。

※符号を揃えたいのだったら絶対値でいいじゃんと思うかもしれませんが、基本的には二乗のほうが計算が簡単なため、二乗を採用しています。同じことは「分散」というものを考えるときにも起きています。分散についてはこちらの記事をご参照ください。

www.ajimatics.com


ここまでをまとめると、

 ①「実際のデータの値と、直線が示す値との差」を「二乗」したものを「全部足す」

 ②全部足したものが最小になるような、abを探す

 ③そうすることで、もっともしっくりくる直線が見つかる

という作業をしていたわけです。こうやってデータをちょうどよく表す関数を見つける手法のことを、「最小二乗法」と呼びます。納得の命名ですね。

これを解くには偏微分とか出てきてややこしいので今回は置いといて、結果だけ書くと

\displaystyle a=\frac{\displaystyle \sum _{i=1}^nx_i\sum _{i=1}^ny_i-n\sum _{i=1}^nx_iy_i}{\displaystyle \left(\sum _{i=1}^nx_i\right)^2-n\sum _{i=1}^nx_i^2}

\displaystyle b=\frac{\displaystyle\sum _{i=1}^nx_i\sum _{i=1}^nx_iy_i-\sum _{i=1}^ny_i\sum _{i=1}^nx_i^2}{\displaystyle\left(\sum _{i=1}^nx_i\right)^2-n\sum _{i=1}^nx_i^2}

となります。

これ見た目がかなりゴツいですが一つ一つ見ていくと実は大したことなくて、例えば「\displaystyle \sum _{i=1}^nx_i」というのは「x_i全部の和」、「\displaystyle \sum _{i=1}^nx_iy_i」は「x_iy_iとの積の全部の和」、「\displaystyle \left(\sum _{i=1}^nx_i\right)^2」は「x_i全部の和を二乗したやつ」みたいな風に読み下していくことができ、一つ一つは捉えやすくなってます。そのため、2つのデータ列さえあれば手計算でもちょうどいい直線を求めることができます。

さて、この式にポケモンの総種類数と発売日からの経過日数のデータをつっこんでやると、a=0.08845程度、b=151.97131程度になります。すなわちこれらを使った「y=0.08845x+151.97131」という式こそが、絶妙にちょうどよくポケモンの増加を表してくれる直線ということになります。

直線を眺めてみる

よかった。ついに最もちょうどいい直線が見つかりました。もう一度そのちょうどよさを眺めましょう。

f:id:motcho:20161123044926p:plain

直線から予想されるポケモンの数を上回ってる部分と下回ってる部分がありますね。第3世代と第5世代の部分が目立って上回ってます。オダマキ博士とアララギ博士の頑張りがうかがえます。

これ眺めてると、

f:id:motcho:20161214060445p:plain

f:id:motcho:20161214060637p:plain

このへんのことが気になってきませんか?

f:id:motcho:20161214061033p:plain

ここです。

ポケモンが802種類のときは、赤緑発売から7570日が経過していた。ポケモンが151種類のときは、赤緑発売から0日が経過していた。だったら、「ポケモンが1種類のときは、赤緑発売の何日前だったのか?」、すなわち「ポケモン誕生の瞬間はいつだったのか」が、この直線から求められるというわけなんです。これは気になって仕方がない!

当然、「実際に」いつ誕生したのかがここからわかるわけはありません。お遊びです。でもなんとなくロマンがあるとは思いませんか。計算によってポケモン爆誕の瞬間が求められるだなんて。数学の力ってすげーって。思いませんか。

フシギダネの誕生日を求める

簡単のため、ビクティニのことは無視します。

全国図鑑番号001、つまり「1番目のポケモン」は、たねポケモン・フシギダネです。 

f:id:motcho:20161214142604p:plain

彼らがこの世に生を受けたであろう日を求めるには、さっき求めた式であるy=ax+byのところに1を代入するだけです。代入して計算すると、x-1706.86程度の値になります。

赤緑発売の約1706.86日前。これは、1991年6月26日午前3時18分ごろになります。

ゲームフリークの田尻智氏が、後にポケットモンスターと呼ばれることになる「カプセルモンスター」の企画書を任天堂に持ち込んだのが1990年。1991年となるとすでにポケモンの開発は始まっています。もしかしたら、もしかしたら本当に、1991年6月26日午前3時18分ごろ、開発者が眠い目をこすりながらフシギダネを実装していた、そんなことがあるのかもしれません。

さらに遊ぶ

この直線が手に入ったことによって、まだまだいろんな遊びができます。例えば、

f:id:motcho:20161214070838p:plain

ここ。

ポケモンがめでたく1000種類を迎えるのはいつになるでしょうか?

1000=ax+bxについて解くと、x=9587.7042024...。赤緑から約9587.7日後。これは2022年5月28日です。東京オリンピックには間に合わないようですね。しかし1000種類ともなるともうモチーフとなる生物が残っていなさそうで心配です。アジとかどう?

もっと遊ぶ

私の誕生日は6/24なんですが、6/24生まれのポケモンは誰でしょうか?

さっきは「ポケモンの番号から日時を求める」ことをしたわけですが、それができるんだったら今度は逆に「日時からポケモンを求める」ということもできるよという話です。

探してみると、3種類のポケモンが見つかります。802種類を365.25日に分配すると一日あたり2.2種類程度になる計算ですから、3種類は多い方といえるでしょう。

 1998/06/24 エアームド

 2001/06/24 コータス

 2011/06/24 ケルディオ

エエエエエエエエエアームド!! 金銀リアタイ時に旅パの一員としてお世話になったあのエアームド!!! これはなにがしかの運命を感じずにはいられません。

ほかの2種もなんとなく好きな子ばかりです。やはり誕生日が同じということで、無意識に惹かれていたのでしょうか。

まだまだ遊べる

データ列からちょうどいい直線を求められるというだけでも結構ワクワクします。隠されていたデータの真髄を掴んでやったみたいな気分になるからでしょうか。

それだけでもワクワクするのに、さらにその直線を使って元のデータ列だけからはうかがい知ることのできなかった情報を手に入れることもできるなんて最高です。まさかエアームドと同じ誕生日だったなんて思いもよりませんでした。最小二乗法最高。

まだまだ、この中に隠されたデータはあると思います。もしよろしければみなさんもそれらを見つけ出して気持ちよくなってください。とりあえず、自分と同じ誕生日のポケモンを探してみたりなんかするといいと思います。

この記事で紹介した最小二乗法は直線だけのものでしたが、前述の通り直線ならデータ列さえあれば簡単にちょうどいい直線を求められます。いろんなデータに直線をかざしてみるというのも楽しいでしょう。

この記事がみなさんの日曜数学活動の一助になれば幸いです。では。

 

日曜数学アドベントカレンダー、明日はcurekoshimizuさんがニュートン法の意外な応用について書いてくれるようです! たのしみ!