「82%より80%が選ばれる」:診断の適合度%が、並び順と食い違っていた
ガチアニメ診断 開発の記録 / 2026年10月
ガチアニメ診断は、最後に「運命の1作」と、次点の2作を出します。それぞれに「適合度 82%」のような数字が付きます。この数字が、順位と食い違っていたことがありました。「82% の作品より、80% の作品のほうが選ばれる」。どれくらい食い違っていたのかを、今回あらためて測ったので、書き残します。
数字と順位が、別の物差しだった
診断は、アニメの好みを 6 本の軸で測って、作品ごとの「近さ」(コサイン類似度)を出します。ただ、最終的な並び順は、近さだけでは決まりません。近さ × 0.82 に、作品の評価(★)、人気、年代、好みの要素を足した合計(total)で並べています。
ところが、画面に出す適合度の%は、近さだけから作っていました。並び順は合計、表示は近さ。物差しが二つあったのです。合計では 1 位でも、近さでは 2 位より低い、ということが起きます。そのとき、画面には「1 位 80%、2 位 82%」と出ます。
直し方
適合度を、並び順と同じ total から出すように直しました(2026年9月25日)。同じ日に、もう一つ、表示の矛盾を直しています。軸のバーの値がちょうど 0 のときでも、「○○ 寄り 50%」と出ていました。寄っていないのに、寄っている、と言っている。最低でも 51% を出すことにしました。
どれだけ食い違っていたのか:測る
当時のコミットには、割合の数字が残っていません。そこで、12問の記事と同じ、作り物の回答者 1,000 人(50 問すべてに答える)で測りました。上位 3 作について、画面の表示がどうなるかを、3 通りで比べます。
- 旧:近さから出した、整数の%。
- 中間:
totalから出した、整数の%。 - いま:
totalから出した、小数第一位までの%。
数えたのは、二つです。「逆転」は、1 位の%が、2 位か 3 位の%より低い場合。「同率」は、1 位と 2 位が、同じ%に見える場合。回答のブレは、小さい(0.3)・中くらい(0.5)・大きい(0.8)の 3 通りです。
| 表示のしかた | 回答のブレ | 逆転 | 1位と2位が同率 |
|---|---|---|---|
| 旧(近さ・整数) | 小さい | 40.3% | 14.1% |
| 中くらい | 37.7% | 15.3% | |
| 大きい | 35.1% | 15.3% | |
| 中間(total・整数) | 小さい | 0.0% | 31.7% |
| 中くらい | 0.0% | 30.1% | |
| 大きい | 0.0% | 27.7% | |
| いま(total・小数第一位) | 小さい | 0.0% | 3.6% |
| 中くらい | 0.0% | 3.9% | |
| 大きい | 0.0% | 3.8% |
旧の表示では、回答者の 35〜40% で、上位 3 作の表示が逆転していました。およそ 5 人に 2 人が、「選ばれたのが 1 位なのに、次点のほうが高い」を見ていた計算です。
直したら、別の問題が出た
合計から出すようにして、逆転は 0% になりました。ところが、整数の%にしたままだと、1 位と 2 位が同じ%に見えることが、3 割前後に増えました。上位には、合計の近い作品が並びます。整数に丸めると、その差が消えて、同じ数字に集まってしまうのです。
そこで、表示を小数第一位までにしました(99.6% のように)。同率は、約 4% まで下がっています。0% にならないのは、本当に、合計の差が 0.1% に満たない場合があるからです。
この測り方の弱いところ
- 回答者は作り物です。本物の人の答え方とは、違います。
- 「旧」は、いまのコードの並び順に、昔の表示のやり方を当てて、再現したものです。当時のコードそのものを動かしたわけではありません。当時は、評価や好みの上乗せに上限が無く、結果が違った可能性があります。
- 測ったのは「表示が順位と一致するか」だけで、「その順位が、その人にとって正しいか」ではありません。
分かったこと
画面に出す数字は、並べるのに使った物差しと、同じものから作る。
当たり前に聞こえますが、計算を足していくうちに、並び順だけが変わって、表示の数字が置いていかれました。もう一つ、丸めは、順位の差を消すことがあります。差が小さい場所では、桁を一つ増やすだけで、見える順位が戻ります。
この記事の数字は、作り物の回答者 1,000 人(乱数は固定)で、2026年10月8日に測ったものです。当時のコミットの記録は、2026年9月25日です。
この話に出てくるもの
- ガチアニメ診断(作品ページ) — 何を作ったのか、画面と数字で
- 診断を12問にしたら、結果はどこまで変わるのか — 同じ測り方の、別の記録
ほかの記録
- Python の splitlines() で JSONL が壊れる:犯人は U+2028(見えない改行文字) — JSONL を splitlines() で読むと、あらすじ中の U+2028 で行が割れて JSON が壊れる。実データ(7,255行と7,247件、U+2028 は8個)で確かめて、split("\n") に直した記録。
- 診断を12問にしたら、結果はどこまで変わるのか — 50問の診断を12問から始められるようにした。短くして結果は変わらないのか、作り物の回答者1,000人で測った記録。タイプはほぼ同じ、運命の1作はかなり変わる。
- 16,177作から6,091作へ:診断のデータベースは、6割以上を落として作った — 診断に使う作品は、Annict・Filmarks・手元の名作をまとめた16,177件のうち、手がかりが足りた6,091作だけ。落とした基準と、残った作品の出どころ・偏りを、数字で書いた記録。
コメント
感想や、記事の間違いの指摘は、ここへ。書くには、GitHub のアカウントが要ります。
押すと、giscus(giscus.app)と GitHub に接続します。押さなければ、接続しません。詳しくはあつかいに書いています。