端数を丸めるのは(たぶん)深い

 

 最近医療事務における「薬価の計算」と、ポケモン対戦における「素早さの数値が同じガブリアスA,BがいてBがスカーフ持ちという状態でAがBに岩石封じを撃った場合、ガブリアスAが必ず先制するという現象」について調べていたのだけど、そのときに「五捨五超入」という端数丸めの方法を知って、初耳だったので、薬価とガブリアスは捨てて端数の丸め方について新たに興味を持って調べていた。

 

 これがけっこう面白い。あたり前のように「めんどくさいときは切り上げor切り捨て、ちょっと正確にやりたければ希望の桁で四捨五入」だけが推奨されるやり方で、それ以外に考慮することなんてないと思っていたのだけれど、違っていた。

 

 まず、これまでの人生で考えたこともなかったのだけど、端数に0.5が有限の割合で現れるとき、0.5というニュートラルな(切り下げて出てくる値とも切り上げて出てくる値とも同じ差を持つ)端数を一方的に切り上げることによって、端数処理を施したデータは端数処理を施していない元データに比べて、わずかに増える方向へのバイアスがかかるのである。

 言われてみれば当然のことなのだが、「そのようになるな」と思って四捨五入をしたことはいままで一度もなかったかもしれない。

 

 先述した「五捨五超入」の場合は、0.5の端数を切り捨てるのだが、その場合は同様にわずかに減る方向へのバイアスが生まれる。

 

 では、バイアスなく公平に端数を丸めることはわれわれにはできないのだろうか? Wikipediaページに答えは書いてあった。

偶数への丸め(round to even)
偶数への丸め(round to even)は、端数が0.5より小さいなら切り捨て、端数が0.5より大きいならは切り上げ、端数がちょうど0.5なら切り捨てと切り上げのうち結果が偶数となる方へ丸める。JIS Z 8401で規則Aとして定められていて、規則B(四捨五入)より「望ましい」とされている。

端数0.5のデータが有限割合で存在する場合、四捨五入ではバイアスが発生するが、偶数への丸めではバイアスが無い。つまり、多数足し合わせても、丸め誤差が特定の側に偏って累積することがない。ただし、偶数+0.5は現れるが奇数+0.5は現れないデータのように分布に特殊な特徴がある場合は、バイアスが発生することがある。

 なるほど、「0.5端数が来たときにはオッズ1:1で切り上げたり切り捨てたりする」とか考えちゃうけど、こういうエレガントな方法で丸められるんですね。

 

4.5→(四捨五入)→5.0

 いまではこの単純な結果に、それまで感じたことがなかった違和感を感じるようになってしまった。世界の見え方が、ディテールで変わる。学ぶということのすばらしい副作用である。

 

 ……というふうに端数を丸めることについて考えていてふと思ったのだけど、「バイアス」という言葉が使われていることが脇から示してもいるように、あるデータの「端数を丸める」というのはある意味で標本*1を抽出しているということとおなじことだと考えてもいいのではないか。元データの情報を要約した値を、四捨五入や切り捨てや偶数への丸めは与えてくれるのだ。

 

 人が端数丸めをしたくなるときのデータというのは、そもそもが抽出された標本であることがほとんどだと思うので、端数丸めがそれだけでバイアスのかかりうる操作だということはあまり問題にはならないと思うのだけど、ちょっと違う例を考えることもできると思う。

 

 ポケモンの素早さ計算に戻ろう。

 ポケモンは「素早さ」という(整数値しか取れない)値を持っていて、戦闘中の技だったり天気だったり持たせた道具でいろいろ補正がかかったあと、端数を整数に丸めて、最終的な値を比較して「素早さ」が大きいほうが先に行動する、というルールである。

 

f:id:kageboushi99m2:20210519212815j:plain

 世界中で行われている無数の対戦のなかで、もともとの数値が何だったポケモンが、どのくらいの割合で先に行動できたか、というののデータがもし取れたとする。戦闘中の技だったり天気だったり持たせた道具の補正というのは対戦側のどちら側にもかかることなので、行動順に対して奇跡的に相殺し合ってノイズも含めて寄与がなかったとする。

 ここでこのデータから、「ポケモンの素早さの元数値としてありうる個々の値」と「その各数値について、実際にどれくらいの確率で先に行動できたか」を組にすると、例えば72と73の先制率の違いが73と74より大きくて、「素早さの数値を72にするよりは断然もうちょい頑張って73にしたほうがいいけれど、74にするメリットはそこまでない」みたいな、数値ごとの差みたいなのが生まれたりしたら。

 

 元データはありうる数字という、バイアスのない値で、そこから生まれた最終のバイアスは対戦の環境とかとは関係なく、単に端数丸めのときにできたノイズが増幅されて出てきたもの、という結論が(たぶん)言える。それってけっこう深くて面白いのではないでしょうか。

*1:母集団と同じサイズの標本ということになるが。